Skip to content

Commit 9351ce0

Browse files
committed
DoubleWord.AtomicRepresentation: Use DoubleWord storage on all platforms
We used to use Int64 on 32-bit architectures, but the inconsistency is bothering me. (Even ignoring alignment issues on SysV-derived ABIs on i386.)
1 parent 9db6c56 commit 9351ce0

File tree

2 files changed

+2
-139
lines changed

2 files changed

+2
-139
lines changed

Sources/Atomics/Conformances/IntegerConformances.swift.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
("UInt64", "Int64", "Int64"),
2525
("Int", "Int", "Int"),
2626
("UInt", "Int", "Int"),
27-
("DoubleWord", "DoubleWord", "Int64"),
27+
("DoubleWord", "DoubleWord", "DoubleWord"),
2828
]
2929
}%
3030
${autogenerated_warning()}

Sources/Atomics/Conformances/autogenerated/IntegerConformances.swift

Lines changed: 1 addition & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -2092,144 +2092,7 @@ extension UInt.AtomicRepresentation: AtomicIntegerStorage {
20922092

20932093

20942094

2095-
#if (compiler(>=5.9) && _pointerBitWidth(_32)) || (compiler(<5.9) && (arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)))
2096-
extension DoubleWord: AtomicValue {
2097-
@frozen
2098-
public struct AtomicRepresentation {
2099-
public typealias Value = DoubleWord
2100-
2101-
#if ATOMICS_NATIVE_BUILTINS
2102-
@usableFromInline
2103-
internal typealias _Storage = Int64
2104-
#else
2105-
@usableFromInline
2106-
internal typealias _Storage = _AtomicInt64Storage
2107-
#endif
2108-
2109-
@usableFromInline
2110-
internal var _storage: _Storage
2111-
2112-
@inline(__always) @_alwaysEmitIntoClient
2113-
public init(_ value: Value) {
2114-
#if ATOMICS_NATIVE_BUILTINS
2115-
_storage = unsafeBitCast(value, to: Int64.self)
2116-
#else
2117-
_storage = _sa_prepare_Int64(unsafeBitCast(value, to: Int64.self))
2118-
#endif
2119-
}
2120-
2121-
@inline(__always) @_alwaysEmitIntoClient
2122-
public func dispose() -> Value {
2123-
#if ATOMICS_NATIVE_BUILTINS
2124-
return unsafeBitCast(_storage, to: DoubleWord.self)
2125-
#else
2126-
let v = _sa_dispose_Int64(_storage)
2127-
return unsafeBitCast(v, to: DoubleWord.self)
2128-
#endif
2129-
}
2130-
}
2131-
}
2132-
2133-
extension UnsafeMutablePointer
2134-
where Pointee == DoubleWord.AtomicRepresentation {
2135-
@inlinable @inline(__always)
2136-
internal var _extract: UnsafeMutablePointer<Pointee._Storage> {
2137-
// `DoubleWord.AtomicRepresentation` is layout-compatible with
2138-
// its only stored property.
2139-
UnsafeMutableRawPointer(self).assumingMemoryBound(to: Pointee._Storage.self)
2140-
}
2141-
}
2142-
2143-
extension DoubleWord.AtomicRepresentation: AtomicStorage {
2144-
@_semantics("atomics.requires_constant_orderings")
2145-
@_transparent @_alwaysEmitIntoClient
2146-
public static func atomicLoad(
2147-
at pointer: UnsafeMutablePointer<Self>,
2148-
ordering: AtomicLoadOrdering
2149-
) -> DoubleWord {
2150-
let r = pointer._extract._atomicLoad(ordering: ordering)
2151-
return unsafeBitCast(r, to: DoubleWord.self)
2152-
}
21532095

2154-
@_semantics("atomics.requires_constant_orderings")
2155-
@_transparent @_alwaysEmitIntoClient
2156-
public static func atomicStore(
2157-
_ desired: DoubleWord,
2158-
at pointer: UnsafeMutablePointer<Self>,
2159-
ordering: AtomicStoreOrdering
2160-
) {
2161-
pointer._extract._atomicStore(
2162-
unsafeBitCast(desired, to: Int64.self),
2163-
ordering: ordering)
2164-
}
2165-
2166-
@_semantics("atomics.requires_constant_orderings")
2167-
@_transparent @_alwaysEmitIntoClient
2168-
public static func atomicExchange(
2169-
_ desired: DoubleWord,
2170-
at pointer: UnsafeMutablePointer<Self>,
2171-
ordering: AtomicUpdateOrdering
2172-
) -> DoubleWord {
2173-
let r = pointer._extract._atomicExchange(
2174-
unsafeBitCast(desired, to: Int64.self),
2175-
ordering: ordering)
2176-
return unsafeBitCast(r, to: DoubleWord.self)
2177-
}
2178-
2179-
@_semantics("atomics.requires_constant_orderings")
2180-
@_transparent @_alwaysEmitIntoClient
2181-
public static func atomicCompareExchange(
2182-
expected: DoubleWord,
2183-
desired: DoubleWord,
2184-
at pointer: UnsafeMutablePointer<Self>,
2185-
ordering: AtomicUpdateOrdering
2186-
) -> (exchanged: Bool, original: DoubleWord) {
2187-
let r = pointer._extract._atomicCompareExchange(
2188-
expected: unsafeBitCast(expected, to: Int64.self),
2189-
desired: unsafeBitCast(desired, to: Int64.self),
2190-
ordering: ordering)
2191-
return (r.exchanged, unsafeBitCast(r.original, to: DoubleWord.self))
2192-
}
2193-
2194-
@_semantics("atomics.requires_constant_orderings")
2195-
@_transparent @_alwaysEmitIntoClient
2196-
public static func atomicCompareExchange(
2197-
expected: DoubleWord,
2198-
desired: DoubleWord,
2199-
at pointer: UnsafeMutablePointer<Self>,
2200-
successOrdering: AtomicUpdateOrdering,
2201-
failureOrdering: AtomicLoadOrdering
2202-
) -> (exchanged: Bool, original: DoubleWord) {
2203-
let r = pointer._extract._atomicCompareExchange(
2204-
expected: unsafeBitCast(expected, to: Int64.self),
2205-
desired: unsafeBitCast(desired, to: Int64.self),
2206-
successOrdering: successOrdering,
2207-
failureOrdering: failureOrdering)
2208-
return (r.exchanged, unsafeBitCast(r.original, to: DoubleWord.self))
2209-
}
2210-
2211-
@_semantics("atomics.requires_constant_orderings")
2212-
@_transparent @_alwaysEmitIntoClient
2213-
public static func atomicWeakCompareExchange(
2214-
expected: DoubleWord,
2215-
desired: DoubleWord,
2216-
at pointer: UnsafeMutablePointer<Self>,
2217-
successOrdering: AtomicUpdateOrdering,
2218-
failureOrdering: AtomicLoadOrdering
2219-
) -> (exchanged: Bool, original: DoubleWord) {
2220-
let r = pointer._extract._atomicWeakCompareExchange(
2221-
expected: unsafeBitCast(expected, to: Int64.self),
2222-
desired: unsafeBitCast(desired, to: Int64.self),
2223-
successOrdering: successOrdering,
2224-
failureOrdering: failureOrdering)
2225-
return (r.exchanged, unsafeBitCast(r.original, to: DoubleWord.self))
2226-
}
2227-
}
2228-
2229-
2230-
2231-
2232-
#else /* (compiler(>=5.9) && _pointerBitWidth(_32)) || (compiler(<5.9) && (arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32))) */
22332096
extension DoubleWord: AtomicValue {
22342097
@frozen
22352098
public struct AtomicRepresentation {
@@ -2363,5 +2226,5 @@ extension DoubleWord.AtomicRepresentation: AtomicStorage {
23632226
}
23642227
}
23652228

2366-
#endif /* (compiler(>=5.9) && _pointerBitWidth(_32)) || (compiler(<5.9) && (arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32))) */
2229+
23672230

0 commit comments

Comments
 (0)