При работе с арифметикой произвольной точности (например, 512-битными целыми числами) есть ли способ заставить GCC использовать ADC и аналогичные инструкции без использования встроенного ассемблера?
Первый взгляд на исходный код GMP показывает, что у них просто есть реализации сборки для каждой поддерживаемой платформы.
Вот написанный мной тестовый код, который добавляет два 128-битных числа из командной строки и выводит результат. (Вдохновленный add_n mini-gmp):
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
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
.
_addcarry_u64
="добавление нескольких слов с использованием флага переноса"> stackoverflow.com/questions/29029572/ - person Z boson   schedule 23.03.2015_addcarry_u64
. Я только что попробовал, и действительно, он выдает 1xadd
и 3xadc
! Что там с GCC и Clang? - person Z boson   schedule 23.03.2015