我正在学习如何为 RISC-V 处理器编写代码。我想将一个值存储0xFFFFFFFF到内存/寄存器中。
addi我可以通过在指令前面添加 来扩展指令的 12 个立即位lui,如下所示:
lui t0, 0xFFFFF
addi t0, t0, 0x7FF
Run Code Online (Sandbox Code Playgroud)
但结果会是这样的0xFFFFF7FF。
那么,我怎样才能产生这个价值呢?
询问 C 编译器:
unsigned foo(){return 0xFFFFFFFF;}
Run Code Online (Sandbox Code Playgroud)
-O3使用 Clang for RISC-V编译为此 asm (在 Godbolt 上):
foo():
addi a0, zero, -1
ret
Run Code Online (Sandbox Code Playgroud)
(gcc 只是使用li a0, -1伪指令,并将细节留给汇编器。通常您应该这样做,除非您想考虑选择可以更有效地生成的常量。)
RISC-Vaddi将其立即操作数符号扩展为 32(或 64)位,因此如果您想要第 12 位为 1,则需要在选择高位时考虑到这一点。
在这种情况下,高位的正确起始值是0这样您可以完全优化lui。
RISC-V 使用 2 的补码有符号整数,因此符号扩展仅意味着在扩展时将符号位复制到所有更高的位置。