[commit: ghc] master: ghc-prim : Hide 64 bit primops when the word size is 32 bits (fixes #9886). (19440ae)

git at git.haskell.org git at git.haskell.org
Tue Mar 10 07:11:18 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/19440ae2bb256f75934949ae57934caee3831a80/ghc

>---------------------------------------------------------------

commit 19440ae2bb256f75934949ae57934caee3831a80
Author: Erik de Castro Lopo <erikd at mega-nerd.com>
Date:   Thu Mar 5 19:39:16 2015 +1100

    ghc-prim : Hide 64 bit primops when the word size is 32 bits (fixes #9886).
    
    Summary:
    These primops were failing to compile on PowerPC (32 bit). There is also
    currently no way to call into these primops from Haskell code. Currently,
    the *only* way to call any of these C hs_atomic_* functions is via the
    fetch*IntArray primops which are only defined for Int values and Int is
    always the native word size.
    
    When these functions can be called (and tested) from Haskell code, then
    it will be worth while implementing them.
    
    Test Plan:
        Compile and run on x86, x86_64, powerpc and arm:
        testsuite/tests/concurrent/should_run/AtomicPrimops.hs
    
    Reviewers: tibbe, austin
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D702
    
    GHC Trac Issues: #9886


>---------------------------------------------------------------

19440ae2bb256f75934949ae57934caee3831a80
 libraries/ghc-prim/cbits/atomic.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/libraries/ghc-prim/cbits/atomic.c b/libraries/ghc-prim/cbits/atomic.c
index e3d6cc1..01cc458 100644
--- a/libraries/ghc-prim/cbits/atomic.c
+++ b/libraries/ghc-prim/cbits/atomic.c
@@ -32,12 +32,14 @@ hs_atomic_add32(volatile StgWord32 *x, StgWord val)
   return __sync_fetch_and_add(x, (StgWord32) val);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // FetchSubByteArrayOp_Int
 
@@ -62,12 +64,14 @@ hs_atomic_sub32(volatile StgWord32 *x, StgWord val)
   return __sync_fetch_and_sub(x, (StgWord32) val);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // FetchAndByteArrayOp_Int
 
@@ -92,12 +96,14 @@ hs_atomic_and32(volatile StgWord32 *x, StgWord val)
   return __sync_fetch_and_and(x, (StgWord32) val);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // FetchNandByteArrayOp_Int
 
@@ -144,6 +150,7 @@ hs_atomic_nand32(volatile StgWord32 *x, StgWord val)
 #endif
 }
 
+#if WORD_SIZE_IN_BITS == 64
 extern StgWord64 hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val);
 StgWord64
 hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val)
@@ -154,6 +161,7 @@ hs_atomic_nand64(volatile StgWord64 *x, StgWord64 val)
   return __sync_fetch_and_nand(x, val);
 #endif
 }
+#endif
 
 // FetchOrByteArrayOp_Int
 
@@ -178,12 +186,14 @@ hs_atomic_or32(volatile StgWord32 *x, StgWord val)
   return __sync_fetch_and_or(x, (StgWord32) val);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // FetchXorByteArrayOp_Int
 
@@ -208,12 +218,14 @@ hs_atomic_xor32(volatile StgWord32 *x, StgWord val)
   return __sync_fetch_and_xor(x, (StgWord32) val);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // CasByteArrayOp_Int
 
@@ -238,12 +250,14 @@ hs_cmpxchg32(volatile StgWord32 *x, StgWord old, StgWord new)
   return __sync_val_compare_and_swap(x, (StgWord32) old, (StgWord32) new);
 }
 
+#if WORD_SIZE_IN_BITS == 64
 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);
 }
+#endif
 
 // AtomicReadByteArrayOp_Int
 



More information about the ghc-commits mailing list