i386.md (extend<mode>xf2): Rename from extendsfxf2 and extenddfxf2.
* config/i386/i386.md (extend<mode>xf2): Rename from extendsfxf2 and extenddfxf2. Macroize expander using X87MODEF12 mode macro. (*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1): Use output_387_reg_move(). (*truncxf<mode>2): 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(). (*truncxf<mode>2_i387_noop): Rename from *truncxfsf2_i387_noop and *truncxfdf2_i387_noop. Macroize insn using X87MODEF12 mode macro. (*truncxf<mode>2_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
This commit is contained in:
parent
9c269bf8e5
commit
a344e3cbb6
|
@ -1,3 +1,24 @@
|
||||||
|
2007-04-06 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
* config/i386/i386.md (extend<mode>xf2): Rename from extendsfxf2
|
||||||
|
and extenddfxf2. Macroize expander using X87MODEF12 mode macro.
|
||||||
|
(*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1):
|
||||||
|
Use output_387_reg_move().
|
||||||
|
(*truncxf<mode>2): 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().
|
||||||
|
(*truncxf<mode>2_i387_noop): Rename from *truncxfsf2_i387_noop and
|
||||||
|
*truncxfdf2_i387_noop. Macroize insn using X87MODEF12 mode macro.
|
||||||
|
(*truncxf<mode>2_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 <dberlin@dberlin.org>
|
2007-04-06 Daniel Berlin <dberlin@dberlin.org>
|
||||||
|
|
||||||
* langhooks-def.h (LANG_HOOKS_INITIALIZER): Remove
|
* langhooks-def.h (LANG_HOOKS_INITIALIZER): Remove
|
||||||
|
|
|
@ -3784,9 +3784,9 @@
|
||||||
[(set_attr "type" "fmov")
|
[(set_attr "type" "fmov")
|
||||||
(set_attr "mode" "SF,XF")])
|
(set_attr "mode" "SF,XF")])
|
||||||
|
|
||||||
(define_expand "extendsfxf2"
|
(define_expand "extend<mode>xf2"
|
||||||
[(set (match_operand:XF 0 "nonimmediate_operand" "")
|
[(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"
|
"TARGET_80387"
|
||||||
{
|
{
|
||||||
/* ??? Needed for compress_float_constant since all fp constants
|
/* ??? Needed for compress_float_constant since all fp constants
|
||||||
|
@ -3796,49 +3796,22 @@
|
||||||
if (standard_80387_constant_p (operands[1]) > 0)
|
if (standard_80387_constant_p (operands[1]) > 0)
|
||||||
{
|
{
|
||||||
operands[1] = simplify_const_unary_operation
|
operands[1] = simplify_const_unary_operation
|
||||||
(FLOAT_EXTEND, XFmode, operands[1], SFmode);
|
(FLOAT_EXTEND, XFmode, operands[1], <MODE>mode);
|
||||||
emit_move_insn_1 (operands[0], operands[1]);
|
emit_move_insn_1 (operands[0], operands[1]);
|
||||||
DONE;
|
DONE;
|
||||||
}
|
}
|
||||||
operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
|
operands[1] = validize_mem (force_const_mem (<MODE>mode, operands[1]));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
(define_insn "*extendsfxf2_i387"
|
(define_insn "*extend<mode>xf2_i387"
|
||||||
[(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
|
[(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"
|
"TARGET_80387"
|
||||||
"* return output_387_reg_move (insn, operands);"
|
"* return output_387_reg_move (insn, operands);"
|
||||||
[(set_attr "type" "fmov")
|
[(set_attr "type" "fmov")
|
||||||
(set_attr "mode" "SF,XF")])
|
(set_attr "mode" "<MODE>,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")])
|
|
||||||
|
|
||||||
;; %%% This seems bad bad news.
|
;; %%% This seems bad bad news.
|
||||||
;; This cannot output into an f-reg because there is no way to be sure
|
;; This cannot output into an f-reg because there is no way to be sure
|
||||||
|
@ -3922,10 +3895,8 @@
|
||||||
switch (which_alternative)
|
switch (which_alternative)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
return output_387_reg_move (insn, operands);
|
||||||
return "fstp%z0\t%y0";
|
|
||||||
else
|
|
||||||
return "fst%z0\t%y0";
|
|
||||||
case 1:
|
case 1:
|
||||||
return "#";
|
return "#";
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -3948,10 +3919,8 @@
|
||||||
switch (which_alternative)
|
switch (which_alternative)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
return output_387_reg_move (insn, operands);
|
||||||
return "fstp%z0\t%y0";
|
|
||||||
else
|
|
||||||
return "fst%z0\t%y0";
|
|
||||||
case 1:
|
case 1:
|
||||||
return "#";
|
return "#";
|
||||||
default:
|
default:
|
||||||
|
@ -3969,12 +3938,7 @@
|
||||||
"TARGET_80387
|
"TARGET_80387
|
||||||
&& !(TARGET_SSE2 && TARGET_SSE_MATH)
|
&& !(TARGET_SSE2 && TARGET_SSE_MATH)
|
||||||
&& !TARGET_MIX_SSE_I387"
|
&& !TARGET_MIX_SSE_I387"
|
||||||
{
|
"* return output_387_reg_move (insn, operands);"
|
||||||
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 "type" "fmov")
|
||||||
(set_attr "mode" "SF")])
|
(set_attr "mode" "SF")])
|
||||||
|
|
||||||
|
@ -3990,162 +3954,90 @@
|
||||||
operands[1] = gen_rtx_REG (SFmode, true_regnum (operands[1]));
|
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"
|
(define_expand "truncxf<mode>2"
|
||||||
[(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
|
[(parallel [(set (match_operand:X87MODEF12 0 "nonimmediate_operand" "")
|
||||||
(float_truncate:SF
|
(float_truncate:X87MODEF12
|
||||||
(match_operand:XF 1 "register_operand" "")))
|
(match_operand:XF 1 "register_operand" "")))
|
||||||
(clobber (match_dup 2))])]
|
(clobber (match_dup 2))])]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
{
|
||||||
if (flag_unsafe_math_optimizations)
|
if (flag_unsafe_math_optimizations)
|
||||||
{
|
{
|
||||||
rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
|
rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (<MODE>mode);
|
||||||
emit_insn (gen_truncxfsf2_i387_noop (reg, operands[1]));
|
emit_insn (gen_truncxf<mode>2_i387_noop (reg, operands[1]));
|
||||||
if (reg != operands[0])
|
if (reg != operands[0])
|
||||||
emit_move_insn (operands[0], reg);
|
emit_move_insn (operands[0], reg);
|
||||||
DONE;
|
DONE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
operands[2] = assign_386_stack_local (SFmode, SLOT_TEMP);
|
operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
|
||||||
})
|
})
|
||||||
|
|
||||||
(define_insn "*truncxfsf2_mixed"
|
(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
|
(float_truncate:SF
|
||||||
(match_operand:XF 1 "register_operand" "f,f,f,f")))
|
(match_operand:XF 1 "register_operand" "f,f")))
|
||||||
(clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
|
(clobber (match_operand:SF 2 "memory_operand" "=X,m"))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
{
|
||||||
gcc_assert (!which_alternative);
|
gcc_assert (!which_alternative);
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
return output_387_reg_move (insn, operands);
|
||||||
return "fstp%z0\t%y0";
|
|
||||||
else
|
|
||||||
return "fst%z0\t%y0";
|
|
||||||
}
|
}
|
||||||
[(set_attr "type" "fmov,multi,multi,multi")
|
[(set_attr "type" "fmov,multi")
|
||||||
(set_attr "unit" "*,i387,i387,i387")
|
(set_attr "unit" "*,i387")
|
||||||
(set_attr "mode" "SF")])
|
(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"
|
(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
|
(float_truncate:DF
|
||||||
(match_operand:XF 1 "register_operand" "f,f,f,f")))
|
(match_operand:XF 1 "register_operand" "f,f")))
|
||||||
(clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
|
(clobber (match_operand:DF 2 "memory_operand" "=X,m"))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
{
|
||||||
gcc_assert (!which_alternative);
|
gcc_assert (!which_alternative);
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
return output_387_reg_move (insn, operands);
|
||||||
return "fstp%z0\t%y0";
|
|
||||||
else
|
|
||||||
return "fst%z0\t%y0";
|
|
||||||
}
|
}
|
||||||
[(set_attr "type" "fmov,multi,multi,multi")
|
[(set_attr "type" "fmov,multi")
|
||||||
(set_attr "unit" "*,i387,i387,i387")
|
(set_attr "unit" "*,i387")
|
||||||
(set_attr "mode" "DF")])
|
(set_attr "mode" "DF")])
|
||||||
|
|
||||||
(define_insn "truncxfdf2_i387_noop"
|
(define_insn "truncxf<mode>2_i387_noop"
|
||||||
[(set (match_operand:DF 0 "register_operand" "=f")
|
[(set (match_operand:X87MODEF12 0 "register_operand" "=f")
|
||||||
(float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
|
(float_truncate:X87MODEF12
|
||||||
|
(match_operand:XF 1 "register_operand" "f")))]
|
||||||
"TARGET_80387 && flag_unsafe_math_optimizations"
|
"TARGET_80387 && flag_unsafe_math_optimizations"
|
||||||
"* return output_387_reg_move (insn, operands);"
|
"* return output_387_reg_move (insn, operands);"
|
||||||
[(set_attr "type" "fmov")
|
[(set_attr "type" "fmov")
|
||||||
(set_attr "mode" "DF")])
|
(set_attr "mode" "<MODE>")])
|
||||||
|
|
||||||
(define_insn "*truncxfdf2_i387"
|
(define_insn "*truncxf<mode>2_i387"
|
||||||
[(set (match_operand:DF 0 "memory_operand" "=m")
|
[(set (match_operand:X87MODEF12 0 "memory_operand" "=m")
|
||||||
(float_truncate:DF
|
(float_truncate:X87MODEF12
|
||||||
(match_operand:XF 1 "register_operand" "f")))]
|
(match_operand:XF 1 "register_operand" "f")))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
"* return output_387_reg_move (insn, operands);"
|
||||||
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 "type" "fmov")
|
||||||
(set_attr "mode" "DF")])
|
(set_attr "mode" "<MODE>")])
|
||||||
|
|
||||||
(define_split
|
(define_split
|
||||||
[(set (match_operand:DF 0 "register_operand" "")
|
[(set (match_operand:X87MODEF12 0 "register_operand" "")
|
||||||
(float_truncate:DF
|
(float_truncate:X87MODEF12
|
||||||
(match_operand:XF 1 "register_operand" "")))
|
(match_operand:XF 1 "register_operand" "")))
|
||||||
(clobber (match_operand:DF 2 "memory_operand" ""))]
|
(clobber (match_operand:X87MODEF12 2 "memory_operand" ""))]
|
||||||
"TARGET_80387 && reload_completed"
|
"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))]
|
(set (match_dup 0) (match_dup 2))]
|
||||||
"")
|
"")
|
||||||
|
|
||||||
(define_split
|
(define_split
|
||||||
[(set (match_operand:DF 0 "memory_operand" "")
|
[(set (match_operand:X87MODEF12 0 "memory_operand" "")
|
||||||
(float_truncate:DF
|
(float_truncate:X87MODEF12
|
||||||
(match_operand:XF 1 "register_operand" "")))
|
(match_operand:XF 1 "register_operand" "")))
|
||||||
(clobber (match_operand:DF 2 "memory_operand" ""))]
|
(clobber (match_operand:X87MODEF12 2 "memory_operand" ""))]
|
||||||
"TARGET_80387"
|
"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.
|
;; Signed conversion to DImode.
|
||||||
|
|
Loading…
Reference in New Issue