Очистить старшие 16 бит в 1 инструкции ARM.
-
08-07-2019 - |
Вопрос
В сборке ARM непосредственные значения кодируются 8-битным значением, что означает, что мы можем кодировать только
(0-256)^2n.
Теперь моя проблема в том, что я хочу очистить старшие 16 бит r0 и заменить их полусловом, хранящимся в r1.Но из-за ограниченного диапазона немедленных действий мне нужно сделать:-
bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16
Можно ли заменить две инструкции bic одной инструкцией?0xffff0000 некодируется.Возможно, мне следует использовать другую логическую операцию для очистки старших 16 бит?
Спасибо
РЕДАКТИРОВАТЬ:Извините, я забыл сказать, что старшие 16 бит r1 пусты, и я использую ARM7TDMI.
Решение
Как насчет:
orr r0,r1,r0,lsl #16
mov r0,r0,ror #16
(Это предполагает, что верхний половина R1 пуст, как это сделал ваш контрольный код.) В зависимости от обстоятельств вы можете опустить окончательное движение здесь, объединив его с некоторым более поздним кодом.
Другие советы
Если у вас достаточно новое ядро ARM, заданный вопрос прост:
movt r0, #0
orr r0, r0, r1,lsl#16
Видеть http://www.keil.com/support/man/docs/armasm/armasm_cjagdjbf.htm
Однако если у вас есть ARMv6+, вы можете выполнить весь приведенный пример за один раз:
pkhbt r0, r0, r1,lsl#16
Видеть http://www.keil.com/support/man/docs/armasm/armasm_cihjedjg.htm
«замените его сохраненным полусловом r1» — означает ли это, что вы можете предположить, что старшие 16 бит r1 равны нулю?Если так,
add r0, r1, r0 lsl #16
mov r0, r0 ror #16
Думайте о mov как о заполнителе, так как вы можете переместить ror туда, где в качестве входных данных будет использоваться r0, и действительно выполнить полезную работу в том же цикле.
На ARMv6 (например.MPCore), можно сказать
uxth r1, r1
orr r0, r1, r0, asl #16
Если вы можете очистить все это, вы могли бы xor
это само с собой.
Если вам нужно сохранить нижнюю половину, можете ли вы сдвинуть регистр влево на 8 бит и обратно?Хотя это может быть такое же количество инструкций.
Для кода C
(a<<16)|((short)b)
gcc генерирует
mov r1, r1, asl #16
mov r1, r1, asr #16
orr r0, r1, r0, asl #16
который не использует никаких немедленных действий - тем не менее, это все равно две инструкции.
Вы можете использовать инструкцию BFC.Битовое поле очищено.Эта инструкция очищает n бит из m бита.