summaryrefslogtreecommitdiff
path: root/src/runtime/atomic_386.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/atomic_386.c')
-rw-r--r--src/runtime/atomic_386.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/runtime/atomic_386.c b/src/runtime/atomic_386.c
new file mode 100644
index 000000000..82d36f2d9
--- /dev/null
+++ b/src/runtime/atomic_386.c
@@ -0,0 +1,46 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "runtime.h"
+#include "textflag.h"
+
+#pragma textflag NOSPLIT
+uint32
+runtime·atomicload(uint32 volatile* addr)
+{
+ return *addr;
+}
+
+#pragma textflag NOSPLIT
+void*
+runtime·atomicloadp(void* volatile* addr)
+{
+ return *addr;
+}
+
+#pragma textflag NOSPLIT
+uint64
+runtime·xadd64(uint64 volatile* addr, int64 v)
+{
+ uint64 old;
+
+ do
+ old = *addr;
+ while(!runtime·cas64(addr, old, old+v));
+
+ return old+v;
+}
+
+#pragma textflag NOSPLIT
+uint64
+runtime·xchg64(uint64 volatile* addr, uint64 v)
+{
+ uint64 old;
+
+ do
+ old = *addr;
+ while(!runtime·cas64(addr, old, v));
+
+ return old;
+}