为什么“长长”参数需要在 RISC-V 中“对齐奇偶寄存器对”

问题描述

正如RISC-V calling convention documentation所说:

当在堆栈上传递两倍于指针字大小的原始参数时,它们是 自然对齐。当它们在整数寄存器中传递时,它们驻留在对齐的奇偶校验中 寄存器对,偶数寄存器保存最低有效位。例如,在 RV32 中, 函数 void foo(int,long long) 在 a0 中传递它的第一个参数,在 a2 中传递它的第二个参数 a3. a1 中什么都没有传递。

为什么不使用 a1a2 而不是 a2a3?所以我们可以通过寄存器传递更多的参数。

解决方法

通常,这样做是为了让简单的代码可以将所有寄存器刷新到内存中,并获得您期望的结果,就像首先使用内存来传递对齐良好的参数一样——这通常很重要带有可变参数函数。

然而,我们应该注意,对于非可变参数函数,clang 和 gcc 都没有直接遵循这一点。它们都使用 a0 表示 inta1a2 表示 long long(其中 a1 是低阶,{{1} } a2 的高阶).

long long

结果

long long square(int num,long long foo) {
    return foo + 100;
}

叮当声:https://godbolt.org/z/9Pez4r

gcc:https://godbolt.org/z/b4dMsr


只有当我们使用 varargs 时,我们才会看到编译器跳过 square: addi a0,a1,100 sltu a1,a0,a1 add a1,a2 ret :

a1

结果

long long square(int num,...);

int test () {
    square ( 100,(long long) 200 );
}

https://godbolt.org/z/4xWc1E

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...