From 44efc743acc01354b6b9eb1939aedfdcc44e71f3 Mon Sep 17 00:00:00 2001 From: Xiao Zeng Date: Fri, 29 Sep 2023 16:29:02 -0600 Subject: [PATCH] Fix INSN costing and more zicond tests So this ends up looking a lot like the bits that I had to revert several weeks ago :-) The core issue we have is given an INSN the generic code will cost the SET_SRC and SET_DEST and sum them. But that's far from ideal on a RISC target. For a register destination, the cost can be determined be looking at just the SET_SRC. Which is precisely what this patch does. When the outer code is an INSN and we're presented with a SET we take one of two paths. If the destination is a register, then we recurse just on the SET_SRC and we're done. Otherwise we fall back to the existing code which sums the cost of the SET_SRC and SET_DEST. That fallback path isn't great and probably could be further improved (just costing SET_DEST in that case is probably quite reasonable). The difference between this version and the bits that slipped through by accident several weeks ago is that old version mis-used the API due to a thinko on my part. This tightens up various zicond tests to avoid undesirable matching. This has been tested on rv64gc -- the only difference it makes on the testsuite is the new tests (included in this patch) flip from failing to passing. Pushed to the trunk. gcc/ * config/riscv/riscv.cc (riscv_rtx_costs): Better handle costing SETs when the outer code is INSN. gcc/testsuite * gcc.target/riscv/zicond-primitiveSemantics_compare_imm.c: New test. * gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_0_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_reg_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_0_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_reg_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics.c: Tighten expected regexp. * gcc.target/riscv/zicond-primitiveSemantics_return_0_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_return_imm_imm.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_return_imm_reg.c: Likewise. * gcc.target/riscv/zicond-primitiveSemantics_return_reg_reg.c: Likewise. * gcc.target/riscv/zicond-xor-01.c: Likewise. --- gcc/config/riscv/riscv.cc | 13 ++++ .../riscv/zicond-primitiveSemantics.c | 4 +- .../zicond-primitiveSemantics_compare_imm.c | 57 ++++++++++++++ ...mitiveSemantics_compare_imm_return_0_imm.c | 73 ++++++++++++++++++ ...tiveSemantics_compare_imm_return_imm_imm.c | 73 ++++++++++++++++++ ...tiveSemantics_compare_imm_return_imm_reg.c | 65 ++++++++++++++++ ...tiveSemantics_compare_imm_return_reg_reg.c | 65 ++++++++++++++++ .../zicond-primitiveSemantics_compare_reg.c | 65 ++++++++++++++++ ...mitiveSemantics_compare_reg_return_0_imm.c | 73 ++++++++++++++++++ ...tiveSemantics_compare_reg_return_imm_imm.c | 73 ++++++++++++++++++ ...tiveSemantics_compare_reg_return_imm_reg.c | 65 ++++++++++++++++ ...tiveSemantics_compare_reg_return_reg_reg.c | 77 +++++++++++++++++++ .../zicond-primitiveSemantics_return_0_imm.c | 4 +- ...zicond-primitiveSemantics_return_imm_imm.c | 4 +- ...zicond-primitiveSemantics_return_imm_reg.c | 4 +- ...zicond-primitiveSemantics_return_reg_reg.c | 4 +- .../gcc.target/riscv/zicond-xor-01.c | 2 +- 17 files changed, 710 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_0_imm.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_imm.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_reg.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_reg_reg.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_0_imm.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_imm.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_reg.c create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_reg_reg.c diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 6e7a719e7a06..d5446b63dbf0 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -2768,6 +2768,19 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN switch (GET_CODE (x)) { + case SET: + /* If we are called for an INSN that's a simple set of a register, + then cost based on the SET_SRC alone. */ + if (outer_code == INSN && REG_P (SET_DEST (x))) + { + riscv_rtx_costs (SET_SRC (x), mode, outer_code, opno, total, speed); + return true; + } + + /* Otherwise return FALSE indicating we should recurse into both the + SET_DEST and SET_SRC combining the cost of both. */ + return false; + case CONST_INT: /* trivial constants checked using OUTER_CODE in case they are encodable in insn itself w/o need for additional insn(s). */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics.c index bcfa04bef91e..276dac708522 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics.c @@ -45,5 +45,5 @@ int primitiveSemantics_11(int a, int b) { /* { dg-final { scan-assembler-times {\mczero\.eqz\M} 6 } } */ /* { dg-final { scan-assembler-times {\mczero\.nez\M} 6 } } */ -/* { dg-final { scan-assembler-not {\mbeq} } } */ -/* { dg-final { scan-assembler-not {\mbne} } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm.c new file mode 100644 index 000000000000..a53a908ff256 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm.c @@ -0,0 +1,57 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_imm_00(long a, long b) { + return a == 2 ? 0 : b; +} + +long primitiveSemantics_compare_imm_01(long a, long b) { + return a != 2 ? 0 : b; +} + +long primitiveSemantics_compare_imm_02(long a, long b) { + return a == 2 ? b : 0; +} + +long primitiveSemantics_compare_imm_03(long a, long b) { + return a != 2 ? b : 0; +} + +long primitiveSemantics_compare_imm_04(long a, long b) { + if (a == 2) + b = 0; + return b; +} + +long primitiveSemantics_compare_imm_05(long a, long b) { + if (!(a == 2)) + b = 0; + return b; +} + +int primitiveSemantics_compare_imm_06(int a, int b) { return a == 2 ? 0 : b; } + +int primitiveSemantics_compare_imm_07(int a, int b) { return a != 2 ? 0 : b; } + +int primitiveSemantics_compare_imm_08(int a, int b) { return a == 2 ? b : 0; } + +int primitiveSemantics_compare_imm_09(int a, int b) { return a != 2 ? b : 0; } + +int primitiveSemantics_compare_imm_10(int a, int b) { + if ((a == 2)) + b = 0; + return b; +} + +int primitiveSemantics_compare_imm_11(int a, int b) { + if (!(a == 2)) + b = 0; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_0_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_0_imm.c new file mode 100644 index 000000000000..c90ed100b304 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_0_imm.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_imm_return_0_imm_00(long a, long b) { + return a == 2 ? 0 : 5; +} + +long primitiveSemantics_compare_imm_return_0_imm_01(long a, long b) { + return a != 2 ? 0 : 5; +} + +long primitiveSemantics_compare_imm_return_0_imm_02(long a, long b) { + return a == 2 ? 5 : 0; +} + +long primitiveSemantics_compare_imm_return_0_imm_03(long a, long b) { + return a != 2 ? 5 : 0; +} + +long primitiveSemantics_compare_imm_return_0_imm_04(long a, long b) { + if (a == 2) + b = 0; + else + b = 5; + return b; +} + +long primitiveSemantics_compare_imm_return_0_imm_05(long a, long b) { + if (!(a == 2)) + b = 0; + else + b = 5; + return b; +} + +int primitiveSemantics_compare_imm_return_0_imm_06(int a, int b) { + return a == 2 ? 0 : 5; +} + +int primitiveSemantics_compare_imm_return_0_imm_07(int a, int b) { + return a != 2 ? 0 : 5; +} + +int primitiveSemantics_compare_imm_return_0_imm_08(int a, int b) { + return a == 2 ? 5 : 0; +} + +int primitiveSemantics_compare_imm_return_0_imm_09(int a, int b) { + return a != 2 ? 5 : 0; +} + +int primitiveSemantics_compare_imm_return_0_imm_10(int a, int b) { + if ((a == 2)) + b = 0; + else + b = 5; + return b; +} + +int primitiveSemantics_compare_imm_return_0_imm_11(int a, int b) { + if (!(a == 2)) + b = 0; + else + b = 5; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_imm.c new file mode 100644 index 000000000000..e806f6f0807f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_imm.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_imm_return_imm_imm_00(long a, long b) { + return a == 2 ? 7 : 4; +} + +long primitiveSemantics_compare_imm_return_imm_imm_01(long a, long b) { + return a != 2 ? 7 : 4; +} + +long primitiveSemantics_compare_imm_return_imm_imm_02(long a, long b) { + return a == 2 ? 7 : 4; +} + +long primitiveSemantics_compare_imm_return_imm_imm_03(long a, long b) { + return a != 2 ? 7 : 4; +} + +long primitiveSemantics_compare_imm_return_imm_imm_04(long a, long b) { + if (a == 2) + b = 7; + else + b = 4; + return b; +} + +long primitiveSemantics_compare_imm_return_imm_imm_05(long a, long b) { + if (!(a == 2)) + b = 7; + else + b = 4; + return b; +} + +int primitiveSemantics_compare_imm_return_imm_imm_06(int a, int b) { + return a == 2 ? 7 : 4; +} + +int primitiveSemantics_compare_imm_return_imm_imm_07(int a, int b) { + return a != 2 ? 7 : 4; +} + +int primitiveSemantics_compare_imm_return_imm_imm_08(int a, int b) { + return a == 2 ? 7 : 4; +} + +int primitiveSemantics_compare_imm_return_imm_imm_09(int a, int b) { + return a != 2 ? 7 : 4; +} + +int primitiveSemantics_compare_imm_return_imm_imm_10(int a, int b) { + if ((a == 2)) + b = 7; + else + b = 4; + return b; +} + +int primitiveSemantics_compare_imm_return_imm_imm_11(int a, int b) { + if (!(a == 2)) + b = 7; + else + b = 4; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_reg.c new file mode 100644 index 000000000000..f976d608a030 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_imm_reg.c @@ -0,0 +1,65 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_imm_return_imm_reg_00(long a, long b) { + return a == 2 ? 3 : b; +} + +long primitiveSemantics_compare_imm_return_imm_reg_01(long a, long b) { + return a != 2 ? 3 : b; +} + +long primitiveSemantics_compare_imm_return_imm_reg_02(long a, long b) { + return a == 2 ? b : 3; +} + +long primitiveSemantics_compare_imm_return_imm_reg_03(long a, long b) { + return a != 2 ? b : 3; +} + +long primitiveSemantics_compare_imm_return_imm_reg_04(long a, long b) { + if (a == 2) + b = 3; + return b; +} + +long primitiveSemantics_compare_imm_return_imm_reg_05(long a, long b) { + if (!(a == 2)) + b = 3; + return b; +} + +int primitiveSemantics_compare_imm_return_imm_reg_06(int a, int b) { + return a == 2 ? 3 : b; +} + +int primitiveSemantics_compare_imm_return_imm_reg_07(int a, int b) { + return a != 2 ? 3 : b; +} + +int primitiveSemantics_compare_imm_return_imm_reg_08(int a, int b) { + return a == 2 ? b : 3; +} + +int primitiveSemantics_compare_imm_return_imm_reg_09(int a, int b) { + return a != 2 ? b : 3; +} + +int primitiveSemantics_compare_imm_return_imm_reg_10(int a, int b) { + if ((a == 2)) + b = 3; + return b; +} + +int primitiveSemantics_compare_imm_return_imm_reg_11(int a, int b) { + if (!(a == 2)) + b = 3; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_reg_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_reg_reg.c new file mode 100644 index 000000000000..90e911923731 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_imm_return_reg_reg.c @@ -0,0 +1,65 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_imm_return_reg_reg_00(long a, long b, long c) { + return a == 2 ? c : b; +} + +long primitiveSemantics_compare_imm_return_reg_reg_01(long a, long b, long c) { + return a != 2 ? c : b; +} + +long primitiveSemantics_compare_imm_return_reg_reg_02(long a, long b, long c) { + return a == 2 ? b : c; +} + +long primitiveSemantics_compare_imm_return_reg_reg_03(long a, long b, long c) { + return a != 2 ? b : c; +} + +long primitiveSemantics_compare_imm_return_reg_reg_04(long a, long b, long c) { + if (a == 2) + b = c; + return b; +} + +long primitiveSemantics_compare_imm_return_reg_reg_05(long a, long b, long c) { + if (!(a == 2)) + b = c; + return b; +} + +int primitiveSemantics_compare_imm_return_reg_reg_06(int a, int b, int c) { + return a == 2 ? c : b; +} + +int primitiveSemantics_compare_imm_return_reg_reg_07(int a, int b, int c) { + return a != 2 ? c : b; +} + +int primitiveSemantics_compare_imm_return_reg_reg_08(int a, int b, int c) { + return a == 2 ? b : c; +} + +int primitiveSemantics_compare_imm_return_reg_reg_09(int a, int b, int c) { + return a != 2 ? b : c; +} + +int primitiveSemantics_compare_imm_return_reg_reg_10(int a, int b, int c) { + if ((a == 2)) + b = c; + return b; +} + +int primitiveSemantics_compare_imm_return_reg_reg_11(int a, int b, int c) { + if (!(a == 2)) + b = c; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 12 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 12 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg.c new file mode 100644 index 000000000000..bfe8c06e1a99 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg.c @@ -0,0 +1,65 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_reg_00(long a, long b, long c) { + return a == c ? 0 : b; +} + +long primitiveSemantics_compare_reg_01(long a, long b, long c) { + return a != c ? 0 : b; +} + +long primitiveSemantics_compare_reg_02(long a, long b, long c) { + return a == c ? b : 0; +} + +long primitiveSemantics_compare_reg_03(long a, long b, long c) { + return a != c ? b : 0; +} + +long primitiveSemantics_compare_reg_04(long a, long b, long c) { + if (a == c) + b = 0; + return b; +} + +long primitiveSemantics_compare_reg_05(long a, long b, long c) { + if (!(a == c)) + b = 0; + return b; +} + +int primitiveSemantics_compare_reg_06(int a, int b, int c) { + return a == c ? 0 : b; +} + +int primitiveSemantics_compare_reg_07(int a, int b, int c) { + return a != c ? 0 : b; +} + +int primitiveSemantics_compare_reg_08(int a, int b, int c) { + return a == c ? b : 0; +} + +int primitiveSemantics_compare_reg_09(int a, int b, int c) { + return a != c ? b : 0; +} + +int primitiveSemantics_compare_reg_10(int a, int b, int c) { + if ((a == c)) + b = 0; + return b; +} + +int primitiveSemantics_compare_reg_11(int a, int b, int c) { + if (!(a == c)) + b = 0; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_0_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_0_imm.c new file mode 100644 index 000000000000..164de0695391 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_0_imm.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_reg_return_0_imm_00(long a, long b, long c) { + return a == c ? 0 : 9; +} + +long primitiveSemantics_compare_reg_return_0_imm_01(long a, long b, long c) { + return a != c ? 0 : 9; +} + +long primitiveSemantics_compare_reg_return_0_imm_02(long a, long b, long c) { + return a == c ? 9 : 0; +} + +long primitiveSemantics_compare_reg_return_0_imm_03(long a, long b, long c) { + return a != c ? 9 : 0; +} + +long primitiveSemantics_compare_reg_return_0_imm_04(long a, long b, long c) { + if (a == c) + b = 0; + else + b = 9; + return b; +} + +long primitiveSemantics_compare_reg_return_0_imm_05(long a, long b, long c) { + if (!(a == c)) + b = 0; + else + b = 9; + return b; +} + +int primitiveSemantics_compare_reg_return_0_imm_06(int a, int b, int c) { + return a == c ? 0 : 9; +} + +int primitiveSemantics_compare_reg_return_0_imm_07(int a, int b, int c) { + return a != c ? 0 : 9; +} + +int primitiveSemantics_compare_reg_return_0_imm_08(int a, int b, int c) { + return a == c ? 9 : 0; +} + +int primitiveSemantics_compare_reg_return_0_imm_09(int a, int b, int c) { + return a != c ? 9 : 0; +} + +int primitiveSemantics_compare_reg_return_0_imm_10(int a, int b, int c) { + if ((a == c)) + b = 0; + else + b = 9; + return b; +} + +int primitiveSemantics_compare_reg_return_0_imm_11(int a, int b, int c) { + if (!(a == c)) + b = 0; + else + b = 9; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_imm.c new file mode 100644 index 000000000000..8ad97abc320a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_imm.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_reg_return_imm_imm_00(long a, long b, long c) { + return a == c ? 7 : 4; +} + +long primitiveSemantics_compare_reg_return_imm_imm_01(long a, long b, long c) { + return a != c ? 7 : 4; +} + +long primitiveSemantics_compare_reg_return_imm_imm_02(long a, long b, long c) { + return a == c ? 7 : 4; +} + +long primitiveSemantics_compare_reg_return_imm_imm_03(long a, long b, long c) { + return a != c ? 7 : 4; +} + +long primitiveSemantics_compare_reg_return_imm_imm_04(long a, long b, long c) { + if (a == c) + b = 7; + else + b = 4; + return b; +} + +long primitiveSemantics_compare_reg_return_imm_imm_05(long a, long b, long c) { + if (!(a == c)) + b = 7; + else + b = 4; + return b; +} + +int primitiveSemantics_compare_reg_return_imm_imm_06(int a, int b, int c) { + return a == c ? 7 : 4; +} + +int primitiveSemantics_compare_reg_return_imm_imm_07(int a, int b, int c) { + return a != c ? 7 : 4; +} + +int primitiveSemantics_compare_reg_return_imm_imm_08(int a, int b, int c) { + return a == c ? 7 : 4; +} + +int primitiveSemantics_compare_reg_return_imm_imm_09(int a, int b, int c) { + return a != c ? 7 : 4; +} + +int primitiveSemantics_compare_reg_return_imm_imm_10(int a, int b, int c) { + if ((a == c)) + b = 7; + else + b = 4; + return b; +} + +int primitiveSemantics_compare_reg_return_imm_imm_11(int a, int b, int c) { + if (!(a == c)) + b = 7; + else + b = 4; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_reg.c new file mode 100644 index 000000000000..5199ba71ef4e --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_imm_reg.c @@ -0,0 +1,65 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_reg_return_imm_reg_00(long a, long b, long c) { + return a == c ? 10 : b; +} + +long primitiveSemantics_compare_reg_return_imm_reg_01(long a, long b, long c) { + return a != c ? 10 : b; +} + +long primitiveSemantics_compare_reg_return_imm_reg_02(long a, long b, long c) { + return a == c ? b : 10; +} + +long primitiveSemantics_compare_reg_return_imm_reg_03(long a, long b, long c) { + return a != c ? b : 10; +} + +long primitiveSemantics_compare_reg_return_imm_reg_04(long a, long b, long c) { + if (a == c) + b = 10; + return b; +} + +long primitiveSemantics_compare_reg_return_imm_reg_05(long a, long b, long c) { + if (!(a == c)) + b = 10; + return b; +} + +int primitiveSemantics_compare_reg_return_imm_reg_06(int a, int b, int c) { + return a == c ? 10 : b; +} + +int primitiveSemantics_compare_reg_return_imm_reg_07(int a, int b, int c) { + return a != c ? 10 : b; +} + +int primitiveSemantics_compare_reg_return_imm_reg_08(int a, int b, int c) { + return a == c ? b : 10; +} + +int primitiveSemantics_compare_reg_return_imm_reg_09(int a, int b, int c) { + return a != c ? b : 10; +} + +int primitiveSemantics_compare_reg_return_imm_reg_10(int a, int b, int c) { + if ((a == c)) + b = 10; + return b; +} + +int primitiveSemantics_compare_reg_return_imm_reg_11(int a, int b, int c) { + if (!(a == c)) + b = 10; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 6 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 6 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_reg_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_reg_reg.c new file mode 100644 index 000000000000..eecb95688f47 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_compare_reg_return_reg_reg.c @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_zicond -mabi=lp64d" { target { rv64 } } } */ +/* { dg-options "-march=rv32gc_zicond -mabi=ilp32f" { target { rv32 } } } */ +/* { dg-skip-if "" { *-*-* } {"-O0" "-Og" "-Os" "-Oz"} } */ + +long primitiveSemantics_compare_reg_return_reg_reg_00(long a, long b, long c, + long d) { + return a == c ? d : b; +} + +long primitiveSemantics_compare_reg_return_reg_reg_01(long a, long b, long c, + long d) { + return a != c ? d : b; +} + +long primitiveSemantics_compare_reg_return_reg_reg_02(long a, long b, long c, + long d) { + return a == c ? b : d; +} + +long primitiveSemantics_compare_reg_return_reg_reg_03(long a, long b, long c, + long d) { + return a != c ? b : d; +} + +long primitiveSemantics_compare_reg_return_reg_reg_04(long a, long b, long c, + long d) { + if (a == c) + b = d; + return b; +} + +long primitiveSemantics_compare_reg_return_reg_reg_05(long a, long b, long c, + long d) { + if (!(a == c)) + b = d; + return b; +} + +int primitiveSemantics_compare_reg_return_reg_reg_06(int a, int b, int c, + int d) { + return a == c ? d : b; +} + +int primitiveSemantics_compare_reg_return_reg_reg_07(int a, int b, int c, + int d) { + return a != c ? d : b; +} + +int primitiveSemantics_compare_reg_return_reg_reg_08(int a, int b, int c, + int d) { + return a == c ? b : d; +} + +int primitiveSemantics_compare_reg_return_reg_reg_09(int a, int b, int c, + int d) { + return a != c ? b : d; +} + +int primitiveSemantics_compare_reg_return_reg_reg_10(int a, int b, int c, + int d) { + if ((a == c)) + b = d; + return b; +} + +int primitiveSemantics_compare_reg_return_reg_reg_11(int a, int b, int c, + int d) { + if (!(a == c)) + b = d; + return b; +} + +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 12 } } */ +/* { dg-final { scan-assembler-times {\mczero.nez\M} 12 } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_0_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_0_imm.c index 0764d2919d44..e3ccb17032e7 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_0_imm.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_0_imm.c @@ -61,5 +61,5 @@ int primitiveSemantics_return_0_imm_11(int a, int b) { /* { dg-final { scan-assembler-times {\mczero\.eqz\M} 6 } } */ /* { dg-final { scan-assembler-times {\mczero\.nez\M} 6 } } */ -/* { dg-final { scan-assembler-not {\mbeq} } } */ -/* { dg-final { scan-assembler-not {\mbne} } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_imm.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_imm.c index 2ff5033bb040..62f9fb29169e 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_imm.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_imm.c @@ -69,5 +69,5 @@ int primitiveSemantics_return_imm_imm_11(int a, int b) { /* { dg-final { scan-assembler-times {\mczero\.eqz\M} 6 } } */ /* { dg-final { scan-assembler-times {\mczero\.nez\M} 6 } } */ -/* { dg-final { scan-assembler-not {\mbeq} } } */ -/* { dg-final { scan-assembler-not {\mbne} } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_reg.c index 93844d166c35..0866f86e6cef 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_reg.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_imm_reg.c @@ -61,5 +61,5 @@ int primitiveSemantics_return_imm_reg_11(int a, int b) { /* { dg-final { scan-assembler-times {\mczero\.eqz\M} 6 } } */ /* { dg-final { scan-assembler-times {\mczero\.nez\M} 6 } } */ -/* { dg-final { scan-assembler-not {\mbeq} } } */ -/* { dg-final { scan-assembler-not {\mbne} } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_reg_reg.c b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_reg_reg.c index 619ad8ecf7d2..eb1764a27bac 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_reg_reg.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics_return_reg_reg.c @@ -61,5 +61,5 @@ int primitiveSemantics_return_reg_reg_11(int a, int b, int c) { /* { dg-final { scan-assembler-times {\mczero\.eqz\M} 12 } } */ /* { dg-final { scan-assembler-times {\mczero\.nez\M} 12 } } */ -/* { dg-final { scan-assembler-not {\mbeq} } } */ -/* { dg-final { scan-assembler-not {\mbne} } } */ +/* { dg-final { scan-assembler-not {\mbeq\M} } } */ +/* { dg-final { scan-assembler-not {\mbne\M} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zicond-xor-01.c b/gcc/testsuite/gcc.target/riscv/zicond-xor-01.c index 8362ffaf5ab1..20079fd43519 100644 --- a/gcc/testsuite/gcc.target/riscv/zicond-xor-01.c +++ b/gcc/testsuite/gcc.target/riscv/zicond-xor-01.c @@ -10,5 +10,5 @@ long xor1(long crc, long poly) return crc; } -/* { dg-final { scan-assembler-times "czero.eqz\t" 1 } } */ +/* { dg-final { scan-assembler-times {\mczero.eqz\M} 1 } } */ /* { dg-final { scan-assembler-times "xor\t" 1 } } */ -- 2.47.2