summaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.md')
-rw-r--r--gcc/config/i386/i386.md30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 6c99b0e3987..90fa70e0dde 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2816,6 +2816,36 @@
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
})
+(define_insn_and_split "*pushxf_rounded"
+ [(set (mem:XF
+ (pre_modify:P
+ (reg:P SP_REG)
+ (plus:P (reg:P SP_REG) (const_int -16))))
+ (match_operand:XF 0 "nonmemory_no_elim_operand" "f,r,*r,C"))]
+ "TARGET_64BIT"
+ "#"
+ "&& 1"
+ [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
+ (set (match_dup 1) (match_dup 0))]
+{
+ rtx pat = PATTERN (curr_insn);
+ operands[1] = SET_DEST (pat);
+
+ /* Preserve memory attributes. */
+ operands[1] = replace_equiv_address (operands[1], stack_pointer_rtx);
+}
+ [(set_attr "type" "multi")
+ (set_attr "unit" "i387,*,*,*")
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "1,2,3")
+ (const_string "DI")
+ ]
+ (const_string "XF")))
+ (set (attr "preferred_for_size")
+ (cond [(eq_attr "alternative" "1")
+ (symbol_ref "false")]
+ (symbol_ref "true")))])
+
(define_insn "*pushxf"
[(set (match_operand:XF 0 "push_operand" "=<,<,<,<")
(match_operand:XF 1 "general_no_elim_operand" "f,r,*r,oF"))]