Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / BPF / assembler-disassembler.s
blob991d6edc683a302a9a89ca7e2e64695697f4e35d
1 // RUN: llvm-mc -triple bpfel --mcpu=v3 --assemble --filetype=obj %s \
2 // RUN: | llvm-objdump -d --mattr=+alu32 - \
3 // RUN: | FileCheck %s
5 // CHECK: 07 01 00 00 2a 00 00 00 r1 += 0x2a
6 // CHECK: 0f 21 00 00 00 00 00 00 r1 += r2
7 r1 += 42
8 r1 += r2
9 // CHECK: 17 01 00 00 2a 00 00 00 r1 -= 0x2a
10 // CHECK: 1f 21 00 00 00 00 00 00 r1 -= r2
11 r1 -= 42
12 r1 -= r2
13 // CHECK: 27 01 00 00 2a 00 00 00 r1 *= 0x2a
14 // CHECK: 2f 21 00 00 00 00 00 00 r1 *= r2
15 r1 *= 42
16 r1 *= r2
17 // CHECK: 37 01 00 00 2a 00 00 00 r1 /= 0x2a
18 // CHECK: 3f 21 00 00 00 00 00 00 r1 /= r2
19 r1 /= 42
20 r1 /= r2
21 // CHECK: 47 01 00 00 2a 00 00 00 r1 |= 0x2a
22 // CHECK: 4f 21 00 00 00 00 00 00 r1 |= r2
23 r1 |= 42
24 r1 |= r2
25 // CHECK: 57 01 00 00 2a 00 00 00 r1 &= 0x2a
26 // CHECK: 5f 21 00 00 00 00 00 00 r1 &= r2
27 r1 &= 42
28 r1 &= r2
29 // CHECK: 67 01 00 00 2a 00 00 00 r1 <<= 0x2a
30 // CHECK: 6f 21 00 00 00 00 00 00 r1 <<= r2
31 r1 <<= 42
32 r1 <<= r2
33 // CHECK: 77 01 00 00 2a 00 00 00 r1 >>= 0x2a
34 // CHECK: 7f 21 00 00 00 00 00 00 r1 >>= r2
35 r1 >>= 42
36 r1 >>= r2
37 // CHECK: 97 01 00 00 2a 00 00 00 r1 %= 0x2a
38 // CHECK: 9f 21 00 00 00 00 00 00 r1 %= r2
39 r1 %= 42
40 r1 %= r2
41 // CHECK: a7 01 00 00 2a 00 00 00 r1 ^= 0x2a
42 // CHECK: af 21 00 00 00 00 00 00 r1 ^= r2
43 r1 ^= 42
44 r1 ^= r2
45 // CHECK: b7 01 00 00 2a 00 00 00 r1 = 0x2a
46 // CHECK: bf 21 00 00 00 00 00 00 r1 = r2
47 r1 = 42
48 r1 = r2
49 // CHECK: c7 01 00 00 2a 00 00 00 r1 s>>= 0x2a
50 // CHECK: cf 21 00 00 00 00 00 00 r1 s>>= r2
51 r1 s>>= 42
52 r1 s>>= r2
53 // CHECK: 87 01 00 00 00 00 00 00 r1 = -r1
54 r1 = -r1
56 // CHECK: 18 01 00 00 2a 00 00 00 00 00 00 00 00 00 00 00 r1 = 0x2a ll
57 r1 = 42 ll
59 // CHECK: 04 01 00 00 2a 00 00 00 w1 += 0x2a
60 // CHECK: 0c 21 00 00 00 00 00 00 w1 += w2
61 w1 += 42
62 w1 += w2
63 // CHECK: 14 01 00 00 2a 00 00 00 w1 -= 0x2a
64 // CHECK: 1c 21 00 00 00 00 00 00 w1 -= w2
65 w1 -= 42
66 w1 -= w2
67 // CHECK: 24 01 00 00 2a 00 00 00 w1 *= 0x2a
68 // CHECK: 2c 21 00 00 00 00 00 00 w1 *= w2
69 w1 *= 42
70 w1 *= w2
71 // CHECK: 34 01 00 00 2a 00 00 00 w1 /= 0x2a
72 // CHECK: 3c 21 00 00 00 00 00 00 w1 /= w2
73 w1 /= 42
74 w1 /= w2
75 // CHECK: 44 01 00 00 2a 00 00 00 w1 |= 0x2a
76 // CHECK: 4c 21 00 00 00 00 00 00 w1 |= w2
77 w1 |= 42
78 w1 |= w2
79 // CHECK: 54 01 00 00 2a 00 00 00 w1 &= 0x2a
80 // CHECK: 5c 21 00 00 00 00 00 00 w1 &= w2
81 w1 &= 42
82 w1 &= w2
83 // CHECK: 64 01 00 00 2a 00 00 00 w1 <<= 0x2a
84 // CHECK: 6c 21 00 00 00 00 00 00 w1 <<= w2
85 w1 <<= 42
86 w1 <<= w2
87 // CHECK: 74 01 00 00 2a 00 00 00 w1 >>= 0x2a
88 // CHECK: 7c 21 00 00 00 00 00 00 w1 >>= w2
89 w1 >>= 42
90 w1 >>= w2
91 // CHECK: 94 01 00 00 2a 00 00 00 w1 %= 0x2a
92 // CHECK: 9c 21 00 00 00 00 00 00 w1 %= w2
93 w1 %= 42
94 w1 %= w2
95 // CHECK: a4 01 00 00 2a 00 00 00 w1 ^= 0x2a
96 // CHECK: ac 21 00 00 00 00 00 00 w1 ^= w2
97 w1 ^= 42
98 w1 ^= w2
99 // CHECK: b4 01 00 00 2a 00 00 00 w1 = 0x2a
100 // CHECK: bc 21 00 00 00 00 00 00 w1 = w2
101 w1 = 42
102 w1 = w2
103 // CHECK: c4 01 00 00 2a 00 00 00 w1 s>>= 0x2a
104 // CHECK: cc 21 00 00 00 00 00 00 w1 s>>= w2
105 w1 s>>= 42
106 w1 s>>= w2
107 // CHECK: 84 01 00 00 00 00 00 00 w1 = -w1
108 w1 = -w1
110 // CHECK: dc 01 00 00 10 00 00 00 r1 = be16 r1
111 // CHECK: dc 02 00 00 20 00 00 00 r2 = be32 r2
112 // CHECK: dc 03 00 00 40 00 00 00 r3 = be64 r3
113 r1 = be16 r1
114 r2 = be32 r2
115 r3 = be64 r3
116 // CHECK: d4 01 00 00 10 00 00 00 r1 = le16 r1
117 // CHECK: d4 02 00 00 20 00 00 00 r2 = le32 r2
118 // CHECK: d4 03 00 00 40 00 00 00 r3 = le64 r3
119 r1 = le16 r1
120 r2 = le32 r2
121 r3 = le64 r3
122 // CHECK: 05 00 00 00 00 00 00 00 goto +0x0
123 goto +0
125 // CHECK: 15 01 00 00 2a 00 00 00 if r1 == 0x2a goto +0x0
126 // CHECK: 1d 21 00 00 00 00 00 00 if r1 == r2 goto +0x0
127 if r1 == 42 goto +0
128 if r1 == r2 goto +0
129 // CHECK: 55 01 00 00 2a 00 00 00 if r1 != 0x2a goto +0x0
130 // CHECK: 5d 21 00 00 00 00 00 00 if r1 != r2 goto +0x0
131 if r1 != 42 goto +0
132 if r1 != r2 goto +0
133 // CHECK: 25 01 00 00 2a 00 00 00 if r1 > 0x2a goto +0x0
134 // CHECK: 2d 21 00 00 00 00 00 00 if r1 > r2 goto +0x0
135 if r1 > 42 goto +0
136 if r1 > r2 goto +0
137 // CHECK: 35 01 00 00 2a 00 00 00 if r1 >= 0x2a goto +0x0
138 // CHECK: 3d 21 00 00 00 00 00 00 if r1 >= r2 goto +0x0
139 if r1 >= 42 goto +0
140 if r1 >= r2 goto +0
141 // CHECK: 65 01 00 00 2a 00 00 00 if r1 s> 0x2a goto +0x0
142 // CHECK: 6d 21 00 00 00 00 00 00 if r1 s> r2 goto +0x0
143 if r1 s> 42 goto +0
144 if r1 s> r2 goto +0
145 // CHECK: 75 01 00 00 2a 00 00 00 if r1 s>= 0x2a goto +0x0
146 // CHECK: 7d 21 00 00 00 00 00 00 if r1 s>= r2 goto +0x0
147 if r1 s>= 42 goto +0
148 if r1 s>= r2 goto +0
149 // CHECK: a5 01 00 00 2a 00 00 00 if r1 < 0x2a goto +0x0
150 // CHECK: ad 21 00 00 00 00 00 00 if r1 < r2 goto +0x0
151 if r1 < 42 goto +0
152 if r1 < r2 goto +0
153 // CHECK: b5 01 00 00 2a 00 00 00 if r1 <= 0x2a goto +0x0
154 // CHECK: bd 21 00 00 00 00 00 00 if r1 <= r2 goto +0x0
155 if r1 <= 42 goto +0
156 if r1 <= r2 goto +0
157 // CHECK: c5 01 00 00 2a 00 00 00 if r1 s< 0x2a goto +0x0
158 // CHECK: cd 21 00 00 00 00 00 00 if r1 s< r2 goto +0x0
159 if r1 s< 42 goto +0
160 if r1 s< r2 goto +0
161 // CHECK: d5 01 00 00 2a 00 00 00 if r1 s<= 0x2a goto +0x0
162 // CHECK: dd 21 00 00 00 00 00 00 if r1 s<= r2 goto +0x0
163 if r1 s<= 42 goto +0
164 if r1 s<= r2 goto +0
166 // CHECK: 16 01 00 00 2a 00 00 00 if w1 == 0x2a goto +0x0
167 // CHECK: 1e 21 00 00 00 00 00 00 if w1 == w2 goto +0x0
168 if w1 == 42 goto +0
169 if w1 == w2 goto +0
170 // CHECK: 56 01 00 00 2a 00 00 00 if w1 != 0x2a goto +0x0
171 // CHECK: 5e 21 00 00 00 00 00 00 if w1 != w2 goto +0x0
172 if w1 != 42 goto +0
173 if w1 != w2 goto +0
174 // CHECK: 26 01 00 00 2a 00 00 00 if w1 > 0x2a goto +0x0
175 // CHECK: 2e 21 00 00 00 00 00 00 if w1 > w2 goto +0x0
176 if w1 > 42 goto +0
177 if w1 > w2 goto +0
178 // CHECK: 36 01 00 00 2a 00 00 00 if w1 >= 0x2a goto +0x0
179 // CHECK: 3e 21 00 00 00 00 00 00 if w1 >= w2 goto +0x0
180 if w1 >= 42 goto +0
181 if w1 >= w2 goto +0
182 // CHECK: 66 01 00 00 2a 00 00 00 if w1 s> 0x2a goto +0x0
183 // CHECK: 6e 21 00 00 00 00 00 00 if w1 s> w2 goto +0x0
184 if w1 s> 42 goto +0
185 if w1 s> w2 goto +0
186 // CHECK: 76 01 00 00 2a 00 00 00 if w1 s>= 0x2a goto +0x0
187 // CHECK: 7e 21 00 00 00 00 00 00 if w1 s>= w2 goto +0x0
188 if w1 s>= 42 goto +0
189 if w1 s>= w2 goto +0
190 // CHECK: a6 01 00 00 2a 00 00 00 if w1 < 0x2a goto +0x0
191 // CHECK: ae 21 00 00 00 00 00 00 if w1 < w2 goto +0x0
192 if w1 < 42 goto +0
193 if w1 < w2 goto +0
194 // CHECK: b6 01 00 00 2a 00 00 00 if w1 <= 0x2a goto +0x0
195 // CHECK: be 21 00 00 00 00 00 00 if w1 <= w2 goto +0x0
196 if w1 <= 42 goto +0
197 if w1 <= w2 goto +0
198 // CHECK: c6 01 00 00 2a 00 00 00 if w1 s< 0x2a goto +0x0
199 // CHECK: ce 21 00 00 00 00 00 00 if w1 s< w2 goto +0x0
200 if w1 s< 42 goto +0
201 if w1 s< w2 goto +0
202 // CHECK: d6 01 00 00 2a 00 00 00 if w1 s<= 0x2a goto +0x0
203 // CHECK: de 21 00 00 00 00 00 00 if w1 s<= w2 goto +0x0
204 if w1 s<= 42 goto +0
205 if w1 s<= w2 goto +0
207 // CHECK: 85 00 00 00 2a 00 00 00 call 0x2a
208 call +42
209 // CHECK: 95 00 00 00 00 00 00 00 exit
210 exit
212 // Note: For the group below w1 is used as a destination for sizes u8, u16, u32.
213 // This is disassembler quirk, but is technically not wrong, as there are
214 // no different encodings for 'r1 = load' vs 'w1 = load'.
216 // CHECK: 71 21 2a 00 00 00 00 00 w1 = *(u8 *)(r2 + 0x2a)
217 // CHECK: 69 21 2a 00 00 00 00 00 w1 = *(u16 *)(r2 + 0x2a)
218 // CHECK: 61 21 2a 00 00 00 00 00 w1 = *(u32 *)(r2 + 0x2a)
219 // CHECK: 79 21 2a 00 00 00 00 00 r1 = *(u64 *)(r2 + 0x2a)
220 r1 = *(u8*)(r2 + 42)
221 r1 = *(u16*)(r2 + 42)
222 r1 = *(u32*)(r2 + 42)
223 r1 = *(u64*)(r2 + 42)
225 // Note: For the group below w1 is used as a source for sizes u8, u16, u32.
226 // This is disassembler quirk, but is technically not wrong, as there are
227 // no different encodings for 'store r1' vs 'store w1'.
229 // CHECK: 73 12 2a 00 00 00 00 00 *(u8 *)(r2 + 0x2a) = w1
230 // CHECK: 6b 12 2a 00 00 00 00 00 *(u16 *)(r2 + 0x2a) = w1
231 // CHECK: 63 12 2a 00 00 00 00 00 *(u32 *)(r2 + 0x2a) = w1
232 // CHECK: 7b 12 2a 00 00 00 00 00 *(u64 *)(r2 + 0x2a) = r1
233 *(u8*)(r2 + 42) = r1
234 *(u16*)(r2 + 42) = r1
235 *(u32*)(r2 + 42) = r1
236 *(u64*)(r2 + 42) = r1
238 // CHECK: c3 21 01 00 00 00 00 00 lock *(u32 *)(r1 + 0x1) += w2
239 // CHECK: c3 21 01 00 50 00 00 00 lock *(u32 *)(r1 + 0x1) &= w2
240 // CHECK: c3 21 01 00 40 00 00 00 lock *(u32 *)(r1 + 0x1) |= w2
241 // CHECK: c3 21 01 00 a0 00 00 00 lock *(u32 *)(r1 + 0x1) ^= w2
242 lock *(u32*)(r1 + 1) += w2
243 lock *(u32*)(r1 + 1) &= w2
244 lock *(u32*)(r1 + 1) |= w2
245 lock *(u32*)(r1 + 1) ^= w2
246 // CHECK: db 21 01 00 00 00 00 00 lock *(u64 *)(r1 + 0x1) += r2
247 // CHECK: db 21 01 00 50 00 00 00 lock *(u64 *)(r1 + 0x1) &= r2
248 // CHECK: db 21 01 00 40 00 00 00 lock *(u64 *)(r1 + 0x1) |= r2
249 // CHECK: db 21 01 00 a0 00 00 00 lock *(u64 *)(r1 + 0x1) ^= r2
250 lock *(u64*)(r1 + 1) += r2
251 lock *(u64*)(r1 + 1) &= r2
252 lock *(u64*)(r1 + 1) |= r2
253 lock *(u64*)(r1 + 1) ^= r2
254 // CHECK: c3 01 00 00 01 00 00 00 w0 = atomic_fetch_add((u32 *)(r1 + 0x0), w0)
255 // CHECK: c3 01 00 00 51 00 00 00 w0 = atomic_fetch_and((u32 *)(r1 + 0x0), w0)
256 // CHECK: c3 01 00 00 a1 00 00 00 w0 = atomic_fetch_xor((u32 *)(r1 + 0x0), w0)
257 // CHECK: c3 01 00 00 41 00 00 00 w0 = atomic_fetch_or((u32 *)(r1 + 0x0), w0)
258 w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)
259 w0 = atomic_fetch_and((u32 *)(r1 + 0), w0)
260 w0 = atomic_fetch_xor((u32 *)(r1 + 0), w0)
261 w0 = atomic_fetch_or((u32 *)(r1 + 0), w0)
262 // CHECK: db 01 00 00 01 00 00 00 r0 = atomic_fetch_add((u64 *)(r1 + 0x0), r0)
263 // CHECK: db 01 00 00 51 00 00 00 r0 = atomic_fetch_and((u64 *)(r1 + 0x0), r0)
264 // CHECK: db 01 00 00 a1 00 00 00 r0 = atomic_fetch_xor((u64 *)(r1 + 0x0), r0)
265 // CHECK: db 01 00 00 41 00 00 00 r0 = atomic_fetch_or((u64 *)(r1 + 0x0), r0)
266 r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)
267 r0 = atomic_fetch_and((u64 *)(r1 + 0), r0)
268 r0 = atomic_fetch_xor((u64 *)(r1 + 0), r0)
269 r0 = atomic_fetch_or((u64 *)(r1 + 0), r0)
270 // CHECK: c3 01 00 00 e1 00 00 00 w0 = xchg32_32(r1 + 0x0, w0)
271 // CHECK: db 01 00 00 e1 00 00 00 r0 = xchg_64(r1 + 0x0, r0)
272 w0 = xchg32_32(r1 + 0, w0)
273 r0 = xchg_64(r1 + 0, r0)
274 // CHECK: c3 11 00 00 f1 00 00 00 w0 = cmpxchg32_32(r1 + 0x0, w0, w1)
275 // CHECK: db 11 00 00 f1 00 00 00 r0 = cmpxchg_64(r1 + 0x0, r0, r1)
276 w0 = cmpxchg32_32(r1 + 0, w0, w1)
277 r0 = cmpxchg_64(r1 + 0, r0, r1)
279 // CHECK: 30 00 00 00 2a 00 00 00 r0 = *(u8 *)skb[0x2a]
280 // CHECK: 28 00 00 00 2a 00 00 00 r0 = *(u16 *)skb[0x2a]
281 // CHECK: 20 00 00 00 2a 00 00 00 r0 = *(u32 *)skb[0x2a]
282 r0 = *(u8*)skb[42]
283 r0 = *(u16*)skb[42]
284 r0 = *(u32*)skb[42]
286 // CHECK: 50 10 00 00 00 00 00 00 r0 = *(u8 *)skb[r1]
287 // CHECK: 48 10 00 00 00 00 00 00 r0 = *(u16 *)skb[r1]
288 // CHECK: 40 10 00 00 00 00 00 00 r0 = *(u32 *)skb[r1]
289 r0 = *(u8*)skb[r1]
290 r0 = *(u16*)skb[r1]
291 r0 = *(u32*)skb[r1]
293 // CHECK: bf 10 01 00 01 00 00 00 r0 = addr_space_cast(r1, 0x0, 0x1)
294 // CHECK: bf 21 01 00 00 00 01 00 r1 = addr_space_cast(r2, 0x1, 0x0)
295 // CHECK: bf 43 01 00 2a 00 07 00 r3 = addr_space_cast(r4, 0x7, 0x2a)
296 r0 = addr_space_cast(r1, 0, 1)
297 r1 = addr_space_cast(r2, 1, 0)
298 r3 = addr_space_cast(r4, 7, 42)