在 C 中是否有用于 add-with-carry 的 ARM 内在函数?
Are there ARM intrinsics for add-with-carry in C?
ARM C 编译器是否存在内部函数来进行加进位操作,还是必须使用汇编语言?
在 x86 上,_addcarry_u64
用于 add-with-carry。 (还有用于特殊用途的较新的 _addcarryx_u64
。)
当前版本的 gcc 没有内在函数。一个问题是 'carry flag' 的通信。但是,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 bignum and GNU MP 个图书馆没有任何研究。由于内在不存在更明确的答案(对于您的工作)取决于您想要实现的目标;质因数、乘法、加法等。您始终可以使用汇编程序,或者更强大地使用为您的特定整数长度生成汇编程序的脚本。
ARM C 编译器是否存在内部函数来进行加进位操作,还是必须使用汇编语言?
在 x86 上,_addcarry_u64
用于 add-with-carry。 (还有用于特殊用途的较新的 _addcarryx_u64
。)
当前版本的 gcc 没有内在函数。一个问题是 'carry flag' 的通信。但是,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 bignum and GNU MP 个图书馆没有任何研究。由于内在不存在更明确的答案(对于您的工作)取决于您想要实现的目标;质因数、乘法、加法等。您始终可以使用汇编程序,或者更强大地使用为您的特定整数长度生成汇编程序的脚本。