Como acessar o sinalizador de transporte ao adicionar dois números de 64 bits usando asm em C

Sim, obrigado, isso funciona. @PeterCordes. Além disso__int128 trabalho. Mas mais uma coisa, como você disse, usando os intrínsecos da aritmética de multiprecisão que é_addcarry_u64 em C, usando o arquivo de cabeçalhoimmintrin.h eu tenho o seguinte 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;
}

Você pode me indicar o erro? Estou recebendo uma referência indefinida_addcarry_u64. Algum google rápido não responde ao problema, se qualquer outro arquivo de cabeçalho deve ser usado ou não é compatível com o gcc e por que motivo

Inicialmente, eu tinha esse código para adicionar dois 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)); \
 }

Agora eu soube que a velocidade dessa implementação pode ser melhorada usando a linguagem assembly. Portanto, estou tentando fazer algo semelhante, no entanto, não consigo acessar ou devolver o transporte. Aqui está o meu 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;
}

O resultado dessa adição deve ser 14B100361BFB66EB1, onde o 1 inicial em msb é o transporte. Eu quero salvar esse transporte em outro registro. Eu tentei jc, mas estou recebendo algum ou outro erro. Mesmo setc me deu erro, pode ser porque não tenho certeza da sintaxe. Então, alguém pode me dizer como salvar o carry em outro registro ou devolvê-lo modificando este código?

questionAnswers(1)

yourAnswerToTheQuestion