C.LUI 指令(RISC-V 的压缩子集)的操作数是什么?

mik*_*307 0 assembly compilation instructions riscv

在 RISC-V 手册中写了这个指令:

C.LUI 将非零的 6 位立即数字段加载到目标寄存器的第 17-12 位,清除低 12 位,并将第 17 位符号扩展到目标的所有高位

由此我得出结论,立即数应该是 6 位,但是后来我正在编译一些东西,可以编译这一行,但是立即数的宽度超过 6 位,所以我很困惑 c.lui x14,0xffff8

yfl*_*ion 5

c.lui 将接受任何 20 位立即数,只要所有位 5 到 19 具有相同的值(1 或 0)。
所以基本上 c.lui 将接受 0xfffe0 和 0xfffff 之间的任何值以及 1 和 0x1f 之间的任何值。0x0 也不被接受(见https://riscv.org//wp-content/uploads/2017/05/riscv-spec-v2.2.pdf

对于您的示例
c.lui a4,0xffff8 将给出指令 0x7761 从该指令中提取的立即数是 0x38,如果您将其移位 12,您将获得 0x38000,之后当您签署扩展时,您将获得:0xffff8000