[PATCH] MIPS/GAS: Omit LI 0 for condition trap
YunQiang Su
syq@debian.org
Wed Jun 19 17:00:38 GMT 2024
From: YunQiang Su <syq@gcc.gnu.org>
MIPSr6 removes condition trap instructions with imm, so we expand
the instruction like "tne $2,IMM" to
li $at,IMM
tne $2,$at
While if IMM is 0, we can use
tne $2,$zero
only.
---
gas/config/tc-mips.c | 11 ++++++++---
gas/testsuite/gas/mips/cond-trap-imm-zero.d | 16 ++++++++++++++++
gas/testsuite/gas/mips/cond-trap-imm-zero.s | 9 +++++++++
gas/testsuite/gas/mips/mips.exp | 2 ++
4 files changed, 35 insertions(+), 3 deletions(-)
create mode 100644 gas/testsuite/gas/mips/cond-trap-imm-zero.d
create mode 100644 gas/testsuite/gas/mips/cond-trap-imm-zero.s
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 8f54cb8937a..863f56d5f8c 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -13815,9 +13815,14 @@ macro (struct mips_cl_insn *ip, char *str)
case M_TNE_I:
s = "tne";
trap:
- used_at = 1;
- load_register (AT, &imm_expr, GPR_SIZE == 64);
- macro_build (NULL, s, "s,t", op[0], AT);
+ if (imm_expr.X_add_number != 0)
+ {
+ used_at = 1;
+ load_register (AT, &imm_expr, GPR_SIZE == 64);
+ macro_build (NULL, s, "s,t", op[0], AT);
+ }
+ else
+ macro_build (NULL, s, "s,t", op[0], ZERO);
break;
case M_TRUNCWS:
diff --git a/gas/testsuite/gas/mips/cond-trap-imm-zero.d b/gas/testsuite/gas/mips/cond-trap-imm-zero.d
new file mode 100644
index 00000000000..39d4c9609b2
--- /dev/null
+++ b/gas/testsuite/gas/mips/cond-trap-imm-zero.d
@@ -0,0 +1,16 @@
+#objdump: -dr
+#name: Condition Trap convert IMM0 to REG0 (MIPSr6)
+#as: -32
+
+.*: +file format .*
+
+Disassembly of section \.text:
+
+00000000 <f>:
+ 0: 00c00034 teq a2,zero
+ 4: 00c00030 tge a2,zero
+ 8: 00c00031 tgeu a2,zero
+ c: 00c00032 tlt a2,zero
+ 10: 00c00033 tltu a2,zero
+ 14: 00c00036 tne a2,zero
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/cond-trap-imm-zero.s b/gas/testsuite/gas/mips/cond-trap-imm-zero.s
new file mode 100644
index 00000000000..84cc7f1f842
--- /dev/null
+++ b/gas/testsuite/gas/mips/cond-trap-imm-zero.s
@@ -0,0 +1,9 @@
+ .set noreorder
+ .set nomacro
+f:
+ teq $6,0
+ tge $6,0
+ tgeu $6,0
+ tlt $6,0
+ tltu $6,0
+ tne $6,0
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index f657b0e17a3..6ec10ddb165 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -2180,4 +2180,6 @@ if { [istarget mips*-*-vxworks*] } {
if [istarget *-*-irix*] {
run_dump_test "irix-no-pdr"
}
+
+ run_dump_test_arches "cond-trap-imm-zero" [mips_arch_list_matching mips32r6]
}
--
2.39.3 (Apple Git-146)
More information about the Binutils
mailing list