mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-19 01:19:41 +08:00
This patch fixes some instructions in the BPF tests that overflow the signed immediates. Note that this happened to work before by chance, as GAS would silently truncate. Tested in bpf-unknown-none. Signed-off-by: Jose E. Marchesi <jose.marchesi@oracle.com>
122 lines
3.1 KiB
ArmAsm
122 lines
3.1 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
|