; он уже ответил на все ваши вопросы в комментариях после того, как я его опубликовал.

пасибо, что работает. @PeterCordes. Также__int128 работает. Но еще одна вещь, как вы сказали, используя присущие многоточности арифметики, это_addcarry_u64 в C, используя заголовочный файлimmintrin.h У меня есть следующий код

#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;
}

Можете ли вы указать мне на ошибку? Я получаю неопределенную ссылку на_addcarry_u64, Некоторые быстрые Google не отвечают на проблему, если какой-либо другой файл заголовка будет использоваться или он не совместим с GCC и почему так

Первоначально у меня был этот код для добавления двух 64-битных чисел:

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)); \
 }

Теперь я узнал, что скорость этой реализации можно улучшить, используя язык ассемблера. Поэтому я пытаюсь сделать что-то подобное, однако я не могу получить или вернуть керри. Вот мой код:

#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;
}

Результатом этого сложения должно быть 14B100361BFB66EB1, где начальный 1 в msb - это перенос. Я хочу сохранить этот перенос в другом регистре. Я пробовал jc, но я получаю ту или иную ошибку. Даже setc дал мне ошибку, возможно, потому что я не уверен в синтаксисе. Так может ли кто-нибудь сказать мне, как сохранить перенос в другом регистре или вернуть его, изменив этот код?

Ответы на вопрос(1)

Ваш ответ на вопрос