aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2014-10-31 20:47:36 +0100
committerUros Bizjak <uros@gcc.gnu.org>2014-10-31 20:47:36 +0100
commit9ccb17b4c47e4c43367cc78059d5deac32672de8 (patch)
tree181e5c3e5aab16e4d36f5d47df68b0e0106eddfa /gcc
parent73c49bf53abd68081dec20ad8adac0546a8e479b (diff)
downloadgcc-9ccb17b4c47e4c43367cc78059d5deac32672de8.zip
gcc-9ccb17b4c47e4c43367cc78059d5deac32672de8.tar.gz
gcc-9ccb17b4c47e4c43367cc78059d5deac32672de8.tar.bz2
re PR rtl-optimization/63620 (RELOAD lost SET_GOT dependency on Darwin)
PR target/63620 * config/i386/i386.md (*pushtf): Allow only CONST_DOUBLES that won't be reloaded through memory. (*pushxf): Ditto. (*pushdf): Ditto. From-SVN: r216987
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.md19
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6a13083..8fb70a1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2014-10-31 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/63620
+ * config/i386/i386.md (*pushtf): Allow only CONST_DOUBLES that won't
+ be reloaded through memory.
+ (*pushxf): Ditto.
+ (*pushdf): Ditto.
+
2014-10-31 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/63659
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index a1803d5..7e4f328 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2733,10 +2733,14 @@
;; Floating point push instructions.
+;; %%% Remove CONST_DOUBLE workaround after PR63620 is fixed!
(define_insn "*pushtf"
[(set (match_operand:TF 0 "push_operand" "=<,<")
(match_operand:TF 1 "general_no_elim_operand" "x,*roF"))]
- "TARGET_64BIT || TARGET_SSE"
+ "(TARGET_64BIT || TARGET_SSE)
+ && (!can_create_pseudo_p ()
+ || GET_CODE (operands[1]) != CONST_DOUBLE
+ || standard_sse_constant_p (operands[1]))"
{
/* This insn should be already split before reg-stack. */
gcc_unreachable ();
@@ -2758,10 +2762,13 @@
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
})
+;; %%% Remove CONST_DOUBLE workaround after PR63620 is fixed!
(define_insn "*pushxf"
[(set (match_operand:XF 0 "push_operand" "=<,<")
(match_operand:XF 1 "general_no_elim_operand" "f,Yx*roF"))]
- ""
+ "!can_create_pseudo_p ()
+ || GET_CODE (operands[1]) != CONST_DOUBLE
+ || standard_80387_constant_p (operands[1]) > 0"
{
/* This insn should be already split before reg-stack. */
gcc_unreachable ();
@@ -2789,10 +2796,16 @@
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
})
+;; %%% Remove CONST_DOUBLE workaround after PR63620 is fixed!
(define_insn "*pushdf"
[(set (match_operand:DF 0 "push_operand" "=<,<,<,<")
(match_operand:DF 1 "general_no_elim_operand" "f,Yd*roF,rmF,x"))]
- ""
+ "!can_create_pseudo_p ()
+ || GET_CODE (operands[1]) != CONST_DOUBLE
+ || (!(TARGET_SSE2 && TARGET_SSE_MATH)
+ && standard_80387_constant_p (operands[1]) > 0)
+ || (TARGET_SSE2 && TARGET_SSE_MATH
+ && standard_sse_constant_p (operands[1]))"
{
/* This insn should be already split before reg-stack. */
gcc_unreachable ();