]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/testsuite/sim/bpf/alu.s
bpf: simulator: correct div, mod insn semantics
[thirdparty/binutils-gdb.git] / sim / testsuite / sim / bpf / alu.s
CommitLineData
b26e2ae7
JM
1# mach: bpf
2# output: pass\nexit 0 (0x0)\n
3;;; alu.s
4;;; Tests for ALU64 BPF instructions in simulator
5
6 .include "testutils.inc"
7
8 .text
9 .global main
10 .type main, @function
11main:
12 mov %r1, 0
13 mov %r2, -1
14
15 ;; add
16 add %r1, 1
17 add %r2, -1
18 add %r1, %r2
19 fail_ne %r1, -1
20
21 ;; sub
22 sub %r1, %r1
23 fail_ne %r1, 0
24 sub %r1, 10
25 sub %r2, %r1
26 fail_ne %r2, 8
27
28 ;; mul
29 mul %r2, %r2 ; r2 = 64
30 mul %r2, 3 ; r2 = 192
31 mov %r1, -3
32 mul %r1, %r2 ; r1 = -576
33 mul %r2, 0
34 fail_ne %r1, -576
35 fail_ne %r2, 0
36 mul %r1, %r1
37 mul %r1, %r1
38 fail_ne %r1, 110075314176
39
40 ;; div
41 div %r2, %r1
42 fail_ne %r2, 0
3ad6c194
DF
43 div %r1, 10000
44 fail_ne %r1, 11007531
b26e2ae7
JM
45 div %r1, %r1
46 fail_ne %r1, 1
47
3ad6c194
DF
48 ;; div is unsigned
49 lddw %r1, -8
50 div %r1, 2
51 fail_ne %r1, 0x7ffffffffffffffc ; sign bits NOT maintained - large pos.
52
b26e2ae7
JM
53 ;; and
54 lddw %r1, 0xaaaaaaaa55555555
55 and %r1, 0x55aaaaaa ; we still only have 32-bit imm.
56 fail_ne %r1, 0x0000000055000000
57 lddw %r2, 0x5555555a5aaaaaaa
58 and %r2, %r1
59 fail_ne %r2, 0x0000000050000000
60
61 ;; or
62 or %r2, 0xdeadbeef
63 fail_ne %r2, 0xffffffffdeadbeef ; 0xdeadbeef gets sign extended
64 lddw %r1, 0xdead00000000beef
65 lddw %r2, 0x0000123456780000
66 or %r1, %r2
67 fail_ne %r1, 0xdead12345678beef
68
69 ;; lsh
70 mov %r1, 0xdeadbeef
71 lsh %r1, 11
72 fail_ne %r1, 0xfffffef56df77800 ; because deadbeef gets sign ext.
73 mov %r2, 21
74 lsh %r1, %r2
75 fail_ne %r1, 0xdeadbeef00000000
76
77 ;; rsh
78 rsh %r1, 11
79 fail_ne %r1, 0x001bd5b7dde00000 ; 0xdeadbeef 00000000 >> 0xb
80 rsh %r1, %r2
81 fail_ne %r1, 0x00000000deadbeef
82
83 ;; arsh
84 arsh %r1, 8
85 fail_ne %r1, 0x0000000000deadbe
86 lsh %r1, 40 ; r1 = 0xdead be00 0000 0000
87 arsh %r1, %r2 ; r1 arsh (r2 == 21)
88 fail_ne %r1, 0xfffffef56df00000
89
90 ;; mod
91 mov %r1, 1025
3ad6c194
DF
92 mod %r1, 16
93 fail_ne %r1, 1
94
95 ;; mod is unsigned
96 mov %r1, 1025
97 mod %r1, -16 ; mod unsigned -> will treat as large positive
98 fail_ne %r1, 1025
99
100 mov %r1, -25 ; -25 is 0xff..ffe7
101 mov %r2, 5 ; ... which when unsigned is a large positive
102 mod %r1, %r2 ; ... which is not evenly divisible by 5
b26e2ae7 103 fail_ne %r1, 1
b26e2ae7
JM
104
105 ;; xor
3ad6c194 106 mov %r1, 0
b26e2ae7
JM
107 xor %r1, %r2
108 fail_ne %r1, 5
109 xor %r1, 0x7eadbeef
110 fail_ne %r1, 0x7eadbeea
111 xor %r1, %r1
112 fail_ne %r1, 0
113
114 ;; neg
115 neg %r2
116 fail_ne %r2, -5
117 mov %r1, -1025
118 neg %r1
119 fail_ne %r1, 1025
120
121 pass