binutils-gdb/sim/testsuite/bpf/alu32.s
Mike Frysinger 1368b914e9 sim: testsuite: flatten tree
Now that all port tests live under testsuite/sim/*/, and none live
in testsuite/ directly, flatten the structure by moving all of the
dirs under testsuite/sim/ to testsuite/ directly.

We need to stop passing --tool to dejagnu so that it searches all
dirs and not just ones that start with "sim".  Since we have no
other dirs in this tree, and no plans to add any, should be fine.
2021-01-15 19:18:34 -05:00

111 lines
3.0 KiB
ArmAsm

# mach: bpf
# output: pass\nexit 0 (0x0)\n
;; alu32.s
;; Tests for ALU(32) BPF instructions in simulator
.include "testutils.inc"
.text
.global main
.type main, @function
main:
mov32 %r1, 10 ; r1 = 10
mov32 %r2, -5 ; r2 = -5
;; add
add32 %r1, 1 ; r1 += 1 (r1 = 11)
add32 %r2, -1 ; r2 += -1 (r2 = -6)
add32 %r1, %r2 ; r1 += r2 (r1 = 11 + -6 = 5)
fail_ne32 %r1, 5
;; sub
sub32 %r1, 5 ; r1 -= 5 (r1 = 0)
sub32 %r1, -5 ; r1 -= -5 (r1 = 5)
sub32 %r1, %r2 ; r1 -= r2 (r1 = 5 - -6 = 11)
fail_ne32 %r1, 11
;; mul
mul32 %r1, 2 ; r1 *= 2 (r1 = 22)
mul32 %r1, -2 ; r1 *= -2 (r1 = -44)
mul32 %r1, %r2 ; r1 *= r2 (r1 = -44 * -6 = 264)
fail_ne32 %r1, 264
;; div
div32 %r1, 6
mov32 %r2, 11
div32 %r1, %r2
fail_ne32 %r1, 4
;; div is unsigned
mov32 %r1, -8 ; 0xfffffff8
div32 %r1, 2
fail_ne32 %r1, 0x7ffffffc ; sign bits are not preserved
;; and (bitwise)
mov32 %r1, 0xb ; r1 = (0xb = 0b1011)
mov32 %r2, 0x5 ; r2 = (0x5 = 0b0101)
and32 %r1, 0xa ; r1 &= (0xa = 0b1010) = (0b1010 = 0xa)
fail_ne32 %r1, 0xa
and32 %r1, %r2 ; r1 &= r2 = 0x0
fail_ne32 %r1, 0x0
;; or (bitwise)
or32 %r1, 0xb
or32 %r1, %r2
fail_ne32 %r1, 0xf
;; lsh (left shift)
lsh32 %r1, 4 ; r1 <<= 4 (r1 = 0xf0)
mov32 %r2, 24 ; r2 = 24
lsh32 %r1, %r2
fail_ne32 %r1, 0xf0000000
;; rsh (right logical shift)
rsh32 %r1, 2
rsh32 %r1, %r2
fail_ne32 %r1, 0x3c ; (0xf000 0000 >> 26)
;; arsh (right arithmetic shift)
arsh32 %r1, 1
or32 %r1, 0x80000000
mov32 %r2, 3
arsh32 %r1, %r2
fail_ne %r1, 0x00000000F0000003
; Note: make sure r1 is NOT sign-extended
; i.e. upper-32 bits should be untouched
;; mod
mov32 %r1, 1025
mod32 %r1, 16
fail_ne32 %r1, 1
;; mod is unsigned
mov32 %r1, 1025
mod32 %r1, -16 ; when unsigned, much larger than 1025
fail_ne32 %r1, 1025
mov32 %r1, -25 ; when unsigned, a large positive which is
mov32 %r2, 5 ; ... not evenly divisible by 5
mod32 %r1, %r2
fail_ne32 %r1, 1
;; xor
xor32 %r1, %r2
fail_ne32 %r1, 4
xor32 %r1, 0xF000000F
fail_ne %r1, 0xF000000B ; Note: check for (bad) sign-extend
xor32 %r1, %r1
fail_ne %r1, 0
;; neg
mov32 %r1, -1
mov32 %r2, 0x7fffffff
neg32 %r1
neg32 %r2
fail_ne32 %r1, 1
fail_ne %r2, 0x80000001 ; Note: check for (bad) sign-extend
neg32 %r2
fail_ne32 %r2, 0x7fffffff
pass