mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-19 01:19:41 +08:00
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.
122 lines
3.2 KiB
ArmAsm
122 lines
3.2 KiB
ArmAsm
# 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
|