1 # RUN: not llvm-mc -triple riscv32 < %s 2>&1 | FileCheck %s
3 # Out of range immediates
5 fence iorw
, iore
# CHECK: :[[@LINE]]:13: error: operand must be formed of letters selected in-order from 'iorw'
6 fence wr
, wr
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
7 fence rw
, rr
# CHECK: :[[@LINE]]:11: error: operand must be formed of letters selected in-order from 'iorw'
8 fence
1, rw
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
9 fence unknown
, unknown
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
12 slli a0
, a0
, 32 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
13 srli a0
, a0
, -1 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
14 srai a0
, a0
, -19 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
15 csrrwi a1
, 0x1, -1 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
16 csrrsi t1
, 999, 32 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
17 csrrci x0
, 43, -90 # CHECK: :[[@LINE]]:16: error: immediate must be an integer in the range [0, 31]
20 ori a0
, a1
, -2049 # CHECK: :[[@LINE]]:13: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
21 andi ra
, sp
, 2048 # CHECK: :[[@LINE]]:14: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
24 csrrw a0
, -1, a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
25 csrrs a0
, 4096, a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
26 csrrs a0
, -0xf, a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
27 csrrc a0
, 0x1000, a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
28 csrrwi a0
, -50, 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
29 csrrsi a0
, 4097, a0
# CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
30 csrrci a0
, 0xffff, a0
# CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
33 beq t0
, t1
, -4098 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
34 bne t0
, t1
, -4097 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
35 blt t0
, t1
, 4095 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
36 bge t0
, t1
, 4096 # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
37 bltu t0
, t1
, 13 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
38 bgeu t0
, t1
, -13 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
41 lui a0
, -1 # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
42 lui s0
, 1048576 # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
43 auipc zero
, -0xf # CHECK: :[[@LINE]]:13: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
46 jal gp
, -1048578 # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
47 jal gp
, -1048577 # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
48 jal gp
, 1048575 # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
49 jal gp
, 1048576 # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
50 jal gp
, 1 # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
52 # Illegal operand modifier
54 fence
%hi
(iorw
), iorw
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
55 fence
%lo
(iorw
), iorw
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
56 fence
%pcrel_hi
(iorw
), iorw
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
57 fence
%pcrel_lo
(iorw
), iorw
# CHECK: :[[@LINE]]:7: error: operand must be formed of letters selected in-order from 'iorw'
60 slli a0
, a0
, %lo
(1) # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
61 srli a0
, a0
, %lo
(a) # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
62 srai a0
, a0
, %hi
(2) # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 31]
63 csrrwi a1
, 0x1, %hi
(b) # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
64 csrrsi t1
, 999, %pcrel_hi
(3) # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
65 csrrci x0
, 43, %pcrel_hi
(c
) # CHECK: :[[@LINE]]:16: error: immediate must be an integer in the range [0, 31]
66 csrrsi t1
, 999, %pcrel_lo
(4) # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31]
67 csrrci x0
, 43, %pcrel_lo
(d
) # CHECK: :[[@LINE]]:16: error: immediate must be an integer in the range [0, 31]
70 ori a0
, a1
, %hi
(foo
) # CHECK: :[[@LINE]]:13: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
71 andi ra
, sp
, %pcrel_hi
(123) # CHECK: :[[@LINE]]:14: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
72 xori a2
, a3
, %hi
(345) # CHECK: :[[@LINE]]:14: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
73 add a1
, a2
, (a3
) # CHECK: :[[@LINE]]:13: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
74 add a1
, a2
, foo
# CHECK: :[[@LINE]]:13: error: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo modifier or an integer in the range [-2048, 2047]
77 csrrw a0
, %lo
(1), a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
78 csrrs a0
, %lo
(a), a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
79 csrrs a0
, %hi
(2), a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
80 csrrc a0
, %hi
(b), a0
# CHECK: :[[@LINE]]:11: error: immediate must be an integer in the range [0, 4095]
81 csrrwi a0
, %pcrel_hi
(3), 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
82 csrrsi a0
, %pcrel_hi
(c
), a0
# CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
83 csrrwi a0
, %pcrel_lo
(4), 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
84 csrrsi a0
, %pcrel_lo
(d
), a0
# CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 4095]
86 ## named csr in place of uimm12
87 csrrw a0
, foos
, a0
# CHECK: :[[@LINE]]:11: error: operand must be a valid system register name or an integer in the range [0, 4095]
88 csrrs a0
, mstatusx
, a0
# CHECK: :[[@LINE]]:11: error: operand must be a valid system register name or an integer in the range [0, 4095]
89 csrrs a0
, xmstatus
, a0
# CHECK: :[[@LINE]]:11: error: operand must be a valid system register name or an integer in the range [0, 4095]
90 csrrc a0
, m12status
, a0
# CHECK: :[[@LINE]]:11: error: operand must be a valid system register name or an integer in the range [0, 4095]
91 csrrwi a0
, mstatus12
, 0 # CHECK: :[[@LINE]]:12: error: operand must be a valid system register name or an integer in the range [0, 4095]
92 csrrsi a0
, mhpm12counter
, a0
# CHECK: :[[@LINE]]:12: error: operand must be a valid system register name or an integer in the range [0, 4095]
93 csrrwi a0
, mhpmcounter32
, 0 # CHECK: :[[@LINE]]:12: error: operand must be a valid system register name or an integer in the range [0, 4095]
94 csrrsi a0
, A, a0
# CHECK: :[[@LINE]]:12: error: operand must be a valid system register name or an integer in the range [0, 4095]
97 beq t0
, t1
, %lo
(1) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
98 bne t0
, t1
, %lo
(a) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
99 blt t0
, t1
, %hi
(2) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
100 bge t0
, t1
, %hi
(b) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
101 bltu t0
, t1
, %pcrel_hi
(3) # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
102 bgeu t0
, t1
, %pcrel_hi
(c
) # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
103 bltu t0
, t1
, %pcrel_lo
(4) # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
104 bgeu t0
, t1
, %pcrel_lo
(d
) # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-4096, 4094]
107 lui a0
, %lo
(1) # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
108 auipc a1
, %lo
(foo
) # CHECK: :[[@LINE]]:11: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
111 jal gp
, %lo
(1) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
112 jal gp
, %lo
(a) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
113 jal gp
, %hi
(2) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
114 jal gp
, %hi
(b) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
115 jal gp
, %pcrel_hi
(3) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
116 jal gp
, %pcrel_hi
(c
) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
117 jal gp
, %pcrel_lo
(4) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
118 jal gp
, %pcrel_lo
(d
) # CHECK: :[[@LINE]]:9: error: immediate must be a multiple of 2 bytes in the range [-1048576, 1048574]
120 # Bare symbol names when an operand modifier is required and unsupported
123 lui a0
, foo
# CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
124 lui a0
, %lo
(foo
) # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
125 lui a0
, %pcrel_lo
(foo
) # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
126 lui a0
, %pcrel_hi
(foo
) # CHECK: :[[@LINE]]:9: error: operand must be a symbol with %hi/%tprel_hi modifier or an integer in the range [0, 1048575]
128 auipc a0
, foo
# CHECK: :[[@LINE]]:11: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
129 auipc a0
, %lo
(foo
) # CHECK: :[[@LINE]]:11: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
130 auipc a0
, %hi
(foo
) # CHECK: :[[@LINE]]:11: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
131 auipc a0
, %pcrel_lo
(foo
) # CHECK: :[[@LINE]]:11: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi modifier or an integer in the range [0, 1048575]
133 # TP-relative symbol names require a %tprel_add modifier.
134 add a0
, a0
, tp
, zero
# CHECK: :[[@LINE]]:17: error: expected '%' for operand modifier
135 add a0
, a0
, tp
, %hi
(foo
) # CHECK: :[[@LINE]]:17: error: operand must be a symbol with %tprel_add modifier
136 add a0
, tp
, a0
, %tprel_add
(foo
) # CHECK: :[[@LINE]]:13: error: the second input operand must be tp/x4 when using %tprel_add modifier
138 # Unrecognized operand modifier
139 addi t0
, sp
, %modifer
(255) # CHECK: :[[@LINE]]:15: error: unrecognized operand modifier
141 # Use of operand modifier on register name
142 addi t1
, %lo
(t2
), 1 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
145 subs t0
, t2
, t1
# CHECK: :[[@LINE]]:1: error: unrecognized instruction mnemonic
146 nandi t0
, zero
, 0 # CHECK: :[[@LINE]]:1: error: unrecognized instruction mnemonic
148 # Invalid register names
149 addi foo
, sp
, 10 # CHECK: :[[@LINE]]:6: error: invalid operand for instruction
150 slti a10
, a2
, 0x20 # CHECK: :[[@LINE]]:6: error: invalid operand for instruction
151 slt x32
, s0
, s0
# CHECK: :[[@LINE]]:5: error: invalid operand for instruction
154 addiw a0
, sp
, 100 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
155 sraw t0
, s2
, zero
# CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
157 # Invalid operand types
158 xori sp
, 22, 220 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
159 sub t0
, t2
, 1 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction
162 sltiu s2
, s3
, 0x50, 0x60 # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
164 # Memory operand not formatted correctly
165 lw a4
, a5
, 111 # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
168 ori a0
, a1
# CHECK: :[[@LINE]]:1: error: too few operands for instruction
169 xor s2
, s2
# CHECK: :[[@LINE]]:1: error: too few operands for instruction
171 # Instruction not in the base ISA
172 mul a4
, ra
, s0
# CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
173 amomaxu.w s5
, s4
, (s3
) # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
174 fadd.s ft0
, ft1
, ft2
# CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled
176 # Using floating point registers when integer registers are expected
177 addi a2
, ft0
, 24 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
179 # fence.tso accepts no operands
180 fence.tso rw
, rw
# CHECK: :[[@LINE]]:11: error: invalid operand for instruction