File: invalid.s

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (191 lines) | stat: -rw-r--r-- 8,420 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
## Test invalid instructions on both loongarch32 and loongarch64 target.

# RUN: not llvm-mc --triple=loongarch32 --mattr=-f %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK64
# RUN: not llvm-mc --triple=loongarch64 --mattr=-f %s 2>&1 --defsym=LA64=1 | FileCheck %s

## Out of range immediates
## uimm2
bytepick.w $a0, $a0, $a0, -1
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]
bytepick.w $a0, $a0, $a0, 4
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]

## uimm2_plus1
alsl.w $a0, $a0, $a0, 0
# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
alsl.w $a0, $a0, $a0, 5
# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]

## uimm5
slli.w $a0, $a0, -1
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
srli.w $a0, $a0, -1
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
srai.w $a0, $a0, 32
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
rotri.w $a0, $a0, 32
# CHECK: :[[#@LINE-1]]:19: error: immediate must be an integer in the range [0, 31]
bstrins.w $a0, $a0, 31, -1
# CHECK: :[[#@LINE-1]]:25: error: immediate must be an integer in the range [0, 31]
bstrpick.w $a0, $a0, 32, 0
# CHECK: :[[#@LINE-1]]:22: error: immediate must be an integer in the range [0, 31]
preld -1, $a0, 0
# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]
preld 32, $a0, 0
# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]

## uimm12
andi $a0, $a0, -1
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]
ori $a0, $a0, 4096
# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [0, 4095]
xori $a0, $a0, 4096
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]

## simm12
addi.w $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [-2048, 2047]
slti $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
sltui $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
preld 0, $a0, 2048
# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [-2048, 2047]
ld.b $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.h $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.w $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.bu $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
ld.hu $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
st.b $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
st.h $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
st.w $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]

## simm14_lsl2
ll.w $a0, $a0, -32772
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
ll.w $a0, $a0, -32769
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
sc.w $a0, $a0, 32767
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
sc.w $a0, $a0, 32768
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]

## simm16_lsl2
beq $a0, $a0, -0x20004
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bne $a0, $a0, -0x20004
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
blt $a0, $a0, -0x1FFFF
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bge $a0, $a0, -0x1FFFF
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bltu $a0, $a0, 0x1FFFF
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bgeu $a0, $a0, 0x1FFFF
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
jirl $a0, $a0, 0x20000
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]

## simm20
lu12i.w $a0, -0x80001
# CHECK: :[[#@LINE-1]]:14: error: immediate must be an integer in the range [-524288, 524287]
pcaddi $a0, -0x80001
# CHECK: :[[#@LINE-1]]:13: error: immediate must be an integer in the range [-524288, 524287]
pcaddu12i $a0, 0x80000
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]
pcalau12i $a0, 0x80000
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]

## simm21_lsl2
beqz $a0, -0x400001
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
bnez $a0, -0x3FFFFF
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
beqz $a0, 0x3FFFFF
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
bnez $a0, 0x400000
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]

## simm26_lsl2
b -0x8000001
# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
b 0x1
# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
bl 0x7FFFFFF
# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
bl 0x8000000
# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]

## Invalid mnemonics
nori $a0, $a0, 0
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
andni $a0, $a0, 0
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
orni $a0, $a0, 0
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic

## Invalid register names
add.w $foo, $a0, $a0
# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
sub.w $a8, $a0, $a0
# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
addi.w $x0, $a0, 0
# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
alsl.w $t9, $a0, $a0, 1
# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
lu12i.w $s10, 0
# CHECK: :[[#@LINE-1]]:10: error: invalid operand for instruction

.ifndef LA64
## LoongArch64 mnemonics
add.d $a0, $a0, $a0
# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
addi.d $a0, $a0, 0
# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
.endif

## Invalid operand types
slt $a0, $a0, 0
# CHECK: :[[#@LINE-1]]:15: error: invalid operand for instruction
slti $a0, 0, 0
# CHECK: :[[#@LINE-1]]:11: error: invalid operand for instruction

## Too many operands
andi $a0, $a0, 0, 0
# CHECK: :[[#@LINE-1]]:19: error: invalid operand for instruction

## Too few operands
and $a0, $a0
# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction
andi $a0, $a0
# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction

## Instructions outside the base integer ISA
## TODO: Test instructions in LSX/LASX/LBT/LVZ after their introduction.

## Floating-Point mnemonics
fadd.s $fa0, $fa0, $fa0
# CHECK:   :[[#@LINE-1]]:1: error: instruction requires the following: 'F' (Single-Precision Floating-Point)
fadd.d $fa0, $fa0, $fa0
# CHECK:   :[[#@LINE-1]]:1: error: instruction requires the following: 'D' (Double-Precision Floating-Point)

## Using floating point registers when integer registers are expected
sll.w $a0, $a0, $fa0
# CHECK: :[[#@LINE-1]]:18: error: invalid operand for instruction

## msbw < lsbw
# CHECK: :[[#@LINE+1]]:21: error: msb is less than lsb
bstrins.w $a0, $a0, 1, 2
# CHECK:            ^~~~

# CHECK: :[[#@LINE+1]]:22: error: msb is less than lsb
bstrpick.w $a0, $a0, 30, 31
# CHECK:             ^~~~~~