所以我最终决定学习和使用PowerPC(PPC)。 一切进展顺利,大部分信息都可以在网上找到。 然而,在查看一些示例时,我遇到了这个问题:
rlwinm r3, r3, 0,1,1
我该如何用C语言实现这个功能? 我尝试了一些研究,但没有找到任何有用的信息。 提前感谢您的帮助!
rlwinm
代表“左移后立即与掩码相与”,它的正确用法是
rlwinm RA, RS, SH, MB, ME
并且
- RA 指定操作结果存储的目标通用寄存器。
- RS 指定操作的源通用寄存器。
- SH 指定操作的移位值。
- MB 指定操作掩码的起始值。
- ME 指定操作掩码的结束值。
- BM 指定32位掩码值。
因此,在您的示例中,源和目标是相同的。移位量为
- 如果 MB 值小于 ME 值 + 1,则从起始点到终点,包括这两个点之间的掩码位都设置为 1。所有其他位都设置为 0。
- 如果 MB 值等于 ME 值 + 1,则所有 32 个掩码位都设置为 1。
- 如果 MB 值大于 ME 值 + 1,则在 ME 值 + 1 和 MB 值 - 1 之间的所有掩码位都设置为 0。所有其他位都设置为 1。
0
,因此不移位。而 MB=ME=1
,因此使用第一种情况,掩码变为所有位都是 0,其中第 1 位是 1
,从 MSB=0
开始编号:0x40000000
。a &= 0x40000000;
假设a
是32位变量。
rlwinm
指令将一个寄存器的值向左旋转指定数量,执行一个AND
操作,并将结果存储到另一个寄存器中。
例如:rlwinm r3, r4, 5, 0, 31
r4
是源寄存器,它被旋转了5
次,在旋转结果放入r3
之前,还需要与一个只有1的位掩码进行AND
操作,因为0
和31
之间的区间是整个32位值。
示例来自这里。
如果要进行C
实现,您可能需要查看如何左旋转和如何执行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;
}