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