1# mach: bpf 2# output: pass\nexit 0 (0x0)\n 3;; alu32.s 4;; Tests for ALU(32) BPF instructions in simulator 5 6 .include "testutils.inc" 7 8 .text 9 .global main 10 .type main, @function 11main: 12 mov32 %r1, 10 ; r1 = 10 13 mov32 %r2, -5 ; r2 = -5 14 15 ;; add 16 add32 %r1, 1 ; r1 += 1 (r1 = 11) 17 add32 %r2, -1 ; r2 += -1 (r2 = -6) 18 add32 %r1, %r2 ; r1 += r2 (r1 = 11 + -6 = 5) 19 fail_ne32 %r1, 5 20 21 ;; sub 22 sub32 %r1, 5 ; r1 -= 5 (r1 = 0) 23 sub32 %r1, -5 ; r1 -= -5 (r1 = 5) 24 sub32 %r1, %r2 ; r1 -= r2 (r1 = 5 - -6 = 11) 25 fail_ne32 %r1, 11 26 27 ;; mul 28 mul32 %r1, 2 ; r1 *= 2 (r1 = 22) 29 mul32 %r1, -2 ; r1 *= -2 (r1 = -44) 30 mul32 %r1, %r2 ; r1 *= r2 (r1 = -44 * -6 = 264) 31 fail_ne32 %r1, 264 32 33 ;; div 34 div32 %r1, 6 35 mov32 %r2, 11 36 div32 %r1, %r2 37 fail_ne32 %r1, 4 38 39 ;; div is unsigned 40 mov32 %r1, -8 ; 0xfffffff8 41 div32 %r1, 2 42 fail_ne32 %r1, 0x7ffffffc ; sign bits are not preserved 43 44 ;; and (bitwise) 45 mov32 %r1, 0xb ; r1 = (0xb = 0b1011) 46 mov32 %r2, 0x5 ; r2 = (0x5 = 0b0101) 47 and32 %r1, 0xa ; r1 &= (0xa = 0b1010) = (0b1010 = 0xa) 48 fail_ne32 %r1, 0xa 49 and32 %r1, %r2 ; r1 &= r2 = 0x0 50 fail_ne32 %r1, 0x0 51 52 ;; or (bitwise) 53 or32 %r1, 0xb 54 or32 %r1, %r2 55 fail_ne32 %r1, 0xf 56 57 ;; lsh (left shift) 58 lsh32 %r1, 4 ; r1 <<= 4 (r1 = 0xf0) 59 mov32 %r2, 24 ; r2 = 24 60 lsh32 %r1, %r2 61 fail_ne32 %r1, 0xf0000000 62 63 ;; rsh (right logical shift) 64 rsh32 %r1, 2 65 rsh32 %r1, %r2 66 fail_ne32 %r1, 0x3c ; (0xf000 0000 >> 26) 67 68 ;; arsh (right arithmetic shift) 69 arsh32 %r1, 1 70 or32 %r1, 0x80000000 71 mov32 %r2, 3 72 arsh32 %r1, %r2 73 fail_ne %r1, 0x00000000F0000003 74 ; Note: make sure r1 is NOT sign-extended 75 ; i.e. upper-32 bits should be untouched 76 77 ;; mod 78 mov32 %r1, 1025 79 mod32 %r1, 16 80 fail_ne32 %r1, 1 81 82 ;; mod is unsigned 83 mov32 %r1, 1025 84 mod32 %r1, -16 ; when unsigned, much larger than 1025 85 fail_ne32 %r1, 1025 86 87 mov32 %r1, -25 ; when unsigned, a large positive which is 88 mov32 %r2, 5 ; ... not evenly divisible by 5 89 mod32 %r1, %r2 90 fail_ne32 %r1, 1 91 92 ;; xor 93 xor32 %r1, %r2 94 fail_ne32 %r1, 4 95 xor32 %r1, 0xF000000F 96 fail_ne %r1, 0xF000000B ; Note: check for (bad) sign-extend 97 xor32 %r1, %r1 98 fail_ne %r1, 0 99 100 ;; neg 101 mov32 %r1, -1 102 mov32 %r2, 0x7fffffff 103 neg32 %r1 104 neg32 %r2 105 fail_ne32 %r1, 1 106 fail_ne %r2, 0x80000001 ; Note: check for (bad) sign-extend 107 neg32 %r2 108 fail_ne32 %r2, 0x7fffffff 109 110 pass 111