aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/runtime/internal/atomic/atomic.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/runtime/internal/atomic/atomic.c')
-rw-r--r--libgo/go/runtime/internal/atomic/atomic.c82
1 files changed, 75 insertions, 7 deletions
diff --git a/libgo/go/runtime/internal/atomic/atomic.c b/libgo/go/runtime/internal/atomic/atomic.c
index 9fed1a8..569e56e 100644
--- a/libgo/go/runtime/internal/atomic/atomic.c
+++ b/libgo/go/runtime/internal/atomic/atomic.c
@@ -6,6 +6,10 @@
#include "runtime.h"
+extern void panicUnaligned(void)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.panicUnaligned")
+ __attribute__ ((noreturn));
+
uint32_t Load (uint32_t *ptr)
__asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.Load")
__attribute__ ((no_split_stack));
@@ -44,7 +48,7 @@ uint64_t
Load64 (uint64_t *ptr)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
}
@@ -58,6 +62,28 @@ LoadAcq (uint32_t *ptr)
return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
}
+uint64_t LoadAcq64 (uint64_t *ptr)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.LoadAcq64")
+ __attribute__ ((no_split_stack));
+
+uint64_t
+LoadAcq64 (uint64_t *ptr)
+{
+ if (((uintptr_t) ptr & 7) != 0)
+ panicUnaligned ();
+ return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
+}
+
+uintptr_t LoadAcquintptr (uintptr_t *ptr)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.LoadAcquintptr")
+ __attribute__ ((no_split_stack));
+
+uintptr_t
+LoadAcquintptr (uintptr_t *ptr)
+{
+ return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
+}
+
uintptr_t Loaduintptr (uintptr_t *ptr)
__asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.Loaduintptr")
__attribute__ ((no_split_stack));
@@ -86,7 +112,7 @@ int64_t
Loadint64 (int64_t *ptr)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
}
@@ -108,7 +134,7 @@ uint64_t
Xadd64 (uint64_t *ptr, int64_t delta)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST);
}
@@ -130,7 +156,7 @@ int64_t
Xaddint64 (int64_t *ptr, int64_t delta)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
}
@@ -152,7 +178,7 @@ uint64_t
Xchg64 (uint64_t *ptr, uint64_t new)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
}
@@ -186,6 +212,26 @@ Or8 (uint8_t *ptr, uint8_t val)
__atomic_or_fetch (ptr, val, __ATOMIC_SEQ_CST);
}
+void And (uint32_t *ptr, uint32_t val)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.And")
+ __attribute__ ((no_split_stack));
+
+void
+And (uint32_t *ptr, uint32_t val)
+{
+ __atomic_and_fetch (ptr, val, __ATOMIC_SEQ_CST);
+}
+
+void Or (uint32_t *ptr, uint32_t val)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.Or")
+ __attribute__ ((no_split_stack));
+
+void
+Or (uint32_t *ptr, uint32_t val)
+{
+ __atomic_or_fetch (ptr, val, __ATOMIC_SEQ_CST);
+}
+
_Bool Cas (uint32_t *ptr, uint32_t old, uint32_t new)
__asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.Cas")
__attribute__ ((no_split_stack));
@@ -204,7 +250,7 @@ _Bool
Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
}
@@ -266,7 +312,7 @@ void
Store64 (uint64_t *ptr, uint64_t val)
{
if (((uintptr_t) ptr & 7) != 0)
- panicmem ();
+ panicUnaligned ();
__atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
}
@@ -280,6 +326,28 @@ StoreRel (uint32_t *ptr, uint32_t val)
__atomic_store_n (ptr, val, __ATOMIC_RELEASE);
}
+void StoreRel64 (uint64_t *ptr, uint64_t val)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.StoreRel64")
+ __attribute__ ((no_split_stack));
+
+void
+StoreRel64 (uint64_t *ptr, uint64_t val)
+{
+ if (((uintptr_t) ptr & 7) != 0)
+ panicUnaligned ();
+ __atomic_store_n (ptr, val, __ATOMIC_RELEASE);
+}
+
+void StoreReluintptr (uintptr_t *ptr, uintptr_t val)
+ __asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.StoreReluintptr")
+ __attribute__ ((no_split_stack));
+
+void
+StoreReluintptr (uintptr_t *ptr, uintptr_t val)
+{
+ __atomic_store_n (ptr, val, __ATOMIC_RELEASE);
+}
+
void Storeuintptr (uintptr_t *ptr, uintptr_t val)
__asm__ (GOSYM_PREFIX "runtime_1internal_1atomic.Storeuintptr")
__attribute__ ((no_split_stack));