[Bug target/48678] unable to find a register to spill in class ‘GENERAL_REGS’
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Apr 20 14:27:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48678
--- Comment #12 from Uros Bizjak <ubizjak at gmail dot com> 2011-04-20 14:27:30 UTC ---
Hm, if line 14 in the testcase is changed to:
- ((T *) &s.d)[0] = *x;
+ ((T *) &s.d)[1] = *x;
then gcc does not touch movstrict pattern at all and generates following code:
movdqa (%rsi), %xmm0
movabsq $-4294901761, %rsi
movzwl (%rdi), %eax
movdqa %xmm0, -24(%rsp)
movq -24(%rsp), %rcx
salq $16, %rax
andq %rsi, %rcx
orq %rax, %rcx
movq %rcx, -24(%rsp)
movdqa -24(%rsp), %xmm0
pcmpeqw (%rdx), %xmm0
ret
However, when byte offset reaches sizeof (*void), i.e. 8 bytes on 64bit target
as in:
- ((T *) &s.d)[0] = *x;
+ ((T *) &s.d)[4] = *x;
then we again get:
movdqa (%rsi), %xmm0
pinsrw $4, (%rdi), %xmm0
pcmpeqw (%rdx), %xmm0
ret
I didn't investigate this in detail, but perhaps someone can shed some light
here?
More information about the Gcc-bugs
mailing list