| # mach: bpf |
| # output: pass\nexit 0 (0x0)\n |
| /* xadd.s |
| Tests for BPF atomic exchange-and-add instructions in simulator |
| |
| The xadd instructions (XADDW, XADDDW) operate on a memory location |
| specified in $dst + offset16, atomically adding the value in $src. |
| |
| In the simulator, there isn't anything else happening. The atomic |
| instructions are identical to a non-atomic load/add/store. */ |
| |
| .include "testutils.inc" |
| |
| .text |
| .global main |
| .type main, @function |
| main: |
| mov %r1, 0x1000 |
| mov %r2, 5 |
| |
| /* basic xadd w */ |
| stw [%r1+0], 10 |
| xaddw [%r1+0], %r2 |
| ldxw %r3, [%r1+0] |
| fail_ne %r3, 15 |
| |
| /* basic xadd dw */ |
| stdw [%r1+8], 42 |
| xadddw [%r1+8], %r2 |
| ldxdw %r3, [%r1+8] |
| fail_ne %r3, 47 |
| |
| /* xadd w negative value */ |
| mov %r4, -1 |
| xaddw [%r1+0], %r4 |
| ldxw %r3, [%r1+0] |
| fail_ne %r3, 14 |
| |
| /* xadd dw negative val */ |
| xadddw [%r1+8], %r4 |
| ldxdw %r3, [%r1+8] |
| fail_ne %r3, 46 |
| |
| pass |