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