From 950fcae46a82569e7cd1fba1637a23b419e00ecd Mon Sep 17 00:00:00 2001 From: Johan Tibell Date: Thu, 26 Jun 2014 14:31:37 +0200 Subject: 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). --- libraries/ghc-prim/cbits/atomic.c | 306 -------------------------------------- libraries/ghc-prim/ghc-prim.cabal | 1 - 2 files changed, 307 deletions(-) delete mode 100644 libraries/ghc-prim/cbits/atomic.c (limited to 'libraries') 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 -- cgit v1.2.1