xref: /llvm-project-15.0.7/llvm/test/MC/CSKY/basic.s (revision 2d28100b)
1# RUN: llvm-mc %s -triple=csky -show-encoding | FileCheck -check-prefixes=CHECK-ASM %s
2
3# CHECK-ASM: addi32 a0, sp, 2
4# CHECK-ASM: encoding: [0x0e,0xe4,0x01,0x00]
5addi32 a0, sp, 2
6
7# CHECK-ASM: subi32 a0, sp, 2
8# CHECK-ASM: encoding: [0x0e,0xe4,0x01,0x10]
9subi32 a0, sp, 2
10
11# CHECK-ASM: andi32 a0, sp, 2
12# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x20]
13andi32 a0, sp, 2
14
15# CHECK-ASM: andni32 a0, sp, 2
16# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x30]
17andni32 a0, sp, 2
18
19# CHECK-ASM: xori32 a0, sp, 2
20# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x40]
21xori32 a0, sp, 2
22
23# CHECK-ASM: lsli32 a0, sp, 2
24# CHECK-ASM: encoding: [0x4e,0xc4,0x20,0x48]
25lsli32 a0, sp, 2
26
27# CHECK-ASM: lsri32 a0, sp, 2
28# CHECK-ASM: encoding: [0x4e,0xc4,0x40,0x48]
29lsri32 a0, sp, 2
30
31# CHECK-ASM: asri32 a0, sp, 2
32# CHECK-ASM: encoding: [0x4e,0xc4,0x80,0x48]
33asri32 a0, sp, 2
34
35# CHECK-ASM: ori32 a0, sp, 2
36# CHECK-ASM: encoding: [0x0e,0xec,0x02,0x00]
37ori32 a0, sp, 2
38
39# CHECK-ASM: rotli32 a0, sp, 2
40# CHECK-ASM: encoding: [0x4e,0xc4,0x00,0x49]
41rotli32 a0, sp, 2
42
43# CHECK-ASM: cmpnei32 a0, 2
44# CHECK-ASM: encoding: [0x40,0xeb,0x02,0x00]
45cmpnei32 a0, 2
46
47# CHECK-ASM: cmphsi32 a0, 2
48# CHECK-ASM: encoding: [0x00,0xeb,0x01,0x00]
49cmphsi32 a0, 2
50
51# CHECK-ASM: cmplti32 a0, 2
52# CHECK-ASM: encoding: [0x20,0xeb,0x01,0x00]
53cmplti32 a0, 2
54
55# CHECK-ASM: movi32 a0, 2
56# CHECK-ASM: encoding: [0x00,0xea,0x02,0x00]
57movi32 a0, 2
58
59# CHECK-ASM: movih32 a0, 2
60# CHECK-ASM: encoding: [0x20,0xea,0x02,0x00]
61movih32 a0, 2
62
63# CHECK-ASM: addu32 a3, l0, l1
64# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x00]
65addu32 a3, l0, l1
66
67# CHECK-ASM: subu32 a3, l0, l1
68# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x00]
69subu32 a3, l0, l1
70
71# CHECK-ASM: and32 a3, l0, l1
72# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x20]
73and32 a3, l0, l1
74
75# CHECK-ASM: andn32 a3, l0, l1
76# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x20]
77andn32 a3, l0, l1
78
79# CHECK-ASM: or32 a3, l0, l1
80# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x24]
81or32 a3, l0, l1
82
83# CHECK-ASM: xor32 a3, l0, l1
84# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x24]
85xor32 a3, l0, l1
86
87# CHECK-ASM: nor32 a3, l0, l1
88# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x24]
89nor32 a3, l0, l1
90
91# CHECK-ASM: lsl32 a3, l0, l1
92# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x40]
93lsl32 a3, l0, l1
94
95# CHECK-ASM: lsr32 a3, l0, l1
96# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x40]
97lsr32 a3, l0, l1
98
99# CHECK-ASM: asr32 a3, l0, l1
100# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x40]
101asr32 a3, l0, l1
102
103# CHECK-ASM: mult32 a3, l0, l1
104# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x84]
105mult32 a3, l0, l1
106
107# CHECK-ASM: divs32 a3, l0, l1
108# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x80]
109divs32 a3, l0, l1
110
111# CHECK-ASM: divu32 a3, l0, l1
112# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x80]
113divu32 a3, l0, l1
114
115# CHECK-ASM: ixh32 a3, l0, l1
116# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x08]
117ixh32 a3, l0, l1
118
119# CHECK-ASM: ixw32 a3, l0, l1
120# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x08]
121ixw32 a3, l0, l1
122
123# CHECK-ASM: ixd32 a3, l0, l1
124# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x08]
125ixd32 a3, l0, l1
126
127# CHECK-ASM: addc32 a3, l0, l1
128# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x00]
129addc32 a3, l0, l1
130
131# CHECK-ASM: subc32 a3, l0, l1
132# CHECK-ASM: encoding: [0xa4,0xc4,0x03,0x01]
133subc32 a3, l0, l1
134
135# CHECK-ASM: ld32.b a0, (sp, 2)
136# CHECK-ASM: encoding: [0x0e,0xd8,0x02,0x00]
137ld32.b a0, (sp, 2)
138
139# CHECK-ASM: ld32.bs a0, (sp, 2)
140# CHECK-ASM: encoding: [0x0e,0xd8,0x02,0x40]
141ld32.bs a0, (sp, 2)
142
143# CHECK-ASM: ld32.h a0, (sp, 2)
144# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x10]
145ld32.h a0, (sp, 2)
146
147# CHECK-ASM: ld32.hs a0, (sp, 2)
148# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x50]
149ld32.hs a0, (sp, 2)
150
151# CHECK-ASM: ld32.w a0, (sp, 4)
152# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x20]
153ld32.w a0, (sp, 4)
154
155# CHECK-ASM: ldr32.b a0, (sp, l1 << 2)
156# CHECK-ASM: encoding: [0xae,0xd0,0x80,0x00]
157ldr32.b a0, (sp, l1 << 2)
158
159# CHECK-ASM: ldr32.bs a0, (sp, l1 << 2)
160# CHECK-ASM: encoding: [0xae,0xd0,0x80,0x10]
161ldr32.bs a0, (sp, l1 << 2)
162
163# CHECK-ASM: ldr32.h a0, (sp, l1 << 3)
164# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x05]
165ldr32.h a0, (sp, l1 << 3)
166
167# CHECK-ASM: ldr32.hs a0, (sp, l1 << 3)
168# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x15]
169ldr32.hs a0, (sp, l1 << 3)
170
171# CHECK-ASM: ldr32.w a0, (sp, l1 << 3)
172# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x09]
173ldr32.w a0, (sp, l1 << 3)
174
175# CHECK-ASM: st32.b a0, (sp, 2)
176# CHECK-ASM: encoding: [0x0e,0xdc,0x02,0x00]
177st32.b a0, (sp, 2)
178
179# CHECK-ASM: st32.h a0, (sp, 2)
180# CHECK-ASM: encoding: [0x0e,0xdc,0x01,0x10]
181st32.h a0, (sp, 2)
182
183# CHECK-ASM: st32.w a0, (sp, 4)
184# CHECK-ASM: encoding: [0x0e,0xdc,0x01,0x20]
185st32.w a0, (sp, 4)
186
187# CHECK-ASM: str32.b a0, (sp, l1 << 2)
188# CHECK-ASM: encoding: [0xae,0xd4,0x80,0x00]
189str32.b a0, (sp, l1 << 2)
190
191# CHECK-ASM: str32.h a0, (sp, l1 << 3)
192# CHECK-ASM: encoding: [0xae,0xd4,0x00,0x05]
193str32.h a0, (sp, l1 << 3)
194
195# CHECK-ASM: str32.w a0, (sp, l1 << 3)
196# CHECK-ASM: encoding: [0xae,0xd4,0x00,0x09]
197str32.w a0, (sp, l1 << 3)
198
199# CHECK-ASM: not32 a3, l0
200# CHECK-ASM: encoding: [0x84,0xc4,0x83,0x24]
201not32 a3, l0
202
203# CHECK-ASM: mov32 a3, l0
204# CHECK-ASM: encoding: [0x04,0xc4,0x23,0x48]
205mov32 a3, l0
206
207# CHECK-ASM: movt32 a3, l0
208# CHECK-ASM: encoding: [0x64,0xc4,0x40,0x0c]
209movt32 a3, l0
210
211# CHECK-ASM: movf32 a3, l0
212# CHECK-ASM: encoding: [0x64,0xc4,0x20,0x0c]
213movf32 a3, l0
214
215# CHECK-ASM: mvc32 a3
216# CHECK-ASM: encoding: [0x00,0xc4,0x03,0x05]
217mvc32 a3
218
219# CHECK-ASM: mvcv32 a3
220# CHECK-ASM: encoding: [0x00,0xc4,0x03,0x06]
221mvcv32 a3
222
223# CHECK-ASM: cmpne32 a3, l0
224# CHECK-ASM: encoding: [0x83,0xc4,0x80,0x04]
225cmpne32 a3, l0
226
227# CHECK-ASM: cmphs32 a3, l0
228# CHECK-ASM: encoding: [0x83,0xc4,0x20,0x04]
229cmphs32 a3, l0
230
231# CHECK-ASM: cmplt32 a3, l0
232# CHECK-ASM: encoding: [0x83,0xc4,0x40,0x04]
233cmplt32 a3, l0
234
235# CHECK-ASM: zext32 a3, l0, 7, 0
236# CHECK-ASM: encoding: [0x04,0xc4,0xe3,0x54]
237zext32 a3, l0, 7, 0
238
239# CHECK-ASM: sext32 a3, l0, 7, 0
240# CHECK-ASM: encoding: [0x04,0xc4,0xe3,0x58]
241sext32 a3, l0, 7, 0
242
243# CHECK-ASM: br32 .L.test
244# CHECK-ASM: encoding: [A,0xe8'A',A,A]
245# CHECK-ASM: fixup A - offset: 0, value: .L.test, kind: fixup_csky_pcrel_imm16_scale2
246.L.test:
247br32 .L.test
248
249# CHECK-ASM: bt32 .L.test2
250# CHECK-ASM: encoding: [0x60'A',0xe8'A',A,A]
251# CHECK-ASM: fixup A - offset: 0, value: .L.test2, kind: fixup_csky_pcrel_imm16_scale2
252.L.test2:
253bt32 .L.test2
254
255# CHECK-ASM: bf32 .L.test3
256# CHECK-ASM: encoding: [0x40'A',0xe8'A',A,A]
257# CHECK-ASM: fixup A - offset: 0, value: .L.test3, kind: fixup_csky_pcrel_imm16_scale2
258.L.test3:
259bf32 .L.test3
260
261# CHECK-ASM: bez32 a0, .L.test4
262# CHECK-ASM: encoding: [A,0xe9'A',A,A]
263# CHECK-ASM: fixup A - offset: 0, value: .L.test4, kind: fixup_csky_pcrel_imm16_scale2
264.L.test4:
265bez32 a0, .L.test4
266
267# CHECK-ASM: bnez32 a0, .L.test5
268# CHECK-ASM: encoding: [0x20'A',0xe9'A',A,A]
269# CHECK-ASM: fixup A - offset: 0, value: .L.test5, kind: fixup_csky_pcrel_imm16_scale2
270.L.test5:
271bnez32 a0, .L.test5
272
273# CHECK-ASM: bhz32 a0, .L.test6
274# CHECK-ASM: encoding: [0x40'A',0xe9'A',A,A]
275# CHECK-ASM: fixup A - offset: 0, value: .L.test6, kind: fixup_csky_pcrel_imm16_scale2
276.L.test6:
277bhz32 a0, .L.test6
278
279# CHECK-ASM: blsz32 a0, .L.test7
280# CHECK-ASM: encoding: [0x60'A',0xe9'A',A,A]
281# CHECK-ASM: fixup A - offset: 0, value: .L.test7, kind: fixup_csky_pcrel_imm16_scale2
282.L.test7:
283blsz32 a0, .L.test7
284
285# CHECK-ASM: blz32 a0, .L.test8
286# CHECK-ASM: encoding: [0x80'A',0xe9'A',A,A]
287# CHECK-ASM: fixup A - offset: 0, value: .L.test8, kind: fixup_csky_pcrel_imm16_scale2
288.L.test8:
289blz32 a0, .L.test8
290
291# CHECK-ASM: bhsz32 a0, .L.test9
292# CHECK-ASM: encoding: [0xa0'A',0xe9'A',A,A]
293# CHECK-ASM: fixup A - offset: 0, value: .L.test9, kind: fixup_csky_pcrel_imm16_scale2
294.L.test9:
295bhsz32 a0, .L.test9
296
297# CHECK-ASM: jmp32 a3
298# CHECK-ASM: encoding: [0xc3,0xe8,0x00,0x00]
299jmp32 a3
300
301# CHECK-ASM: jmpi32 .L.test10
302# CHECK-ASM: encoding: [0xc0'A',0xea'A',A,A]
303# CHECK-ASM: fixup A - offset: 0, value: .L.test10, kind: fixup_csky_pcrel_uimm16_scale4
304.L.test10:
305jmpi32 [.L.test10]
306
307# CHECK-ASM: bsr32 .L.test11
308# CHECK-ASM: encoding: [A,0xe0'A',A,A]
309# CHECK-ASM: fixup A - offset: 0, value: .L.test11, kind: fixup_csky_pcrel_imm26_scale2
310.L.test11:
311bsr32 .L.test11
312
313# CHECK-ASM: jsr32 a3
314# CHECK-ASM: encoding: [0xe3,0xe8,0x00,0x00]
315jsr32 a3
316
317# CHECK-ASM: jsri32 .L.test12
318# CHECK-ASM: encoding: [0xe0'A',0xea'A',A,A]
319# CHECK-ASM: fixup A - offset: 0, value: .L.test12, kind: fixup_csky_pcrel_uimm16_scale4
320.L.test12:
321jsri32 [.L.test12]
322
323# CHECK-ASM: rts32
324# CHECK-ASM: encoding: [0xcf,0xe8,0x00,0x00]
325rts32
326
327# CHECK-ASM: grs32 a0, .L.test13
328# CHECK-ASM: encoding: [0x0c'A',0xcc'A',A,A]
329# CHECK-ASM: fixup A - offset: 0, value: .L.test13, kind: fixup_csky_pcrel_imm18_scale2
330.L.test13:
331grs32 a0, .L.test13
332
333# CHECK-ASM: lrw32 a0, .L.test14
334# CHECK-ASM: encoding: [0x80'A',0xea'A',A,A]
335# CHECK-ASM: fixup A - offset: 0, value: .L.test14, kind: fixup_csky_pcrel_uimm16_scale4
336.L.test14:
337lrw32 a0, [.L.test14]
338
339# RUN: not llvm-mc -triple csky --defsym=ERR=1 < %s 2>&1 | FileCheck %s
340
341.ifdef ERR
342
343# uimm12/oimm12/nimm12
344addi32 a0, a0, 0 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [1, 4096]
345subi32 a0, a0, 4097 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [1, 4096]
346andi32 a0, a0, 4096 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 4095]
347andni32 a0, a0, 4096 # CHECK: :[[#@LINE]]:17: error: immediate must be an integer in the range [0, 4095]
348xori32 a0, a0, 4096 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 4095]
349
350
351# uimm5
352lsli32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31]
353lsri32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31]
354asri32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31]
355rotli32 a0, a0, 32 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
356
357# uimm12(shift0)/uimm12_1/uimm12_2
358ld32.b a0, (a0, -1)  # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 4095]
359ld32.h a0, (a0, 4095)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094]
360ld32.h a0, (a0, 4093)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094]
361ld32.w a0, (a0, 4093)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092]
362ld32.w a0, (a0, 2)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092]
363ldr32.b a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
364ldr32.bs a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:25: error: immediate must be an integer in the range [0, 3]
365ldr32.h a0, (a0, a1 << -1) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
366ldr32.hs a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:25: error: immediate must be an integer in the range [0, 3]
367ldr32.w a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
368
369st32.b a0, (a0, -1)  # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 4095]
370st32.h a0, (a0, 4095)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094]
371st32.h a0, (a0, 4093)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094]
372st32.w a0, (a0, 4093)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092]
373st32.w a0, (a0, 2)  # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092]
374
375str32.b a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
376str32.h a0, (a0, a1 << -1) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
377str32.w a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3]
378
379# uimm16/oimm16
380ori32 a0, a0, 0x10000 # CHECK: :[[@LINE]]:15: error: immediate must be an integer in the range [0, 65535]
381cmpnei32 a0, 0x10000 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 65535]
382cmphsi32 a0, 0x10001 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [1, 65536]
383cmplti32 a0, 0 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [1, 65536]
384movi32 a0, 0x10000 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 65535]
385movih32 a0, 0x10000 # CHECK: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 65535]
386
387# Invalid mnemonics
388subs t0, t2, t1 # CHECK: :[[#@LINE]]:1: error: unrecognized instruction mnemonic
389nandi t0, t2, 0 # CHECK: :[[#@LINE]]:1: error: unrecognized instruction mnemonic
390
391# Invalid register names
392addi32 foo, sp, 10 # CHECK: :[[#@LINE]]:8: error: unknown operand
393lsli32 a10, a2, 0x20 # CHECK: :[[#@LINE]]:8: error: unknown operand
394asri32 x32, s0, s0 # CHECK: :[[#@LINE]]:8: error: unknown operand
395
396# Invalid operand types
397xori32 sp, 22, 220 # CHECK: :[[#@LINE]]:12: error: invalid operand for instruction
398subu32 t0, t2, 1 # CHECK: :[[#@LINE]]:16: error: invalid operand for instruction
399
400# Too many operands
401subi32 t2, t3, 0x50, 0x60 # CHECK: :[[@LINE]]:22: error: invalid operand for instruction
402
403# Too few operands
404xori32 a0, a1 # CHECK: :[[#@LINE]]:1: error: too few operands for instruction
405xor32 a0, a2 # CHECK: :[[#@LINE]]:1: error: too few operands for instruction
406
407# Need label
408br32 0x100 # CHECK: :[[@LINE]]:6: error: operand must be a symbol name
409jmpi32 0x100 # CHECK: :[[@LINE]]:8: error: operand must be a constpool symbol name
410bsr32 0x100 # CHECK: :[[@LINE]]:7: error: operand must be a symbol name
411
412.endif
413