【问题标题】:Is there a more efficient way of performing an arithmetic right-shift of two signed halfwords?有没有更有效的方法来执行两个有符号半字的算术右移?
【发布时间】:2012-08-22 19:24:06
【问题描述】:

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

任何建议将不胜感激!

【问题讨论】:

  • 你不想测试 0x4000 而不是 0x0400?
  • 你说得对,应该是 0x4000 - 输入问题时输入了错误,感谢指出!

标签: assembly arm armv6


【解决方案1】:

我认为这应该可行:

MOV r1, #0
SHADD16 r0, r1, r0

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多