URL: https://linuxfr.org/users/montaigne/journaux/gcc-et-le-mmxsse1233dnow Title: GCC et le mmx/sse{1,2,3)/3dnow Authors: Ontologia Date: 2005年10月02日T20:07:27+02:00 Tags: Score: 0 Nos processeurs modernes sont formidables et sont capable de nous proposer des merveilles comme 4 multiplicationss flotantes en un cycle. Je veux parler des fpu MMX/SSE/3dnow Je me suis dit, Gcc doit bien gérer ça (?) Je me suis donc amusé à générer un petit code c #include <stdio.h> int main (void) { float a1,b1,c1,a2,b2,c2,z,y,x; int i; for (i= 45 ; i< 789 ; i++ ) if (i % 119) a1 = (float)i+75; a2 = a1+56.456; b1 = a2 + 743.4454; b2 = a2 + 7568.45454; c1 = a2 + 42.456546; c2 = a2 + 4212213; printf("%f,%f,%f,%f,%f,%f\n",a1,b1,c1,a2,b2,c2); x = a1+a2; y = b1+b2; z = c1+c2; printf("%f,%f,%f\n",x,y,z); return 0; } gcc -S testsimd.c -O6 -msse2 -mtune=athlon-4 -march=athlon-4 -o t.asm qui me produit ce code assembleur : main: £spaces£ £/spaces£flds .LC8 £spaces£ £/spaces£pushl %ebp £spaces£ £/spaces£movl 45,ドル %ecx £spaces£ £/spaces£movl %esp, %ebp £spaces£ £/spaces£pushl %ebx £spaces£ £/spaces£movl 1154949189,ドル %ebx £spaces£ £/spaces£subl 164,ドル %esp £spaces£ £/spaces£flds .LC0 £spaces£ £/spaces£andl $-16, %esp £spaces£ £/spaces£subl 16,ドル %esp £spaces£ £/spaces£.p2align 4,,7 .L6: £spaces£ £/spaces£movl %ecx, %eax £spaces£ £/spaces£imull %ebx £spaces£ £/spaces£movl %ecx, %eax £spaces£ £/spaces£sarl 31,ドル %eax £spaces£ £/spaces£sarl 5,ドル %edx £spaces£ £/spaces£subl %eax, %edx £spaces£ £/spaces£movl %edx, %eax £spaces£ £/spaces£sall 4,ドル %eax £spaces£ £/spaces£subl %edx, %eax £spaces£ £/spaces£sall 3,ドル %eax £spaces£ £/spaces£subl %edx, %eax £spaces£ £/spaces£cmpl %eax, %ecx £spaces£ £/spaces£je .L4 £spaces£ £/spaces£fstp %st(1) £spaces£ £/spaces£xorps %xmm0, %xmm0 £spaces£ £/spaces£cvtsi2ss %ecx, %xmm0 £spaces£ £/spaces£movss %xmm0, -92(%ebp) £spaces£ £/spaces£flds -92(%ebp) £spaces£ £/spaces£fadd %st(1), %st £spaces£ £/spaces£fxch %st(1) .L4: £spaces£ £/spaces£incl %ecx £spaces£ £/spaces£cmpl 788,ドル %ecx £spaces£ £/spaces£jle .L6 £spaces£ £/spaces£ffreep %st(0) £spaces£ £/spaces£fldl .LC1 £spaces£ £/spaces£fadd %st(1), %st £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£movl $.LC6, (%esp) £spaces£ £/spaces£fstl 4(%esp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fstps -12(%ebp) £spaces£ £/spaces£fstps -88(%ebp) £spaces£ £/spaces£flds -12(%ebp) £spaces£ £/spaces£fld %st(0) £spaces£ £/spaces£fstl 28(%esp) £spaces£ £/spaces£fld %st(1) £spaces£ £/spaces£faddl .LC2 £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fsts -40(%ebp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fstps -12(%ebp) £spaces£ £/spaces£fld %st(1) £spaces£ £/spaces£faddl .LC4 £spaces£ £/spaces£fxch %st(2) £spaces£ £/spaces£faddl .LC3 £spaces£ £/spaces£flds -12(%ebp) £spaces£ £/spaces£fstl 12(%esp) £spaces£ £/spaces£fxch %st(3) £spaces£ £/spaces£fstps -12(%ebp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fadds .LC5 £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fstps -16(%ebp) £spaces£ £/spaces£flds -12(%ebp) £spaces£ £/spaces£fxch %st(2) £spaces£ £/spaces£fstps -72(%ebp) £spaces£ £/spaces£fsts -20(%ebp) £spaces£ £/spaces£fstpl 44(%esp) £spaces£ £/spaces£fstl 20(%esp) £spaces£ £/spaces£flds -16(%ebp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fstps -56(%ebp) £spaces£ £/spaces£fstpl 36(%esp) £spaces£ £/spaces£call printf £spaces£ £/spaces£movl $.LC7, (%esp) £spaces£ £/spaces£flds -40(%ebp) £spaces£ £/spaces£flds -88(%ebp) £spaces£ £/spaces£faddp %st, %st(1) £spaces£ £/spaces£flds -72(%ebp) £spaces£ £/spaces£flds -56(%ebp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fadds -16(%ebp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fadds -20(%ebp) £spaces£ £/spaces£fxch %st(2) £spaces£ £/spaces£fstpl 4(%esp) £spaces£ £/spaces£fxch %st(1) £spaces£ £/spaces£fstpl 20(%esp) £spaces£ £/spaces£fstpl 12(%esp) £spaces£ £/spaces£call printf £spaces£ £/spaces£xorl %eax, %eax £spaces£ £/spaces£movl -4(%ebp), %ebx £spaces£ £/spaces£leave £spaces£ £/spaces£ret Là je me dit, "tiens bizare, on dirait plutôt du code 387, malgré les deux instructions mmx du début" Poussant l'investigation plus loin, j'apprend que les registres du 387 et mmx/sse sont les mêmes. Je lit le manuel intel et amd sur le sse2 et le 3dnow, et là j'ai été frappé par la complexité de ses instructions : à part celle dévolues à l'addition, et à la multiplication, elles sont vraiment tordues et pas simple du tout à manipuler pour un humain expérimenté, alors un compilo.... J'ai donc l'affreux doute que le compilateur n'y arrive pas, malgré ce qui est écrit ici : [http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/i386-and-x86_002d64-Opt(...)](http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options) Est-ce une illusion d'optique, Y a t-il d'autres compilateurs qui le font (celui d'Intel je suppose), ou est-ce vraiment encore un problème du fait de la complexité des instructions SIMD ?