; он уже ответил на все ваши вопросы в комментариях после того, как я его опубликовал.
пасибо, что работает. @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 дал мне ошибку, возможно, потому что я не уверен в синтаксисе. Так может ли кто-нибудь сказать мне, как сохранить перенос в другом регистре или вернуть его, изменив этот код?