了解PowerPC rlwinm指令

所以我终于说服自己尝试学习/使用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=00x40000000

在C中,我们可以像写一样简单

 a &= 0x40000000; 

假设a是32位变量。

rlwinm将寄存器的值旋转指定的数字,执行AND并将结果存储在寄存器中。

示例: rlwinm r3, r4, 5, 0, 31

r4是旋转了5的源寄存器,在旋转结果置于r3 ,它也是AND位,只有1s的位掩码,因为031之间的间隔是整个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; }