From a344e3cbb65b400f2250ed90f1529f83ac980c05 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 6 Apr 2007 22:14:12 +0200 Subject: [PATCH] i386.md (extendxf2): Rename from extendsfxf2 and extenddfxf2. * config/i386/i386.md (extendxf2): Rename from extendsfxf2 and extenddfxf2. Macroize expander using X87MODEF12 mode macro. (*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1): Use output_387_reg_move(). (*truncxf2): Rename from *truncxfsf2 and truncxfdf2. Macroize expander using X87MODEF12 mode macro. (*truncxfsf2_mixed): Combine alternatives, ignore "r" alternative when choosing register preferences. Use output_387_reg_move(). (*truncxfdf2_mixed): Combine alternatives, use "r" alternative instead of "x". Use output_387_reg_move(). (*truncxf2_i387_noop): Rename from *truncxfsf2_i387_noop and *truncxfdf2_i387_noop. Macroize insn using X87MODEF12 mode macro. (*truncxf2_i387): Rename from *truncxfsf2_i387 and *truncxfdf2_i387. Macroize insn using X87MODEF12 mode macro. Use output_387_reg_move(). (*truncxf?f_mixed splitter): Macroize splitter using X87MODEF12 mode macro. (*truncxf?f_i387 splitter): Ditto. From-SVN: r123626 --- gcc/ChangeLog | 21 ++++ gcc/config/i386/i386.md | 214 ++++++++++------------------------------ 2 files changed, 74 insertions(+), 161 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 70befba1129..898aeaaa282 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2007-04-06 Uros Bizjak + + * config/i386/i386.md (extendxf2): Rename from extendsfxf2 + and extenddfxf2. Macroize expander using X87MODEF12 mode macro. + (*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1): + Use output_387_reg_move(). + (*truncxf2): Rename from *truncxfsf2 and truncxfdf2. Macroize + expander using X87MODEF12 mode macro. + (*truncxfsf2_mixed): Combine alternatives, ignore "r" alternative when + choosing register preferences. Use output_387_reg_move(). + (*truncxfdf2_mixed): Combine alternatives, use "r" alternative + instead of "x". Use output_387_reg_move(). + (*truncxf2_i387_noop): Rename from *truncxfsf2_i387_noop and + *truncxfdf2_i387_noop. Macroize insn using X87MODEF12 mode macro. + (*truncxf2_i387): Rename from *truncxfsf2_i387 and + *truncxfdf2_i387. Macroize insn using X87MODEF12 mode macro. + Use output_387_reg_move(). + (*truncxf?f_mixed splitter): Macroize splitter using X87MODEF12 + mode macro. + (*truncxf?f_i387 splitter): Ditto. + 2007-04-06 Daniel Berlin * langhooks-def.h (LANG_HOOKS_INITIALIZER): Remove diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 885e6770339..e524f08dd26 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -3784,9 +3784,9 @@ [(set_attr "type" "fmov") (set_attr "mode" "SF,XF")]) -(define_expand "extendsfxf2" +(define_expand "extendxf2" [(set (match_operand:XF 0 "nonimmediate_operand" "") - (float_extend:XF (match_operand:SF 1 "general_operand" "")))] + (float_extend:XF (match_operand:X87MODEF12 1 "general_operand" "")))] "TARGET_80387" { /* ??? Needed for compress_float_constant since all fp constants @@ -3796,49 +3796,22 @@ if (standard_80387_constant_p (operands[1]) > 0) { operands[1] = simplify_const_unary_operation - (FLOAT_EXTEND, XFmode, operands[1], SFmode); + (FLOAT_EXTEND, XFmode, operands[1], mode); emit_move_insn_1 (operands[0], operands[1]); DONE; } - operands[1] = validize_mem (force_const_mem (SFmode, operands[1])); + operands[1] = validize_mem (force_const_mem (mode, operands[1])); } }) -(define_insn "*extendsfxf2_i387" +(define_insn "*extendxf2_i387" [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m") - (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))] + (float_extend:XF + (match_operand:X87MODEF12 1 "nonimmediate_operand" "fm,f")))] "TARGET_80387" "* return output_387_reg_move (insn, operands);" [(set_attr "type" "fmov") - (set_attr "mode" "SF,XF")]) - -(define_expand "extenddfxf2" - [(set (match_operand:XF 0 "nonimmediate_operand" "") - (float_extend:XF (match_operand:DF 1 "general_operand" "")))] - "TARGET_80387" -{ - /* ??? Needed for compress_float_constant since all fp constants - are LEGITIMATE_CONSTANT_P. */ - if (GET_CODE (operands[1]) == CONST_DOUBLE) - { - if (standard_80387_constant_p (operands[1]) > 0) - { - operands[1] = simplify_const_unary_operation - (FLOAT_EXTEND, XFmode, operands[1], DFmode); - emit_move_insn_1 (operands[0], operands[1]); - DONE; - } - operands[1] = validize_mem (force_const_mem (DFmode, operands[1])); - } -}) - -(define_insn "*extenddfxf2_i387" - [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m") - (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))] - "TARGET_80387" - "* return output_387_reg_move (insn, operands);" - [(set_attr "type" "fmov") - (set_attr "mode" "DF,XF")]) + (set_attr "mode" ",XF")]) ;; %%% This seems bad bad news. ;; This cannot output into an f-reg because there is no way to be sure @@ -3922,10 +3895,8 @@ switch (which_alternative) { case 0: - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; + return output_387_reg_move (insn, operands); + case 1: return "#"; case 2: @@ -3948,10 +3919,8 @@ switch (which_alternative) { case 0: - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; + return output_387_reg_move (insn, operands); + case 1: return "#"; default: @@ -3969,12 +3938,7 @@ "TARGET_80387 && !(TARGET_SSE2 && TARGET_SSE_MATH) && !TARGET_MIX_SSE_I387" -{ - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; -} + "* return output_387_reg_move (insn, operands);" [(set_attr "type" "fmov") (set_attr "mode" "SF")]) @@ -3990,162 +3954,90 @@ operands[1] = gen_rtx_REG (SFmode, true_regnum (operands[1])); }) -;; Conversion from XFmode to SFmode. +;; Conversion from XFmode to {SF,DF}mode -(define_expand "truncxfsf2" - [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "") - (float_truncate:SF - (match_operand:XF 1 "register_operand" ""))) +(define_expand "truncxf2" + [(parallel [(set (match_operand:X87MODEF12 0 "nonimmediate_operand" "") + (float_truncate:X87MODEF12 + (match_operand:XF 1 "register_operand" ""))) (clobber (match_dup 2))])] "TARGET_80387" { if (flag_unsafe_math_optimizations) { - rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode); - emit_insn (gen_truncxfsf2_i387_noop (reg, operands[1])); + rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (mode); + emit_insn (gen_truncxf2_i387_noop (reg, operands[1])); if (reg != operands[0]) emit_move_insn (operands[0], reg); DONE; } else - operands[2] = assign_386_stack_local (SFmode, SLOT_TEMP); + operands[2] = assign_386_stack_local (mode, SLOT_TEMP); }) (define_insn "*truncxfsf2_mixed" - [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?r,?x") + [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?fx*r") (float_truncate:SF - (match_operand:XF 1 "register_operand" "f,f,f,f"))) - (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))] + (match_operand:XF 1 "register_operand" "f,f"))) + (clobber (match_operand:SF 2 "memory_operand" "=X,m"))] "TARGET_80387" { gcc_assert (!which_alternative); - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; + return output_387_reg_move (insn, operands); } - [(set_attr "type" "fmov,multi,multi,multi") - (set_attr "unit" "*,i387,i387,i387") + [(set_attr "type" "fmov,multi") + (set_attr "unit" "*,i387") (set_attr "mode" "SF")]) -(define_insn "truncxfsf2_i387_noop" - [(set (match_operand:SF 0 "register_operand" "=f") - (float_truncate:SF (match_operand:XF 1 "register_operand" "f")))] - "TARGET_80387 && flag_unsafe_math_optimizations" - "* return output_387_reg_move (insn, operands);" - [(set_attr "type" "fmov") - (set_attr "mode" "SF")]) - -(define_insn "*truncxfsf2_i387" - [(set (match_operand:SF 0 "memory_operand" "=m") - (float_truncate:SF - (match_operand:XF 1 "register_operand" "f")))] - "TARGET_80387" -{ - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; -} - [(set_attr "type" "fmov") - (set_attr "mode" "SF")]) - -(define_split - [(set (match_operand:SF 0 "register_operand" "") - (float_truncate:SF - (match_operand:XF 1 "register_operand" ""))) - (clobber (match_operand:SF 2 "memory_operand" ""))] - "TARGET_80387 && reload_completed" - [(set (match_dup 2) (float_truncate:SF (match_dup 1))) - (set (match_dup 0) (match_dup 2))] - "") - -(define_split - [(set (match_operand:SF 0 "memory_operand" "") - (float_truncate:SF - (match_operand:XF 1 "register_operand" ""))) - (clobber (match_operand:SF 2 "memory_operand" ""))] - "TARGET_80387" - [(set (match_dup 0) (float_truncate:SF (match_dup 1)))] - "") - -;; Conversion from XFmode to DFmode. - -(define_expand "truncxfdf2" - [(parallel [(set (match_operand:DF 0 "nonimmediate_operand" "") - (float_truncate:DF - (match_operand:XF 1 "register_operand" ""))) - (clobber (match_dup 2))])] - "TARGET_80387" -{ - if (flag_unsafe_math_optimizations) - { - rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DFmode); - emit_insn (gen_truncxfdf2_i387_noop (reg, operands[1])); - if (reg != operands[0]) - emit_move_insn (operands[0], reg); - DONE; - } - else - operands[2] = assign_386_stack_local (DFmode, SLOT_TEMP); -}) - (define_insn "*truncxfdf2_mixed" - [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f,?r,?Y2*x") + [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?fY2*r") (float_truncate:DF - (match_operand:XF 1 "register_operand" "f,f,f,f"))) - (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))] + (match_operand:XF 1 "register_operand" "f,f"))) + (clobber (match_operand:DF 2 "memory_operand" "=X,m"))] "TARGET_80387" { gcc_assert (!which_alternative); - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; + return output_387_reg_move (insn, operands); } - [(set_attr "type" "fmov,multi,multi,multi") - (set_attr "unit" "*,i387,i387,i387") + [(set_attr "type" "fmov,multi") + (set_attr "unit" "*,i387") (set_attr "mode" "DF")]) -(define_insn "truncxfdf2_i387_noop" - [(set (match_operand:DF 0 "register_operand" "=f") - (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))] +(define_insn "truncxf2_i387_noop" + [(set (match_operand:X87MODEF12 0 "register_operand" "=f") + (float_truncate:X87MODEF12 + (match_operand:XF 1 "register_operand" "f")))] "TARGET_80387 && flag_unsafe_math_optimizations" "* return output_387_reg_move (insn, operands);" [(set_attr "type" "fmov") - (set_attr "mode" "DF")]) + (set_attr "mode" "")]) -(define_insn "*truncxfdf2_i387" - [(set (match_operand:DF 0 "memory_operand" "=m") - (float_truncate:DF +(define_insn "*truncxf2_i387" + [(set (match_operand:X87MODEF12 0 "memory_operand" "=m") + (float_truncate:X87MODEF12 (match_operand:XF 1 "register_operand" "f")))] "TARGET_80387" -{ - if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) - return "fstp%z0\t%y0"; - else - return "fst%z0\t%y0"; -} + "* return output_387_reg_move (insn, operands);" [(set_attr "type" "fmov") - (set_attr "mode" "DF")]) + (set_attr "mode" "")]) (define_split - [(set (match_operand:DF 0 "register_operand" "") - (float_truncate:DF - (match_operand:XF 1 "register_operand" ""))) - (clobber (match_operand:DF 2 "memory_operand" ""))] + [(set (match_operand:X87MODEF12 0 "register_operand" "") + (float_truncate:X87MODEF12 + (match_operand:XF 1 "register_operand" ""))) + (clobber (match_operand:X87MODEF12 2 "memory_operand" ""))] "TARGET_80387 && reload_completed" - [(set (match_dup 2) (float_truncate:DF (match_dup 1))) + [(set (match_dup 2) (float_truncate:X87MODEF12 (match_dup 1))) (set (match_dup 0) (match_dup 2))] "") (define_split - [(set (match_operand:DF 0 "memory_operand" "") - (float_truncate:DF - (match_operand:XF 1 "register_operand" ""))) - (clobber (match_operand:DF 2 "memory_operand" ""))] + [(set (match_operand:X87MODEF12 0 "memory_operand" "") + (float_truncate:X87MODEF12 + (match_operand:XF 1 "register_operand" ""))) + (clobber (match_operand:X87MODEF12 2 "memory_operand" ""))] "TARGET_80387" - [(set (match_dup 0) (float_truncate:DF (match_dup 1)))] + [(set (match_dup 0) (float_truncate:X87MODEF12 (match_dup 1)))] "") ;; Signed conversion to DImode.