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

问题描述

在RISC-V手册中,此说明的内容如下:

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

据此我得出结论,立即数应为6位,但是随后我正在编译某些内容,并且可以编译此行,但立即数的宽度超过6位,因此感到困惑 c.lui x14,0xffff8

解决方法

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如果从该指令中提取12则立即数是0x38,则得到0x38000,然后在对它进行扩展签名时得到:0xffff8000