Hello!
All things equal, we would like to avoid x87 registers to move DFmode
immediates to a memory.
Following testcase:
--cut here--
volatile double y;
void
test ()
{
int z;
for (z = 0; z < 1000; z++)
{
y = 1.33;
}
}
-- cut here--
compiled with -O3 to:
movl $1000, %eax
.L3:
fldl .LC0(%rip)
subl $1, %eax
fstpl y(%rip)
jne .L3
rep; ret
With attached patch, it compiles to:
movsd .LC0(%rip), %xmm0
movl $1000, %eax
.L3:
subl $1, %eax
movsd %xmm0, y(%rip)
jne .L3
rep; ret
2013-01-23 Uros Bizjak <[email protected]>
* config/i386/i386.md (*movdf_internal_rex64): Disparage alternatives
involving stack registers slightly.
Tested on x86_64-pc-linux-gnu, committed to mainline, will ba commited
also to 4.7 branch.
Uros.
Index: i386.md
===================================================================
--- i386.md (revision 195407)
+++ i386.md (working copy)
@@ -2934,9 +2934,9 @@
(define_insn "*movdf_internal_rex64"
[(set (match_operand:DF 0 "nonimmediate_operand"
- "=f,m,f,?r,?m,?r,x,x,x,m,Yi,r ")
+ "=?f,?m,?f,?r,?m,?r,x,x,x,m,Yi,r ")
(match_operand:DF 1 "general_operand"
- "fm,f,G,rm,r ,F ,C,x,m,x,r ,Yi"))]
+ "fm ,f ,G ,rm,r ,F ,C,x,m,x,r ,Yi"))]
"TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
&& (!can_create_pseudo_p ()
|| (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)