@@ -107,7 +107,9 @@ FloatingPoint.test("Float/staticProperties") {
107
107
expectBitwiseEqual(0x1.921f_b6__p1, Ty.pi)
108
108
expectBitwiseEqual(0x1.0p-23, Ty.ulpOfOne)
109
109
expectBitwiseEqual(0x1.0p-126, Ty.leastNormalMagnitude)
110
+ #if !arch(arm)
110
111
expectBitwiseEqual(0x1.0p-149, Ty.leastNonzeroMagnitude)
112
+ #endif
111
113
112
114
// From the BinaryFloatingPoint protocol.
113
115
expectEqual(8, Ty.exponentBitCount)
@@ -180,7 +182,9 @@ FloatingPoint.test("Double/staticProperties") {
180
182
expectBitwiseEqual(0x1.921f_b544_42d1_8__p1, Ty.pi)
181
183
expectBitwiseEqual(0x1.0p-52, Ty.ulpOfOne)
182
184
expectBitwiseEqual(0x1.0p-1022, Ty.leastNormalMagnitude)
185
+ #if !arch(arm)
183
186
expectBitwiseEqual(0x1.0p-1074, Ty.leastNonzeroMagnitude)
187
+ #endif
184
188
185
189
// From the BinaryFloatingPoint protocol.
186
190
expectEqual(11, Ty.exponentBitCount)
@@ -243,6 +247,24 @@ FloatingPoint.test("Double/HashValueZero") {
243
247
expectEqual(zero.hashValue, negativeZero.hashValue)
244
248
}
245
249
250
+ #if arch(arm)
251
+ % for FloatSelf in ['Float32', 'Float64']:
252
+ func testSubNormalFlush(_ f: ${FloatSelf}) {
253
+ if !f.isSubnormal {
254
+ return
255
+ }
256
+ switch f.sign {
257
+ case .plus:
258
+ expectBitwiseEqual(.leastNonzeroMagnitude, f.nextUp)
259
+ expectBitwiseEqual(0.0, f.nextDown)
260
+ case .minus:
261
+ expectBitwiseEqual(-0.0, f.nextUp)
262
+ expectBitwiseEqual(-.leastNonzeroMagnitude, f.nextDown)
263
+ }
264
+ }
265
+ % end
266
+ #endif
267
+
246
268
let floatNextUpDownTests: [(Float, Float)] = [
247
269
(.nan, .nan),
248
270
(.greatestFiniteMagnitude, .infinity),
@@ -254,6 +276,13 @@ let floatNextUpDownTests: [(Float, Float)] = [
254
276
FloatingPoint.test("Float.nextUp, .nextDown")
255
277
.forEach(in: floatNextUpDownTests) {
256
278
(prev, succ) in
279
+ #if arch(arm)
280
+ if prev.isSubnormal || succ.isSubnormal {
281
+ testSubNormalFlush(prev)
282
+ testSubNormalFlush(succ)
283
+ return
284
+ }
285
+ #endif
257
286
expectBitwiseEqual(succ, prev.nextUp)
258
287
expectBitwiseEqual(prev, succ.nextDown)
259
288
expectBitwiseEqual(-succ, (-prev).nextDown)
@@ -271,6 +300,13 @@ let doubleNextUpDownTests: [(Double, Double)] = [
271
300
FloatingPoint.test("Double.nextUp, .nextDown")
272
301
.forEach(in: doubleNextUpDownTests) {
273
302
(prev, succ) in
303
+ #if arch(arm)
304
+ if prev.isSubnormal || succ.isSubnormal {
305
+ testSubNormalFlush(prev)
306
+ testSubNormalFlush(succ)
307
+ return
308
+ }
309
+ #endif
274
310
expectBitwiseEqual(succ, prev.nextUp)
275
311
expectBitwiseEqual(prev, succ.nextDown)
276
312
expectBitwiseEqual(-succ, (-prev).nextDown)
0 commit comments