blob: 90fa3dbdab920b9986042bea5be9f0c89d3eac0e [file] [log] [blame]
# 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, -559038737 /* 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, -559038737 /* 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