diff options
author | Roger Sayle <roger@nextmovesoftware.com> | 2020-07-28 15:55:47 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-07-29 23:05:46 +0200 |
commit | a0d007d67c85ecf4030bad8a6cf95f31bc6cb656 (patch) | |
tree | e2a8c72bf3c48befec45895c1a5dd57763c71cc8 | |
parent | 0f4a54ccb89c2fbd939f5385e359083e75e4d56f (diff) | |
download | gcc-a0d007d67c85ecf4030bad8a6cf95f31bc6cb656.zip gcc-a0d007d67c85ecf4030bad8a6cf95f31bc6cb656.tar.gz gcc-a0d007d67c85ecf4030bad8a6cf95f31bc6cb656.tar.bz2 |
nvptx: Support floating point reciprocal instructions
The following patch addds support for PTX's rcp.rn.f32 and rcp.rn.f64
instructions. Note that the "rcp.rn" forms of this instruction
calculate the fully IEEE compliant result for the reciprocal, unlike
the rcp.approx variants that just provide fast approximations.
This patch has been tested on nvptx-none hosted on x86_64-pc-linux-gnu
with "make" and "make check" with no new regressions.
2020-07-12 Roger Sayle <roger@nextmovesoftware.com>
gcc/ChangeLog:
* config/nvptx/nvptx.md (recip<mode>2): New instruction.
gcc/testsuite/ChangeLog:
* gcc.target/nvptx/recip-1.c: New test.
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/nvptx/recip-1.c | 18 |
2 files changed, 27 insertions, 0 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 0538e83..746d6ec 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -879,6 +879,15 @@ "" "%.\\tfma%#%t0\\t%0, %1, %2, %3;") +(define_insn "*recip<mode>2" + [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R") + (div:SDFM + (match_operand:SDFM 2 "const_double_operand" "F") + (match_operand:SDFM 1 "nvptx_register_operand" "R")))] + "CONST_DOUBLE_P (operands[2]) + && real_identical (CONST_DOUBLE_REAL_VALUE (operands[2]), &dconst1)" + "%.\\trcp%#%t0\\t%0, %1;") + (define_insn "div<mode>3" [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R") (div:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R") diff --git a/gcc/testsuite/gcc.target/nvptx/recip-1.c b/gcc/testsuite/gcc.target/nvptx/recip-1.c new file mode 100644 index 0000000..1812787 --- /dev/null +++ b/gcc/testsuite/gcc.target/nvptx/recip-1.c @@ -0,0 +1,18 @@ +/* { dg-do assemble } */ +/* { dg-options "-O2 -save-temps" } */ + +double +foo (double x) +{ + return 1.0 / x; +} + +float +foof (float x) +{ + return 1.0f / x; +} + +/* { dg-final { scan-assembler-times "rcp.rn.f64" 1 } } */ +/* { dg-final { scan-assembler-times "rcp.rn.f32" 1 } } */ + |