Я в настоящее время переписываю часть кода 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 со сменными операциями во втором операнде, но они, похоже, не работают для подписанных полуслов.
Любые предложения будут очень благодарны!
dont вы хотите проверить 0x4000 не 0x0400? –
Вы правы, должно быть 0x4000 - введите ошибку, набрав вопрос, спасибо, что указали! –