aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2018-07-17 01:02:11 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2018-07-17 01:02:11 +0200
commit66408f6c3954fa6d91972bffecfaf49287cbfe55 (patch)
treefc9fbf1b492ef8c62191b6bdd9734fbf97014a49
parent56a6c9b4b2aa227c2d5bd21f2fb43b561a5b7d96 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.md23
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")))