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