理解PowerPC rlwinm指令

6

所以我最终决定学习和使用PowerPC(PPC)。 一切进展顺利,大部分信息都可以在网上找到。 然而,在查看一些示例时,我遇到了这个问题:

rlwinm    r3, r3, 0,1,1

我该如何用C语言实现这个功能? 我尝试了一些研究,但没有找到任何有用的信息。 提前感谢您的帮助!

2个回答

7

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
在 C 语言中,我们可以简单地编写如下:
a &= 0x40000000;

假设a是32位变量。


2

rlwinm指令将一个寄存器的值向左旋转指定数量,执行一个AND操作,并将结果存储到另一个寄存器中。

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

r4是源寄存器,它被旋转了5次,在旋转结果放入r3之前,还需要与一个只有1的位掩码进行AND操作,因为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;
}

1
请注意,PowerPC从左侧计算位数,其中MSB =位0。(许多其他ISA(如x86)从右侧计算位数)。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接