https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69519
Bug ID: 69519 Summary: STV doesn't use xmm register for DImove move Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: hjl.tools at gmail dot com CC: ienkovich at gcc dot gnu.org Target Milestone: --- Target: i686 [hjl@gnu-6 gcc]$ cat x.i long long a, b; extern void fn2 (void); void fn1 (void) { long long c = a; a = b ^ a; fn2 (); a = c; } [hjl@gnu-6 gcc]$ ./xgcc -B./ -S -O2 x.i -m32 -msse2 [hjl@gnu-6 gcc]$ cat x.s .file "x.i" .text .p2align 4,,15 .globl fn1 .type fn1, @function fn1: .LFB0: .cfi_startproc subl $28, %esp .cfi_def_cfa_offset 32 movl a, %eax movl a+4, %edx movq b, %xmm0 movl %eax, (%esp) movl %edx, 4(%esp) movdqa (%esp), %xmm2 I am expecting xmm register is used to move `a' onto stack. pxor %xmm2, %xmm0 movq %xmm0, a call fn2 movq (%esp), %xmm1 movq %xmm1, a addl $28, %esp .cfi_def_cfa_offset 4 ret .cfi_endproc .LFE0: .size fn1, .-fn1 .comm b,8,8 .comm a,8,8 .ident "GCC: (GNU) 6.0.0 20160126 (experimental)" .section .note.GNU-stack,"",@progbits [hjl@gnu-6 gcc]$