XPERM4

RISC-V XPERM4 指令详解

指令手册R-type

半字节查表置换(Zbkx)。

指令语法

xperm4 rd, rs1, rs2

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

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

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

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

Zbkx位操作

指令行为说明

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

XPERM4 指令解析与执行动画

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

执行环境

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

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

当前计算

0: 8 -> 0 0
1: 9 -> 0 0
2: A -> 0 0
3: B -> 0 0
4: C -> 0 0
5: D -> 0 0
6: E -> 0 0
7: F -> 0 0

x[rs2] indexes 8 entries in x[rs1]; result = 0x00000000

步骤: decode

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

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

快速理解与检索要点

XPERM4 在整数寄存器内查表:rs1 保存 XLEN/4 个半字节,rs2 的各半字节选择对应表项;越界索引写零。

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

常见使用场景

位操作

RV32 Zbkx,x11=0x89ABCDEF、x12=0x76543210:xperm4 x10, x11, x12 得到 x10=0x89ABCDEF。

寄存器内查表

RV32 Zbkx,x11=0x89ABCDEF、x12=0x76543210:xperm4 x10, x11, x12 得到 x10=0x89ABCDEF。

使用前检查清单

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

容易混淆 / 常见误区

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

常见问题

XPERM4 是否访问内存?

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

XPERM4 属于哪个扩展?

它属于 Zbkx 交叉置换扩展。