LoongArch: Scan all illegal operand instructions without interruption

Currently, gas will exit immediately and report an error when
it sees illegal operands, and will not process the remaining
instructions. Replace as_fatal with as_bad to check for all
illegal operands.

Add test cases for illegal operands of some instructions.
This commit is contained in:
Lulu Cai
2024-03-02 10:47:42 +08:00
committed by liuzhensong
parent d8915f27eb
commit 272acb42cf
8 changed files with 269 additions and 7 deletions

View File

@@ -958,8 +958,8 @@ check_this_insn_before_appending (struct loongarch_cl_insn *ip)
/* For AMO insn amswap.[wd], amadd.[wd], etc. */
if (ip->args[0] != 0
&& (ip->args[0] == ip->args[1] || ip->args[0] == ip->args[2]))
as_fatal (_("AMO insns require rd != base && rd != rt"
" when rd isn't $r0"));
as_bad (_("automic memory operations insns require rd != rj"
" && rd != rk when rd isn't r0"));
}
else if ((ip->insn->mask == 0xffe08000
/* bstrins.w rd, rj, msbw, lsbw */
@@ -970,12 +970,13 @@ check_this_insn_before_appending (struct loongarch_cl_insn *ip)
{
/* For bstr(ins|pick).[wd]. */
if (ip->args[2] < ip->args[3])
as_fatal (_("bstr(ins|pick).[wd] require msbd >= lsbd"));
as_bad (_("bstr(ins|pick).[wd] require msbd >= lsbd"));
}
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_bad (_("g?csrxchg require rj != r0 && rj != r1"));
return ret;
}

View File

@@ -0,0 +1,18 @@
#as:
#objdump: -d
#skip: loongarch32-*-*
.*:[ ]+file format .*
Disassembly of section .text:
0+ <.*>:
0: 00682041 bstrins\.w \$ra, \$tp, 0x8, 0x8
4: 00882041 bstrins\.d \$ra, \$tp, 0x8, 0x8
8: 0068a041 bstrpick\.w \$ra, \$tp, 0x8, 0x8
c: 00c82041 bstrpick\.d \$ra, \$tp, 0x8, 0x8
10: 00680041 bstrins\.w \$ra, \$tp, 0x8, 0x0
14: 00880041 bstrins\.d \$ra, \$tp, 0x8, 0x0
18: 00688041 bstrpick\.w \$ra, \$tp, 0x8, 0x0
1c: 00c80041 bstrpick\.d \$ra, \$tp, 0x8, 0x0

View File

@@ -0,0 +1,9 @@
bstrins.w $r1,$r2,8,8
bstrins.d $r1,$r2,8,8
bstrpick.w $r1,$r2,8,8
bstrpick.d $r1,$r2,8,8
bstrins.w $r1,$r2,8,0
bstrins.d $r1,$r2,8,0
bstrpick.w $r1,$r2,8,0
bstrpick.d $r1,$r2,8,0

View File

@@ -0,0 +1,113 @@
.*: Assembler messages:
.*:2: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:3: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:4: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:5: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:6: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:7: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:8: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:9: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:10: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:11: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:12: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:13: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:14: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:15: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:16: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:17: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:18: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:19: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:20: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:21: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:22: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:23: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:24: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:25: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:26: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:27: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:28: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:29: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:30: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:31: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:32: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:33: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:34: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:35: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:36: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:37: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:38: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:39: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:40: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:41: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:42: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:43: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:44: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:45: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:46: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:47: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:48: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:49: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:50: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:51: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:52: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:53: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:54: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:55: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:56: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:57: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:58: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:59: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:60: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:61: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:62: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:63: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:64: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:65: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:66: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:67: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:68: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:69: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:70: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:71: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:72: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:73: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:74: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:75: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:76: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:77: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:78: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:79: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:80: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:81: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:82: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:83: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:84: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:85: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:86: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:87: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:88: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:89: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:90: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:91: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:92: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:93: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:94: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:95: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:96: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:97: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:98: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:99: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:100: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:101: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:102: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:103: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:104: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:105: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
.*:108: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
.*:109: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
.*:110: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
.*:111: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
.*:114: Error: g\?csrxchg require rj != r0 && rj != r1
.*:115: Error: g\?csrxchg require rj != r0 && rj != r1
.*:116: Error: g\?csrxchg require rj != r0 && rj != r1
.*:117: Error: g\?csrxchg require rj != r0 && rj != r1

View File

@@ -0,0 +1,117 @@
# Illegal operand of atomic memory access instruction.
amcas.b $r1,$r1,$r2
amcas.b $r1,$r2,$r1
amcas.h $r1,$r1,$r2
amcas.h $r1,$r2,$r1
amcas.w $r1,$r1,$r2
amcas.w $r1,$r2,$r1
amcas.d $r1,$r1,$r2
amcas.d $r1,$r2,$r1
amcas_db.b $r1,$r1,$r2
amcas_db.b $r1,$r2,$r1
amcas_db.h $r1,$r1,$r2
amcas_db.h $r1,$r2,$r1
amcas_db.w $r1,$r1,$r2
amcas_db.w $r1,$r2,$r1
amcas_db.d $r1,$r1,$r2
amcas_db.d $r1,$r2,$r1
amswap.b $r1,$r1,$r2
amswap.b $r1,$r2,$r1
amswap.h $r1,$r1,$r2
amswap.h $r1,$r2,$r1
amadd.b $r1,$r1,$r2
amadd.b $r1,$r2,$r1
amadd.h $r1,$r1,$r2
amadd.h $r1,$r2,$r1
amswap_db.b $r1,$r1,$r2
amswap_db.b $r1,$r2,$r1
amswap_db.h $r1,$r1,$r2
amswap_db.h $r1,$r2,$r1
amadd_db.b $r1,$r1,$r2
amadd_db.b $r1,$r2,$r1
amadd_db.h $r1,$r1,$r2
amadd_db.h $r1,$r2,$r1
amswap.w $r1,$r1,$r2
amswap.w $r1,$r2,$r1
amswap.d $r1,$r1,$r2
amswap.d $r1,$r2,$r1
amadd.w $r1,$r1,$r2
amadd.w $r1,$r2,$r1
amadd.d $r1,$r1,$r2
amadd.d $r1,$r2,$r1
amand.w $r1,$r1,$r2
amand.w $r1,$r2,$r1
amand.d $r1,$r1,$r2
amand.d $r1,$r2,$r1
amor.w $r1,$r1,$r2
amor.w $r1,$r2,$r1
amor.d $r1,$r1,$r2
amor.d $r1,$r2,$r1
amxor.w $r1,$r1,$r2
amxor.w $r1,$r2,$r1
amxor.d $r1,$r1,$r2
amxor.d $r1,$r2,$r1
ammax.w $r1,$r1,$r2
ammax.w $r1,$r2,$r1
ammax.d $r1,$r1,$r2
ammax.d $r1,$r2,$r1
ammin.w $r1,$r1,$r2
ammin.w $r1,$r2,$r1
ammin.d $r1,$r1,$r2
ammin.d $r1,$r2,$r1
ammax.wu $r1,$r1,$r2
ammax.wu $r1,$r2,$r1
ammax.du $r1,$r1,$r2
ammax.du $r1,$r2,$r1
ammin.wu $r1,$r1,$r2
ammin.wu $r1,$r2,$r1
ammin.du $r1,$r1,$r2
ammin.du $r1,$r2,$r1
amswap_db.w $r1,$r1,$r2
amswap_db.w $r1,$r2,$r1
amswap_db.d $r1,$r1,$r2
amswap_db.d $r1,$r2,$r1
amadd_db.w $r1,$r1,$r2
amadd_db.w $r1,$r2,$r1
amadd_db.d $r1,$r1,$r2
amadd_db.d $r1,$r2,$r1
amand_db.w $r1,$r1,$r2
amand_db.w $r1,$r2,$r1
amand_db.d $r1,$r1,$r2
amand_db.d $r1,$r2,$r1
amor_db.w $r1,$r1,$r2
amor_db.w $r1,$r2,$r1
amor_db.d $r1,$r1,$r2
amor_db.d $r1,$r2,$r1
amxor_db.w $r1,$r1,$r2
amxor_db.w $r1,$r2,$r1
amxor_db.d $r1,$r1,$r2
amxor_db.d $r1,$r2,$r1
ammax_db.w $r1,$r1,$r2
ammax_db.w $r1,$r2,$r1
ammax_db.d $r1,$r1,$r2
ammax_db.d $r1,$r2,$r1
ammin_db.w $r1,$r1,$r2
ammin_db.w $r1,$r2,$r1
ammin_db.d $r1,$r1,$r2
ammin_db.d $r1,$r2,$r1
ammax_db.wu $r1,$r1,$r2
ammax_db.wu $r1,$r2,$r1
ammax_db.du $r1,$r1,$r2
ammax_db.du $r1,$r2,$r1
ammin_db.wu $r1,$r1,$r2
ammin_db.wu $r1,$r2,$r1
ammin_db.du $r1,$r1,$r2
ammin_db.du $r1,$r2,$r1
# Illegal operand of bstr(ins|pick).[wd]
bstrins.w $r1,$r2,0,8
bstrins.d $r1,$r2,0,8
bstrpick.w $r1,$r2,0,8
bstrpick.d $r1,$r2,0,8
# Illegal operand of csrxchg/gcsrxchg
csrxchg $r0,$r0,1
csrxchg $r0,$r1,1
gcsrxchg $r0,$r0,1
gcsrxchg $r0,$r1,1

View File

@@ -32,4 +32,8 @@ if [istarget loongarch*-*-*] {
run_list_test "align"
run_list_test "reg-s9"
if [istarget loongarch64-*-*] {
run_list_test "illegal-operand"
}
}

View File

@@ -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:[ ]*05000440[ ]*gcsrxchg[ ]*\$zero,[ ]*\$tp,[ ]*0x1[ ]*
[ ]*c:[ ]*06482401[ ]*gtlbflush[ ]*
[ ]*10:[ ]*002b8001[ ]*hvcl[ ]*0x1[ ]*
[ ]*14:[ ]*00000820[ ]*movgr2scr[ ]*\$scr0,[ ]*\$ra[ ]*

View File

@@ -1,6 +1,6 @@
gcsrrd $r0, 1
gcsrwr $r0, 1
gcsrxchg $r0, $r1, 1
gcsrxchg $r0, $r2, 1
gtlbflush
hvcl 1
movgr2scr $scr0, $r1