diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2018-07-17 01:02:11 +0200 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2018-07-17 01:02:11 +0200 |
commit | 66408f6c3954fa6d91972bffecfaf49287cbfe55 (patch) | |
tree | fc9fbf1b492ef8c62191b6bdd9734fbf97014a49 | |
parent | 56a6c9b4b2aa227c2d5bd21f2fb43b561a5b7d96 (diff) | |
download | gcc-66408f6c3954fa6d91972bffecfaf49287cbfe55.zip gcc-66408f6c3954fa6d91972bffecfaf49287cbfe55.tar.gz gcc-66408f6c3954fa6d91972bffecfaf49287cbfe55.tar.bz2 |
rs6000: Improve truncifsf2
The current implementation leaves an unnecessary register move. It is
easier to just expand things in the expander already. This patch does
that.
* config/rs6000/rs6000.md (trunc<mode>sf2): Expand truncates of
double-double modes to SFmode directly directly.
(trunc<mode>sf2_fprs): Delete.
From-SVN: r262754
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 23 |
2 files changed, 11 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5985984..6bdf930 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2018-07-16 Segher Boessenkool <segher@kernel.crashing.org> + * config/rs6000/rs6000.md (trunc<mode>sf2): Expand truncates of + double-double modes to SFmode directly directly. + (trunc<mode>sf2_fprs): Delete. + +2018-07-16 Segher Boessenkool <segher@kernel.crashing.org> + * config/rs6000/rs6000.c (init_float128_ibm): Use the correct names for conversions between IFmode and the decimal floating point modes. (init_float128_ieee): Use the correct names for conversions between diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 44d32d9..94a0f7d 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -7702,28 +7702,15 @@ { if (FLOAT128_IEEE_P (<MODE>mode)) rs6000_expand_float128_convert (operands[0], operands[1], false); - else if (<MODE>mode == TFmode) - emit_insn (gen_trunctfsf2_fprs (operands[0], operands[1])); - else if (<MODE>mode == IFmode) - emit_insn (gen_truncifsf2_fprs (operands[0], operands[1])); else - gcc_unreachable (); + { + rtx tmp = gen_reg_rtx (DFmode); + emit_insn (gen_trunc<mode>df2 (tmp, operands[1])); + emit_insn (gen_truncdfsf2 (operands[0], tmp)); + } DONE; }) -(define_insn_and_split "trunc<mode>sf2_fprs" - [(set (match_operand:SF 0 "gpc_reg_operand" "=f") - (float_truncate:SF (match_operand:IBM128 1 "gpc_reg_operand" "d"))) - (clobber (match_scratch:DF 2 "=d"))] - "TARGET_HARD_FLOAT && TARGET_LONG_DOUBLE_128 && FLOAT128_IBM_P (<MODE>mode)" - "#" - "&& reload_completed" - [(set (match_dup 2) - (float_truncate:DF (match_dup 1))) - (set (match_dup 0) - (float_truncate:SF (match_dup 2)))] - "") - (define_expand "floatsi<mode>2" [(parallel [(set (match_operand:FLOAT128 0 "gpc_reg_operand") (float:FLOAT128 (match_operand:SI 1 "gpc_reg_operand"))) |