We have done so for MIPSr6, which removes the support of condtional trap with IMM. To be consistent, Let's do so for pre-R6.
We also add 2 new tests 1) be sure that $0 is used. 2) be sure we expand the condtional trap compare with constant, instead of leaving it to GAS. We decide to so so for MIPSr6 is that, we find a problem for code .set noreorder .set nomacro teq $2,0 GAS expands it instead of converting it to `teq $2,$0`: li $3,0 teq $2,$3 It is wrong, as we ask for `nomacro`. GCC works well with `teq $2,IMM`, if IMM is not zero. To be sure that it will always be so in future, Let's add a test for it. gcc * config/mips/mips.md(conditional_trap): Output $0 instead of IMM0. gcc/testsuite: * gcc.target/mips/trap-compare-0.c: Testcase to be sure that $0 is used instead of IMM0 for conditional trap. * gcc.target/mips/trap-compare-imm-r6.c: Testcase to be sure that we expand condtional trap compare with constant. --- gcc/config/mips/mips.md | 2 +- .../gcc.target/mips/trap-compare-0.c | 31 ++++++++++++++++ .../gcc.target/mips/trap-compare-imm-r6.c | 36 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/mips/trap-compare-0.c create mode 100644 gcc/testsuite/gcc.target/mips/trap-compare-imm-r6.c diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index fd64d3d001a..591ae3cb438 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -1254,7 +1254,7 @@ (define_insn "*conditional_trap<mode>" (match_operand:GPR 2 "arith_operand" "dI")]) (const_int 0))] "ISA_HAS_COND_TRAPI" - "t%C0\t%z1,%2" + "t%C0\t%z1,%z2" [(set_attr "type" "trap")]) ;; diff --git a/gcc/testsuite/gcc.target/mips/trap-compare-0.c b/gcc/testsuite/gcc.target/mips/trap-compare-0.c new file mode 100644 index 00000000000..fb0078d34f1 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/trap-compare-0.c @@ -0,0 +1,31 @@ +/* Check that we use $0 instead of 0 in conditional trap. */ +/* { dg-do compile } */ +/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */ + +NOMIPS16 +void teq0 (int i) { + if (i == 0) + __builtin_trap(); +} + +NOMIPS16 +void tne0 (int i) { + if (i != 0) + __builtin_trap(); +} + +NOMIPS16 +void tge0 (int i) { + if (i >= 0) + __builtin_trap(); +} +NOMIPS16 +void tlt0 (int i) { + if (i < 0) + __builtin_trap(); +} + +/* { dg-final { scan-assembler "teq0:.*\tteq\t\\\$4,\\\$0" } } */ +/* { dg-final { scan-assembler "tne0:.*\ttne\t\\\$4,\\\$0" } } */ +/* { dg-final { scan-assembler "tge0:.*\ttge\t\\\$4,\\\$0" } } */ +/* { dg-final { scan-assembler "tlt0:.*\ttlt\t\\\$4,\\\$0" } } */ diff --git a/gcc/testsuite/gcc.target/mips/trap-compare-imm-r6.c b/gcc/testsuite/gcc.target/mips/trap-compare-imm-r6.c new file mode 100644 index 00000000000..b12e40672d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/trap-compare-imm-r6.c @@ -0,0 +1,36 @@ +/* Check that no teq $2,imm macro is used for R6. */ +/* { dg-do compile } */ +/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */ +/* { dg-options "isa_rev>=6" } */ + +NOMIPS16 +void teq5 (int i) { + if (i == 5) + __builtin_trap(); +} + +NOMIPS16 +void tne5 (int i) { + if (i != 5) + __builtin_trap(); +} + +NOMIPS16 +void tge5 (int i) { + if (i >= 5) + __builtin_trap(); +} +NOMIPS16 +void tlt5 (int i) { + if (i < 5) + __builtin_trap(); +} + +/* { dg-final { scan-assembler "teq5:.*\tli\t\\\$2,5.*\tteq\t\\\$4,\\\$2" } } */ +/* { dg-final { scan-assembler-not "teq5:.*\tteq\t\\\$4,5" } } */ +/* { dg-final { scan-assembler "tne5:.*\tli\t\\\$2,5.*\ttne\t\\\$4,\\\$2" } } */ +/* { dg-final { scan-assembler-not "tne5:.*\ttne\t\\\$4,5" } } */ +/* { dg-final { scan-assembler "tge5:.*\tli\t\\\$2,4.*\ttge\t\\\$2,\\\$4" } } */ +/* { dg-final { scan-assembler-not "tge5:.*\ttge\t\\\$4,5" } } */ +/* { dg-final { scan-assembler "tlt5:.*\tli\t\\\$2,4.*\ttge\t\\\$2,\\\$4" } } */ +/* { dg-final { scan-assembler-not "tlt5:.*\ttlt\t\\\$4,5" } } */ -- 2.39.3 (Apple Git-146)