diff git a/Setup.hs b/Setup.hs
index 46f5022..36c3aa9 100644
 a/Setup.hs
+++ b/Setup.hs
@@ 1,19 +1,7 @@
{# LANGUAGE CPP #}
import Distribution.Simple
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo, buildDir)
import System.Cmd(system)

ps :: String
#if mingw32_HOST_OS  mingw32_TARGET_OS
ps = ['\\']
#else
ps = ['/']
#endif
+#!/usr/bin/runhaskell
+module Main where
main = defaultMainWithHooks hooks
 where hooks = simpleUserHooks { runTests = runTests' }
+import Distribution.Simple
runTests' :: Args > Bool > PackageDescription > LocalBuildInfo > IO ()
runTests' _ _ _ lbi = system testprog >> return ()
 where testprog = (buildDir lbi) ++ ps ++ "test" ++ ps ++ "test"
+main :: IO ()
+main = defaultMain
diff git a/bitsatomic.cabal b/bitsatomic.cabal
index 68da7f7..97b513f 100644
 a/bitsatomic.cabal
+++ b/bitsatomic.cabal
@@ 43,3 +43,3 @@ Stability: experimental
BuildType: Custom
CabalVersion: >= 1.6
+CabalVersion: >= 1.8
ExtraSourceFiles: cbits/atomicbitopsgcc.c cbits/atomicbitopsgcc.h
@@ 64,11 +64,6 @@ library
flag test
 description: Build test program.
 default: False

Executable test
 if flag(test)
 buildable: True
 builddepends:
 base >= 4 && < 6,
+testsuite test
+ Type: exitcodestdio1.0
+ builddepends: bitsatomic,
+ base >= 4 && < 6,
QuickCheck,
@@ 78,6 +73,4 @@ Executable test
testframework
 else
 buildable: False
 hssourcedirs: ., test
 othermodules: Data.Bits.Atomic
+
+ hssourcedirs: test
mainis: test.hs
@@ 85,4 +78 @@ Executable test
GHCProfOptions: autoall

 IncludeDirs: cbits
 CSources: cbits/atomicbitopsgcc.c
diff git a/cbits/atomicbitopsgcc.c b/cbits/atomicbitopsgcc.c
index 3f9d4ef..96ed076 100644
 a/cbits/atomicbitopsgcc.c
+++ b/cbits/atomicbitopsgcc.c
@@ 5,39 +5,39 @@ void mem_barrier (void) {return __sync_synchronize ();}
/* 8bit */
inline unsigned char fetch_and_add_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_add_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_add (p, v);
}
inline unsigned char fetch_and_sub_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_sub_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_sub (p, v);
}
inline unsigned char fetch_and_or_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_or_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_or (p, v);
}
inline unsigned char fetch_and_and_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_and_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_and (p, v);
}
inline unsigned char fetch_and_xor_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_xor_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_xor (p, v);
}
inline unsigned char fetch_and_nand_8 (unsigned char *p, unsigned char v) {
+unsigned char fetch_and_nand_8 (unsigned char *p, unsigned char v) {
return __sync_fetch_and_nand (p, v);
}
inline unsigned char add_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char add_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_add_and_fetch (p, v);
}
inline unsigned char sub_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char sub_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_sub_and_fetch (p, v);
}
inline unsigned char or_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char or_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_or_and_fetch (p, v);
}
inline unsigned char and_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char and_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_and_and_fetch (p, v);
}
inline unsigned char xor_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char xor_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_xor_and_fetch (p, v);
}
inline unsigned char nand_and_fetch_8 (unsigned char *p, unsigned char v) {
+unsigned char nand_and_fetch_8 (unsigned char *p, unsigned char v) {
return __sync_nand_and_fetch (p, v);
}
inline unsigned int
+unsigned int
bool_compare_and_swap_8 (unsigned char *p, unsigned char old, unsigned char new) {
@@ 45,3 +45,3 @@ bool_compare_and_swap_8 (unsigned char *p, unsigned char old, unsigned char new)
}
inline unsigned char
+unsigned char
val_compare_and_swap_8 (unsigned char *p, unsigned char old, unsigned char new) {
@@ 49,3 +49,3 @@ val_compare_and_swap_8 (unsigned char *p, unsigned char old, unsigned char new)
}
inline unsigned char lock_test_and_set_8 (unsigned char *p) {
+unsigned char lock_test_and_set_8 (unsigned char *p) {
// Only immediate 0/1 appear to be widely supported, so hardcode it
@@ 60,39 +60,39 @@ void lock_release_8 (unsigned char *p) {
/* 16bit */
inline unsigned short fetch_and_add_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_add_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_add (p, v);
}
inline unsigned short fetch_and_sub_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_sub_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_sub (p, v);
}
inline unsigned short fetch_and_or_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_or_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_or (p, v);
}
inline unsigned short fetch_and_and_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_and_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_and (p, v);
}
inline unsigned short fetch_and_xor_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_xor_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_xor (p, v);
}
inline unsigned short fetch_and_nand_16 (unsigned short *p, unsigned short v) {
+unsigned short fetch_and_nand_16 (unsigned short *p, unsigned short v) {
return __sync_fetch_and_nand (p, v);
}
inline unsigned short add_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short add_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_add_and_fetch (p, v);
}
inline unsigned short sub_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short sub_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_sub_and_fetch (p, v);
}
inline unsigned short or_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short or_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_or_and_fetch (p, v);
}
inline unsigned short and_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short and_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_and_and_fetch (p, v);
}
inline unsigned short xor_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short xor_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_xor_and_fetch (p, v);
}
inline unsigned short nand_and_fetch_16 (unsigned short *p, unsigned short v) {
+unsigned short nand_and_fetch_16 (unsigned short *p, unsigned short v) {
return __sync_nand_and_fetch (p, v);
}
inline unsigned int
+unsigned int
bool_compare_and_swap_16 (unsigned short *p, unsigned short old, unsigned short new) {
@@ 100,3 +100,3 @@ bool_compare_and_swap_16 (unsigned short *p, unsigned short old, unsigned short
}
inline unsigned short
+unsigned short
val_compare_and_swap_16 (unsigned short *p, unsigned short old, unsigned short new) {
@@ 104,3 +104,3 @@ val_compare_and_swap_16 (unsigned short *p, unsigned short old, unsigned short n
}
inline unsigned short lock_test_and_set_16 (unsigned short *p) {
+unsigned short lock_test_and_set_16 (unsigned short *p) {
// Only immediate 0/1 appear to be widely supported, so hardcode it
@@ 115,39 +115,39 @@ void lock_release_16 (unsigned short *p) {
/* 32bit */
inline unsigned int fetch_and_add_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_add_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_add (p, v);
}
inline unsigned int fetch_and_sub_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_sub_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_sub (p, v);
}
inline unsigned int fetch_and_or_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_or_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_or (p, v);
}
inline unsigned int fetch_and_and_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_and_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_and (p, v);
}
inline unsigned int fetch_and_xor_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_xor_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_xor (p, v);
}
inline unsigned int fetch_and_nand_32 (unsigned int *p, unsigned int v) {
+unsigned int fetch_and_nand_32 (unsigned int *p, unsigned int v) {
return __sync_fetch_and_nand (p, v);
}
inline unsigned int add_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int add_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_add_and_fetch (p, v);
}
inline unsigned int sub_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int sub_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_sub_and_fetch (p, v);
}
inline unsigned int or_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int or_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_or_and_fetch (p, v);
}
inline unsigned int and_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int and_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_and_and_fetch (p, v);
}
inline unsigned int xor_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int xor_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_xor_and_fetch (p, v);
}
inline unsigned int nand_and_fetch_32 (unsigned int *p, unsigned int v) {
+unsigned int nand_and_fetch_32 (unsigned int *p, unsigned int v) {
return __sync_nand_and_fetch (p, v);
}
inline unsigned int
+unsigned int
bool_compare_and_swap_32 (unsigned int *p, unsigned int old, unsigned int new) {
@@ 155,3 +155,3 @@ bool_compare_and_swap_32 (unsigned int *p, unsigned int old, unsigned int new) {
}
inline unsigned int
+unsigned int
val_compare_and_swap_32 (unsigned int *p, unsigned int old, unsigned int new) {
@@ 159,3 +159,3 @@ val_compare_and_swap_32 (unsigned int *p, unsigned int old, unsigned int new) {
}
inline unsigned int lock_test_and_set_32 (unsigned int *p) {
+unsigned int lock_test_and_set_32 (unsigned int *p) {
// Only immediate 0/1 appear to be widely supported, so hardcode it
@@ 170,39 +170,39 @@ void lock_release_32 (unsigned int *p) {
/* 64bit */
inline unsigned long long fetch_and_add_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_add_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_add (p, v);
}
inline unsigned long long fetch_and_sub_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_sub_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_sub (p, v);
}
inline unsigned long long fetch_and_or_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_or_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_or (p, v);
}
inline unsigned long long fetch_and_and_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_and_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_and (p, v);
}
inline unsigned long long fetch_and_xor_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_xor_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_xor (p, v);
}
inline unsigned long long fetch_and_nand_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long fetch_and_nand_64 (unsigned long long *p, unsigned long long v) {
return __sync_fetch_and_nand (p, v);
}
inline unsigned long long add_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long add_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_add_and_fetch (p, v);
}
inline unsigned long long sub_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long sub_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_sub_and_fetch (p, v);
}
inline unsigned long long or_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long or_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_or_and_fetch (p, v);
}
inline unsigned long long and_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long and_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_and_and_fetch (p, v);
}
inline unsigned long long xor_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long xor_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_xor_and_fetch (p, v);
}
inline unsigned long long nand_and_fetch_64 (unsigned long long *p, unsigned long long v) {
+unsigned long long nand_and_fetch_64 (unsigned long long *p, unsigned long long v) {
return __sync_nand_and_fetch (p, v);
}
inline unsigned int
+unsigned int
bool_compare_and_swap_64 (unsigned long long *p, unsigned long long old, unsigned long long new) {
@@ 210,3 +210,3 @@ bool_compare_and_swap_64 (unsigned long long *p, unsigned long long old, unsigne
}
inline unsigned long long
+unsigned long long
val_compare_and_swap_64 (unsigned long long *p, unsigned long long old, unsigned long long new) {
@@ 214,3 +214,3 @@ val_compare_and_swap_64 (unsigned long long *p, unsigned long long old, unsigned
}
inline unsigned long long lock_test_and_set_64 (unsigned long long *p) {
+unsigned long long lock_test_and_set_64 (unsigned long long *p) {
// Only immediate 0/1 appear to be widely supported, so hardcode it
@@ 225,39 +225,39 @@ void lock_release_64 (unsigned long long *p) {
/* Wordsized */
inline unsigned long fetch_and_add_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_add_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_add (p, v);
}
inline unsigned long fetch_and_sub_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_sub_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_sub (p, v);
}
inline unsigned long fetch_and_or_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_or_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_or (p, v);
}
inline unsigned long fetch_and_and_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_and_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_and (p, v);
}
inline unsigned long fetch_and_xor_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_xor_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_xor (p, v);
}
inline unsigned long fetch_and_nand_word (unsigned long *p, unsigned long v) {
+unsigned long fetch_and_nand_word (unsigned long *p, unsigned long v) {
return __sync_fetch_and_nand (p, v);
}
inline unsigned long add_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long add_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_add_and_fetch (p, v);
}
inline unsigned long sub_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long sub_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_sub_and_fetch (p, v);
}
inline unsigned long or_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long or_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_or_and_fetch (p, v);
}
inline unsigned long and_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long and_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_and_and_fetch (p, v);
}
inline unsigned long xor_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long xor_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_xor_and_fetch (p, v);
}
inline unsigned long nand_and_fetch_word (unsigned long *p, unsigned long v) {
+unsigned long nand_and_fetch_word (unsigned long *p, unsigned long v) {
return __sync_nand_and_fetch (p, v);
}
inline unsigned int
+unsigned int
bool_compare_and_swap_word (unsigned long *p, unsigned long old, unsigned long new) {
@@ 265,3 +265,3 @@ bool_compare_and_swap_word (unsigned long *p, unsigned long old, unsigned long n
}
inline unsigned long
+unsigned long
val_compare_and_swap_word (unsigned long *p, unsigned long old, unsigned long new) {
@@ 269,3 +269,3 @@ val_compare_and_swap_word (unsigned long *p, unsigned long old, unsigned long ne
}
inline unsigned long lock_test_and_set_word (unsigned long *p) {
+unsigned long lock_test_and_set_word (unsigned long *p) {
// Only immediate 0/1 appear to be widely supported, so hardcode it
diff git a/cbits/atomicbitopsgcc.h b/cbits/atomicbitopsgcc.h
index f9eccc4..7e0ef15 100644
 a/cbits/atomicbitopsgcc.h
+++ b/cbits/atomicbitopsgcc.h
@@ 6,19 +6,19 @@ void mem_barrier (void);
/* 8bit */
inline unsigned char fetch_and_add_8 (unsigned char *, unsigned char );
inline unsigned char fetch_and_sub_8 (unsigned char *, unsigned char );
inline unsigned char fetch_and_or_8 (unsigned char *, unsigned char );
inline unsigned char fetch_and_and_8 (unsigned char *, unsigned char );
inline unsigned char fetch_and_xor_8 (unsigned char *, unsigned char );
inline unsigned char fetch_and_nand_8 (unsigned char *, unsigned char );
inline unsigned char add_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned char sub_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned char or_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned char and_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned char xor_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned char nand_and_fetch_8 (unsigned char *, unsigned char );
inline unsigned int
+unsigned char fetch_and_add_8 (unsigned char *, unsigned char );
+unsigned char fetch_and_sub_8 (unsigned char *, unsigned char );
+unsigned char fetch_and_or_8 (unsigned char *, unsigned char );
+unsigned char fetch_and_and_8 (unsigned char *, unsigned char );
+unsigned char fetch_and_xor_8 (unsigned char *, unsigned char );
+unsigned char fetch_and_nand_8 (unsigned char *, unsigned char );
+unsigned char add_and_fetch_8 (unsigned char *, unsigned char );
+unsigned char sub_and_fetch_8 (unsigned char *, unsigned char );
+unsigned char or_and_fetch_8 (unsigned char *, unsigned char );
+unsigned char and_and_fetch_8 (unsigned char *, unsigned char );
+unsigned char xor_and_fetch_8 (unsigned char *, unsigned char );
+unsigned char nand_and_fetch_8 (unsigned char *, unsigned char );
+unsigned int
bool_compare_and_swap_8 (unsigned char *, unsigned char, unsigned char);
inline unsigned char
+unsigned char
val_compare_and_swap_8 (unsigned char *, unsigned char , unsigned char);
inline unsigned char lock_test_and_set_8 (unsigned char *);
+unsigned char lock_test_and_set_8 (unsigned char *);
void lock_release_8 (unsigned char *);
@@ 26,19 +26,19 @@ void lock_release_8 (unsigned char *);
/* 16bit */
inline unsigned short fetch_and_add_16 (unsigned short *, unsigned short );
inline unsigned short fetch_and_sub_16 (unsigned short *, unsigned short );
inline unsigned short fetch_and_or_16 (unsigned short *, unsigned short );
inline unsigned short fetch_and_and_16 (unsigned short *, unsigned short );
inline unsigned short fetch_and_xor_16 (unsigned short *, unsigned short );
inline unsigned short fetch_and_nand_16 (unsigned short *, unsigned short );
inline unsigned short add_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned short sub_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned short or_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned short and_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned short xor_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned short nand_and_fetch_16 (unsigned short *, unsigned short );
inline unsigned int
+unsigned short fetch_and_add_16 (unsigned short *, unsigned short );
+unsigned short fetch_and_sub_16 (unsigned short *, unsigned short );
+unsigned short fetch_and_or_16 (unsigned short *, unsigned short );
+unsigned short fetch_and_and_16 (unsigned short *, unsigned short );
+unsigned short fetch_and_xor_16 (unsigned short *, unsigned short );
+unsigned short fetch_and_nand_16 (unsigned short *, unsigned short );
+unsigned short add_and_fetch_16 (unsigned short *, unsigned short );
+unsigned short sub_and_fetch_16 (unsigned short *, unsigned short );
+unsigned short or_and_fetch_16 (unsigned short *, unsigned short );
+unsigned short and_and_fetch_16 (unsigned short *, unsigned short );
+unsigned short xor_and_fetch_16 (unsigned short *, unsigned short );
+unsigned short nand_and_fetch_16 (unsigned short *, unsigned short );
+unsigned int
bool_compare_and_swap_16 (unsigned short *, unsigned short , unsigned short );
inline unsigned short
+unsigned short
val_compare_and_swap_16 (unsigned short *, unsigned short , unsigned short );
inline unsigned short lock_test_and_set_16 (unsigned short *);
+unsigned short lock_test_and_set_16 (unsigned short *);
void lock_release_16 (unsigned short *);
@@ 47,19 +47,19 @@ void lock_release_16 (unsigned short *);
/* 32bit */
inline unsigned int fetch_and_add_32 (unsigned int *, unsigned int );
inline unsigned int fetch_and_sub_32 (unsigned int *, unsigned int );
inline unsigned int fetch_and_or_32 (unsigned int *, unsigned int );
inline unsigned int fetch_and_and_32 (unsigned int *, unsigned int );
inline unsigned int fetch_and_xor_32 (unsigned int *, unsigned int );
inline unsigned int fetch_and_nand_32 (unsigned int *, unsigned int );
inline unsigned int add_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int sub_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int or_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int and_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int xor_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int nand_and_fetch_32 (unsigned int *, unsigned int );
inline unsigned int
+unsigned int fetch_and_add_32 (unsigned int *, unsigned int );
+unsigned int fetch_and_sub_32 (unsigned int *, unsigned int );
+unsigned int fetch_and_or_32 (unsigned int *, unsigned int );
+unsigned int fetch_and_and_32 (unsigned int *, unsigned int );
+unsigned int fetch_and_xor_32 (unsigned int *, unsigned int );
+unsigned int fetch_and_nand_32 (unsigned int *, unsigned int );
+unsigned int add_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int sub_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int or_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int and_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int xor_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int nand_and_fetch_32 (unsigned int *, unsigned int );
+unsigned int
bool_compare_and_swap_32 (unsigned int *, unsigned int , unsigned int );
inline unsigned int
+unsigned int
val_compare_and_swap_32 (unsigned int *, unsigned int , unsigned int );
inline unsigned int lock_test_and_set_32 (unsigned int *);
+unsigned int lock_test_and_set_32 (unsigned int *);
void lock_release_32 (unsigned int *);
@@ 67,19 +67,19 @@ void lock_release_32 (unsigned int *);
/* 64bit */
inline unsigned long long fetch_and_add_64 (unsigned long long *, unsigned long long );
inline unsigned long long fetch_and_sub_64 (unsigned long long *, unsigned long long );
inline unsigned long long fetch_and_or_64 (unsigned long long *, unsigned long long );
inline unsigned long long fetch_and_and_64 (unsigned long long *, unsigned long long );
inline unsigned long long fetch_and_xor_64 (unsigned long long *, unsigned long long );
inline unsigned long long fetch_and_nand_64 (unsigned long long *, unsigned long long );
inline unsigned long long add_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned long long sub_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned long long or_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned long long and_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned long long xor_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned long long nand_and_fetch_64 (unsigned long long *, unsigned long long );
inline unsigned int
+unsigned long long fetch_and_add_64 (unsigned long long *, unsigned long long );
+unsigned long long fetch_and_sub_64 (unsigned long long *, unsigned long long );
+unsigned long long fetch_and_or_64 (unsigned long long *, unsigned long long );
+unsigned long long fetch_and_and_64 (unsigned long long *, unsigned long long );
+unsigned long long fetch_and_xor_64 (unsigned long long *, unsigned long long );
+unsigned long long fetch_and_nand_64 (unsigned long long *, unsigned long long );
+unsigned long long add_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned long long sub_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned long long or_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned long long and_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned long long xor_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned long long nand_and_fetch_64 (unsigned long long *, unsigned long long );
+unsigned int
bool_compare_and_swap_64 (unsigned long long *, unsigned long long , unsigned long long );
inline unsigned long long
+unsigned long long
val_compare_and_swap_64 (unsigned long long *, unsigned long long , unsigned long long );
inline unsigned long long lock_test_and_set_64 (unsigned long long *);
+unsigned long long lock_test_and_set_64 (unsigned long long *);
void lock_release_64 (unsigned long long *);
@@ 87,19 +87,19 @@ void lock_release_64 (unsigned long long *);
/* Word */
inline unsigned long fetch_and_add_word (unsigned long *, unsigned long );
inline unsigned long fetch_and_sub_word (unsigned long *, unsigned long );
inline unsigned long fetch_and_or_word (unsigned long *, unsigned long );
inline unsigned long fetch_and_and_word (unsigned long *, unsigned long );
inline unsigned long fetch_and_xor_word (unsigned long *, unsigned long );
inline unsigned long fetch_and_nand_word (unsigned long *, unsigned long );
inline unsigned long add_and_fetch_word (unsigned long *, unsigned long );
inline unsigned long sub_and_fetch_word (unsigned long *, unsigned long );
inline unsigned long or_and_fetch_word (unsigned long *, unsigned long );
inline unsigned long and_and_fetch_word (unsigned long *, unsigned long );
inline unsigned long xor_and_fetch_word (unsigned long *, unsigned long );
inline unsigned long nand_and_fetch_word (unsigned long *, unsigned long );
inline unsigned int
+unsigned long fetch_and_add_word (unsigned long *, unsigned long );
+unsigned long fetch_and_sub_word (unsigned long *, unsigned long );
+unsigned long fetch_and_or_word (unsigned long *, unsigned long );
+unsigned long fetch_and_and_word (unsigned long *, unsigned long );
+unsigned long fetch_and_xor_word (unsigned long *, unsigned long );
+unsigned long fetch_and_nand_word (unsigned long *, unsigned long );
+unsigned long add_and_fetch_word (unsigned long *, unsigned long );
+unsigned long sub_and_fetch_word (unsigned long *, unsigned long );
+unsigned long or_and_fetch_word (unsigned long *, unsigned long );
+unsigned long and_and_fetch_word (unsigned long *, unsigned long );
+unsigned long xor_and_fetch_word (unsigned long *, unsigned long );
+unsigned long nand_and_fetch_word (unsigned long *, unsigned long );
+unsigned int
bool_compare_and_swap_word (unsigned long *, unsigned long , unsigned long );
inline unsigned long
+unsigned long
val_compare_and_swap_word (unsigned long *, unsigned long , unsigned long );
inline unsigned long lock_test_and_set_word (unsigned long *);
+unsigned long lock_test_and_set_word (unsigned long *);
void lock_release_word (unsigned long *);
diff git a/test/test.hs b/test/test.hs
index 8cf3cb2..38238b5 100644
 a/test/test.hs
+++ b/test/test.hs
@@ 35,3 +35,3 @@ testPattern = 0xdeadbeef
type PolyTest = (AtomicBits a, Storable a, Integral a, Bounded a) => a > Assertion
+type PolyTest = (AtomicBits a, Storable a, Integral a, Bounded a, Show a) => a > Assertion
@@ 50,3 +50,3 @@ testTypes _test = do
test_compareAndSwap :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_compareAndSwap :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 65,3 +65,3 @@ test_compareAndSwap_all = testTypes test_compareAndSwap
test_compareAndSwapBool :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_compareAndSwapBool :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 80,3 +80,3 @@ test_compareAndSwapBool_all = testTypes test_compareAndSwapBool
test_fetchAndAdd :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_fetchAndAdd :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 98,3 +98,3 @@ test_fetchAndAdd_all = testTypes test_fetchAndAdd
test_fetchAndSub :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_fetchAndSub :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 115,3 +115,3 @@ test_fetchAndSub_all = testTypes test_fetchAndSub
test_fetchAndXor :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_fetchAndXor :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 127,3 +127,3 @@ test_fetchAndXor_all = testTypes test_fetchAndXor
test_subAndFetch :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_subAndFetch :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion
@@ 140,3 +140,3 @@ test_subAndFetch_all = testTypes test_subAndFetch
test_lockTestRelease :: (AtomicBits a, Storable a, Integral a, Bounded a) =>
+test_lockTestRelease :: (AtomicBits a, Storable a, Integral a, Bounded a, Show a) =>
a > Assertion