diff options
Diffstat (limited to 'gcc/config/i386/i386.md')
-rw-r--r-- | gcc/config/i386/i386.md | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 46987d370ad..6818ba0d725 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2938,6 +2938,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"))] @@ -3172,9 +3202,9 @@ ;; in alternatives 4, 6, 7 and 8. (define_insn "*movxf_internal" [(set (match_operand:XF 0 "nonimmediate_operand" - "=f,m,f,?r ,!o,?*r ,!o,!o,!o,r ,o") + "=f,m,f,?r ,!o,?*r ,!o,!o,!o,r ,o ,o") (match_operand:XF 1 "general_operand" - "fm,f,G,roF,r , *roF,*r,F ,C,roF,rF"))] + "fm,f,G,roF,r ,*roF,*r,F ,C ,roF,rF,rC"))] "!(MEM_P (operands[0]) && MEM_P (operands[1])) && (lra_in_progress || reload_completed || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) @@ -3201,19 +3231,19 @@ } } [(set (attr "isa") - (cond [(eq_attr "alternative" "7") + (cond [(eq_attr "alternative" "7,10") (const_string "nox64") - (eq_attr "alternative" "8") + (eq_attr "alternative" "8,11") (const_string "x64") ] (const_string "*"))) (set (attr "type") - (cond [(eq_attr "alternative" "3,4,5,6,7,8,9,10") + (cond [(eq_attr "alternative" "3,4,5,6,7,8,9,10,11") (const_string "multi") ] (const_string "fmov"))) (set (attr "mode") - (cond [(eq_attr "alternative" "3,4,5,6,7,8,9,10") + (cond [(eq_attr "alternative" "3,4,5,6,7,8,9,10,11") (if_then_else (match_test "TARGET_64BIT") (const_string "DI") (const_string "SI")) @@ -3224,7 +3254,7 @@ (symbol_ref "false")] (symbol_ref "true"))) (set (attr "enabled") - (cond [(eq_attr "alternative" "9,10") + (cond [(eq_attr "alternative" "9,10,11") (if_then_else (match_test "TARGET_HARD_XF_REGS") (symbol_ref "false") |