1 // RUN
: llvm-mc
-triple bpfel
--mcpu
=v3
--assemble
--filetype
=obj
%s \
2 // RUN
: | llvm-objdump
-d
--mattr
=+alu32
- \
5 // CHECK
: 07 01 00 00 2a 00 00 00 r1 += 0x2a
6 // CHECK
: 0f
21 00 00 00 00 00 00 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
13 // CHECK
: 27 01 00 00 2a 00 00 00 r1 *= 0x2a
14 // CHECK
: 2f
21 00 00 00 00 00 00 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
21 // CHECK
: 47 01 00 00 2a 00 00 00 r1 |
= 0x2a
22 // CHECK
: 4f
21 00 00 00 00 00 00 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
29 // CHECK
: 67 01 00 00 2a 00 00 00 r1 <<= 0x2a
30 // CHECK
: 6f
21 00 00 00 00 00 00 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
37 // CHECK
: 97 01 00 00 2a 00 00 00 r1 %= 0x2a
38 // CHECK
: 9f
21 00 00 00 00 00 00 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
45 // CHECK
: b7
01 00 00 2a 00 00 00 r1 = 0x2a
46 // CHECK
: bf 21 00 00 00 00 00 00 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
53 // CHECK
: 87 01 00 00 00 00 00 00 r1 = -r1
56 // CHECK
: 18 01 00 00 2a 00 00 00 00 00 00 00 00 00 00 00 r1 = 0x2a 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
63 // CHECK
: 14 01 00 00 2a 00 00 00 w1
-= 0x2a
64 // CHECK
: 1c
21 00 00 00 00 00 00 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
71 // CHECK
: 34 01 00 00 2a 00 00 00 w1
/= 0x2a
72 // CHECK
: 3c
21 00 00 00 00 00 00 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
79 // CHECK
: 54 01 00 00 2a 00 00 00 w1
&= 0x2a
80 // CHECK
: 5c
21 00 00 00 00 00 00 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
87 // CHECK
: 74 01 00 00 2a 00 00 00 w1
>>= 0x2a
88 // CHECK
: 7c
21 00 00 00 00 00 00 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
95 // CHECK
: a4
01 00 00 2a 00 00 00 w1 ^
= 0x2a
96 // CHECK
: ac
21 00 00 00 00 00 00 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
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
107 // CHECK
: 84 01 00 00 00 00 00 00 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
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
122 // CHECK
: 05 00 00 00 00 00 00 00 goto
+0x0
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
207 // CHECK
: 85 00 00 00 2a 00 00 00 call
0x2a
209 // CHECK
: 95 00 00 00 00 00 00 00 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)
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
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]
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]
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)