Bonjour,
J'ai écris un programme qui contient une fonction en full asm pour avoir les meilleurs perfs.
Voici le code de la fonction :
[CODE]__declspec
(align(16)) double tab1[4], tab2[4];
__declspec
(naked) double sincosadd_asm() {
__declspec(align(16)) double r;
__asm {
movapd xmm0, qword ptr[tab1]
addpd xmm0, qword ptr[tab2]
movapd xmm1, qword ptr[tab1 + 16]
addpd xmm1, qword ptr[tab2 + 16]
addpd xmm0, xmm1
movsd xmm2, xmm0
unpckhpd xmm0, xmm0
addsd xmm2, xmm0
movsd qword ptr[r], xmm2
fld qword ptr[r]
ret
}
}
[/CODE]
Je compile avec Intel C++ et il m'affiche des avertissements sur ce code du genre :
warning #1980: bad memvx128 qualifier -- __asm movapd
J'ai donc réecris la fonction en C++
[CODE]
double
sincosadd() {
__declspec(align(16)) double t[4];
for(DWORD i = 0; i < 4; ++i)
t[i] = tab1[i] + tab2[i];
return t[0] + t[1] + t[2] + t[3];
}
[/CODE]
Et regardé l'ASM qu'il génère :
push ebp ;21.20
mov ebp, esp ;21.20
and esp, -16 ;21.20
sub esp, 16 ;21.20
$LN65:
movaps xmm0, XMMWORD PTR ?tab1@@3PANA ;24.10
$LN67:
addpd xmm0, XMMWORD PTR ?tab2@@3PANA ;24.20
$LN69:
movaps xmm1, XMMWORD PTR ?tab1@@3PANA+16 ;24.10
$LN71:
addpd xmm1, XMMWORD PTR ?tab2@@3PANA+16 ;24.20
$LN73:
movaps xmm2, xmm0 ;24.3
$LN75:
unpckhpd xmm0, xmm0 ;25.30
$LN77:
$LN79:
$LN81:
addsd xmm2, xmm0 ;25.16
$LN83:
addsd xmm2, xmm1 ;25.23
$LN85:
unpckhpd xmm1, xmm1 ;25.30
addsd xmm2, xmm1 ;25.30
movsd QWORD PTR [esp], xmm2 ;25.30
fld QWORD PTR [esp] ;25.30
mov esp, ebp ;25.30
pop ebp ;25.30
ret ;25.30
ALIGN 2
Je n'ai pas l'impression que movaps soit la bonne instruction puisque je manipule des flottants double précision et que movaps c'est pour copier des flottants simple précision alors que l'instruction qui suit est addpd (ajouté paquet de flottant double précision).
Bref tout ça pour vous demander, pensez vous comme moi que le compilo pête les plombs pour m'avertir que je n'utilise pas correctement les bonnes instructions alors qu'a en regardé son code ce qu'il génère n'est guère mieux et même pire?