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