XPERM8

RISC-V XPERM8 指令详解

指令手册R-type

字节查表置换(Zbkx)。

指令语法

xperm8 rd, rs1, rs2
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
Zbkx位操作

指令行为说明

XPERM8(Zbkx)把 rs1 看作由 XLEN/8 个 8 位元素组成的表,把 rs2 的每个 8 位元素看作索引。对每个结果位置,若索引小于 XLEN/8,则从 rs1 中选取对应 8 位元素写入 rd;否则该结果元素写 0。

XPERM8 指令解析与执行动画

每个 8-bit rs2 元素是 rs1 元素表的索引;越界结果元素为零。

funct7
31..25
0010100
rs2
24..20
01100
rs1
19..15
01011
funct3
14..12
100
rd
11..7
01010
opcode
6..0
0110011

当前计算

0: 0 -> D4
1: 1 -> C3
2: 2 -> B2
3: 3 -> A1

x[rs2] indexes 4 entries in x[rs1]; result = 0xA1B2C3D4

步骤: decode

显示当前指令的固定字段和寄存器字段。

x[a0] <- 0xA1B2C3D4
1/4: decode

快速理解与检索要点

XPERM8 是 Zbkx 交叉寄存器置换指令;页面按官方 B 扩展的操作定义校对。

指令按 XLEN 宽度的 8 位元素操作。
不要把 rs2 索引取模;越界结果元素为 0。

常见使用场景

位操作

结合 «xperm8 a0, a1, a2» 等实际代码理解该场景。

寄存器内查表

结合 «xperm8 a0, a1, a2» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认 rd、rs1、rs2(及 rs3)是合法 GPR。
  • 确认 funct3 与 funct7 字段编码正确。
语义检查
  • 确认结果是否会影响后续分支或地址计算。
  • 确认 rd 寄存器不会被其他指令覆盖。

容易混淆 / 常见误区

索引来自 rs2 的每个 8 位元素;rs1 是被查表的数据源。
索引超出寄存器中元素数量时结果元素为 0,不会取模回绕。
该操作按 XLEN 的 8 位元素数量确定有效索引范围。

常见问题

XPERM8 是否访问内存?

不访问。它只在整数寄存器内重排位字段或查表。

XPERM8 属于哪个扩展?

它属于 Zbkx 交叉置换扩展。