[英]Understanding PowerPC rlwinm instruction
所以我终于说服自己尝试学习/使用PowerPC(PPC)。 一切进展顺利,大多数信息都是在网上找到的。 但是,在查看一些示例时,我发现了这个:
rlwinm r3, r3, 0,1,1
我怎么用C做这个? 我尝试做一些研究,但找不到任何帮助我的东西。 提前致谢!
rlwinm
代表“立即旋转左字然后使用蒙版aNd,它的正确用法是
rlwinm RA, RS, SH, MB, ME
根据描述页面 :
- RA指定存储操作结果的目标通用寄存器。
- RS指定用于操作的源通用寄存器。
- SH指定操作的移位值。
- MB指定操作的掩码的开始值。
- ME指定操作的掩码的结束值。
- BM指定32位掩码的值。
和
- 如果MB值小于ME值+ 1,则在起点和终点之间并包括起点和终点的掩码位被设置为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位变量。
rlwinm
将寄存器的值旋转指定的数字,执行AND
并将结果存储在寄存器中。
示例: rlwinm r3, r4, 5, 0, 31
r4
是旋转了5
的源寄存器,在旋转结果放在r3
,它也是AND
位,只有1s的位掩码,因为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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.