]> git.ipfire.org Git - thirdparty/gcc.git/commit
nvptx: Use cvt to perform sign-extension of truncation
authorRoger Sayle <roger@nextmovesoftware.com>
Wed, 8 Dec 2021 11:45:38 +0000 (12:45 +0100)
committerTom de Vries <tdevries@suse.de>
Wed, 8 Dec 2021 15:42:12 +0000 (16:42 +0100)
commit6b49d50a27428e9de0ae2913651a6379744f3067
treebcec92b6adfafa5faf2ce4a9480a69d22ec913b7
parentd3d44a00e511f0402e8a2449c1c9c27f28ac9cf7
nvptx: Use cvt to perform sign-extension of truncation

This patch introduces some new define_insn rules to the nvptx backend,
to perform sign-extension of a truncation (from and to the same mode),
using a single cvt instruction.  As an example, the following function

int foo(int x) { return (char)x; }

with -O2 currently generates:

mov.u32 %r24, %ar0;
mov.u32 %r26, %r24;
cvt.s32.s8      %value, %r26;

and with this patch, now generates:

mov.u32 %r24, %ar0;
cvt.s32.s8      %value, %r24;

This patch has been tested on nvptx-none hosted by x86_64-pc-linux-gnu
with a top-level "make" (including newlib) and a "make check" with no
new regressions.

gcc/ChangeLog:

* config/nvptx/nvptx.md (*extend_trunc_<mode>2_qi,
*extend_trunc_<mode>2_hi, *extend_trunc_di2_si): New insns.
Use cvt to perform sign-extension of truncation in one step.

gcc/testsuite/ChangeLog:

* gcc.target/nvptx/exttrunc-2.c: New test case.
* gcc.target/nvptx/exttrunc-3.c: New test case.
* gcc.target/nvptx/exttrunc-4.c: New test case.
* gcc.target/nvptx/exttrunc-5.c: New test case.
* gcc.target/nvptx/exttrunc-6.c: New test case.
gcc/config/nvptx/nvptx.md
gcc/testsuite/gcc.target/nvptx/exttrunc-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/nvptx/exttrunc-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/nvptx/exttrunc-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/nvptx/exttrunc-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/nvptx/exttrunc-6.c [new file with mode: 0644]