forked from Imagelibrary/binutils-gdb
The BPF assembler has been updated to follow the clang convention in the interpretation of semicolons: they separate statements and directives, and do not start line comments.
111 lines
3.3 KiB
ArmAsm
111 lines
3.3 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, -268435456 /* 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, -2147483648 /* 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, -268435441 /* 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
|