Логическое смещение влево по сумме двух чисел / регистров? - PullRequest
0 голосов
/ 26 декабря 2018

Есть ли способ выполнить левый сдвиг логическим путем суммирования двух чисел / регистров?

Я думаю о чем-то, что выглядит так, но на самом деле работает:

mov r4, r1, lsl add, r7, #1

1 Ответ

0 голосов
/ 26 декабря 2018

Вам нужны две инструкции (для вычисления числа сдвигов в регистре tmp).

(если оба числа не являются константами. lsl r4, r1, #1 + #2 может вычислять во время сборки значение lsl r4, r1, #3.)

Регистр + немедленный или регистр + регистр не кодируется в машинном коде ARM.Есть только несколько битов, которые кодируют режим сдвига (левый, правый логический, правый арифметический, поворот-правый и немедленный или счетчик регистров) и счетчик сдвигов (номер регистра или счет как непосредственный, но не оба).

Источник ASM - это просто способ описания машинного кода в тексте.Это не то же самое, что C, где вы можете написать более сложное выражение и скомпилировать его с несколькими инструкциями.Таким образом, ограничения существуют из-за ограничений кодирования машинного кода, а не из-за выбора синтаксиса / языкового дизайна asm.

(ldr r0, =0x12345678 - это псевдоинструкция, которая собирает более чем одну инструкцию, однако,или относительная загрузка ПК из соседнего литерального пула. Но кроме нескольких псевдоинструкций для построения больших значений, которые не помещались бы в поле как часть одной 32-битной ARM или 16-битной инструкции thumb / thumb2, однаИнструкция asm должна быть собрана в одну машинную инструкцию.)

Согласно https://www.scss.tcd.ie/John.Waldron/3d1/barrelshift.pdf, счетчик сдвигов может либо быть 5-битовым непосредственным, либо указанным в качестве нижнего байтарегистр.Определенно не оба.


Я не думаю, что есть какие-то совершенно разные инструкции, которые вы могли бы использовать вместо этого.Например, вы можете сместить только один операнд, поэтому вы не можете получить дополнительное смещение за единицу, сдвинув оба входа влево на add на одинаковую величину.


Вы можетебыть в состоянии оптимизировать дополнительное немедленное смещение, если код , использующий , результат может применить константную часть смещения позже.

Я не уверен, если использовать стволshiftt добавляет задержку на некоторые ARM-арки, но в этом случае было бы не идеальным иметь в цикле множество инструкций, каждый из которых выполняет дополнительный сдвиг, а не одну дополнительную инструкцию для сохранения результата сдвига в регистре.

И, конечно, если вы хотите использовать его с инструкциями, которые должны сдвинуть другой операнд, вам понадобится конечное значение.

...