Skip to content

Commit 9af6623

Browse files
authored
Merge pull request #21379 from DougGregor/there-and-back-again-a-simd-operator-tale
Move SIMD operators back into the Swift standard library
2 parents e90b6ca + e21a96f commit 9af6623

File tree

10 files changed

+337
-337
lines changed

10 files changed

+337
-337
lines changed

stdlib/public/Darwin/MediaPlayer/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ add_swift_target_library(swiftMediaPlayer ${SWIFT_SDK_OVERLAY_LIBRARY_BUILD_TYPE
88
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
99
TARGET_SDKS IOS IOS_SIMULATOR
1010

11-
SWIFT_MODULE_DEPENDS_IOS Darwin AVFoundation CoreAudio CoreFoundation CoreGraphics CoreImage CoreMedia Dispatch Foundation Metal ObjectiveC QuartzCore simd SIMDOperators UIKit os CoreData # auto-updated
11+
SWIFT_MODULE_DEPENDS_IOS Darwin AVFoundation CoreAudio CoreFoundation CoreGraphics CoreImage CoreMedia Dispatch Foundation Metal ObjectiveC QuartzCore simd UIKit os CoreData # auto-updated
1212
FRAMEWORK_DEPENDS_WEAK MediaPlayer
1313

1414
DEPLOYMENT_VERSION_IOS ${SWIFTLIB_DEPLOYMENT_VERSION_MEDIAPLAYER_IOS}

stdlib/public/Darwin/simd/Quaternion.swift.gyb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import Swift
1616
import Darwin
17-
import SIMDOperators
1817
@_exported import simd
1918

2019
%for scalar in ['Float','Double']:

stdlib/public/Darwin/simd/simd.swift.gyb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import Swift
1616
import Darwin
17-
@_exported import SIMDOperators
1817
@_exported import simd
1918

2019
public extension SIMD {
Lines changed: 1 addition & 325 deletions
Original file line numberDiff line numberDiff line change
@@ -1,325 +1 @@
1-
// Implementations of integer operations. These should eventually all
2-
// be replaced with @_semantics to lower directly to vector IR nodes.
3-
public extension SIMD where Scalar : FixedWidthInteger {
4-
@_transparent
5-
var leadingZeroBitCount: Self {
6-
var result = Self()
7-
for i in indices { result[i] = Scalar(self[i].leadingZeroBitCount) }
8-
return result
9-
}
10-
11-
@_transparent
12-
var trailingZeroBitCount: Self {
13-
var result = Self()
14-
for i in indices { result[i] = Scalar(self[i].trailingZeroBitCount) }
15-
return result
16-
}
17-
18-
@_transparent
19-
var nonzeroBitCount: Self {
20-
var result = Self()
21-
for i in indices { result[i] = Scalar(self[i].nonzeroBitCount) }
22-
return result
23-
}
24-
25-
@_transparent
26-
static prefix func ~(rhs: Self) -> Self {
27-
var result = Self()
28-
for i in result.indices { result[i] = ~rhs[i] }
29-
return result
30-
}
31-
32-
@_transparent
33-
static func &(lhs: Self, rhs: Self) -> Self {
34-
var result = Self()
35-
for i in result.indices { result[i] = lhs[i] & rhs[i] }
36-
return result
37-
}
38-
39-
@_transparent
40-
static func ^(lhs: Self, rhs: Self) -> Self {
41-
var result = Self()
42-
for i in result.indices { result[i] = lhs[i] ^ rhs[i] }
43-
return result
44-
}
45-
46-
@_transparent
47-
static func |(lhs: Self, rhs: Self) -> Self {
48-
var result = Self()
49-
for i in result.indices { result[i] = lhs[i] | rhs[i] }
50-
return result
51-
}
52-
53-
@_transparent
54-
static func &<<(lhs: Self, rhs: Self) -> Self {
55-
var result = Self()
56-
for i in result.indices { result[i] = lhs[i] &<< rhs[i] }
57-
return result
58-
}
59-
60-
@_transparent
61-
static func &>>(lhs: Self, rhs: Self) -> Self {
62-
var result = Self()
63-
for i in result.indices { result[i] = lhs[i] &>> rhs[i] }
64-
return result
65-
}
66-
67-
@_transparent
68-
static func &+(lhs: Self, rhs: Self) -> Self {
69-
var result = Self()
70-
for i in result.indices { result[i] = lhs[i] &+ rhs[i] }
71-
return result
72-
}
73-
74-
@_transparent
75-
static func &-(lhs: Self, rhs: Self) -> Self {
76-
var result = Self()
77-
for i in result.indices { result[i] = lhs[i] &- rhs[i] }
78-
return result
79-
}
80-
81-
@_transparent
82-
static func &*(lhs: Self, rhs: Self) -> Self {
83-
var result = Self()
84-
for i in result.indices { result[i] = lhs[i] &* rhs[i] }
85-
return result
86-
}
87-
88-
@_transparent
89-
static func /(lhs: Self, rhs: Self) -> Self {
90-
var result = Self()
91-
for i in result.indices { result[i] = lhs[i] / rhs[i] }
92-
return result
93-
}
94-
95-
@_transparent
96-
static func %(lhs: Self, rhs: Self) -> Self {
97-
var result = Self()
98-
for i in result.indices { result[i] = lhs[i] % rhs[i] }
99-
return result
100-
}
101-
}
102-
103-
// Implementations of floating-point operations. These should eventually all
104-
// be replaced with @_semantics to lower directly to vector IR nodes.
105-
public extension SIMD where Scalar : FloatingPoint {
106-
@_transparent
107-
static func +(lhs: Self, rhs: Self) -> Self {
108-
var result = Self()
109-
for i in result.indices { result[i] = lhs[i] + rhs[i] }
110-
return result
111-
}
112-
113-
@_transparent
114-
static func -(lhs: Self, rhs: Self) -> Self {
115-
var result = Self()
116-
for i in result.indices { result[i] = lhs[i] - rhs[i] }
117-
return result
118-
}
119-
120-
@_transparent
121-
static func *(lhs: Self, rhs: Self) -> Self {
122-
var result = Self()
123-
for i in result.indices { result[i] = lhs[i] * rhs[i] }
124-
return result
125-
}
126-
127-
@_transparent
128-
static func /(lhs: Self, rhs: Self) -> Self {
129-
var result = Self()
130-
for i in result.indices { result[i] = lhs[i] / rhs[i] }
131-
return result
132-
}
133-
134-
@_transparent
135-
func addingProduct(_ lhs: Self, _ rhs: Self) -> Self {
136-
var result = Self()
137-
for i in result.indices { result[i] = self[i].addingProduct(lhs[i], rhs[i]) }
138-
return result
139-
}
140-
141-
@_transparent
142-
func squareRoot( ) -> Self {
143-
var result = Self()
144-
for i in result.indices { result[i] = self[i].squareRoot() }
145-
return result
146-
}
147-
148-
@_transparent
149-
func rounded(_ rule: FloatingPointRoundingRule) -> Self {
150-
var result = Self()
151-
for i in result.indices { result[i] = self[i].rounded(rule) }
152-
return result
153-
}
154-
}
155-
156-
public extension SIMDMask {
157-
@_transparent
158-
static prefix func .!(rhs: SIMDMask) -> SIMDMask {
159-
return SIMDMask(~rhs._storage)
160-
}
161-
162-
@_transparent
163-
static func .&(lhs: SIMDMask, rhs: SIMDMask) -> SIMDMask {
164-
return SIMDMask(lhs._storage & rhs._storage)
165-
}
166-
167-
@_transparent
168-
static func .^(lhs: SIMDMask, rhs: SIMDMask) -> SIMDMask {
169-
return SIMDMask(lhs._storage ^ rhs._storage)
170-
}
171-
172-
@_transparent
173-
static func .|(lhs: SIMDMask, rhs: SIMDMask) -> SIMDMask {
174-
return SIMDMask(lhs._storage | rhs._storage)
175-
}
176-
}
177-
178-
// These operations should never need @_semantics; they should be trivial
179-
// wrappers around the core operations defined above.
180-
public extension SIMD where Scalar : FixedWidthInteger {
181-
@_transparent static func &(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) & rhs }
182-
@_transparent static func ^(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) ^ rhs }
183-
@_transparent static func |(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) | rhs }
184-
@_transparent static func &<<(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) &<< rhs }
185-
@_transparent static func &>>(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) &>> rhs }
186-
@_transparent static func &+(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) &+ rhs }
187-
@_transparent static func &-(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) &- rhs }
188-
@_transparent static func &*(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) &* rhs }
189-
@_transparent static func /(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) / rhs }
190-
@_transparent static func %(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) % rhs }
191-
192-
@_transparent static func &(lhs: Self, rhs: Scalar) -> Self { return lhs & Self(repeating: rhs) }
193-
@_transparent static func ^(lhs: Self, rhs: Scalar) -> Self { return lhs ^ Self(repeating: rhs) }
194-
@_transparent static func |(lhs: Self, rhs: Scalar) -> Self { return lhs | Self(repeating: rhs) }
195-
@_transparent static func &<<(lhs: Self, rhs: Scalar) -> Self { return lhs &<< Self(repeating: rhs) }
196-
@_transparent static func &>>(lhs: Self, rhs: Scalar) -> Self { return lhs &>> Self(repeating: rhs) }
197-
@_transparent static func &+(lhs: Self, rhs: Scalar) -> Self { return lhs &+ Self(repeating: rhs) }
198-
@_transparent static func &-(lhs: Self, rhs: Scalar) -> Self { return lhs &- Self(repeating: rhs) }
199-
@_transparent static func &*(lhs: Self, rhs: Scalar) -> Self { return lhs &* Self(repeating: rhs) }
200-
@_transparent static func /(lhs: Self, rhs: Scalar) -> Self { return lhs / Self(repeating: rhs) }
201-
@_transparent static func %(lhs: Self, rhs: Scalar) -> Self { return lhs % Self(repeating: rhs) }
202-
203-
@_transparent static func &=(lhs: inout Self, rhs: Self) { lhs = lhs & rhs }
204-
@_transparent static func ^=(lhs: inout Self, rhs: Self) { lhs = lhs ^ rhs }
205-
@_transparent static func |=(lhs: inout Self, rhs: Self) { lhs = lhs | rhs }
206-
@_transparent static func &<<=(lhs: inout Self, rhs: Self) { lhs = lhs &<< rhs }
207-
@_transparent static func &>>=(lhs: inout Self, rhs: Self) { lhs = lhs &>> rhs }
208-
@_transparent static func &+=(lhs: inout Self, rhs: Self) { lhs = lhs &+ rhs }
209-
@_transparent static func &-=(lhs: inout Self, rhs: Self) { lhs = lhs &- rhs }
210-
@_transparent static func &*=(lhs: inout Self, rhs: Self) { lhs = lhs &* rhs }
211-
@_transparent static func /=(lhs: inout Self, rhs: Self) { lhs = lhs / rhs }
212-
@_transparent static func %=(lhs: inout Self, rhs: Self) { lhs = lhs % rhs }
213-
214-
@_transparent static func &=(lhs: inout Self, rhs: Scalar) { lhs = lhs & rhs }
215-
@_transparent static func ^=(lhs: inout Self, rhs: Scalar) { lhs = lhs ^ rhs }
216-
@_transparent static func |=(lhs: inout Self, rhs: Scalar) { lhs = lhs | rhs }
217-
@_transparent static func &<<=(lhs: inout Self, rhs: Scalar) { lhs = lhs &<< rhs }
218-
@_transparent static func &>>=(lhs: inout Self, rhs: Scalar) { lhs = lhs &>> rhs }
219-
@_transparent static func &+=(lhs: inout Self, rhs: Scalar) { lhs = lhs &+ rhs }
220-
@_transparent static func &-=(lhs: inout Self, rhs: Scalar) { lhs = lhs &- rhs }
221-
@_transparent static func &*=(lhs: inout Self, rhs: Scalar) { lhs = lhs &* rhs }
222-
@_transparent static func /=(lhs: inout Self, rhs: Scalar) { lhs = lhs / rhs }
223-
@_transparent static func %=(lhs: inout Self, rhs: Scalar) { lhs = lhs % rhs }
224-
225-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&+' instead")
226-
static func +(lhs: Self, rhs: Self) -> Self { fatalError() }
227-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&-' instead")
228-
static func -(lhs: Self, rhs: Self) -> Self { fatalError() }
229-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&*' instead")
230-
static func *(lhs: Self, rhs: Self) -> Self { fatalError() }
231-
232-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&+' instead")
233-
static func +(lhs: Self, rhs: Scalar) -> Self { fatalError() }
234-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&-' instead")
235-
static func -(lhs: Self, rhs: Scalar) -> Self { fatalError() }
236-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&*' instead")
237-
static func *(lhs: Self, rhs: Scalar) -> Self { fatalError() }
238-
239-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&+' instead")
240-
static func +(lhs: Scalar, rhs: Self) -> Self { fatalError() }
241-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&-' instead")
242-
static func -(lhs: Scalar, rhs: Self) -> Self { fatalError() }
243-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&*' instead")
244-
static func *(lhs: Scalar, rhs: Self) -> Self { fatalError() }
245-
246-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&+=' instead")
247-
static func +=(lhs: inout Self, rhs: Self) { fatalError() }
248-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&-=' instead")
249-
static func -=(lhs: inout Self, rhs: Self) { fatalError() }
250-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&*=' instead")
251-
static func *=(lhs: inout Self, rhs: Self) { fatalError() }
252-
253-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&+=' instead")
254-
static func +=(lhs: inout Self, rhs: Scalar) { fatalError() }
255-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&-=' instead")
256-
static func -=(lhs: inout Self, rhs: Scalar) { fatalError() }
257-
@available(*, unavailable, message: "integer vector types do not support checked arithmetic; use the wrapping operator '&*=' instead")
258-
static func *=(lhs: inout Self, rhs: Scalar) { fatalError() }
259-
}
260-
261-
public extension SIMD where Scalar : FloatingPoint {
262-
@_transparent static prefix func -(rhs: Self) -> Self { return 0 - rhs }
263-
264-
@_transparent static func +(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) + rhs }
265-
@_transparent static func -(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) - rhs }
266-
@_transparent static func *(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) * rhs }
267-
@_transparent static func /(lhs: Scalar, rhs: Self) -> Self { return Self(repeating: lhs) / rhs }
268-
269-
@_transparent static func +(lhs: Self, rhs: Scalar) -> Self { return lhs + Self(repeating: rhs) }
270-
@_transparent static func -(lhs: Self, rhs: Scalar) -> Self { return lhs - Self(repeating: rhs) }
271-
@_transparent static func *(lhs: Self, rhs: Scalar) -> Self { return lhs * Self(repeating: rhs) }
272-
@_transparent static func /(lhs: Self, rhs: Scalar) -> Self { return lhs / Self(repeating: rhs) }
273-
274-
@_transparent static func +=(lhs: inout Self, rhs: Self) { lhs = lhs + rhs }
275-
@_transparent static func -=(lhs: inout Self, rhs: Self) { lhs = lhs - rhs }
276-
@_transparent static func *=(lhs: inout Self, rhs: Self) { lhs = lhs * rhs }
277-
@_transparent static func /=(lhs: inout Self, rhs: Self) { lhs = lhs / rhs }
278-
279-
@_transparent static func +=(lhs: inout Self, rhs: Scalar) { lhs = lhs + rhs }
280-
@_transparent static func -=(lhs: inout Self, rhs: Scalar) { lhs = lhs - rhs }
281-
@_transparent static func *=(lhs: inout Self, rhs: Scalar) { lhs = lhs * rhs }
282-
@_transparent static func /=(lhs: inout Self, rhs: Scalar) { lhs = lhs / rhs }
283-
284-
@_transparent func addingProduct(_ lhs: Scalar, _ rhs: Self) -> Self {
285-
return self.addingProduct(Self(repeating: lhs), rhs)
286-
}
287-
@_transparent func addingProduct(_ lhs: Self, _ rhs: Scalar) -> Self {
288-
return self.addingProduct(lhs, Self(repeating: rhs))
289-
}
290-
@_transparent mutating func addProduct(_ lhs: Self, _ rhs: Self) {
291-
self = self.addingProduct(lhs, rhs)
292-
}
293-
@_transparent mutating func addProduct(_ lhs: Scalar, _ rhs: Self) {
294-
self = self.addingProduct(lhs, rhs)
295-
}
296-
@_transparent mutating func addProduct(_ lhs: Self, _ rhs: Scalar) {
297-
self = self.addingProduct(lhs, rhs)
298-
}
299-
300-
@_transparent mutating func formSquareRoot( ) {
301-
self = self.squareRoot()
302-
}
303-
304-
@_transparent mutating func round(_ rule: FloatingPointRoundingRule) {
305-
self = self.rounded(rule)
306-
}
307-
}
308-
309-
public extension SIMDMask {
310-
@_transparent static func .&(lhs: Bool, rhs: SIMDMask) -> SIMDMask { return SIMDMask(repeating: lhs) .& rhs }
311-
@_transparent static func .^(lhs: Bool, rhs: SIMDMask) -> SIMDMask { return SIMDMask(repeating: lhs) .^ rhs }
312-
@_transparent static func .|(lhs: Bool, rhs: SIMDMask) -> SIMDMask { return SIMDMask(repeating: lhs) .| rhs }
313-
314-
@_transparent static func .&(lhs: SIMDMask, rhs: Bool) -> SIMDMask { return lhs .& SIMDMask(repeating: rhs) }
315-
@_transparent static func .^(lhs: SIMDMask, rhs: Bool) -> SIMDMask { return lhs .^ SIMDMask(repeating: rhs) }
316-
@_transparent static func .|(lhs: SIMDMask, rhs: Bool) -> SIMDMask { return lhs .| SIMDMask(repeating: rhs) }
317-
318-
@_transparent static func .&=(lhs: inout SIMDMask, rhs: SIMDMask) { lhs = lhs .& rhs }
319-
@_transparent static func .^=(lhs: inout SIMDMask, rhs: SIMDMask) { lhs = lhs .^ rhs }
320-
@_transparent static func .|=(lhs: inout SIMDMask, rhs: SIMDMask) { lhs = lhs .| rhs }
321-
322-
@_transparent static func .&=(lhs: inout SIMDMask, rhs: Bool) { lhs = lhs .& rhs }
323-
@_transparent static func .^=(lhs: inout SIMDMask, rhs: Bool) { lhs = lhs .^ rhs }
324-
@_transparent static func .|=(lhs: inout SIMDMask, rhs: Bool) { lhs = lhs .| rhs }
325-
}
1+
// This file intentionally left blank.

0 commit comments

Comments
 (0)