123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- # 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
|