| # 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 |