summaryrefslogtreecommitdiff
path: root/sim/testsuite/sim/bpf/alu32.s
blob: e8d5062476cd6200bf15dacbe1e2403dd55aaae4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# mach: bpf
# output: pass\nexit 0 (0x0)\n
;; alu32.s
;; Tests for ALU(32) BPF instructions in simulator

    .include "testutils.inc"

    .text
    .global main
    .type main, @function
main:
    mov32       %r1, 10         ; r1 = 10
    mov32       %r2, -5         ; r2 = -5

    ;; add
    add32       %r1, 1          ; r1 += 1  (r1 = 11)
    add32       %r2, -1         ; r2 += -1 (r2 = -6)
    add32       %r1, %r2        ; r1 += r2 (r1 = 11 + -6 = 5)
    fail_ne32   %r1, 5

    ;; sub
    sub32       %r1, 5          ; r1 -= 5 (r1 = 0)
    sub32       %r1, -5         ; r1 -= -5 (r1 = 5)
    sub32       %r1, %r2        ; r1 -= r2 (r1 = 5 - -6 = 11)
    fail_ne32   %r1, 11

    ;; mul
    mul32       %r1, 2          ; r1 *= 2  (r1 = 22)
    mul32       %r1, -2         ; r1 *= -2 (r1 = -44)
    mul32       %r1, %r2        ; r1 *= r2 (r1 = -44 * -6 = 264)
    fail_ne32   %r1, 264

    ;; div
    div32       %r1, 6
    mov32       %r2, 11
    div32       %r1, %r2
    fail_ne32   %r1, 4

    ;; div is unsigned
    mov32       %r1, -8         ; 0xfffffff8
    div32       %r1, 2
    fail_ne32   %r1, 0x7ffffffc ; sign bits are not preserved

    ;; and (bitwise)
    mov32       %r1, 0xb        ; r1  = (0xb = 0b1011)
    mov32       %r2, 0x5        ; r2  = (0x5 = 0b0101)
    and32       %r1, 0xa        ; r1 &= (0xa = 0b1010) = (0b1010 = 0xa)
    fail_ne32   %r1, 0xa
    and32       %r1, %r2        ; r1 &= r2 = 0x0
    fail_ne32   %r1, 0x0

    ;; or (bitwise)
    or32        %r1, 0xb
    or32        %r1, %r2
    fail_ne32   %r1, 0xf

    ;; lsh (left shift)
    lsh32       %r1, 4          ; r1 <<= 4 (r1 = 0xf0)
    mov32       %r2, 24         ; r2 = 24
    lsh32       %r1, %r2
    fail_ne32   %r1, 0xf0000000

    ;; rsh (right logical shift)
    rsh32       %r1, 2
    rsh32       %r1, %r2
    fail_ne32   %r1, 0x3c       ; (0xf000 0000 >> 26)

    ;; arsh (right arithmetic shift)
    arsh32      %r1, 1
    or32        %r1, 0x80000000
    mov32       %r2, 3
    arsh32      %r1, %r2
    fail_ne     %r1, 0x00000000F0000003
                                ; Note: make sure r1 is NOT sign-extended
                                ; i.e. upper-32 bits should be untouched

    ;; mod
    mov32       %r1, 1025
    mod32       %r1, 16
    fail_ne32   %r1, 1

    ;; mod is unsigned
    mov32       %r1, 1025
    mod32       %r1, -16        ; when unsigned, much larger than 1025
    fail_ne32   %r1, 1025

    mov32       %r1, -25        ; when unsigned, a large positive which is
    mov32       %r2, 5          ; ... not evenly divisible by 5
    mod32       %r1, %r2
    fail_ne32   %r1, 1

    ;; xor
    xor32       %r1, %r2
    fail_ne32   %r1, 4
    xor32       %r1, 0xF000000F
    fail_ne     %r1, 0xF000000B ; Note: check for (bad) sign-extend
    xor32       %r1, %r1
    fail_ne     %r1, 0

    ;; neg
    mov32       %r1, -1
    mov32       %r2, 0x7fffffff
    neg32       %r1
    neg32       %r2
    fail_ne32   %r1, 1
    fail_ne     %r2, 0x80000001 ; Note: check for (bad) sign-extend
    neg32       %r2
    fail_ne32   %r2, 0x7fffffff

    pass