RISC-V 使用 LUI / ADDI 在寄存器中生成 -1 / 0xFFFFFFFF?

Kra*_*011 5 assembly riscv

我正在学习如何为 RISC-V 处理器编写代码。我想将一个值存储0xFFFFFFFF到内存/寄存器中。

addi我可以通过在指令前面添加 来扩展指令的 12 个立即位lui,如下所示:

lui t0, 0xFFFFF
addi t0, t0, 0x7FF
Run Code Online (Sandbox Code Playgroud)

但结果会是这样的0xFFFFF7FF

那么,我怎样才能产生这个价值呢?

Pet*_*des 6

询问 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 的补码有符号整数,因此符号扩展仅意味着在扩展时将符号位复制到所有更高的位置。