summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorJohan Tibell <johan.tibell@gmail.com>2014-06-26 14:31:37 +0200
committerHerbert Valerio Riedel <hvr@gnu.org>2014-06-26 14:58:45 +0200
commit950fcae46a82569e7cd1fba1637a23b419e00ecd (patch)
treec0cfda4ad4fb473c588d517e89ae2b47598457fd /libraries
parent84d7845063c974a9437a29f4f0b5094392d04a29 (diff)
downloadhaskell-950fcae46a82569e7cd1fba1637a23b419e00ecd.tar.gz
Revert "Add more primops for atomic ops on byte arrays"
This commit caused the register allocator to fail on i386. This reverts commit d8abf85f8ca176854e9d5d0b12371c4bc402aac3 and 04dd7cb3423f1940242fdfe2ea2e3b8abd68a177 (the second being a fix to the first).
Diffstat (limited to 'libraries')
-rw-r--r--libraries/ghc-prim/cbits/atomic.c306
-rw-r--r--libraries/ghc-prim/ghc-prim.cabal1
2 files changed, 0 insertions, 307 deletions
diff --git a/libraries/ghc-prim/cbits/atomic.c b/libraries/ghc-prim/cbits/atomic.c
deleted file mode 100644
index e3d6cc1e95..0000000000
--- a/libraries/ghc-prim/cbits/atomic.c
+++ /dev/null
@@ -1,306 +0,0 @@
-#include "Rts.h"
-
-// Fallbacks for atomic primops on byte arrays. The builtins used
-// below are supported on both GCC and LLVM.
-//
-// Ideally these function would take StgWord8, StgWord16, etc but
-// older GCC versions incorrectly assume that the register that the
-// argument is passed in has been zero extended, which is incorrect
-// according to the ABI and is not what GHC does when it generates
-// calls to these functions.
-
-// FetchAddByteArrayOp_Int
-
-extern StgWord hs_atomic_add8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_add8(volatile StgWord8 *x, StgWord val)
-{
- return __sync_fetch_and_add(x, (StgWord8) val);
-}
-
-extern StgWord hs_atomic_add16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_add16(volatile StgWord16 *x, StgWord val)
-{
- return __sync_fetch_and_add(x, (StgWord16) val);
-}
-
-extern StgWord hs_atomic_add32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_add32(volatile StgWord32 *x, StgWord val)
-{
- return __sync_fetch_and_add(x, (StgWord32) val);
-}
-
-extern StgWord64 hs_atomic_add64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_add64(volatile StgWord64 *x, StgWord64 val)
-{
- return __sync_fetch_and_add(x, val);
-}
-
-// FetchSubByteArrayOp_Int
-
-extern StgWord hs_atomic_sub8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_sub8(volatile StgWord8 *x, StgWord val)
-{
- return __sync_fetch_and_sub(x, (StgWord8) val);
-}
-
-extern StgWord hs_atomic_sub16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_sub16(volatile StgWord16 *x, StgWord val)
-{
- return __sync_fetch_and_sub(x, (StgWord16) val);
-}
-
-extern StgWord hs_atomic_sub32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_sub32(volatile StgWord32 *x, StgWord val)
-{
- return __sync_fetch_and_sub(x, (StgWord32) val);
-}
-
-extern StgWord64 hs_atomic_sub64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_sub64(volatile StgWord64 *x, StgWord64 val)
-{
- return __sync_fetch_and_sub(x, val);
-}
-
-// FetchAndByteArrayOp_Int
-
-extern StgWord hs_atomic_and8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_and8(volatile StgWord8 *x, StgWord val)
-{
- return __sync_fetch_and_and(x, (StgWord8) val);
-}
-
-extern StgWord hs_atomic_and16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_and16(volatile StgWord16 *x, StgWord val)
-{
- return __sync_fetch_and_and(x, (StgWord16) val);
-}
-
-extern StgWord hs_atomic_and32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_and32(volatile StgWord32 *x, StgWord val)
-{
- return __sync_fetch_and_and(x, (StgWord32) val);
-}
-
-extern StgWord64 hs_atomic_and64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_and64(volatile StgWord64 *x, StgWord64 val)
-{
- return __sync_fetch_and_and(x, val);
-}
-
-// FetchNandByteArrayOp_Int
-
-// Workaround for http://llvm.org/bugs/show_bug.cgi?id=8842
-#define CAS_NAND(x, val) \
- { \
- __typeof__ (*(x)) tmp = *(x); \
- while (!__sync_bool_compare_and_swap(x, tmp, ~(tmp & (val)))) { \
- tmp = *(x); \
- } \
- return tmp; \
- }
-
-extern StgWord hs_atomic_nand8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_nand8(volatile StgWord8 *x, StgWord val)
-{
-#ifdef __clang__
- CAS_NAND(x, (StgWord8) val)
-#else
- return __sync_fetch_and_nand(x, (StgWord8) val);
-#endif
-}
-
-extern StgWord hs_atomic_nand16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_nand16(volatile StgWord16 *x, StgWord val)
-{
-#ifdef __clang__
- CAS_NAND(x, (StgWord16) val);
-#else
- return __sync_fetch_and_nand(x, (StgWord16) val);
-#endif
-}
-
-extern StgWord hs_atomic_nand32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_nand32(volatile StgWord32 *x, StgWord val)
-{
-#ifdef __clang__
- CAS_NAND(x, (StgWord32) val);
-#else
- return __sync_fetch_and_nand(x, (StgWord32) val);
-#endif
-}
-
-extern StgWord64 hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val)
-{
-#ifdef __clang__
- CAS_NAND(x, val);
-#else
- return __sync_fetch_and_nand(x, val);
-#endif
-}
-
-// FetchOrByteArrayOp_Int
-
-extern StgWord hs_atomic_or8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_or8(volatile StgWord8 *x, StgWord val)
-{
- return __sync_fetch_and_or(x, (StgWord8) val);
-}
-
-extern StgWord hs_atomic_or16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_or16(volatile StgWord16 *x, StgWord val)
-{
- return __sync_fetch_and_or(x, (StgWord16) val);
-}
-
-extern StgWord hs_atomic_or32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_or32(volatile StgWord32 *x, StgWord val)
-{
- return __sync_fetch_and_or(x, (StgWord32) val);
-}
-
-extern StgWord64 hs_atomic_or64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_or64(volatile StgWord64 *x, StgWord64 val)
-{
- return __sync_fetch_and_or(x, val);
-}
-
-// FetchXorByteArrayOp_Int
-
-extern StgWord hs_atomic_xor8(volatile StgWord8 *x, StgWord val);
-StgWord
-hs_atomic_xor8(volatile StgWord8 *x, StgWord val)
-{
- return __sync_fetch_and_xor(x, (StgWord8) val);
-}
-
-extern StgWord hs_atomic_xor16(volatile StgWord16 *x, StgWord val);
-StgWord
-hs_atomic_xor16(volatile StgWord16 *x, StgWord val)
-{
- return __sync_fetch_and_xor(x, (StgWord16) val);
-}
-
-extern StgWord hs_atomic_xor32(volatile StgWord32 *x, StgWord val);
-StgWord
-hs_atomic_xor32(volatile StgWord32 *x, StgWord val)
-{
- return __sync_fetch_and_xor(x, (StgWord32) val);
-}
-
-extern StgWord64 hs_atomic_xor64(volatile StgWord64 *x, StgWord64 val);
-StgWord64
-hs_atomic_xor64(volatile StgWord64 *x, StgWord64 val)
-{
- return __sync_fetch_and_xor(x, val);
-}
-
-// CasByteArrayOp_Int
-
-extern StgWord hs_cmpxchg8(volatile StgWord8 *x, StgWord old, StgWord new);
-StgWord
-hs_cmpxchg8(volatile StgWord8 *x, StgWord old, StgWord new)
-{
- return __sync_val_compare_and_swap(x, (StgWord8) old, (StgWord8) new);
-}
-
-extern StgWord hs_cmpxchg16(volatile StgWord16 *x, StgWord old, StgWord new);
-StgWord
-hs_cmpxchg16(volatile StgWord16 *x, StgWord old, StgWord new)
-{
- return __sync_val_compare_and_swap(x, (StgWord16) old, (StgWord16) new);
-}
-
-extern StgWord hs_cmpxchg32(volatile StgWord32 *x, StgWord old, StgWord new);
-StgWord
-hs_cmpxchg32(volatile StgWord32 *x, StgWord old, StgWord new)
-{
- return __sync_val_compare_and_swap(x, (StgWord32) old, (StgWord32) new);
-}
-
-extern StgWord hs_cmpxchg64(volatile StgWord64 *x, StgWord64 old, StgWord64 new);
-StgWord
-hs_cmpxchg64(volatile StgWord64 *x, StgWord64 old, StgWord64 new)
-{
- return __sync_val_compare_and_swap(x, old, new);
-}
-
-// AtomicReadByteArrayOp_Int
-
-extern StgWord hs_atomicread8(volatile StgWord8 *x);
-StgWord
-hs_atomicread8(volatile StgWord8 *x)
-{
- return *x;
-}
-
-extern StgWord hs_atomicread16(volatile StgWord16 *x);
-StgWord
-hs_atomicread16(volatile StgWord16 *x)
-{
- return *x;
-}
-
-extern StgWord hs_atomicread32(volatile StgWord32 *x);
-StgWord
-hs_atomicread32(volatile StgWord32 *x)
-{
- return *x;
-}
-
-extern StgWord64 hs_atomicread64(volatile StgWord64 *x);
-StgWord64
-hs_atomicread64(volatile StgWord64 *x)
-{
- return *x;
-}
-
-// AtomicWriteByteArrayOp_Int
-
-extern void hs_atomicwrite8(volatile StgWord8 *x, StgWord val);
-void
-hs_atomicwrite8(volatile StgWord8 *x, StgWord val)
-{
- *x = (StgWord8) val;
-}
-
-extern void hs_atomicwrite16(volatile StgWord16 *x, StgWord val);
-void
-hs_atomicwrite16(volatile StgWord16 *x, StgWord val)
-{
- *x = (StgWord16) val;
-}
-
-extern void hs_atomicwrite32(volatile StgWord32 *x, StgWord val);
-void
-hs_atomicwrite32(volatile StgWord32 *x, StgWord val)
-{
- *x = (StgWord32) val;
-}
-
-extern void hs_atomicwrite64(volatile StgWord64 *x, StgWord64 val);
-void
-hs_atomicwrite64(volatile StgWord64 *x, StgWord64 val)
-{
- *x = (StgWord64) val;
-}
diff --git a/libraries/ghc-prim/ghc-prim.cabal b/libraries/ghc-prim/ghc-prim.cabal
index bc9f57126a..c861342b56 100644
--- a/libraries/ghc-prim/ghc-prim.cabal
+++ b/libraries/ghc-prim/ghc-prim.cabal
@@ -52,7 +52,6 @@ Library
exposed-modules: GHC.Prim
c-sources:
- cbits/atomic.c
cbits/bswap.c
cbits/debug.c
cbits/longlong.c