ARM7 7命令集提供了在汇编程序中以任意数量正确旋转32位值的有效方法。对于一个操作的第二个操作数,通过将ror #n指定为移位操作数,它是偶数"for free“,但是对于64位整数,指令集不提供直接支持。除了1,31,33或63位位置旋转的特殊情况(更不用说0或32位了),我只知道如何使用四条指令旋转64位值(这很容易,所以我在这里不写)。在这四种特殊情况下,我可以将其简化为三条指令,但我不知道一般情况下该如何做。所以我的问题是:
给定两个寄存器中的64位值,例如R0和R1,是否可以用3 ARM7指令将这个值右旋转n个位置(对于任意的n)?
发布于 2011-03-25 15:48:39
如果有解决办法的话,gcc也不承认:
unsigned long long int reg64 = random_value;
unsigned int n = shift_value;
reg64 = (reg64 >> (n%64)) | (reg64 << ((64-n)%64));结果如下:
n=1:
MOVS R2, R0, LSR #1
MOV R3, R1, RRX
ORR R2, R2, R1, ASL #31n=2-31:
MOV R2, R0, LSR #n
ORR R2, R2, R1, ASL #32-n
MOV R3, R0, ASL #32-n
ORR R3, R3, R1, LSR #nn=33-62:
MOV R3, R0, ASL #64-n
ORR R3, R3, R1, LSR #n-32
MOV R2, R0, LSR, #n-32
ORR R2, R2, R1, ASL #64-nn=63:
ADDS R2, R0, R0
ADC R3, R1, R1
ORR R2, R2, R1, LSR #31https://stackoverflow.com/questions/5379218
复制相似问题