Gcc prend-il en charge les entiers 128 bits sur AMD64 ?[dupliquer]
-
29-09-2020 - |
Question
Gcc prend-il en charge les entiers 128 bits sur AMD64 ?
Comment le définir ?
Comment utiliser scanf/printf pour le lire/écrire ?
La solution
CCG prend en charge intégré __int128
et unsigned __int128
types (sur les plates-formes 64 bits uniquement), mais il semble que la prise en charge du formatage des entiers 128 bits soit moins courante dans la libc.
Note: <stdint.h>
définit __int128_t
et __uint128_t
sur les versions antérieures à gcc4.6.Voir également Existe-t-il un entier de 128 bits dans gcc ? pour un tableau des versions gcc/clang/ICC.
Comment savoir si __uint128_t est défini pour détecter __int128
Autres conseils
void f(__int128* res, __int128* op1, __int128* op2)
{
*res = *op1 + *op2;
}
Enregistrer dans Test.c et compiler avec:
$ gcc -c -O3 test.c
$ objdump -d -M intel test.o
vous obtenez:
mov rcx, rdx
mov rax, [rsi]
mov rdx, [rsi+0x8]
add rax, [rcx]
adc rdx, [rcx+0x8]
mov [rdi], rax
mov [rdi+0x8], rdx
Comme vous pouvez le constater que le type __int128
est pris en charge en maintenant deux 64 bits de séquence, puis en leur fonctionnant avec le grand motif Int typique de l'utilisation de deux instructions, par exemple Ajouter, puis ADC (Ajouter avec le transport)