RISC-V调用约定详解:RV32G/RV64G与RV32E规范

需积分: 22 84 下载量 91 浏览量 更新于2024-08-08 收藏 3.65MB PDF 举报
调用约定在RISC-V架构中的重要性体现在其对程序执行效率和内存管理的标准化处理。在中移4G.cat1模组 ML302产品规格说明书中,章节20详细描述了针对RV32(32位)和RV64(64位)架构的两种调用约定:基本ISA加上标准通用扩展(RV32G和RV64G)。这些约定关注于如何在缺乏浮点单元的情况下,通过软浮点进行函数参数传递和内存操作。 首先,C编译器支持的数据类型在RV32和RV64中有所不同。在RV32中,所有整数类型(如int、long、long long)均为32位,采用ILP32整数模型,而RV64则支持64位整数。此外,C语言中的float和double在RV32和RV64中分别占用32和64位,且对数据类型进行存储时遵循自然对齐规则。例如,char和unsigned char在存储时会被零扩展,而signed char和short则根据符号扩展。 对于RVG调用约定,RISC-V倾向于在寄存器中传递尽可能多的参数,最多使用8个整数寄存器a0-a7。调用约定的变化包括: 1. 对于RV64,增加了对32位整数类型如int的正确符号扩展,确保在保存到寄存器时保持数据完整性。 2. 修改了长指令编码,以优化指令格式,尤其是在处理大地址空间时。 3. 引入了计数器寄存器,并将其标准化描述在基本整数指令集中,而不是仅限于浮点部分。 4. CALL和SBREAK指令更名为了ECALL和EBREAK,保持了原有的功能但更新了标识。 5. 对浮点NaN处理和转换溢出规则进行了澄清,确保一致性。 6. LR/SC操作的规范得到了修订,包括压缩指令的使用。 7. 提出了RV32E基本ISA,旨在减少整数寄存器的需求,简化设计。 8. 软浮点调用约定的栈对齐规则有所调整,并特别描述了针对RV32E的调用约定。 9. C压缩扩展提案得到了更新,版本1.9,强调了基本ISA和通用扩展在未来版本中的稳定性。 RISC-V的调用约定对于编写高效的RISC-V程序至关重要,它定义了数据在函数调用和内存访问中的布局,确保了不同架构之间的互操作性和代码的可移植性。同时,随着RISC-V的发展,不断优化的调用约定反映了对性能和兼容性的持续追求。