diff options
Diffstat (limited to 'gcc/config/i386/i386.md')
-rw-r--r-- | gcc/config/i386/i386.md | 30 |
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"))] |