XPERM8

RISC-V XPERM8 指令详解

指令手册R-type

字节查表置换(Zbkx)。

指令语法

xperm8 rd, rs1, rs2

语法为 xperm8 rd, rs1, rs2;操作数为整数 x0–x31 或 ABI 名称,没有汇编立即数。

32 位 OP:funct7=0010100、funct3=100、opcode=0110011。

RV32/RV64 Zbkx;rs1 保存 XLEN/8 个 8 位表项,rs2 各元素为索引,越界结果为零。

x0 源恒为零,写入 x0 被丢弃;重叠源/目标读取写回前的值,同名源只有一个值。不访问内存。

Zbkx位操作

指令行为说明

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

XPERM8 指令解析与执行动画

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

执行环境

x0 恒为零;源值在写回前读取。教学步骤不表示处理器周期。

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 在整数寄存器内查表:rs1 保存 XLEN/8 个字节,rs2 的各字节选择对应表项;越界索引写零。

支持 RV32 与 RV64;每个表项和索引均为 8 位。
索引从最低有效元素起编号为 0;越界写零,不取模。

常见使用场景

位操作

RV32 Zbkx,x11=0xA1B2C3D4、x12=0x00010203:xperm8 x10, x11, x12 得到 x10=0xD4C3B2A1。

寄存器内查表

RV32 Zbkx,x11=0xA1B2C3D4、x12=0x00010203:xperm8 x10, x11, x12 得到 x10=0xD4C3B2A1。

使用前检查清单

语法检查
  • 语法为 xperm8 rd, rs1, rs2;操作数为整数 x0–x31 或 ABI 名称,没有汇编立即数。
  • 32 位 OP:funct7=0010100、funct3=100、opcode=0110011。
语义检查
  • RV32/RV64 Zbkx;rs1 保存 XLEN/8 个 8 位表项,rs2 各元素为索引,越界结果为零。
  • x0 源恒为零,写入 x0 被丢弃;重叠源/目标读取写回前的值,同名源只有一个值。不访问内存。

容易混淆 / 常见误区

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

常见问题

XPERM8 是否访问内存?

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

XPERM8 属于哪个扩展?

它属于 Zbkx 交叉置换扩展。