Rodrigo Mesquita pushed to branch wip/romes/26166-move-prims at Glasgow Haskell Compiler / GHC
Commits:
-
480471cc
by Rodrigo Mesquita at 2025-10-10T14:58:21+01:00
19 changed files:
- compiler/GHC/CmmToAsm/Wasm/FromCmm.hs
- hadrian/src/Settings/Packages.hs
- libraries/ghc-internal/ghc-internal.cabal.in
- rts/RtsSymbols.c
- rts/include/stg/Prim.h
- libraries/ghc-internal/cbits/atomic.c → rts/prim/atomic.c
- libraries/ghc-internal/cbits/bitrev.c → rts/prim/bitrev.c
- libraries/ghc-internal/cbits/bswap.c → rts/prim/bswap.c
- libraries/ghc-internal/cbits/clz.c → rts/prim/clz.c
- libraries/ghc-internal/cbits/ctz.c → rts/prim/ctz.c
- libraries/ghc-internal/cbits/int64x2minmax.c → rts/prim/int64x2minmax.c
- libraries/ghc-internal/cbits/longlong.c → rts/prim/longlong.c
- libraries/ghc-internal/cbits/mulIntMayOflo.c → rts/prim/mulIntMayOflo.c
- libraries/ghc-internal/cbits/pdep.c → rts/prim/pdep.c
- libraries/ghc-internal/cbits/pext.c → rts/prim/pext.c
- libraries/ghc-internal/cbits/popcnt.c → rts/prim/popcnt.c
- libraries/ghc-internal/cbits/vectorQuotRem.c → rts/prim/vectorQuotRem.c
- libraries/ghc-internal/cbits/word2float.c → rts/prim/word2float.c
- rts/rts.cabal
Changes:
| ... | ... | @@ -438,7 +438,7 @@ lower_MO_S_Shr lbl w0 [x, y] = case someWasmTypeFromCmmType (cmmBits w0) of |
| 438 | 438 | lower_MO_S_Shr _ _ _ = panic "lower_MO_S_Shr: unreachable"
|
| 439 | 439 | |
| 440 | 440 | -- | Lower a 'MO_MulMayOflo' operation. It's translated to a ccall to
|
| 441 | --- @hs_mulIntMayOflo@ function in @ghc-prim/cbits/mulIntMayOflo@,
|
|
| 441 | +-- @hs_mulIntMayOflo@ function in @rts/prim/mulIntMayOflo@,
|
|
| 442 | 442 | -- otherwise it's quite non-trivial to implement as inline assembly.
|
| 443 | 443 | lower_MO_MulMayOflo ::
|
| 444 | 444 | CLabel -> Width -> [CmmExpr] -> WasmCodeGenM w (SomeWasmExpr w)
|
| ... | ... | @@ -287,9 +287,6 @@ ghcInternalArgs = package ghcInternal ? do |
| 287 | 287 | |
| 288 | 288 | , builder (Cabal Flags) ? flag NeedLibatomic `cabalFlag` "need-atomic"
|
| 289 | 289 | |
| 290 | - , builder (Cc CompileC) ? (not <$> flag CcLlvmBackend) ?
|
|
| 291 | - input "**/cbits/atomic.c" ? arg "-Wno-sync-nand"
|
|
| 292 | - |
|
| 293 | 290 | ]
|
| 294 | 291 | |
| 295 | 292 | -- | RTS-specific command line arguments.
|
| ... | ... | @@ -413,6 +410,9 @@ rtsPackageArgs = package rts ? do |
| 413 | 410 | |
| 414 | 411 | , input "**/RetainerProfile.c" ? flag CcLlvmBackend ?
|
| 415 | 412 | arg "-Wno-incompatible-pointer-types"
|
| 413 | + |
|
| 414 | + , input "**/prim/atomic.c" ? (not <$> flag CcLlvmBackend) ?
|
|
| 415 | + arg "-Wno-sync-nand"
|
|
| 416 | 416 | ]
|
| 417 | 417 | |
| 418 | 418 | mconcat
|
| ... | ... | @@ -442,20 +442,7 @@ Library |
| 442 | 442 | cbits/sysconf.c
|
| 443 | 443 | cbits/fs.c
|
| 444 | 444 | cbits/strerror.c
|
| 445 | - cbits/atomic.c
|
|
| 446 | - cbits/bswap.c
|
|
| 447 | - cbits/bitrev.c
|
|
| 448 | - cbits/clz.c
|
|
| 449 | - cbits/ctz.c
|
|
| 450 | 445 | cbits/debug.c
|
| 451 | - cbits/int64x2minmax.c
|
|
| 452 | - cbits/longlong.c
|
|
| 453 | - cbits/mulIntMayOflo.c
|
|
| 454 | - cbits/pdep.c
|
|
| 455 | - cbits/pext.c
|
|
| 456 | - cbits/popcnt.c
|
|
| 457 | - cbits/vectorQuotRem.c
|
|
| 458 | - cbits/word2float.c
|
|
| 459 | 446 | cbits/Stack_c.c
|
| 460 | 447 | |
| 461 | 448 | cmm-sources:
|
| ... | ... | @@ -1016,6 +1016,116 @@ extern char **environ; |
| 1016 | 1016 | #define RTS_FINI_ARRAY_SYMBOLS
|
| 1017 | 1017 | #endif
|
| 1018 | 1018 | |
| 1019 | +#define SymI_HasProtoAllSizes(symbol) \
|
|
| 1020 | + SymI_HasProto(symbol##8) \
|
|
| 1021 | + SymI_HasProto(symbol##16) \
|
|
| 1022 | + SymI_HasProto(symbol##32) \
|
|
| 1023 | + SymI_HasProto(symbol##64)
|
|
| 1024 | + |
|
| 1025 | +#if !defined(arm_HOST_ARCH)
|
|
| 1026 | +#define RTS_ATOMICS_SYMBOLS \
|
|
| 1027 | + SymI_HasProtoAllSizes(hs_atomic_add) \
|
|
| 1028 | + SymI_HasProtoAllSizes(hs_atomic_sub) \
|
|
| 1029 | + SymI_HasProtoAllSizes(hs_atomic_and) \
|
|
| 1030 | + SymI_HasProtoAllSizes(hs_atomic_nand) \
|
|
| 1031 | + SymI_HasProtoAllSizes(hs_atomic_or) \
|
|
| 1032 | + SymI_HasProtoAllSizes(hs_atomic_xor) \
|
|
| 1033 | + SymI_HasProtoAllSizes(hs_cmpxchg) \
|
|
| 1034 | + SymI_HasProtoAllSizes(hs_xchg) \
|
|
| 1035 | + SymI_HasProtoAllSizes(hs_atomicread) \
|
|
| 1036 | + SymI_HasProtoAllSizes(hs_atomicwrite)
|
|
| 1037 | +#else
|
|
| 1038 | +// No atomics on arm32. See e9abcad4cc3
|
|
| 1039 | +#define RTS_ATOMICS_SYMBOLS
|
|
| 1040 | +#endif
|
|
| 1041 | + |
|
| 1042 | +// In rts/longlong.c
|
|
| 1043 | +#if WORD_SIZE_IN_BITS < 64
|
|
| 1044 | +#define RTS_SYMBOLS_LONGLONG \
|
|
| 1045 | + SymI_HasProto(hs_eq64) \
|
|
| 1046 | + SymI_HasProto(hs_ne64) \
|
|
| 1047 | + SymI_HasProto(hs_gtWord64) \
|
|
| 1048 | + SymI_HasProto(hs_geWord64) \
|
|
| 1049 | + SymI_HasProto(hs_ltWord64) \
|
|
| 1050 | + SymI_HasProto(hs_leWord64) \
|
|
| 1051 | + SymI_HasProto(hs_gtInt64) \
|
|
| 1052 | + SymI_HasProto(hs_geInt64) \
|
|
| 1053 | + SymI_HasProto(hs_ltInt64) \
|
|
| 1054 | + SymI_HasProto(hs_leInt64) \
|
|
| 1055 | + SymI_HasProto(hs_neg64) \
|
|
| 1056 | + SymI_HasProto(hs_add64) \
|
|
| 1057 | + SymI_HasProto(hs_sub64) \
|
|
| 1058 | + SymI_HasProto(hs_mul64) \
|
|
| 1059 | + SymI_HasProto(hs_remWord64) \
|
|
| 1060 | + SymI_HasProto(hs_quotWord64) \
|
|
| 1061 | + SymI_HasProto(hs_remInt64) \
|
|
| 1062 | + SymI_HasProto(hs_quotInt64) \
|
|
| 1063 | + SymI_HasProto(hs_and64) \
|
|
| 1064 | + SymI_HasProto(hs_or64) \
|
|
| 1065 | + SymI_HasProto(hs_xor64) \
|
|
| 1066 | + SymI_HasProto(hs_not64) \
|
|
| 1067 | + SymI_HasProto(hs_uncheckedShiftL64) \
|
|
| 1068 | + SymI_HasProto(hs_uncheckedShiftRL64) \
|
|
| 1069 | + SymI_HasProto(hs_uncheckedIShiftRA64) \
|
|
| 1070 | + SymI_HasProto(hs_intToInt64) \
|
|
| 1071 | + SymI_HasProto(hs_int64ToInt) \
|
|
| 1072 | + SymI_HasProto(hs_wordToWord64) \
|
|
| 1073 | + SymI_HasProto(hs_word64ToWord)
|
|
| 1074 | +#else
|
|
| 1075 | +#define RTS_SYMBOLS_LONGLONG
|
|
| 1076 | +#endif
|
|
| 1077 | + |
|
| 1078 | +// rts/prim/vectorQuotRem.c and rts/prim/int64x2minmax
|
|
| 1079 | +#if defined(__SSE2__)
|
|
| 1080 | +#define RTS_SYMBOLS_VECTORQUOTREM \
|
|
| 1081 | + SymI_HasProto(hs_quotInt8X16) \
|
|
| 1082 | + SymI_HasProto(hs_quotInt16X8) \
|
|
| 1083 | + SymI_HasProto(hs_quotInt32X4) \
|
|
| 1084 | + SymI_HasProto(hs_quotInt64X2) \
|
|
| 1085 | + SymI_HasProto(hs_quotWord8X16) \
|
|
| 1086 | + SymI_HasProto(hs_quotWord16X8) \
|
|
| 1087 | + SymI_HasProto(hs_quotWord32X4) \
|
|
| 1088 | + SymI_HasProto(hs_quotWord64X2) \
|
|
| 1089 | + SymI_HasProto(hs_remInt8X16) \
|
|
| 1090 | + SymI_HasProto(hs_remInt16X8) \
|
|
| 1091 | + SymI_HasProto(hs_remInt32X4) \
|
|
| 1092 | + SymI_HasProto(hs_remInt64X2) \
|
|
| 1093 | + SymI_HasProto(hs_remWord8X16) \
|
|
| 1094 | + SymI_HasProto(hs_remWord16X8) \
|
|
| 1095 | + SymI_HasProto(hs_remWord32X4) \
|
|
| 1096 | + SymI_HasProto(hs_remWord64X2)
|
|
| 1097 | +#define RTS_SYMBOLS_INT64X2MINMAX \
|
|
| 1098 | + SymI_HasProto(hs_minInt64X2) \
|
|
| 1099 | + SymI_HasProto(hs_maxInt64X2) \
|
|
| 1100 | + SymI_HasProto(hs_minWord64X2) \
|
|
| 1101 | + SymI_HasProto(hs_maxWord64X2)
|
|
| 1102 | +#else
|
|
| 1103 | +#define RTS_SYMBOLS_VECTORQUOTREM
|
|
| 1104 | +#define RTS_SYMBOLS_INT64X2MINMAX
|
|
| 1105 | +#endif
|
|
| 1106 | + |
|
| 1107 | +// Symbols on files in rts/prim/*
|
|
| 1108 | +#define RTS_SYMBOLS_PRIM \
|
|
| 1109 | + RTS_ATOMICS_SYMBOLS \
|
|
| 1110 | + RTS_SYMBOLS_INT64X2MINMAX \
|
|
| 1111 | + RTS_SYMBOLS_LONGLONG \
|
|
| 1112 | + RTS_SYMBOLS_VECTORQUOTREM \
|
|
| 1113 | + SymI_HasProtoAllSizes(hs_bitrev) \
|
|
| 1114 | + SymI_HasProto(hs_bswap16) \
|
|
| 1115 | + SymI_HasProto(hs_bswap32) \
|
|
| 1116 | + SymI_HasProto(hs_bswap64) \
|
|
| 1117 | + SymI_HasProtoAllSizes(hs_clz) \
|
|
| 1118 | + SymI_HasProtoAllSizes(hs_ctz) \
|
|
| 1119 | + SymI_NeedsProto(hs_mulIntMayOflo) \
|
|
| 1120 | + SymI_HasProtoAllSizes(hs_pdep) \
|
|
| 1121 | + SymI_HasProtoAllSizes(hs_pext) \
|
|
| 1122 | + SymI_HasProtoAllSizes(hs_pext) \
|
|
| 1123 | + SymI_HasProto(hs_popcnt) \
|
|
| 1124 | + SymI_HasProtoAllSizes(hs_popcnt) \
|
|
| 1125 | + SymI_HasProto(hs_word2float32) \
|
|
| 1126 | + SymI_HasProto(hs_word2float64)
|
|
| 1127 | + |
|
| 1128 | + |
|
| 1019 | 1129 | /* entirely bogus claims about types of these symbols */
|
| 1020 | 1130 | #define SymI_NeedsProto(vvv) extern void vvv(void);
|
| 1021 | 1131 | #define SymI_NeedsDataProto(vvv) extern StgWord vvv[];
|
| ... | ... | @@ -1038,6 +1148,7 @@ RTS_ARCH_LIBGCC_SYMBOLS |
| 1038 | 1148 | RTS_FINI_ARRAY_SYMBOLS
|
| 1039 | 1149 | RTS_LIBFFI_SYMBOLS
|
| 1040 | 1150 | RTS_ARM_OUTLINE_ATOMIC_SYMBOLS
|
| 1151 | +RTS_SYMBOLS_PRIM
|
|
| 1041 | 1152 | |
| 1042 | 1153 | #undef SymI_NeedsProto
|
| 1043 | 1154 | #undef SymI_NeedsDataProto
|
| ... | ... | @@ -1081,6 +1192,7 @@ RtsSymbolVal rtsSyms[] = { |
| 1081 | 1192 | RTS_FINI_ARRAY_SYMBOLS
|
| 1082 | 1193 | RTS_LIBFFI_SYMBOLS
|
| 1083 | 1194 | RTS_ARM_OUTLINE_ATOMIC_SYMBOLS
|
| 1195 | + RTS_SYMBOLS_PRIM
|
|
| 1084 | 1196 | SymI_HasDataProto(nonmoving_write_barrier_enabled)
|
| 1085 | 1197 | { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE } /* sentinel */
|
| 1086 | 1198 | };
|
| ... | ... | @@ -2,8 +2,6 @@ |
| 2 | 2 | *
|
| 3 | 3 | * (c) The GHC Team, 2014-2014
|
| 4 | 4 | *
|
| 5 | - * Declarations for C fallback primitives implemented by 'ghc-internal' package.
|
|
| 6 | - *
|
|
| 7 | 5 | * Do not #include this file directly: #include "Rts.h" instead.
|
| 8 | 6 | *
|
| 9 | 7 | * To understand the structure of the RTS headers, see the wiki:
|
| ... | ... | @@ -13,7 +11,7 @@ |
| 13 | 11 | |
| 14 | 12 | #pragma once
|
| 15 | 13 | |
| 16 | -/* libraries/ghc-internal/cbits/atomic.c */
|
|
| 14 | +/* rts/prim/atomic.c */
|
|
| 17 | 15 | StgWord hs_atomic_add8(StgWord x, StgWord val);
|
| 18 | 16 | StgWord hs_atomic_add16(StgWord x, StgWord val);
|
| 19 | 17 | StgWord hs_atomic_add32(StgWord x, StgWord val);
|
| ... | ... | @@ -55,12 +53,12 @@ StgWord hs_xchg16(StgWord x, StgWord val); |
| 55 | 53 | StgWord hs_xchg32(StgWord x, StgWord val);
|
| 56 | 54 | StgWord64 hs_xchg64(StgWord x, StgWord64 val);
|
| 57 | 55 | |
| 58 | -/* libraries/ghc-internal/cbits/bswap.c */
|
|
| 56 | +/* rts/prim/bswap.c */
|
|
| 59 | 57 | StgWord16 hs_bswap16(StgWord16 x);
|
| 60 | 58 | StgWord32 hs_bswap32(StgWord32 x);
|
| 61 | 59 | StgWord64 hs_bswap64(StgWord64 x);
|
| 62 | 60 | |
| 63 | -/* libraries/ghc-internal/cbits/bitrev.c
|
|
| 61 | +/* rts/prim/bitrev.c
|
|
| 64 | 62 | This was done as part of issue #16164.
|
| 65 | 63 | See Note [Bit reversal primop] for more details about the implementation.*/
|
| 66 | 64 | StgWord hs_bitrev8(StgWord x);
|
| ... | ... | @@ -68,7 +66,7 @@ StgWord16 hs_bitrev16(StgWord16 x); |
| 68 | 66 | StgWord32 hs_bitrev32(StgWord32 x);
|
| 69 | 67 | StgWord64 hs_bitrev64(StgWord64 x);
|
| 70 | 68 | |
| 71 | -/* libraries/ghc-internal/cbits/longlong.c */
|
|
| 69 | +/* rts/prim/longlong.c */
|
|
| 72 | 70 | #if WORD_SIZE_IN_BITS < 64
|
| 73 | 71 | StgInt hs_eq64 (StgWord64 a, StgWord64 b);
|
| 74 | 72 | StgInt hs_ne64 (StgWord64 a, StgWord64 b);
|
| ... | ... | @@ -101,36 +99,36 @@ StgWord64 hs_wordToWord64 (StgWord w); |
| 101 | 99 | StgWord hs_word64ToWord (StgWord64 w);
|
| 102 | 100 | #endif
|
| 103 | 101 | |
| 104 | -/* libraries/ghc-internal/cbits/pdep.c */
|
|
| 102 | +/* rts/prim/pdep.c */
|
|
| 105 | 103 | StgWord64 hs_pdep64(StgWord64 src, StgWord64 mask);
|
| 106 | 104 | StgWord hs_pdep32(StgWord src, StgWord mask);
|
| 107 | 105 | StgWord hs_pdep16(StgWord src, StgWord mask);
|
| 108 | 106 | StgWord hs_pdep8(StgWord src, StgWord mask);
|
| 109 | 107 | |
| 110 | -/* libraries/ghc-internal/cbits/pext.c */
|
|
| 108 | +/* rts/prim/pext.c */
|
|
| 111 | 109 | StgWord64 hs_pext64(StgWord64 src, StgWord64 mask);
|
| 112 | 110 | StgWord hs_pext32(StgWord src, StgWord mask);
|
| 113 | 111 | StgWord hs_pext16(StgWord src, StgWord mask);
|
| 114 | 112 | StgWord hs_pext8(StgWord src, StgWord mask);
|
| 115 | 113 | |
| 116 | -/* libraries/ghc-internal/cbits/popcnt.c */
|
|
| 114 | +/* rts/prim/popcnt.c */
|
|
| 117 | 115 | StgWord hs_popcnt8(StgWord x);
|
| 118 | 116 | StgWord hs_popcnt16(StgWord x);
|
| 119 | 117 | StgWord hs_popcnt32(StgWord x);
|
| 120 | 118 | StgWord hs_popcnt64(StgWord64 x);
|
| 121 | 119 | StgWord hs_popcnt(StgWord x);
|
| 122 | 120 | |
| 123 | -/* libraries/ghc-internal/cbits/word2float.c */
|
|
| 121 | +/* rts/prim/word2float.c */
|
|
| 124 | 122 | StgFloat hs_word2float32(StgWord x);
|
| 125 | 123 | StgDouble hs_word2float64(StgWord x);
|
| 126 | 124 | |
| 127 | -/* libraries/ghc-internal/cbits/clz.c */
|
|
| 125 | +/* rts/prim/clz.c */
|
|
| 128 | 126 | StgWord hs_clz8(StgWord x);
|
| 129 | 127 | StgWord hs_clz16(StgWord x);
|
| 130 | 128 | StgWord hs_clz32(StgWord x);
|
| 131 | 129 | StgWord hs_clz64(StgWord64 x);
|
| 132 | 130 | |
| 133 | -/* libraries/ghc-internal/cbits/ctz.c */
|
|
| 131 | +/* rts/prim/ctz.c */
|
|
| 134 | 132 | StgWord hs_ctz8(StgWord x);
|
| 135 | 133 | StgWord hs_ctz16(StgWord x);
|
| 136 | 134 | StgWord hs_ctz32(StgWord x);
|
| ... | ... | @@ -12,90 +12,66 @@ |
| 12 | 12 | |
| 13 | 13 | // FetchAddByteArrayOp_Int
|
| 14 | 14 | |
| 15 | -extern StgWord hs_atomic_add8(StgWord x, StgWord val);
|
|
| 16 | -StgWord
|
|
| 17 | -hs_atomic_add8(StgWord x, StgWord val)
|
|
| 15 | +StgWord hs_atomic_add8(StgWord x, StgWord val)
|
|
| 18 | 16 | {
|
| 19 | 17 | return __sync_fetch_and_add((volatile StgWord8 *) x, (StgWord8) val);
|
| 20 | 18 | }
|
| 21 | 19 | |
| 22 | -extern StgWord hs_atomic_add16(StgWord x, StgWord val);
|
|
| 23 | -StgWord
|
|
| 24 | -hs_atomic_add16(StgWord x, StgWord val)
|
|
| 20 | +StgWord hs_atomic_add16(StgWord x, StgWord val)
|
|
| 25 | 21 | {
|
| 26 | 22 | return __sync_fetch_and_add((volatile StgWord16 *) x, (StgWord16) val);
|
| 27 | 23 | }
|
| 28 | 24 | |
| 29 | -extern StgWord hs_atomic_add32(StgWord x, StgWord val);
|
|
| 30 | -StgWord
|
|
| 31 | -hs_atomic_add32(StgWord x, StgWord val)
|
|
| 25 | +StgWord hs_atomic_add32(StgWord x, StgWord val)
|
|
| 32 | 26 | {
|
| 33 | 27 | return __sync_fetch_and_add((volatile StgWord32 *) x, (StgWord32) val);
|
| 34 | 28 | }
|
| 35 | 29 | |
| 36 | -extern StgWord64 hs_atomic_add64(StgWord x, StgWord64 val);
|
|
| 37 | -StgWord64
|
|
| 38 | -hs_atomic_add64(StgWord x, StgWord64 val)
|
|
| 30 | +StgWord64 hs_atomic_add64(StgWord x, StgWord64 val)
|
|
| 39 | 31 | {
|
| 40 | 32 | return __sync_fetch_and_add((volatile StgWord64 *) x, val);
|
| 41 | 33 | }
|
| 42 | 34 | |
| 43 | 35 | // FetchSubByteArrayOp_Int
|
| 44 | 36 | |
| 45 | -extern StgWord hs_atomic_sub8(StgWord x, StgWord val);
|
|
| 46 | -StgWord
|
|
| 47 | -hs_atomic_sub8(StgWord x, StgWord val)
|
|
| 37 | +StgWord hs_atomic_sub8(StgWord x, StgWord val)
|
|
| 48 | 38 | {
|
| 49 | 39 | return __sync_fetch_and_sub((volatile StgWord8 *) x, (StgWord8) val);
|
| 50 | 40 | }
|
| 51 | 41 | |
| 52 | -extern StgWord hs_atomic_sub16(StgWord x, StgWord val);
|
|
| 53 | -StgWord
|
|
| 54 | -hs_atomic_sub16(StgWord x, StgWord val)
|
|
| 42 | +StgWord hs_atomic_sub16(StgWord x, StgWord val)
|
|
| 55 | 43 | {
|
| 56 | 44 | return __sync_fetch_and_sub((volatile StgWord16 *) x, (StgWord16) val);
|
| 57 | 45 | }
|
| 58 | 46 | |
| 59 | -extern StgWord hs_atomic_sub32(StgWord x, StgWord val);
|
|
| 60 | -StgWord
|
|
| 61 | -hs_atomic_sub32(StgWord x, StgWord val)
|
|
| 47 | +StgWord hs_atomic_sub32(StgWord x, StgWord val)
|
|
| 62 | 48 | {
|
| 63 | 49 | return __sync_fetch_and_sub((volatile StgWord32 *) x, (StgWord32) val);
|
| 64 | 50 | }
|
| 65 | 51 | |
| 66 | -extern StgWord64 hs_atomic_sub64(StgWord x, StgWord64 val);
|
|
| 67 | -StgWord64
|
|
| 68 | -hs_atomic_sub64(StgWord x, StgWord64 val)
|
|
| 52 | +StgWord64 hs_atomic_sub64(StgWord x, StgWord64 val)
|
|
| 69 | 53 | {
|
| 70 | 54 | return __sync_fetch_and_sub((volatile StgWord64 *) x, val);
|
| 71 | 55 | }
|
| 72 | 56 | |
| 73 | 57 | // FetchAndByteArrayOp_Int
|
| 74 | 58 | |
| 75 | -extern StgWord hs_atomic_and8(StgWord x, StgWord val);
|
|
| 76 | -StgWord
|
|
| 77 | -hs_atomic_and8(StgWord x, StgWord val)
|
|
| 59 | +StgWord hs_atomic_and8(StgWord x, StgWord val)
|
|
| 78 | 60 | {
|
| 79 | 61 | return __sync_fetch_and_and((volatile StgWord8 *) x, (StgWord8) val);
|
| 80 | 62 | }
|
| 81 | 63 | |
| 82 | -extern StgWord hs_atomic_and16(StgWord x, StgWord val);
|
|
| 83 | -StgWord
|
|
| 84 | -hs_atomic_and16(StgWord x, StgWord val)
|
|
| 64 | +StgWord hs_atomic_and16(StgWord x, StgWord val)
|
|
| 85 | 65 | {
|
| 86 | 66 | return __sync_fetch_and_and((volatile StgWord16 *) x, (StgWord16) val);
|
| 87 | 67 | }
|
| 88 | 68 | |
| 89 | -extern StgWord hs_atomic_and32(StgWord x, StgWord val);
|
|
| 90 | -StgWord
|
|
| 91 | -hs_atomic_and32(StgWord x, StgWord val)
|
|
| 69 | +StgWord hs_atomic_and32(StgWord x, StgWord val)
|
|
| 92 | 70 | {
|
| 93 | 71 | return __sync_fetch_and_and((volatile StgWord32 *) x, (StgWord32) val);
|
| 94 | 72 | }
|
| 95 | 73 | |
| 96 | -extern StgWord64 hs_atomic_and64(StgWord x, StgWord64 val);
|
|
| 97 | -StgWord64
|
|
| 98 | -hs_atomic_and64(StgWord x, StgWord64 val)
|
|
| 74 | +StgWord64 hs_atomic_and64(StgWord x, StgWord64 val)
|
|
| 99 | 75 | {
|
| 100 | 76 | return __sync_fetch_and_and((volatile StgWord64 *) x, val);
|
| 101 | 77 | }
|
| ... | ... | @@ -167,9 +143,7 @@ hs_atomic_and64(StgWord x, StgWord64 val) |
| 167 | 143 | #pragma GCC diagnostic ignored "-Wsync-nand"
|
| 168 | 144 | #endif
|
| 169 | 145 | |
| 170 | -extern StgWord hs_atomic_nand8(StgWord x, StgWord val);
|
|
| 171 | -StgWord
|
|
| 172 | -hs_atomic_nand8(StgWord x, StgWord val)
|
|
| 146 | +StgWord hs_atomic_nand8(StgWord x, StgWord val)
|
|
| 173 | 147 | {
|
| 174 | 148 | #if USE_SYNC_FETCH_AND_NAND
|
| 175 | 149 | return __sync_fetch_and_nand((volatile StgWord8 *) x, (StgWord8) val);
|
| ... | ... | @@ -178,9 +152,7 @@ hs_atomic_nand8(StgWord x, StgWord val) |
| 178 | 152 | #endif
|
| 179 | 153 | }
|
| 180 | 154 | |
| 181 | -extern StgWord hs_atomic_nand16(StgWord x, StgWord val);
|
|
| 182 | -StgWord
|
|
| 183 | -hs_atomic_nand16(StgWord x, StgWord val)
|
|
| 155 | +StgWord hs_atomic_nand16(StgWord x, StgWord val)
|
|
| 184 | 156 | {
|
| 185 | 157 | #if USE_SYNC_FETCH_AND_NAND
|
| 186 | 158 | return __sync_fetch_and_nand((volatile StgWord16 *) x, (StgWord16) val);
|
| ... | ... | @@ -189,9 +161,7 @@ hs_atomic_nand16(StgWord x, StgWord val) |
| 189 | 161 | #endif
|
| 190 | 162 | }
|
| 191 | 163 | |
| 192 | -extern StgWord hs_atomic_nand32(StgWord x, StgWord val);
|
|
| 193 | -StgWord
|
|
| 194 | -hs_atomic_nand32(StgWord x, StgWord val)
|
|
| 164 | +StgWord hs_atomic_nand32(StgWord x, StgWord val)
|
|
| 195 | 165 | {
|
| 196 | 166 | #if USE_SYNC_FETCH_AND_NAND
|
| 197 | 167 | return __sync_fetch_and_nand((volatile StgWord32 *) x, (StgWord32) val);
|
| ... | ... | @@ -200,9 +170,7 @@ hs_atomic_nand32(StgWord x, StgWord val) |
| 200 | 170 | #endif
|
| 201 | 171 | }
|
| 202 | 172 | |
| 203 | -extern StgWord64 hs_atomic_nand64(StgWord x, StgWord64 val);
|
|
| 204 | -StgWord64
|
|
| 205 | -hs_atomic_nand64(StgWord x, StgWord64 val)
|
|
| 173 | +StgWord64 hs_atomic_nand64(StgWord x, StgWord64 val)
|
|
| 206 | 174 | {
|
| 207 | 175 | #if USE_SYNC_FETCH_AND_NAND
|
| 208 | 176 | return __sync_fetch_and_nand((volatile StgWord64 *) x, val);
|
| ... | ... | @@ -215,96 +183,72 @@ hs_atomic_nand64(StgWord x, StgWord64 val) |
| 215 | 183 | |
| 216 | 184 | // FetchOrByteArrayOp_Int
|
| 217 | 185 | |
| 218 | -extern StgWord hs_atomic_or8(StgWord x, StgWord val);
|
|
| 219 | -StgWord
|
|
| 220 | -hs_atomic_or8(StgWord x, StgWord val)
|
|
| 186 | +StgWord hs_atomic_or8(StgWord x, StgWord val)
|
|
| 221 | 187 | {
|
| 222 | 188 | return __sync_fetch_and_or((volatile StgWord8 *) x, (StgWord8) val);
|
| 223 | 189 | }
|
| 224 | 190 | |
| 225 | -extern StgWord hs_atomic_or16(StgWord x, StgWord val);
|
|
| 226 | -StgWord
|
|
| 227 | -hs_atomic_or16(StgWord x, StgWord val)
|
|
| 191 | +StgWord hs_atomic_or16(StgWord x, StgWord val)
|
|
| 228 | 192 | {
|
| 229 | 193 | return __sync_fetch_and_or((volatile StgWord16 *) x, (StgWord16) val);
|
| 230 | 194 | }
|
| 231 | 195 | |
| 232 | -extern StgWord hs_atomic_or32(StgWord x, StgWord val);
|
|
| 233 | -StgWord
|
|
| 234 | -hs_atomic_or32(StgWord x, StgWord val)
|
|
| 196 | +StgWord hs_atomic_or32(StgWord x, StgWord val)
|
|
| 235 | 197 | {
|
| 236 | 198 | return __sync_fetch_and_or((volatile StgWord32 *) x, (StgWord32) val);
|
| 237 | 199 | }
|
| 238 | 200 | |
| 239 | -extern StgWord64 hs_atomic_or64(StgWord x, StgWord64 val);
|
|
| 240 | -StgWord64
|
|
| 241 | -hs_atomic_or64(StgWord x, StgWord64 val)
|
|
| 201 | +StgWord64 hs_atomic_or64(StgWord x, StgWord64 val)
|
|
| 242 | 202 | {
|
| 243 | 203 | return __sync_fetch_and_or((volatile StgWord64 *) x, val);
|
| 244 | 204 | }
|
| 245 | 205 | |
| 246 | 206 | // FetchXorByteArrayOp_Int
|
| 247 | 207 | |
| 248 | -extern StgWord hs_atomic_xor8(StgWord x, StgWord val);
|
|
| 249 | -StgWord
|
|
| 250 | -hs_atomic_xor8(StgWord x, StgWord val)
|
|
| 208 | +StgWord hs_atomic_xor8(StgWord x, StgWord val)
|
|
| 251 | 209 | {
|
| 252 | 210 | return __sync_fetch_and_xor((volatile StgWord8 *) x, (StgWord8) val);
|
| 253 | 211 | }
|
| 254 | 212 | |
| 255 | -extern StgWord hs_atomic_xor16(StgWord x, StgWord val);
|
|
| 256 | -StgWord
|
|
| 257 | -hs_atomic_xor16(StgWord x, StgWord val)
|
|
| 213 | +StgWord hs_atomic_xor16(StgWord x, StgWord val)
|
|
| 258 | 214 | {
|
| 259 | 215 | return __sync_fetch_and_xor((volatile StgWord16 *) x, (StgWord16) val);
|
| 260 | 216 | }
|
| 261 | 217 | |
| 262 | -extern StgWord hs_atomic_xor32(StgWord x, StgWord val);
|
|
| 263 | -StgWord
|
|
| 264 | -hs_atomic_xor32(StgWord x, StgWord val)
|
|
| 218 | +StgWord hs_atomic_xor32(StgWord x, StgWord val)
|
|
| 265 | 219 | {
|
| 266 | 220 | return __sync_fetch_and_xor((volatile StgWord32 *) x, (StgWord32) val);
|
| 267 | 221 | }
|
| 268 | 222 | |
| 269 | -extern StgWord64 hs_atomic_xor64(StgWord x, StgWord64 val);
|
|
| 270 | -StgWord64
|
|
| 271 | -hs_atomic_xor64(StgWord x, StgWord64 val)
|
|
| 223 | +StgWord64 hs_atomic_xor64(StgWord x, StgWord64 val)
|
|
| 272 | 224 | {
|
| 273 | 225 | return __sync_fetch_and_xor((volatile StgWord64 *) x, val);
|
| 274 | 226 | }
|
| 275 | 227 | |
| 276 | 228 | // CasByteArrayOp_Int
|
| 277 | 229 | |
| 278 | -extern StgWord hs_cmpxchg8(StgWord x, StgWord old, StgWord new);
|
|
| 279 | -StgWord
|
|
| 280 | -hs_cmpxchg8(StgWord x, StgWord old, StgWord new)
|
|
| 230 | +StgWord hs_cmpxchg8(StgWord x, StgWord old, StgWord new)
|
|
| 281 | 231 | {
|
| 282 | 232 | StgWord8 expected = (StgWord8) old;
|
| 283 | 233 | __atomic_compare_exchange_n((StgWord8 *) x, &expected, (StgWord8) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
| 284 | 234 | return expected;
|
| 285 | 235 | }
|
| 286 | 236 | |
| 287 | -extern StgWord hs_cmpxchg16(StgWord x, StgWord old, StgWord new);
|
|
| 288 | -StgWord
|
|
| 289 | -hs_cmpxchg16(StgWord x, StgWord old, StgWord new)
|
|
| 237 | +StgWord hs_cmpxchg16(StgWord x, StgWord old, StgWord new)
|
|
| 290 | 238 | {
|
| 291 | 239 | StgWord16 expected = (StgWord16) old;
|
| 292 | 240 | __atomic_compare_exchange_n((StgWord16 *) x, &expected, (StgWord16) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
| 293 | 241 | return expected;
|
| 294 | 242 | }
|
| 295 | 243 | |
| 296 | -extern StgWord hs_cmpxchg32(StgWord x, StgWord old, StgWord new);
|
|
| 297 | -StgWord
|
|
| 298 | -hs_cmpxchg32(StgWord x, StgWord old, StgWord new)
|
|
| 244 | +StgWord hs_cmpxchg32(StgWord x, StgWord old, StgWord new)
|
|
| 299 | 245 | {
|
| 300 | 246 | StgWord32 expected = (StgWord32) old;
|
| 301 | 247 | __atomic_compare_exchange_n((StgWord32 *) x, &expected, (StgWord32) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
| 302 | 248 | return expected;
|
| 303 | 249 | }
|
| 304 | 250 | |
| 305 | -extern StgWord64 hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new);
|
|
| 306 | -StgWord64
|
|
| 307 | -hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new)
|
|
| 251 | +StgWord64 hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new)
|
|
| 308 | 252 | {
|
| 309 | 253 | StgWord64 expected = (StgWord64) old;
|
| 310 | 254 | __atomic_compare_exchange_n((StgWord64 *) x, &expected, (StgWord64) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
| ... | ... | @@ -313,31 +257,23 @@ hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new) |
| 313 | 257 | |
| 314 | 258 | // Atomic exchange operations
|
| 315 | 259 | |
| 316 | -extern StgWord hs_xchg8(StgWord x, StgWord val);
|
|
| 317 | -StgWord
|
|
| 318 | -hs_xchg8(StgWord x, StgWord val)
|
|
| 260 | +StgWord hs_xchg8(StgWord x, StgWord val)
|
|
| 319 | 261 | {
|
| 320 | 262 | return (StgWord) __atomic_exchange_n((StgWord8 *) x, (StgWord8) val, __ATOMIC_SEQ_CST);
|
| 321 | 263 | }
|
| 322 | 264 | |
| 323 | -extern StgWord hs_xchg16(StgWord x, StgWord val);
|
|
| 324 | -StgWord
|
|
| 325 | -hs_xchg16(StgWord x, StgWord val)
|
|
| 265 | +StgWord hs_xchg16(StgWord x, StgWord val)
|
|
| 326 | 266 | {
|
| 327 | 267 | return (StgWord) __atomic_exchange_n((StgWord16 *)x, (StgWord16) val, __ATOMIC_SEQ_CST);
|
| 328 | 268 | }
|
| 329 | 269 | |
| 330 | -extern StgWord hs_xchg32(StgWord x, StgWord val);
|
|
| 331 | -StgWord
|
|
| 332 | -hs_xchg32(StgWord x, StgWord val)
|
|
| 270 | +StgWord hs_xchg32(StgWord x, StgWord val)
|
|
| 333 | 271 | {
|
| 334 | 272 | return (StgWord) __atomic_exchange_n((StgWord32 *) x, (StgWord32) val, __ATOMIC_SEQ_CST);
|
| 335 | 273 | }
|
| 336 | 274 | |
| 337 | 275 | //GCC provides this even on 32bit, but StgWord is still 32 bits.
|
| 338 | -extern StgWord64 hs_xchg64(StgWord x, StgWord64 val);
|
|
| 339 | -StgWord64
|
|
| 340 | -hs_xchg64(StgWord x, StgWord64 val)
|
|
| 276 | +StgWord64 hs_xchg64(StgWord x, StgWord64 val)
|
|
| 341 | 277 | {
|
| 342 | 278 | return (StgWord64) __atomic_exchange_n((StgWord64 *) x, (StgWord64) val, __ATOMIC_SEQ_CST);
|
| 343 | 279 | }
|
| ... | ... | @@ -352,30 +288,22 @@ hs_xchg64(StgWord x, StgWord64 val) |
| 352 | 288 | // primitives which the GCC documentation claims "usually" implies a full
|
| 353 | 289 | // barrier.
|
| 354 | 290 | |
| 355 | -extern StgWord hs_atomicread8(StgWord x);
|
|
| 356 | -StgWord
|
|
| 357 | -hs_atomicread8(StgWord x)
|
|
| 291 | +StgWord hs_atomicread8(StgWord x)
|
|
| 358 | 292 | {
|
| 359 | 293 | return __atomic_load_n((StgWord8 *) x, __ATOMIC_SEQ_CST);
|
| 360 | 294 | }
|
| 361 | 295 | |
| 362 | -extern StgWord hs_atomicread16(StgWord x);
|
|
| 363 | -StgWord
|
|
| 364 | -hs_atomicread16(StgWord x)
|
|
| 296 | +StgWord hs_atomicread16(StgWord x)
|
|
| 365 | 297 | {
|
| 366 | 298 | return __atomic_load_n((StgWord16 *) x, __ATOMIC_SEQ_CST);
|
| 367 | 299 | }
|
| 368 | 300 | |
| 369 | -extern StgWord hs_atomicread32(StgWord x);
|
|
| 370 | -StgWord
|
|
| 371 | -hs_atomicread32(StgWord x)
|
|
| 301 | +StgWord hs_atomicread32(StgWord x)
|
|
| 372 | 302 | {
|
| 373 | 303 | return __atomic_load_n((StgWord32 *) x, __ATOMIC_SEQ_CST);
|
| 374 | 304 | }
|
| 375 | 305 | |
| 376 | -extern StgWord64 hs_atomicread64(StgWord x);
|
|
| 377 | -StgWord64
|
|
| 378 | -hs_atomicread64(StgWord x)
|
|
| 306 | +StgWord64 hs_atomicread64(StgWord x)
|
|
| 379 | 307 | {
|
| 380 | 308 | return __atomic_load_n((StgWord64 *) x, __ATOMIC_SEQ_CST);
|
| 381 | 309 | }
|
| ... | ... | @@ -384,30 +312,22 @@ hs_atomicread64(StgWord x) |
| 384 | 312 | // Implies a full memory barrier (see compiler/GHC/Builtin/primops.txt.pp)
|
| 385 | 313 | // __ATOMIC_SEQ_CST: Full barrier (see hs_atomicread8 above).
|
| 386 | 314 | |
| 387 | -extern void hs_atomicwrite8(StgWord x, StgWord val);
|
|
| 388 | -void
|
|
| 389 | -hs_atomicwrite8(StgWord x, StgWord val)
|
|
| 315 | +void hs_atomicwrite8(StgWord x, StgWord val)
|
|
| 390 | 316 | {
|
| 391 | 317 | __atomic_store_n((StgWord8 *) x, (StgWord8) val, __ATOMIC_SEQ_CST);
|
| 392 | 318 | }
|
| 393 | 319 | |
| 394 | -extern void hs_atomicwrite16(StgWord x, StgWord val);
|
|
| 395 | -void
|
|
| 396 | -hs_atomicwrite16(StgWord x, StgWord val)
|
|
| 320 | +void hs_atomicwrite16(StgWord x, StgWord val)
|
|
| 397 | 321 | {
|
| 398 | 322 | __atomic_store_n((StgWord16 *) x, (StgWord16) val, __ATOMIC_SEQ_CST);
|
| 399 | 323 | }
|
| 400 | 324 | |
| 401 | -extern void hs_atomicwrite32(StgWord x, StgWord val);
|
|
| 402 | -void
|
|
| 403 | -hs_atomicwrite32(StgWord x, StgWord val)
|
|
| 325 | +void hs_atomicwrite32(StgWord x, StgWord val)
|
|
| 404 | 326 | {
|
| 405 | 327 | __atomic_store_n((StgWord32 *) x, (StgWord32) val, __ATOMIC_SEQ_CST);
|
| 406 | 328 | }
|
| 407 | 329 | |
| 408 | -extern void hs_atomicwrite64(StgWord x, StgWord64 val);
|
|
| 409 | -void
|
|
| 410 | -hs_atomicwrite64(StgWord x, StgWord64 val)
|
|
| 330 | +void hs_atomicwrite64(StgWord x, StgWord64 val)
|
|
| 411 | 331 | {
|
| 412 | 332 | __atomic_store_n((StgWord64 *) x, (StgWord64) val, __ATOMIC_SEQ_CST);
|
| 413 | 333 | }
|
| ... | ... | @@ -529,6 +529,19 @@ library |
| 529 | 529 | sm/Storage.c
|
| 530 | 530 | sm/Sweep.c
|
| 531 | 531 | fs.c
|
| 532 | + prim/atomic.c
|
|
| 533 | + prim/bitrev.c
|
|
| 534 | + prim/bswap.c
|
|
| 535 | + prim/clz.c
|
|
| 536 | + prim/ctz.c
|
|
| 537 | + prim/int64x2minmax.c
|
|
| 538 | + prim/longlong.c
|
|
| 539 | + prim/mulIntMayOflo.c
|
|
| 540 | + prim/pdep.c
|
|
| 541 | + prim/pext.c
|
|
| 542 | + prim/popcnt.c
|
|
| 543 | + prim/vectorQuotRem.c
|
|
| 544 | + prim/word2float.c
|
|
| 532 | 545 | -- I wish we had wildcards..., this would be:
|
| 533 | 546 | -- *.c hooks/**/*.c sm/**/*.c eventlog/**/*.c linker/**/*.c
|
| 534 | 547 |