aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/bpf/alu.s
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/bpf/alu.s')
-rw-r--r--sim/testsuite/bpf/alu.s121
1 files changed, 121 insertions, 0 deletions
diff --git a/sim/testsuite/bpf/alu.s b/sim/testsuite/bpf/alu.s
new file mode 100644
index 0000000..4dc37b1
--- /dev/null
+++ b/sim/testsuite/bpf/alu.s
@@ -0,0 +1,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, 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, 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