diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2007-01-30 12:20:07 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2007-01-30 12:20:07 +0100 |
commit | eaee4464778034db0c3f27640c98bdfb8584ef17 (patch) | |
tree | 942a2e626dc40e269d296c1c97e6a8efef92aff0 /gcc/config | |
parent | 9b1959ffcaa3fab49a90eb25f32a815ac22c2a85 (diff) | |
download | gcc-eaee4464778034db0c3f27640c98bdfb8584ef17.zip gcc-eaee4464778034db0c3f27640c98bdfb8584ef17.tar.gz gcc-eaee4464778034db0c3f27640c98bdfb8584ef17.tar.bz2 |
builtins.c (expand_builtin_int_interclass_roundingfn): New function to handle optabs that operate on floating point input argument and...
* builtins.c (expand_builtin_int_interclass_roundingfn): New function
to handle optabs that operate on floating point input argument and
output to integer output.
(expand_builtin_mathfn) [BUILT_IN_ILOGB]: Move from here ...
(expand_builtin_interclass_mathfn) [BUILT_IN_ILOGB]: ... to here.
(expand_builtin): Expand BUILT_IN_ILOGB{,F,L} using
expand_builtin_interclass_mathfn ().
* config/i386/i386.md (fxtractxf3_i387): Rename from *fxtractxf3_i387.
(ilogbsi2): Remove.
(ilogbxf2, ilogb<mode>2): New expanders to implement ilogb, ilogbf and
ilogbl built-in functions as x87 intrinsics.
From-SVN: r121336
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/i386.md | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 21d1c2b..a9620e2 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -16261,7 +16261,7 @@ DONE; }) -(define_insn "*fxtractxf3_i387" +(define_insn "fxtractxf3_i387" [(set (match_operand:XF 0 "register_operand" "=f") (unspec:XF [(match_operand:XF 2 "register_operand" "0")] UNSPEC_XTRACT_FRACT)) @@ -16316,21 +16316,34 @@ DONE; }) -(define_expand "ilogbsi2" - [(parallel [(set (match_dup 2) - (unspec:XF [(match_operand:XF 1 "register_operand" "")] - UNSPEC_XTRACT_FRACT)) - (set (match_dup 3) - (unspec:XF [(match_dup 1)] UNSPEC_XTRACT_EXP))]) - (parallel [(set (match_operand:SI 0 "register_operand" "") - (fix:SI (match_dup 3))) - (clobber (reg:CC FLAGS_REG))])] +(define_expand "ilogbxf2" + [(use (match_operand:SI 0 "register_operand" "")) + (use (match_operand:XF 1 "register_operand" ""))] "TARGET_USE_FANCY_MATH_387 - && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387) && flag_unsafe_math_optimizations && !optimize_size" { - operands[2] = gen_reg_rtx (XFmode); - operands[3] = gen_reg_rtx (XFmode); + rtx op0 = gen_reg_rtx (XFmode); + rtx op1 = gen_reg_rtx (XFmode); + + emit_insn (gen_fxtractxf3_i387 (op0, op1, operands[1])); + emit_insn (gen_fix_truncxfsi2 (operands[0], op1)); + DONE; +}) + +(define_expand "ilogb<mode>2" + [(use (match_operand:SI 0 "register_operand" "")) + (use (match_operand:X87MODEF12 1 "register_operand" ""))] + "TARGET_USE_FANCY_MATH_387 + && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) + || TARGET_MIX_SSE_I387) + && flag_unsafe_math_optimizations && !optimize_size" +{ + rtx op0 = gen_reg_rtx (XFmode); + rtx op1 = gen_reg_rtx (XFmode); + + emit_insn (gen_fxtract_extend<mode>xf3_i387 (op0, op1, operands[1])); + emit_insn (gen_fix_truncxfsi2 (operands[0], op1)); + DONE; }) (define_insn "*f2xm1xf2_i387" |