blob: 1ebd25250081b10f89167def1f5b96dc9f0a64d9 [file] [log] [blame]
Luis Marquesc3bf3d12019-08-21 14:00:58 +00001# RUN: not llvm-mc -triple=riscv32 -mattr=+c -mattr=-rvc-hints < %s 2>&1 \
2# RUN: | FileCheck %s
Alex Bradbury9f6aec42017-12-07 12:50:32 +00003
4## GPRC
Alex Bradburyf8f4b902017-12-07 13:19:57 +00005.LBB:
Alex Bradbury9f6aec42017-12-07 12:50:32 +00006c.lw ra, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
7c.sw sp, 4(sp) # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
Alex Bradburyf8f4b902017-12-07 13:19:57 +00008c.beqz t0, .LBB # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
9c.bnez s8, .LBB # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
Alex Bradbury60714f92017-12-13 09:32:55 +000010c.addi4spn s4, sp, 12 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction
11c.srli s7, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
12c.srai t0, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
13c.andi t1, 12 # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
14c.and t1, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
15c.or a0, s8 # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
16c.xor t2, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
17c.sub a0, s8 # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
Alex Bradbury9f6aec42017-12-07 12:50:32 +000018
19## GPRNoX0
20c.lwsp x0, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
21c.lwsp zero, 4(sp) # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
Alex Bradburyf8f4b902017-12-07 13:19:57 +000022c.jr x0 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
23c.jalr zero # CHECK: :[[@LINE]]:9: error: invalid operand for instruction
Luis Marquesc3bf3d12019-08-21 14:00:58 +000024c.addi x0, x0, 1 # CHECK: :[[@LINE]]:13: error: immediate must be zero
25c.li zero, 2 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
26c.slli zero, zero, 4 # CHECK: :[[@LINE]]:15: error: invalid operand for instruction
27c.mv zero, s0 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
Alex Bradbury60714f92017-12-13 09:32:55 +000028c.mv ra, x0 # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
29c.add ra, ra, x0 # CHECK: :[[@LINE]]:16: error: invalid operand for instruction
Luis Marquesc3bf3d12019-08-21 14:00:58 +000030c.add zero, zero, sp # CHECK: :[[@LINE]]:14: error: invalid operand for instruction
Alex Bradbury60714f92017-12-13 09:32:55 +000031
32## GPRNoX0X2
Luis Marquesc3bf3d12019-08-21 14:00:58 +000033c.lui x0, 4 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
Alex Bradbury60714f92017-12-13 09:32:55 +000034c.lui x2, 4 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
35
36## SP
37c.addi4spn a0, a0, 12 # CHECK: :[[@LINE]]:17: error: invalid operand for instruction
38c.addi16sp t0, 16 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction
Alex Bradbury9f6aec42017-12-07 12:50:32 +000039
40# Out of range immediates
41
Alex Bradbury0ad4c262017-12-15 10:20:51 +000042## uimmlog2xlennonzero
Alex Bradbury60714f92017-12-13 09:32:55 +000043c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
44c.srli a0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
45c.srai a0, 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31]
46
47## simm6
48c.li t0, 128 # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
Ana Pazos065b0882018-09-13 18:37:23 +000049c.li t0, foo # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
50c.li t0, %lo(foo) # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
51c.li t0, %hi(foo) # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31]
Alex Bradbury60714f92017-12-13 09:32:55 +000052c.andi a0, -33 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
Ana Pazos065b0882018-09-13 18:37:23 +000053c.andi a0, foo # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
54c.andi a0, %lo(foo) # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
55c.andi a0, %hi(foo) # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [-32, 31]
Alex Bradbury60714f92017-12-13 09:32:55 +000056
Shiva Chenb22c1d22018-02-02 02:43:23 +000057## simm6nonzero
Luis Marquesc3bf3d12019-08-21 14:00:58 +000058c.addi t0, 0 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
Shiva Chenb22c1d22018-02-02 02:43:23 +000059c.addi t0, -33 # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
60c.addi t0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
Ana Pazos065b0882018-09-13 18:37:23 +000061c.addi t0, foo # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
62c.addi t0, %lo(foo) # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
63c.addi t0, %hi(foo) # CHECK: :[[@LINE]]:12: error: immediate must be non-zero in the range [-32, 31]
Shiva Chenb22c1d22018-02-02 02:43:23 +000064
Shiva Chen7c172422018-02-22 15:02:28 +000065## c_lui_imm
66c.lui t0, 0 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
67c.lui t0, 32 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
68c.lui t0, 0xffffdf # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
69c.lui t0, 0x1000000 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
Alex Bradbury60714f92017-12-13 09:32:55 +000070
Alex Bradbury9f6aec42017-12-07 12:50:32 +000071## uimm8_lsb00
72c.lwsp ra, 256(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
73c.swsp ra, -4(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]
74## uimm7_lsb00
75c.lw s0, -4(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
76c.sw s0, 128(sp) # CHECK: :[[@LINE]]:11: error: immediate must be a multiple of 4 bytes in the range [0, 124]
Alex Bradburyf8f4b902017-12-07 13:19:57 +000077
78## simm9_lsb0
79c.bnez s1, -258 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-256, 254]
80c.beqz a0, 256 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-256, 254]
81
82## simm12_lsb0
83c.j 2048 # CHECK: :[[@LINE]]:5: error: immediate must be a multiple of 2 bytes in the range [-2048, 2046]
84c.jal -2050 # CHECK: :[[@LINE]]:7: error: immediate must be a multiple of 2 bytes in the range [-2048, 2046]
Alex Bradbury60714f92017-12-13 09:32:55 +000085
86## uimm10_lsb00nonzero
87c.addi4spn a0, sp, 0 # CHECK: :[[@LINE]]:21: error: immediate must be a multiple of 4 bytes in the range [4, 1020]
88c.addi4spn a0, sp, 1024 # CHECK: :[[@LINE]]:21: error: immediate must be a multiple of 4 bytes in the range [4, 1020]
89
Shiva Chenb22c1d22018-02-02 02:43:23 +000090## simm10_lsb0000nonzero
91c.addi16sp sp, -528 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]
92c.addi16sp sp, 512 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]
93c.addi16sp sp, 0 # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 16 bytes and non-zero in the range [-512, 496]