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