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?