diff options
Diffstat (limited to 'sim/testsuite/bpf/alu.s')
-rw-r--r-- | sim/testsuite/bpf/alu.s | 121 |
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 |