powerpc - 无知关于insrwi指令

标签 powerpc

我查了一下,没有什么能很好地解释它。它说 rlwimi 可以用来等效于它,但我也不知道该指令。

其中的代码:

 andi.     r0, r6, 3     # while(r6 != 3)
 bdnzf     eq, loc_90014730 # if(CTR != 0) loc_90014730();
 insrwi    r4, r4, 8,16  # ????
 srwi.     r0, r5, 4     # r0 = r5 >> 4;
 insrwi    r4, r4, 16,0

(r4==0)

我已经坚持这条指令有一段时间了。请不要只给我结果,请给我详细的解释。

最佳答案

我认为你需要用 rlwimi 做一些实验才能向自己充分解释它,但我发现以下是有帮助的。

《Power PC 编程手册》第 1 册中有关于 rlwimi 的编程说明,其中提供了有关 inslwi 和 insrwi 的更多详细信息:

rlwimi can be used to insert an n-bit field that is left-justified in the low-order 32 bits of register RS, into RAL starting at bit position b, by setting SH=32-b, MB=b, and ME=(b+n)-1. It can be used to insert an n-bit field that is right-justified in the low-order 32 bits of register RS, into RAL starting at bit position b, by setting SH=32-(b+n), MB=b, and ME=(b+n)-1.

它还有助于比较 insrwi 和 inslwi 的结果。下面是两个跟踪 rlwimi 过程的示例,其中 r4=0x12345678。

insrwi r4,r4,8,16 相当于 rlwimi r4,r4,8,16,23

  1. 左移 8 位,注意它将原始 r4 的最后 8 位放入与生成的掩码匹配的位置:0x34567812
  2. 生成掩码:0x0000FF00
  3. 在生成的掩码的控制下插入最后 8 位,即 r4 中右对齐的 8 位:0x12347878

因此 insrwi 从右侧取出 n 位(从第 32 位开始)并将它们插入到从 b 位开始的目标寄存器中。

inslwi r4,r4,8,16 相当于 rlwimi r4,r4,16,16,23

  1. 左移 16 位,注意它将原始 r4 的前 8 位放入与生成的掩码匹配的位置:0x56781234
  2. 生成掩码:0x0000FF00
  3. 在生成的掩码的控制下插入前 8 位,即 r4 中左对齐的 8 位:0x12341278

因此inslwi从左侧取出n位(从位0开始)并将它们插入到从位b开始的目标寄存器中。

关于powerpc - 无知关于insrwi指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26543132/

相关文章:

c++ - 使用 gcc 编译时 PowerPC 上的 long double 错误

c++ - 为什么全局变量没有用我在 extern 变量中给出的字符串初始化

linux - 如何在Linux中启用ddr的ecc?

c - Powerpc arch 上的 gcc 内联汇编程序隐式函数声明

xbox360 - 对 PowerPC 的寄存器值感到困惑?

c - 64 位算法在 32 位应用程序中提供错误输出

c - 1252-142 由于本地标签,AIX 汇编程序出现语法错误

linux-kernel - Linux 内核 - 错误 : Failed to allocate 0x6b3c bytes below 0x1000000

c - 线程本地存储 (TLS) - 编译器错误