xref: /llvm-project/llvm/test/MC/RISCV/rv32c-invalid.s (revision 08f1aa87281f969bb5a46a780385819079067826)
1# RUN: not llvm-mc -triple=riscv32 -mattr=+c -mattr=+no-rvc-hints < %s 2>&1 \
2# RUN:     | FileCheck %s
3# RUN: not llvm-mc -triple=riscv32 -mattr=+zca -mattr=+no-rvc-hints < %s 2>&1 \
4# RUN:     | FileCheck %s
5
6## GPRC
7.LBB:
8c.lw  ra, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
9c.sw  sp, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
10c.beqz  t0, .LBB # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
11c.bnez  s8, .LBB # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
12c.addi4spn  s4, sp, 12 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction
13c.srli  s7, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
14c.srai  t0, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
15c.andi  t1, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
16c.and  t1, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
17c.or   a0, s8 # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
18c.xor  t2, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
19c.sub  a0, s8 # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
20
21## GPRNoX0
22c.lwsp  x0, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
23c.lwsp  zero, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
24c.jr  x0 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
25c.jalr  zero # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
26c.addi  x0, x0, 1 # CHECK: :[[@LINE]]:13: error: immediate must be zero
27c.li  zero, 2 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RVC Hint Instructions{{$}}
28c.slli  zero, zero, 4 # CHECK: :[[@LINE]]:15: error: invalid operand for instruction
29c.mv  zero, s0 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RVC Hint Instructions{{$}}
30c.mv  ra, x0 # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
31c.add  ra, ra, x0 # CHECK: :[[@LINE]]:16: error: invalid operand for instruction
32c.add  zero, zero, sp # CHECK: :[[@LINE]]:14: error: invalid operand for instruction
33
34## GPRNoX0X2
35c.lui x0, 4 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RVC Hint Instructions{{$}}
36c.lui x2, 4 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
37
38## SP
39c.addi4spn  a0, a0, 12 # CHECK: :[[@LINE]]:17: error: invalid operand for instruction
40c.addi16sp  t0, 16 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction
41
42# Out of range immediates
43
44## uimmlog2xlennonzero
45c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
46c.srli a0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
47c.srai a0, 0  # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
48
49## simm6
50c.li t0, 128 # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
51c.li t0, foo # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
52c.li t0, %lo(foo) # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
53c.li t0, %hi(foo) # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
54c.andi a0, -33 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
55c.andi a0, foo # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
56c.andi a0, %lo(foo) # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
57c.andi a0, %hi(foo) # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
58
59## simm6nonzero
60c.addi t0, 0 # CHECK: :[[@LINE]]:1: error: instruction requires the following: RVC Hint Instructions{{$}}
61c.addi t0, -33 # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
62c.addi t0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
63c.addi t0, foo # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
64c.addi t0, %lo(foo) # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
65c.addi t0, %hi(foo) # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
66
67## c_lui_imm
68c.lui t0, 0 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
69c.lui t0, 32 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
70c.lui t0, 0xffffdf # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
71c.lui t0, 0x1000000 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
72
73## uimm8_lsb00
74c.lwsp  ra, 256(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
75c.swsp  ra, -4(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
76## uimm7_lsb00
77c.lw  s0, -4(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
78c.sw  s0, 128(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
79
80## simm9_lsb0
81c.bnez  s1, -258 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-256, 254]
82c.beqz  a0, 256 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-256, 254]
83
84## simm12_lsb0
85c.j 2048 # CHECK: :[[@LINE]]:5: error: immediate must be a multiple of 2 bytes in the range [-2048, 2046]
86c.jal -2050 # CHECK: :[[@LINE]]:7: error: immediate must be a multiple of 2 bytes in the range [-2048, 2046]
87
88## uimm10_lsb00nonzero
89c.addi4spn  a0, sp, 0 # CHECK: :[[@LINE]]:21: error: immediate must be a multiple of 4 bytes in the range [4, 1020]
90c.addi4spn  a0, sp, 1024 # CHECK: :[[@LINE]]:21: error: immediate must be a multiple of 4 bytes in the range [4, 1020]
91
92## simm10_lsb0000nonzero
93c.addi16sp  sp, -528 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]
94c.addi16sp  sp, 512 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]
95c.addi16sp  sp, 0 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]
96