我目前正在重写部分C代码,试图利用Armv6 SIMD和DSP扩展(我是ARM汇编语言的初学者)。
到目前为止,我已经使用SMUSD和SMUADX实现了复数乘法。这些指令假设复数的实部和虚部存储在单个32位寄存器的16位半字上。
在执行某个复数乘法之前,我需要将两个有符号半字的算术右移一位。
这是我目前的代码,我怀疑它远没有效率,可能还有更快的方法。我很担心,因为这个代码在算法的最严格的循环中运行,并且切换到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指令玩了一下第二个操作数上的移位操作,但它们似乎不适用于带符号的半字。
任何建议都将不胜感激!
答案 0 :(得分:2)
我认为这应该有效:
MOV r1, #0
SHADD16 r0, r1, r0
SHADD16签名为半字加,然后是结果的一半(与ASR为1相同)。