换档操作是否在拇指ISA中以分开的指令运行?

时间:2014-03-02 15:39:37

标签: arm

ARM指令可以在其第二个源操作数(见下面的汇编列表)中使用桶形移位器,这是数据处理指令的一部分,因此保存一条指令进行移位。我想知道拇指指令可以利用DP指令中的桶移位吗?或者它应该将班次操作分成独立的指令?我问这个,因为拇指可能没有足够的空间用于编码桶形移位器的指令。

mov r0, r1, LSL #1

1 个答案:

答案 0 :(得分:4)

该示例并不好,因为它是规范lsl r0, r1, #1的替代形式, 具有16位Thumb编码(尽管有标志设置限制)。

另一个ARM指令,如add r0, r0, r1, lsl #1,确实必须作为两个Thumb指令完成,因为正如你所说的那样,没有空间将两个操作都压缩成16位(因此你也限制为r0-r7所以寄存器可以用3位而不是4位编码。

另一方面,Thumb-2通常具有用于立即移位操作数的32位编码,因此在ARMv6T2和更高版本的架构上,您可以将add r0, r0, r1, lsl #1编码为单个指令。

然而,寄存器移位寄存器形式(例如add r0, r0, r1, lsl r2)即使在Thumb-2中也不可用 - 你必须在2个Thumb指令中这样做:

lsl r1, r2
add r0, r1

请注意,与ARM指令不同,此序列会更改r1中的值 - 如果您想保留该值,则需要一个中间寄存器和一个额外的mov指令(或Thumb-2 3寄存器) lsl) - 最后的办法是bx到ARM代码。