aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-10-01 11:07:20 +0200
committerTom de Vries <tdevries@suse.de>2020-10-01 21:22:16 +0200
commitb3ec0de08250d7e0599e36895d5cb727016c81d3 (patch)
treea2dd483822dceed49f226da05ab31ab821f3191f
parentc2978b3405884e38429c1937f416753ca88d3cd6 (diff)
downloadgcc-b3ec0de08250d7e0599e36895d5cb727016c81d3.zip
gcc-b3ec0de08250d7e0599e36895d5cb727016c81d3.tar.gz
gcc-b3ec0de08250d7e0599e36895d5cb727016c81d3.tar.bz2
[nvptx] Emit mov.u32 instead of cvt.u32.u32 for truncsiqi2
When running: ... $ gcc.sh src/gcc/testsuite/gcc.target/nvptx/abi-complex-arg.c -S -dP ... we have in abi-complex-arg.s: ... //(insn 3 5 4 2 // (set // (reg:QI 23) // (truncate:QI (reg:SI 22))) "abi-complex-arg.c":38:1 29 {truncsiqi2} // (nil)) cvt.u32.u32 %r23, %r22; // 3 [c=4] truncsiqi2/0 ... The cvt.u32.u32 can be written shorter and clearer as mov.u32. Fix this in define_insn "truncsi<QHIM>2". Tested on nvptx. gcc/ChangeLog: 2020-10-01 Tom de Vries <tdevries@suse.de> PR target/80845 * config/nvptx/nvptx.md (define_insn "truncsi<QHIM>2"): Emit mov.u32 instead of cvt.u32.u32.
-rw-r--r--gcc/config/nvptx/nvptx.md10
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index 035f6e0..ccbcd09 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -383,9 +383,13 @@
[(set (match_operand:QHIM 0 "nvptx_nonimmediate_operand" "=R,m")
(truncate:QHIM (match_operand:SI 1 "nvptx_register_operand" "R,R")))]
""
- "@
- %.\\tcvt%t0.u32\\t%0, %1;
- %.\\tst%A0.u%T0\\t%0, %1;"
+ {
+ if (which_alternative == 1)
+ return "%.\\tst%A0.u%T0\\t%0, %1;";
+ if (GET_MODE (operands[0]) == QImode)
+ return "%.\\tmov%t0\\t%0, %1;";
+ return "%.\\tcvt%t0.u32\\t%0, %1;";
+ }
[(set_attr "subregs_ok" "true")])
(define_insn "truncdi<mode>2"