让GCC在没有内联汇编的情况下使用进位逻辑进行任意精度算术?

使用任意精度算术(例如512位整数)时,有没有办法让GCC在不使用内联汇编的情况下使用ADC和类似指令?

乍一看GMP的源代码显示,它们只是为每个支持的平台提供了汇编实现。

这是我编写的测试代码,它从命令行添加两个128位数字并打印结果。 (受mini-gmp的add_n启发):

#include  #include  #include  int main (int argc, char **argv) { uint32_t a[4]; uint32_t b[4]; uint32_t c[4]; uint32_t carry = 0; for (int i = 0; i < 4; ++i) { a[i] = strtoul (argv[i+1], NULL, 16); b[i] = strtoul (argv[i+5], NULL, 16); } for (int i = 0; i < 4; ++i) { uint32_t aa = a[i]; uint32_t bb = b[i]; uint32_t r = aa + carry; carry = (r < carry); r += bb; carry += (r < bb); c[i] = r; } printf ("%08X%08X%08X%08X + %08X%08X%08X%08X =\n", a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0]); printf ("%08X%08X%08X%08X\n", c[3], c[2], c[1], c[0]); return 0; } 

GCC -O3 -std=c99不生成任何adc指令,如objdump所检查。 我的gcc版本是i686-pc-mingw32-gcc (GCC) 4.5.2

GCC 使用进位标志, 如果它可以看到它需要:
例如,在32位机器上添加两个uint64_t值时,必须生成一个32位ADD和一个32位ADC 。 但是除了那些编译器被迫使用进位的情况之外,可能无法说服w / o汇编程序。 因此,使用可用的最大整数类型来允许GCC通过有效地让它知道值的单个“组件”属于一起来优化操作可能是有益的。

对于简单的加法,另一种计算进位的方法可能是查看操作数中的相关位,如:

 uint32_t aa,bb,rr; bool msbA, msbB, msbR, carry; // ... rr = aa+bb; msbA = aa >= (1<<31); // equivalent: (aa & (1<<31)) != 0; msbB = bb >= (1<<31); msbR = rr >= (1<<31); carry = (msbA && msbB) || ( !msbR && ( msbA || msbB) );