zext.h
RISC-V zext.h:Zbb/Zbkb 指令与等价移位序列
Zbb/Zbkb 指令;另列等价移位序列zext.h 指令将源寄存器低 16 位零扩展到 XLEN。Zbb 扩展提供该指令;Zbkb 扩展的 RV32 PACK 或 RV64 PACKW 在 rs2=x0 时也是 zext.h。RISC-V Assembly Programmer's Manual 另列等价的 SLLI/SRLI 移位序列。
你写下的是
zext.h rd, rs
等价移位序列
slli rd, rs, XLEN - 16
srli rd, rd, XLEN - 16
单条指令与等价移位序列
zext.h 的零扩展操作既有 Zbb/Zbkb 的单条指令形式,也可由 RISC-V Assembly Programmer's Manual 列出的两条移位序列完成。单条指令在 RV32 与 RV64 中编码不同。
Zbb 与 Zbkb 均提供 zext.h 的单条指令形式。没有上述单条指令形式时,可用两条移位指令完成相同的低 16 位零扩展。
官方语义核对重点
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 第 30.9.50 节给出 Zbb 的 zext.h 编码与低 16 位零扩展操作。
第 30.9.26 与 30.9.28 节说明:Zbkb 的 RV32 PACK 与 RV64 PACKW 在 rs2=x0 时也是 zext.h。
RISC-V Assembly Programmer's Manual 列出等价的 SLLI/SRLI 移位序列。
可用性与扩展条件
基础条件
- Zbb 扩展提供 zext.h;RV32 与 RV64 编码不同。
- Zbkb 扩展也提供 zext.h:RV32 对应 PACK 的 rs2=x0 编码,RV64 对应 PACKW 的 rs2=x0 编码。
单指令/标准写法条件
- 目标 ISA 提供 Zbb 或 Zbkb 扩展。
回退/边界
未提供上述单条指令形式时,可用 SLLI/SRLI 等价移位序列完成低 16 位零扩展。备注
- 零扩展低 16 位。
等价移位序列如何工作
步骤 1
在等价序列中,SLLI 将源寄存器左移 XLEN - 16 位,低位补零。
步骤 2
随后 SRLI 逻辑右移,高位补零,得到低 16 位的零扩展结果。
官方依据与阅读顺序
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 第 30.9.50 节给出 Zbb 的 zext.h 编码与语义;第 30.9.26 与 30.9.28 节说明 Zbkb 的 RV32 PACK 与 RV64 PACKW 在 rs2=x0 时也是 zext.h。RISC-V Assembly Programmer's Manual 表 5 列出等价的 SLLI/SRLI 序列。
什么时候优先想到它
目标 ISA 提供 Zbb 或 Zbkb 扩展时,zext.h 有低 16 位零扩展的单条指令形式。
未提供上述单条指令形式时,可用 SLLI/SRLI 等价移位序列完成低 16 位零扩展。
容易混淆 / 常见误区
不能仅凭未启用 Zbb 就断定 zext.h 需要两条指令:Zbkb 的 RV32 PACK 与 RV64 PACKW 在 rs2=x0 时也提供 zext.h。
两条移位序列执行零扩展,不是符号扩展。
常见问题
zext.h 在 Zbb 下是伪指令吗?
不是。非特权 ISA 将 zext.h 定义为 Zbb 的真实指令,并给出 RV32 与 RV64 编码。
没有 Zbb 就必须使用两条移位指令吗?
不是。Zbkb 的 RV32 PACK 与 RV64 PACKW 在 rs2=x0 时也是 zext.h。应先区分目标 ISA 是否提供该单条指令形式。
等价的移位序列是什么?
RISC-V Assembly Programmer's Manual 列出 slli rd, rs, XLEN - 16 后接 srli rd, rd, XLEN - 16,将源寄存器低 16 位零扩展到 XLEN。