# 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