aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/bpf/xadd.s
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/bpf/xadd.s')
-rw-r--r--sim/testsuite/bpf/xadd.s44
1 files changed, 44 insertions, 0 deletions
diff --git a/sim/testsuite/bpf/xadd.s b/sim/testsuite/bpf/xadd.s
new file mode 100644
index 0000000..be60714
--- /dev/null
+++ b/sim/testsuite/bpf/xadd.s
@@ -0,0 +1,44 @@
+# 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