了解PowerPC rlwinm指令

时间:2015-06-17 15:56:51

标签: c powerpc

所以我终于说服自己尝试学习/使用PowerPC(PPC)。 一切进展顺利,大多数信息都是在网上找到的。 但是,在查看一些例子时,我发现了这个:

rlwinm    r3, r3, 0,1,1

我将如何在C中执行此操作? 我尝试做一些研究,但找不到任何帮助我的东西。 提前谢谢!

2 个答案:

答案 0 :(得分:5)

rlwinm代表“立即旋转左字然后用面具旋转aNd,正确用法是

rlwinm  RA, RS, SH, MB, ME

根据description page

  
      
  • 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,因为031之间的间隔是整个32位值。

取自here

的示例

对于C实施,您可能需要查看how to rotate lefthow 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;
}