是否有更有效的方法来执行两个有符号半字的算术右移?

时间:2012-08-22 19:24:07

标签: assembly arm armv6

我目前正在重写部分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指令玩了一下第二个操作数上的移位操作,但它们似乎不适用于带符号的半字。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

我认为这应该有效:

MOV r1, #0
SHADD16 r0, r1, r0

SHADD16签名为半字加,然后是结果的一半(与ASR为1相同)。