Cómo acceder al indicador de acarreo al agregar dos números de 64 bits usando asm en C

Sí, gracias, eso funciona. @PeterCordes. también__int128 trabajos. Pero una cosa más como dijiste usando la intrínseca de la aritmética de multiprecisión que es_addcarry_u64 en C, usando el archivo de encabezadoimmintrin.h Tengo el siguiente código

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <immintrin.h>

unsigned char _addcarry_u64(unsigned char c_in, uint64_t src1, uint64_t src2,uint64_t *sum);

int main()
{
    unsigned char carry;
    uint64_t sum;
    long long int c1=0,c2=0;
    uint64_t a=0x0234BDFA12CD4379,b=0xA8DB4567ACE92B38;
    carry = _addcarry_u64(0,a,b,&sum);
    printf("sum is %lx and carry value is %u n",sum,carry);
    return 0;
}

¿Me puede indicar el error? Me estoy haciendo referencia indefinida a_addcarry_u64. Algunos google rápidos no responden al problema, si se usa cualquier otro archivo de encabezado o si no es compatible con gcc y por qué

Inicialmente tenía este código para agregar dos números de 64 bits:

static __inline int is_digit_lessthan_ct(digit_t x, digit_t y)
{ // Is x < y?
    return ( int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX-1)); 
}


#define ADDC(carryIn, addend1, addend2, carryOut, sumOut) \
       { digit_t tempReg = (addend1) + (int)(carryIn);    \
                (sumOut) = (addend2) + tempReg;           \
              (carryOut) = (is_digit_lessthan_ct(tempReg, (int)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); \
 }

Ahora tengo que saber que la velocidad de esta implementación se puede mejorar usando lenguaje ensamblador. Así que estoy tratando de hacer algo similar, sin embargo, no puedo acceder o devolver el carry. Aquí está mi código:

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
uint64_t add32(uint64_t a,uint64_t b)
{
    uint64_t d=0,carry=0;
    __asm__("mov %1,%%rax\n\t"
            "adc %2,%%rax\n\t"
            "mov %%rax,%0\n\t"
            :"=r"(d)
            :"r"(a),"r"(b)
            :"%rax"
           );
    return d;
}
int main()
{
    uint64_t a=0xA234BDFA12CD4379,b=0xA8DB4567ACE92B38;
    printf("Sum = %lx \n",add32(a,b));
    return 0;
}

El resultado de esta adición debe ser 14B100361BFB66EB1, donde el 1 inicial en msb es el carry. Quiero guardar ese carry en otro registro. Intenté jc, pero recibo un error u otro. Incluso setc me dio un error, puede ser porque no estoy seguro de la sintaxis. Entonces, ¿alguien puede decirme cómo guardar el carry en otro registro o devolverlo modificando este código?

Respuestas a la pregunta(1)

Su respuesta a la pregunta