xref: /llvm-project/llvm/test/CodeGen/BPF/assembler-disassembler.s (revision 2aacb56e8361213c1bd69c2ceafdea3aa0ca9125)
1// RUN: llvm-mc -triple bpfel --mcpu=v3 --assemble --filetype=obj %s \
2// RUN:   | llvm-objdump -d --mattr=+alu32 - \
3// RUN:   | FileCheck %s
4
5// CHECK: 07 01 00 00 2a 00 00 00	r1 += 0x2a
6// CHECK: 0f 21 00 00 00 00 00 00	r1 += r2
7r1 += 42
8r1 += 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
11r1 -= 42
12r1 -= 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
15r1 *= 42
16r1 *= 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
19r1 /= 42
20r1 /= 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
23r1 |= 42
24r1 |= 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
27r1 &= 42
28r1 &= 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
31r1 <<= 42
32r1 <<= 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
35r1 >>= 42
36r1 >>= 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
39r1 %= 42
40r1 %= 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
43r1 ^= 42
44r1 ^= 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
47r1 = 42
48r1 = 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
51r1 s>>= 42
52r1 s>>= r2
53// CHECK: 87 01 00 00 00 00 00 00	r1 = -r1
54r1 = -r1
55
56// CHECK: 18 01 00 00 2a 00 00 00 00 00 00 00 00 00 00 00	r1 = 0x2a ll
57r1 = 42 ll
58
59// CHECK: 04 01 00 00 2a 00 00 00	w1 += 0x2a
60// CHECK: 0c 21 00 00 00 00 00 00	w1 += w2
61w1 += 42
62w1 += 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
65w1 -= 42
66w1 -= 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
69w1 *= 42
70w1 *= 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
73w1 /= 42
74w1 /= 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
77w1 |= 42
78w1 |= 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
81w1 &= 42
82w1 &= 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
85w1 <<= 42
86w1 <<= 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
89w1 >>= 42
90w1 >>= 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
93w1 %= 42
94w1 %= 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
97w1 ^= 42
98w1 ^= 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
101w1 = 42
102w1 = 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
105w1 s>>= 42
106w1 s>>= w2
107// CHECK: 84 01 00 00 00 00 00 00	w1 = -w1
108w1 = -w1
109
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
113r1 = be16 r1
114r2 = be32 r2
115r3 = 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
119r1 = le16 r1
120r2 = le32 r2
121r3 = le64 r3
122// CHECK: 05 00 00 00 00 00 00 00	goto +0x0
123goto +0
124
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
127if r1 == 42 goto +0
128if 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
131if r1 != 42 goto +0
132if 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
135if r1 > 42 goto +0
136if 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
139if r1 >= 42 goto +0
140if 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
143if r1 s> 42 goto +0
144if 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
147if r1 s>= 42 goto +0
148if 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
151if r1 < 42 goto +0
152if 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
155if r1 <= 42 goto +0
156if 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
159if r1 s< 42 goto +0
160if 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
163if r1 s<= 42 goto +0
164if r1 s<= r2 goto +0
165
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
168if w1 == 42 goto +0
169if 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
172if w1 != 42 goto +0
173if 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
176if w1 > 42 goto +0
177if 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
180if w1 >= 42 goto +0
181if 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
184if w1 s> 42 goto +0
185if 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
188if w1 s>= 42 goto +0
189if 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
192if w1 < 42 goto +0
193if 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
196if w1 <= 42 goto +0
197if 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
200if w1 s< 42 goto +0
201if 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
204if w1 s<= 42 goto +0
205if w1 s<= w2 goto +0
206
207// CHECK: 85 00 00 00 2a 00 00 00	call 0x2a
208call +42
209// CHECK: 95 00 00 00 00 00 00 00	exit
210exit
211
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'.
215//
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)
220r1 = *(u8*)(r2 + 42)
221r1 = *(u16*)(r2 + 42)
222r1 = *(u32*)(r2 + 42)
223r1 = *(u64*)(r2 + 42)
224
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'.
228//
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
237
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
242lock *(u32*)(r1 + 1) += w2
243lock *(u32*)(r1 + 1) &= w2
244lock *(u32*)(r1 + 1) |= w2
245lock *(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
250lock *(u64*)(r1 + 1) += r2
251lock *(u64*)(r1 + 1) &= r2
252lock *(u64*)(r1 + 1) |= r2
253lock *(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)
258w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)
259w0 = atomic_fetch_and((u32 *)(r1 + 0), w0)
260w0 = atomic_fetch_xor((u32 *)(r1 + 0), w0)
261w0 = 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)
266r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)
267r0 = atomic_fetch_and((u64 *)(r1 + 0), r0)
268r0 = atomic_fetch_xor((u64 *)(r1 + 0), r0)
269r0 = 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)
272w0 = xchg32_32(r1 + 0, w0)
273r0 = 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)
276w0 = cmpxchg32_32(r1 + 0, w0, w1)
277r0 = cmpxchg_64(r1 + 0, r0, r1)
278
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]
282r0 = *(u8*)skb[42]
283r0 = *(u16*)skb[42]
284r0 = *(u32*)skb[42]
285
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]
289r0 = *(u8*)skb[r1]
290r0 = *(u16*)skb[r1]
291r0 = *(u32*)skb[r1]
292
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)
296r0 = addr_space_cast(r1, 0, 1)
297r1 = addr_space_cast(r2, 1, 0)
298r3 = addr_space_cast(r4, 7, 42)
299