------- Additional Comments From steven at gcc dot gnu dot org 2005-01-12 09:37 ------- AMD64 has this at -O2: Test case 1: main: .LFB499: subq $24, %rsp .LCFI0: movl $.LC1, %edi movl $4, %eax movaps .LC0(%rip), %xmm0 movups %xmm0, (%rsp) cvtss2sd 12(%rsp), %xmm3 cvtss2sd 8(%rsp), %xmm2 cvtss2sd 4(%rsp), %xmm1 cvtss2sd (%rsp), %xmm0 call printf xorl %eax, %eax addq $24, %rsp ret .LFE499: Test case 2: main: .LFB499: subq $40, %rsp .LCFI0: movl $.LC4, %edi movl $4, %eax movl $0x3fa66666, 16(%rsp) movl $0x3fb33333, 20(%rsp) movl $0x3fc00000, 24(%rsp) movl $0x3fcccccd, 28(%rsp) movups 16(%rsp), %xmm0 movups %xmm0, (%rsp) cvtss2sd 12(%rsp), %xmm3 cvtss2sd 8(%rsp), %xmm2 cvtss2sd 4(%rsp), %xmm1 cvtss2sd (%rsp), %xmm0 call printf xorl %eax, %eax addq $40, %rsp ret With -m32 -march=pentium4 -mtune=prescott I get this: Test case 1: main: pushl %ebp movl %esp, %ebp subl $56, %esp andl $-16, %esp subl $16, %esp movaps .LC0, %xmm0 movups %xmm0, -16(%ebp) flds -4(%ebp) fstpl 28(%esp) flds -8(%ebp) fstpl 20(%esp) flds -12(%ebp) fstpl 12(%esp) flds -16(%ebp) fstpl 4(%esp) movl $.LC1, (%esp) call printf xorl %eax, %eax leave ret Test case 2 (which is basically the same as Uros' code): main: pushl %ebp movl %esp, %ebp subl $72, %esp andl $-16, %esp subl $16, %esp movl $0x3fa66666, -16(%ebp) movl $0x3fb33333, -12(%ebp) movl $0x3fc00000, -8(%ebp) movl $0x3fcccccd, -4(%ebp) movups -16(%ebp), %xmm0 movups %xmm0, -32(%ebp) flds -20(%ebp) fstpl 28(%esp) flds -24(%ebp) fstpl 20(%esp) flds -28(%ebp) fstpl 12(%esp) flds -32(%ebp) fstpl 4(%esp) movl $.LC4, (%esp) call printf xorl %eax, %eax leave ret
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18562