1## Test invalid instructions on both loongarch32 and loongarch64 target.
2
3# RUN: not llvm-mc --triple=loongarch32 --mattr=-f %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK64
4# RUN: not llvm-mc --triple=loongarch64 --mattr=-f %s 2>&1 --defsym=LA64=1 | FileCheck %s
5
6## Out of range immediates
7## uimm2
8bytepick.w $a0, $a0, $a0, -1
9# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]
10bytepick.w $a0, $a0, $a0, 4
11# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]
12
13## uimm2_plus1
14alsl.w $a0, $a0, $a0, 0
15# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
16alsl.w $a0, $a0, $a0, 5
17# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
18
19## uimm5
20slli.w $a0, $a0, -1
21# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
22srli.w $a0, $a0, -1
23# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
24srai.w $a0, $a0, 32
25# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
26rotri.w $a0, $a0, 32
27# CHECK: :[[#@LINE-1]]:19: error: immediate must be an integer in the range [0, 31]
28bstrins.w $a0, $a0, 31, -1
29# CHECK: :[[#@LINE-1]]:25: error: immediate must be an integer in the range [0, 31]
30bstrpick.w $a0, $a0, 32, 0
31# CHECK: :[[#@LINE-1]]:22: error: immediate must be an integer in the range [0, 31]
32preld -1, $a0, 0
33# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]
34preld 32, $a0, 0
35# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]
36
37## uimm12
38andi $a0, $a0, -1
39# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]
40ori $a0, $a0, 4096
41# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [0, 4095]
42xori $a0, $a0, 4096
43# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]
44
45## simm12
46addi.w $a0, $a0, -2049
47# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [-2048, 2047]
48slti $a0, $a0, -2049
49# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
50sltui $a0, $a0, 2048
51# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
52preld 0, $a0, 2048
53# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [-2048, 2047]
54ld.b $a0, $a0, 2048
55# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
56ld.h $a0, $a0, 2048
57# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
58ld.w $a0, $a0, 2048
59# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
60ld.bu $a0, $a0, -2049
61# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
62ld.hu $a0, $a0, -2049
63# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
64st.b $a0, $a0, 2048
65# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
66st.h $a0, $a0, 2048
67# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
68st.w $a0, $a0, -2049
69# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
70
71## simm14_lsl2
72ll.w $a0, $a0, -32772
73# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
74ll.w $a0, $a0, -32769
75# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
76sc.w $a0, $a0, 32767
77# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
78sc.w $a0, $a0, 32768
79# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
80
81## simm16_lsl2
82beq $a0, $a0, -0x20004
83# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
84bne $a0, $a0, -0x20004
85# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
86blt $a0, $a0, -0x1FFFF
87# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
88bge $a0, $a0, -0x1FFFF
89# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
90bltu $a0, $a0, 0x1FFFF
91# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
92bgeu $a0, $a0, 0x1FFFF
93# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
94jirl $a0, $a0, 0x20000
95# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
96
97## simm20
98lu12i.w $a0, -0x80001
99# CHECK: :[[#@LINE-1]]:14: error: immediate must be an integer in the range [-524288, 524287]
100pcaddi $a0, -0x80001
101# CHECK: :[[#@LINE-1]]:13: error: immediate must be an integer in the range [-524288, 524287]
102pcaddu12i $a0, 0x80000
103# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]
104pcalau12i $a0, 0x80000
105# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]
106
107## simm21_lsl2
108beqz $a0, -0x400001
109# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
110bnez $a0, -0x3FFFFF
111# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
112beqz $a0, 0x3FFFFF
113# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
114bnez $a0, 0x400000
115# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
116
117## simm26_lsl2
118b -0x8000001
119# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
120b 0x1
121# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
122bl 0x7FFFFFF
123# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
124bl 0x8000000
125# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
126
127## Invalid mnemonics
128nori $a0, $a0, 0
129# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
130andni $a0, $a0, 0
131# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
132orni $a0, $a0, 0
133# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
134
135## Invalid register names
136add.w $foo, $a0, $a0
137# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
138sub.w $a8, $a0, $a0
139# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
140addi.w $x0, $a0, 0
141# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
142alsl.w $t9, $a0, $a0, 1
143# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
144lu12i.w $s10, 0
145# CHECK: :[[#@LINE-1]]:10: error: invalid operand for instruction
146
147.ifndef LA64
148## LoongArch64 mnemonics
149add.d $a0, $a0, $a0
150# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
151addi.d $a0, $a0, 0
152# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
153.endif
154
155## Invalid operand types
156slt $a0, $a0, 0
157# CHECK: :[[#@LINE-1]]:15: error: invalid operand for instruction
158slti $a0, 0, 0
159# CHECK: :[[#@LINE-1]]:11: error: invalid operand for instruction
160
161## Too many operands
162andi $a0, $a0, 0, 0
163# CHECK: :[[#@LINE-1]]:19: error: invalid operand for instruction
164
165## Too few operands
166and $a0, $a0
167# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction
168andi $a0, $a0
169# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction
170
171## Instructions outside the base integer ISA
172## TODO: Test instructions in LSX/LASX/LBT/LVZ after their introduction.
173
174## Floating-Point mnemonics
175fadd.s $fa0, $fa0, $fa0
176# CHECK:   :[[#@LINE-1]]:1: error: instruction requires the following: 'F' (Single-Precision Floating-Point)
177fadd.d $fa0, $fa0, $fa0
178# CHECK:   :[[#@LINE-1]]:1: error: instruction requires the following: 'D' (Double-Precision Floating-Point)
179
180## Using floating point registers when integer registers are expected
181sll.w $a0, $a0, $fa0
182# CHECK: :[[#@LINE-1]]:18: error: invalid operand for instruction
183
184## msbw < lsbw
185# CHECK: :[[#@LINE+1]]:21: error: msb is less than lsb
186bstrins.w $a0, $a0, 1, 2
187# CHECK:            ^~~~
188
189# CHECK: :[[#@LINE+1]]:22: error: msb is less than lsb
190bstrpick.w $a0, $a0, 30, 31
191# CHECK:             ^~~~~~
192