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。