riscv: thead: Add support for the XTheadCondMov ISA extensions
commit8e7ffe126debfbc59e2d359ef3c37899327e2055
authorChristoph Müllner <christoph.muellner@vrull.eu>
Mon, 8 Aug 2022 15:48:20 +0000 (8 17:48 +0200)
committerPhilipp Tomsich <philipp.tomsich@vrull.eu>
Wed, 15 Mar 2023 08:58:18 +0000 (15 09:58 +0100)
treea29473c96d4abd643c63ddaa1e9f7b520dde9359
parentc493fa3892487c22d0bdd817361a02bd523fc2e7
riscv: thead: Add support for the XTheadCondMov ISA extensions

This patch adds support for XTheadCondMov ISA extension.
The extension brings a one-sided conditional move (no else-assignment).
Given that GCC has a great if-conversion pass, we don't need to do much,
besides properly expanding mov<mode>cc accordingly and adjust the cost
model.

gcc/ChangeLog:

* config/riscv/iterators.md (TARGET_64BIT): Add GPR2 iterator.
* config/riscv/riscv-protos.h (riscv_expand_conditional_move):
Add prototype.
* config/riscv/riscv.cc (riscv_rtx_costs): Add costs for
XTheadCondMov.
(riscv_expand_conditional_move): New function.
(riscv_expand_conditional_move_onesided): New function.
* config/riscv/riscv.md: Add support for XTheadCondMov.
* config/riscv/thead.md (*th_cond_mov<GPR:mode><GPR2:mode>): Add
support for XTheadCondMov.
(*th_cond_gpr_mov<GPR:mode><GPR2:mode>): Likewise.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/xtheadcondmov-mveqz-imm-eqz.c: New test.
* gcc.target/riscv/xtheadcondmov-mveqz-imm-not.c: New test.
* gcc.target/riscv/xtheadcondmov-mveqz-reg-eqz.c: New test.
* gcc.target/riscv/xtheadcondmov-mveqz-reg-not.c: New test.
* gcc.target/riscv/xtheadcondmov-mvnez-imm-cond.c: New test.
* gcc.target/riscv/xtheadcondmov-mvnez-imm-nez.c: New test.
* gcc.target/riscv/xtheadcondmov-mvnez-reg-cond.c: New test.
* gcc.target/riscv/xtheadcondmov-mvnez-reg-nez.c: New test.

Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
13 files changed:
gcc/config/riscv/iterators.md
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.md
gcc/config/riscv/thead.md
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mveqz-imm-eqz.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mveqz-imm-not.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mveqz-reg-eqz.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mveqz-reg-not.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mvnez-imm-cond.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mvnez-imm-nez.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mvnez-reg-cond.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-mvnez-reg-nez.c [new file with mode: 0644]