是否存在用于C中的add-with-carry的ARM内在函数?

时间:2016-05-09 23:21:41

标签: arm intrinsics

是否存在ARM C编译器的内在函数来执行add-with-carry操作,或者是否需要使用汇编语言?

在x86上,_addcarry_u64用于附加携带。 (出于特殊目的,还有较新的_addcarryx_u64。)

1 个答案:

答案 0 :(得分:6)

当前版本的gcc没有内在功能。一个问题是'进位标志'的通信。但是,ARM后端确实知道并定义了一组ADC原语,例如addsi3_carryin

对于example

unsigned long long big_inc(unsigned long long x)
{
  return ++x;
}

翻译成,

big_inc(unsigned long long):
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        adds    r0, r0, #1
        adc     r1, r1, #0
        bx      lr

当您遇到类似问题时,查看开源多精度库总是有益的。有OpenSSL bignumGNU MP个库没有任何研究。由于内在不存在,一个更确定的答案(对于你的工作)取决于你想要实现的目标;素数因子,乘法,加法等。您总是可以使用汇编程序或更强大地使用为您的特定整数长度生成汇编程序的脚本。