我目前正在重写一部分 C 代码,试图利用 Armv6 SIMD 和 DSP 扩展(我是 ARM 汇编语言的初学者)。
到目前为止,我在使用 SMUSD 和 SMUADX 实现复数乘法方面取得了巨大的进步。这些指令假定复数的实部和虚部存储在单个 32 位寄存器的 16 位半字上。
在执行某个复数乘法之前,我需要对两个有符号半字执行算术右移 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 指令玩了一下,但它们似乎不适用于有符号半字。
任何建议将不胜感激!