我需要帮助将此 ppc 指令翻译成 C++

问题描述

有人可以用 C++ 给我看一个例子,我试着练习我的汇编语言技能,我得到的语言是 powerpc,我们正在寻找 44 位移动到 r0 的右侧,然后从那里开始我们正在提取一个 8 位

extrdi r0,r0,8,44

解决方法

ISA 说 extrdi 是“提取并右对齐立即”,它是 rldicl 的扩展助记符(“立即旋转左双字并清除左”)- v2.07 pg 717 . 所以你的语句等价于 rldicl r0,r0,52,56

因此,您希望从位置 44 开始提取 8 位,然后将其右对齐,这将使其成为最低有效的 8 位。值得注意的是,IBM 位数与您可能期望的相反:conventional bit = 63 - IBM bit。所以 IBM 位 44 到 51 是“常规”位号 12 到 19。

我们简单地向下移位,使第 12 位变为第 0 位,第 19 位变为第 7 位 - 移位 12 位。然后我们需要屏蔽它,以便我们只得到最低有效的 8 位。

unsigned long extrdi(unsigned long a) {
  return (a >> 12) & 0xff;
}

查看godbolt.org:https://godbolt.org/z/rGe3EW,我们看到确实是:

extrdi:
        rldicl 3,3,56
        blr
        .long 0
        .byte 0,0

(r3 是参数和返回寄存器)