2012-08-22 2 views
1

Я в настоящее время переписываю часть кода C, пытаясь воспользоваться расширениями Armv6 SIMD и DSP (я начинаю учебу относительно языка сборки ARM).Есть ли более эффективный способ выполнения арифметического сдвига вправо двух подписанных половин?

До сих пор я добился огромных успехов, используя SMUSD и SMUADX для реализации комплексного умножения чисел. Эти инструкции предполагают, что вещественные и мнимые части сложного числа хранятся на 16-битных половинах одного 32-битного регистра.

Перед выполнением некоторого сложного множителя мне необходимо выполнить арифметическое смещение вправо и влево с половиной слова на 1 бит.

Это мой текущий код, который, как я подозреваю, далек от эффективности и, вероятно, существует гораздо более быстрый способ. Я обеспокоен, поскольку этот код работает в сжатые цикле алгоритма, а некоторые из циклов, полученных за счет перехода на SMUSD и SMUADX теряются этим причудливым код переключения:

mov r0, r0, asr#1 @ arithmetically shift right by 1 
        @ higher half-word is ok, lower half-word is now polluted by 
        @ the higher half-word's lowest bit becoming the sign bit 
        @ of the lower half-word 

tst r0, #0x4000 @ test if the lower-halfword was negative 
        @ (sign bit was shifted, it is now at position 14) 

orrne r0, #0x8000 @ if negative, ensure the sign bit is turned on 
biceq r0, #0x8000 @ if positive, ensure the sign bit is turned off 

Я играл немного с PKHBT и инструкции PKHTB со сменными операциями во втором операнде, но они, похоже, не работают для подписанных полуслов.

Любые предложения будут очень благодарны!

+1

dont вы хотите проверить 0x4000 не 0x0400? –

+0

Вы правы, должно быть 0x4000 - введите ошибку, набрав вопрос, спасибо, что указали! –

ответ

2

Я думаю, что это должно работать:

MOV r1, #0 
SHADD16 r0, r1, r0 

SHADD16 подписан половина слова добавить затем половину результата (который так же, как ASR 1).

+0

Спасибо, Пит, он отлично работает! –