1

我目前正在重写一部分 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 指令玩了一下,但它们似乎不适用于有符号半字。

任何建议将不胜感激!

4

1 回答 1

2

我认为这应该有效:

MOV r1, #0
SHADD16 r0, r1, r0

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

于 2012-08-22T21:27:52.847 回答