\f
;; 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 ();
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 ();
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 ();