Очистить верхние 16 бит в 1 инструкции ARM - PullRequest
3 голосов
/ 16 ноября 2008

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

(0-256)^2n.

Теперь моя проблема в том, что я хочу очистить старшие 16 бит r0 и заменить его полусловом, хранящимся в r1. Но из-за ограниченного круга непосредственных участников я должен сделать: -

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

Можно ли заменить 2 двухсторонние инструкции одной инструкцией? 0xffff0000 не кодируется. Возможно, мне следует использовать другую логическую операцию, чтобы очистить старшие 16 бит?

Спасибо

РЕДАКТИРОВАТЬ: Извините, я забыл сказать, что старшие 16 бит R1 пуст, и я использую ARM7TDMI

Ответы [ 7 ]

5 голосов
/ 17 ноября 2008

Если у вас достаточно новое ядро ​​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

4 голосов
/ 17 ноября 2008

Как насчет:

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(Предполагается, что верхнее полуслово r1 пусто, как это сделал ваш ссылочный код.) В зависимости от обстоятельств вы можете пропустить последний элемент mov здесь, объединив его с более поздним кодом.

2 голосов
/ 17 ноября 2008

«заменить его полусловом, хранящимся в r1» - значит ли это, что вы можете считать, что верхние 16 бит r1 равны нулю? Если это так,

add r0, r1, r0 lsl #16
mov r0, r0 ror #16

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

1 голос
/ 17 ноября 2008

На ARMv6 (например, MPCore) вы можете сказать

    uxth    r1, r1
    orr     r0, r1, r0, asl #16
0 голосов
/ 29 апреля 2014

Вы можете использовать инструкцию BFC. Битовое поле очищено. Эта инструкция очищает n бит от m bit

0 голосов
/ 16 ноября 2008

Для кода C

 (a<<16)|((short)b)

gcc генерирует

    mov     r1, r1, asl #16
    mov     r1, r1, asr #16
    orr     r0, r1, r0, asl #16

, который не использует непосредственные значения - это все же две инструкции

0 голосов
/ 16 ноября 2008

Если вы можете очистить все это, вы можете xor это с собой.

Если вам нужно сохранить нижнюю половину, можете ли вы сдвинуть регистр влево на 8 бит и обратно? Это может быть то же количество инструкций.

...