Une bibli de calculs, par définition ça demande des perfs sinon...
On va faire du unsigned pour l'exemple (mieux pour fibonacci):
typedef struct _BNUINT128 {
DWORD d[4];
} BNUINT128, *LPBNUINT128;
Déclaration de l'addition (fera a += b):
void __fastcall bnADDu128(LPBNUINT128 a, LPBNUINT128 b);
Si on veut conserver l'original a, en faire une copie préalable.
Toutes opérations en __fastcall, les PUSH et POP ne sont pas gratuits, voire très couteux.
Fichier ASM 32 bits:
bnADDu128 PROC ; ecx = *a, edx = *b
mov eax, [edx]
add [ecx], eax
mov eax, [edx+4]
adc [ecx+4], eax
mov eax, [edx+8]
adc [ecx+8], eax
mov eax, [edx+12]
adc [ecx+12], eax
ret 0 ' RIEN A DEPILER
bnADDu128 ENDP
Fichier ASM 64 bits:
bnADDu128 PROC ; rcx = *a, rdx = *b
mov rax, [rdx]
add [rcx], rax
mov rax, [rdx+8]
adc [rcx+8], rax
ret 0 ' RIEN A DEPILER
bnADDu128 ENDP
La soustraction est triviale sur le même modèle, mutiplication et dividion sont un peu plus intéressantes.
ciao...
BruNews, MVP VC++