1# mach: bpf
2# output: pass\nexit 0 (0x0)\n
3;;; xadd.s
4;;; Tests for BPF atomic exchange-and-add instructions in simulator
5;;;
6;;; The xadd instructions (XADDW, XADDDW) operate on a memory location
7;;; specified in $dst + offset16, atomically adding the value in $src.
8;;;
9;;; In the simulator, there isn't anything else happening. The atomic
10;;; instructions are identical to a non-atomic load/add/store.
11
12    .include "testutils.inc"
13
14    .text
15    .global main
16    .type main, @function
17main:
18    mov         %r1, 0x1000
19    mov         %r2, 5
20
21    ;; basic xadd w
22    stw         [%r1+0], 10
23    xaddw       [%r1+0], %r2
24    ldxw        %r3, [%r1+0]
25    fail_ne     %r3, 15
26
27    ;; basic xadd dw
28    stdw        [%r1+8], 42
29    xadddw      [%r1+8], %r2
30    ldxdw       %r3, [%r1+8]
31    fail_ne     %r3, 47
32
33    ;; xadd w negative value
34    mov         %r4, -1
35    xaddw       [%r1+0], %r4
36    ldxw        %r3, [%r1+0]
37    fail_ne     %r3, 14
38
39    ;; xadd dw negative val
40    xadddw      [%r1+8], %r4
41    ldxdw       %r3, [%r1+8]
42    fail_ne     %r3, 46
43
44    pass
45