diff options
author | Roger Sayle <roger@nextmovesoftware.com> | 2024-05-19 09:49:45 +0100 |
---|---|---|
committer | Roger Sayle <roger@nextmovesoftware.com> | 2024-05-19 09:49:45 +0100 |
commit | 1676ef6e91b902f592270e4bcf10b4fc342e200d (patch) | |
tree | 4e840741e88febdbd612b88e40d4483fbd6897f8 | |
parent | a6114c2a691112f9cf5b072c21685d2e43c76d81 (diff) | |
download | gcc-1676ef6e91b902f592270e4bcf10b4fc342e200d.zip gcc-1676ef6e91b902f592270e4bcf10b4fc342e200d.tar.gz gcc-1676ef6e91b902f592270e4bcf10b4fc342e200d.tar.bz2 |
nvptx: Correct pattern for popcountdi2 insn in nvptx.md.
The result of a POPCOUNT operation in RTL should have the same mode
as its operand. This corrects the specification of popcount in
the nvptx backend, splitting the current generic define_insn into
two, one for popcountsi2 and the other for popcountdi2 (the latter
with an explicit truncate).
2024-05-19 Roger Sayle <roger@nextmovesoftware.com>
gcc/ChangeLog
* config/nvptx/nvptx.md (popcount<mode>2): Split into...
(popcountsi2): define_insn handling SImode popcount.
(popcountdi2): define_insn handling DImode popcount, with an
explicit truncate:SI to produce an SImode result.
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 96e6c91..ef7e3fb 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -655,11 +655,18 @@ DONE; }) -(define_insn "popcount<mode>2" +(define_insn "popcountsi2" [(set (match_operand:SI 0 "nvptx_register_operand" "=R") - (popcount:SI (match_operand:SDIM 1 "nvptx_register_operand" "R")))] + (popcount:SI (match_operand:SI 1 "nvptx_register_operand" "R")))] "" - "%.\\tpopc.b%T1\\t%0, %1;") + "%.\\tpopc.b32\\t%0, %1;") + +(define_insn "popcountdi2" + [(set (match_operand:SI 0 "nvptx_register_operand" "=R") + (truncate:SI + (popcount:DI (match_operand:DI 1 "nvptx_register_operand" "R"))))] + "" + "%.\\tpopc.b64\\t%0, %1;") ;; Multiplication variants |