Salut

J'utilise habituellement les fonctions intrasics d'Intel pour optimiser du code C++ avec des instructions SSE.
Mais en regardant le code généré en mode release par mon compilo (ICL) , j'ai remarqué que ce n'est pas optimal pour la vitesse sur un point particulier:
Quand une constante est utilisée à plusieurs reprises, le compilo la garde dans un registre SSE pour la réutiliser.

Par exemple, pour ce code simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
a=_mm_mul_ps(a,_mm_set_ps1(10))
b=_mm_mul_ps(b,_mm_set_ps1(10))
le compilo génère qqch du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
movaps      xmm7,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)] // charge la constante
mulps       xmm0,xmm7 // xmm0=xmm0*xmm7
mulps       xmm1,xmm7 // xmm1=xmm1*xmm7
Je souhaiterais obtenir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
mulps       xmm0,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)]
mulps       xmm1,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)]
La stratégie du compilo est peut-être généralement payante, mais dans mon cas c'est plus lent. J'en suis sûr, car quand je modifie dans mon code C++ les valeurs des constantes pour n'en avoir aucune identique, le code généré est plus rapide (mais erroné...).
Mon explication: + de place dans les registres => + de résultats temporaires sont gardés dans les registres => - d'aller retour avec la pile => + rapide

Question: comment forcer mon compilo à compiler à ma manière.
Peut-être en insérant de l'assembleur? Mais je n'ai pas réussi! (Je suis nul en assembleur)
Il me faudrait écrire qqch dans le genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
__asm mulps a, 10;
__asm mulps b, 10;
J'ai a priori 2 problèmes:
- je crois pas qu'il soit possible d'utiliser des variables directement avec __asm
- je ne vois pas comment aller charger la bonne valeur de constante