求ARM clang下aeabi_ldivmod与__divmoddi4内建函数的接口定义
关于ARM嵌入式编译中
__divmoddi4与aeabi_ldivmod的接口及源码问题 1. __divmoddi4的源码与寄存器接口
__divmoddi4是compiler-rt项目中的通用64位有符号除法取模实现,可在该项目的lib/builtins目录下找到其C语言实现文件divmoddi4.c;若需ARM架构的汇编实现,可查看对应ARM子架构的内置函数目录(若未找到特定汇编版本,通用C实现会被编译使用)。
其ARM平台的寄存器调用规则严格遵循AAPCS(ARM架构过程调用标准):
- 输入参数:
- 64位被除数:高32位存入
R1,低32位存入R0 - 64位除数:高32位存入
R3,低32位存入R2
- 64位被除数:高32位存入
- 输出结果:
- 64位商:高32位存于
R1,低32位存于R0 - 64位余数:高32位存于
R3,低32位存于R2
- 64位商:高32位存于
2. aeabi_ldivmod的接口
aeabi_ldivmod是遵循**AEABI(ARM嵌入式应用二进制接口)**标准的封装函数,其接口可结合标准规范与你找到的汇编源码推导:
- 输入参数(寄存器传递):
- 64位被除数:高32位在
R1,低32位在R0 - 64位除数:高32位在
R3,低32位在R2 - 余数输出指针(
int64_t*):作为第三个参数,若寄存器资源不足则通过栈传递(可从你找到的汇编源码中r4保存余数指针的逻辑验证)
- 64位被除数:高32位在
- 输出逻辑:
- 64位商:以
R1:R0组合作为返回值(符合AAPCS的64位返回规则) - 64位余数:由
__divmoddi4计算后,写入输入时指定的输出指针指向的内存地址
- 64位商:以
内容的提问来源于stack exchange,提问作者ysap
相关产品推荐
相关产品推荐

