• [^] # Re: Assembleur

    Posté par . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 1.

    Une petite bizarrerie de gcc (4.5.1) dans le code généré (O3):


    yvar1[i] += yvar2[i] + yvar3[i];
    4007f0: f2 0f 10 09 movsd (%rcx),%xmm1
    ...
    4007f7: f2 0f 10 10 movsd (%rax),%xmm2
    4007fb: 66 0f 16 49 08 movhpd 0x8(%rcx),%xmm1
    400800: f2 0f 10 22 movsd (%rdx),%xmm4
    400804: 66 0f 16 50 08 movhpd 0x8(%rax),%xmm2
    400809: 66 0f 16 62 08 movhpd 0x8(%rdx),%xmm4
    40080e: 66 0f 28 c1 movapd %xmm1,%xmm0
    400812: 66 0f 28 ca movapd %xmm2,%xmm1
    400816: 66 0f 58 cc addpd %xmm4,%xmm1
    40081a: 66 0f 58 c1 addpd %xmm1,%xmm0
    40081e: 66 0f 13 01 movlpd %xmm0,(%rcx)
    400822: 66 0f 17 41 08 movhpd %xmm0,0x8(%rcx)


    Il utilise bien les instructions SSE.
    Par contre, si je comprend bien, il charge un couple de y1, y2,y3 dans les registres xmm1, xmm2 et xmm4.
    Puis met xmm1 dans xmm0
    Puis met xmm2 dans xmm1
    Puis additionne xmm4 + xmm1 + xmm2.

    Dites monsieur gcc, ca sert à quoi ce déplacement des registres 2 et 1 dans 1 et 0 ??

    C'est probablement pour cela que tu vois une différence (injustifiable à mon avis) entre le "+=" et les "+" .
    Il ne fait pas cette entourloupe pour pour la série de "+" .