aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/bpf/alu.s
blob: acba7b86cc6021704fc155e859323c5d818e652d (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
111
112
113
114
115
116
117
118
119
120
121
# mach: bpf
# output: pass\nexit 0 (0x0)\n
;;; alu.s
;;; Tests for ALU64 BPF instructions in simulator

    .include "testutils.inc"

    .text
    .global main
    .type main, @function
main:
    mov         %r1, 0
    mov         %r2, -1

    ;; add
    add         %r1, 1
    add         %r2, -1
    add         %r1, %r2
    fail_ne     %r1, -1

    ;; sub
    sub         %r1, %r1
    fail_ne     %r1, 0
    sub         %r1, 10
    sub         %r2, %r1
    fail_ne     %r2, 8

    ;; mul
    mul         %r2, %r2        ; r2 = 64
    mul         %r2, 3          ; r2 = 192
    mov         %r1, -3
    mul         %r1, %r2        ; r1 = -576
    mul         %r2, 0
    fail_ne     %r1, -576
    fail_ne     %r2, 0
    mul         %r1, %r1
    mul         %r1, %r1
    fail_ne     %r1, 110075314176

    ;; div
    div         %r2, %r1
    fail_ne     %r2, 0
    div         %r1, 10000
    fail_ne     %r1, 11007531
    div         %r1, %r1
    fail_ne     %r1, 1

    ;; div is unsigned
    lddw        %r1, -8
    div         %r1, 2
    fail_ne     %r1, 0x7ffffffffffffffc ; sign bits NOT maintained - large pos.

    ;; and
    lddw        %r1, 0xaaaaaaaa55555555
    and         %r1, 0x55aaaaaa         ; we still only have 32-bit imm.
    fail_ne     %r1, 0x0000000055000000
    lddw        %r2, 0x5555555a5aaaaaaa
    and         %r2, %r1
    fail_ne     %r2, 0x0000000050000000

    ;; or
    or          %r2, -559038737         ; 0xdeadbeef
    fail_ne     %r2, 0xffffffffdeadbeef ; 0xdeadbeef gets sign extended
    lddw        %r1, 0xdead00000000beef
    lddw        %r2, 0x0000123456780000
    or          %r1, %r2
    fail_ne     %r1, 0xdead12345678beef

    ;; lsh
    mov         %r1, -559038737         ; 0xdeadbeef
    lsh         %r1, 11
    fail_ne     %r1, 0xfffffef56df77800 ; because deadbeef gets sign ext.
    mov         %r2, 21
    lsh         %r1, %r2
    fail_ne     %r1, 0xdeadbeef00000000

    ;; rsh
    rsh         %r1, 11
    fail_ne     %r1, 0x001bd5b7dde00000 ; 0xdeadbeef 00000000 >> 0xb
    rsh         %r1, %r2
    fail_ne     %r1, 0x00000000deadbeef

    ;; arsh
    arsh        %r1, 8
    fail_ne     %r1, 0x0000000000deadbe
    lsh         %r1, 40                 ; r1 = 0xdead be00 0000 0000
    arsh        %r1, %r2                ; r1 arsh (r2 == 21)
    fail_ne     %r1, 0xfffffef56df00000

    ;; mod
    mov         %r1, 1025
    mod         %r1, 16
    fail_ne     %r1, 1

    ;; mod is unsigned
    mov         %r1, 1025
    mod         %r1, -16        ; mod unsigned -> will treat as large positive
    fail_ne     %r1, 1025

    mov         %r1, -25        ; -25 is 0xff..ffe7
    mov         %r2, 5          ; ... which when unsigned is a large positive
    mod         %r1, %r2        ; ... which is not evenly divisible by 5
    fail_ne     %r1, 1

    ;; xor
    mov         %r1, 0
    xor         %r1, %r2
    fail_ne     %r1, 5
    xor         %r1, 0x7eadbeef
    fail_ne     %r1, 0x7eadbeea
    xor         %r1, %r1
    fail_ne     %r1, 0

    ;; neg
    neg         %r2
    fail_ne     %r2, -5
    mov         %r1, -1025
    neg         %r1
    fail_ne     %r1, 1025

    pass