diff options
author | alexbiehl <alex.biehl@gmail.com> | 2016-08-01 18:46:29 +1000 |
---|---|---|
committer | Erik de Castro Lopo <erikd@mega-nerd.com> | 2016-08-01 18:46:30 +1000 |
commit | 750553a68c126bdbee3d325a606a9537a8d53141 (patch) | |
tree | 660d147ee59f58742da86e3675b706ae9ed0b9dd /includes | |
parent | 89ae1e858f6eed42cebd9af01b30e239d4543faf (diff) | |
download | haskell-750553a68c126bdbee3d325a606a9537a8d53141.tar.gz |
Use MO_Cmpxchg in Primops.cmm instead of ccall cas(..)
Adjust `CmmParse.y` to parse the `cmpxchg{8, 16, 32, 64}` instructions
and use the 32 respectively the 64 bit variant in `Primops.cmm`. This
effectively eliminates the compare-and-swap ccall to the rts.
Based off the mailing list question from @osa1
(https://mail.haskell.org/pipermail/ghc-devs/2016-July/012506.html).
Reviewers: simonmar, austin, erikd, bgamari, trommler
Reviewed By: erikd, bgamari, trommler
Subscribers: carter, trommler, osa1, thomie
Differential Revision: https://phabricator.haskell.org/D2431
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Cmm.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/includes/Cmm.h b/includes/Cmm.h index 3b9a5a6794..9b7a4e4608 100644 --- a/includes/Cmm.h +++ b/includes/Cmm.h @@ -179,6 +179,16 @@ #endif /* ----------------------------------------------------------------------------- + Atomic memory operations. + -------------------------------------------------------------------------- */ + +#if SIZEOF_W == 4 +#define cmpxchgW cmpxchg32 +#elif SIZEOF_W == 8 +#define cmpxchgW cmpxchg64 +#endif + +/* ----------------------------------------------------------------------------- Heap/stack access, and adjusting the heap/stack pointers. -------------------------------------------------------------------------- */ |