所以我终于说服自己尝试学习/使用PowerPC(PPC)。 一切进展顺利,大多数信息都是在网上找到的。 但是,在查看一些例子时,我发现了这个:
rlwinm r3, r3, 0,1,1
我将如何在C中执行此操作? 我尝试做一些研究,但找不到任何帮助我的东西。 提前谢谢!
答案 0 :(得分:5)
rlwinm
代表“立即旋转左字然后用面具旋转aNd,正确用法是
rlwinm RA, RS, SH, MB, ME
- RA指定存储操作结果的目标通用寄存器。
- RS指定操作的源通用寄存器。
- SH指定操作的移位值。
- MB指定操作掩码的开始值。
- ME指定操作掩码的结束值。
- BM指定32位掩码的值。
和
- 如果MB值小于ME值+ 1,则掩码位 在起点和终点之间和之间设置为 那些。所有其他位都设置为零。
- 如果MB值与...相同 ME值+ 1,则所有32个掩码位都设置为1。
- 如果MB值大于ME值+ 1,则所有掩码位 在ME值+1和MB值-1之间并包括它们被设置为 零。所有其他位都设置为1。
因此在您的示例中,源和目标是相同的。班次金额为0
,因此没有班次。还有MB=ME=1
,因此第一种情况适用,以便掩码变为全为0,位号为1 1
,而MSB=0
编号:0x40000000
。
在C中,我们可以像
一样简单地编写它a &= 0x40000000;
假设a
是32位变量。
答案 1 :(得分:2)
rlwinm
将寄存器的值旋转指定的数字,执行AND
并将结果存储在寄存器中。
示例:rlwinm r3, r4, 5, 0, 31
r4
是源寄存器,按5
旋转,在将旋转结果放入r3
之前,它也是AND
,只有位掩码1,因为0
和31
之间的间隔是整个32位值。
取自here。
的示例对于C
实施,您可能需要查看how to rotate left和how to AND
,这些内容现在应该很简单。以下内容应该有效:
int rotateLeft(int input, int shift) {
return (input << shift) | ((input >> (32 - shift)) & ~(-1 << shift));
}
int rlwinm(int input, int shift, int mask) {
return rotateLeft(input, shift) & mask;
}