如何解决为什么“长长”参数需要在 RISC-V 中“对齐奇偶寄存器对”
正如RISC-V calling convention documentation所说:
当在堆栈上传递两倍于指针字大小的原始参数时,它们是 自然对齐。当它们在整数寄存器中传递时,它们驻留在对齐的奇偶校验中 寄存器对,偶数寄存器保存最低有效位。例如,在 RV32 中, 函数 void foo(int,long long) 在 a0 中传递它的第一个参数,在 a2 中传递它的第二个参数 a3. a1 中什么都没有传递。
为什么不使用 a1
和 a2
而不是 a2
和 a3
?所以我们可以通过寄存器传递更多的参数。
解决方法
通常,这样做是为了让简单的代码可以将所有寄存器刷新到内存中,并获得您期望的结果,就像首先使用内存来传递对齐良好的参数一样——这通常很重要带有可变参数函数。
然而,我们应该注意,对于非可变参数函数,clang 和 gcc 都没有直接遵循这一点。它们都使用 a0
表示 int
和 a1
,a2
表示 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 );
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。