[v1] LoongArch: gcsrxchg cannot use r0 and r1 as rj registers

Message ID 20240229114045.1407397-1-cailulu@loongson.cn
State Unresolved
Headers
Series [v1] LoongArch: gcsrxchg cannot use r0 and r1 as rj registers |

Checks

Context Check Description
snail/binutils-gdb-check warning Git am fail log

Commit Message

Lulu Cai Feb. 29, 2024, 11:40 a.m. UTC
  ---
 gas/config/tc-loongarch.c                         | 5 +++--
 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.d | 3 +++
 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.l | 2 ++
 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.s | 1 +
 gas/testsuite/gas/loongarch/lvz-lbt.d             | 2 +-
 gas/testsuite/gas/loongarch/lvz-lbt.s             | 2 +-
 6 files changed, 11 insertions(+), 4 deletions(-)
 create mode 100644 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.d
 create mode 100644 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.l
 create mode 100644 gas/testsuite/gas/loongarch/check_gcsrxchg_regs.s
  

Patch

diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
index de92366eda4..3a661e76967 100644
--- a/gas/config/tc-loongarch.c
+++ b/gas/config/tc-loongarch.c
@@ -962,8 +962,9 @@  check_this_insn_before_appending (struct loongarch_cl_insn *ip)
     }
   else if (ip->insn->mask != 0 && (ip->insn_bin & 0xfe0003c0) == 0x04000000
 	   /* csrxchg  rd, rj, csr_num  */
-	   && (strcmp ("csrxchg", ip->name) == 0))
-    as_fatal (_("csrxchg require rj != $r0 && rj != $r1"));
+	   && (strcmp ("csrxchg", ip->name) == 0
+	       || strcmp ("gcsrxchg", ip->name) == 0))
+    as_fatal (_("g?csrxchg require rj != $r0 && rj != $r1"));
 
   return ret;
 }
diff --git a/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.d b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.d
new file mode 100644
index 00000000000..f8ff34e2473
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.d
@@ -0,0 +1,3 @@ 
+#as:
+#source: check_gcsrxchg_regs.s
+#error_output: check_gcsrxchg_regs.l
diff --git a/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.l b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.l
new file mode 100644
index 00000000000..54cbdaf657b
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.l
@@ -0,0 +1,2 @@ 
+.*: Assembler messages:
+.*error: g\?csrxchg require rj != \$r0 && rj != \$r1
diff --git a/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.s b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.s
new file mode 100644
index 00000000000..acc2f51fbc3
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/check_gcsrxchg_regs.s
@@ -0,0 +1 @@ 
+gcsrxchg	$r0, $r1, 1
diff --git a/gas/testsuite/gas/loongarch/lvz-lbt.d b/gas/testsuite/gas/loongarch/lvz-lbt.d
index f89707762dc..557f3ac1a6d 100644
--- a/gas/testsuite/gas/loongarch/lvz-lbt.d
+++ b/gas/testsuite/gas/loongarch/lvz-lbt.d
@@ -10,7 +10,7 @@  Disassembly of section .text:
 00000000.* <.text>:
 [ 	]*0:[ 	]*05000400[ 	]*gcsrrd[ 	]*\$zero,[ 	]*0x1[ 	]*
 [ 	]*4:[ 	]*05000420[ 	]*gcsrwr[ 	]*\$zero,[ 	]*0x1[ 	]*
-[ 	]*8:[ 	]*05000420[ 	]*gcsrwr[ 	]*\$zero,[ 	]*0x1[ 	]*
+[ 	]*8:[ 	]*05000483[ 	]*gcsrxchg[ 	]*\$sp, \$a0, 0x1
 [ 	]*c:[ 	]*06482401[ 	]*gtlbflush[ 	]*
 [ 	]*10:[ 	]*002b8001[ 	]*hvcl[ 	]*0x1[ 	]*
 [ 	]*14:[ 	]*00000820[ 	]*movgr2scr[ 	]*\$scr0,[ 	]*\$ra[ 	]*
diff --git a/gas/testsuite/gas/loongarch/lvz-lbt.s b/gas/testsuite/gas/loongarch/lvz-lbt.s
index 64469a4362d..850f77ff3a7 100644
--- a/gas/testsuite/gas/loongarch/lvz-lbt.s
+++ b/gas/testsuite/gas/loongarch/lvz-lbt.s
@@ -1,6 +1,6 @@ 
 gcsrrd	$r0, 1
 gcsrwr	$r0, 1
-gcsrxchg	$r0, $r1, 1
+gcsrxchg	$r3, $r4, 1
 gtlbflush
 hvcl	1
 movgr2scr	$scr0, $r1