Skip to content

Commit 4c923d6

Browse files
committed
Address reviewer comments on binade, nextUp, ulp
1 parent 73a6aed commit 4c923d6

File tree

1 file changed

+10
-21
lines changed

1 file changed

+10
-21
lines changed

stdlib/public/core/FloatingPointTypes.swift.gyb

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -625,18 +625,14 @@ extension ${Self}: BinaryFloatingPoint {
625625
/// almost never is.
626626
@_inlineable // FIXME(sil-serialize-all)
627627
public var ulp: ${Self} {
628-
%if bits == 32 or bits == 64:
628+
%if bits != 80:
629629
guard _fastPath(isFinite) else { return .nan }
630630
if _fastPath(isNormal) {
631631
let bitPattern_ = bitPattern & ${Self}.infinity.bitPattern
632-
return ${Self}(bitPattern: bitPattern_) / 0x1p${SignificandBitCount}
632+
return ${Self}(bitPattern: bitPattern_) * 0x1p-${SignificandBitCount}
633633
}
634-
#if arch(arm)
635-
// On arm, flush positive subnormal values to 0.
636-
return 0
637-
#else
638-
return .leastNonzeroMagnitude
639-
#endif
634+
// On arm, flush subnormal values to 0.
635+
return .leastNormalMagnitude * 0x1p-${SignificandBitCount}
640636
%else:
641637
guard _fastPath(isFinite) else { return .nan }
642638
if exponentBitPattern > UInt(${Self}.significandBitCount) {
@@ -931,24 +927,17 @@ extension ${Self}: BinaryFloatingPoint {
931927
/// - If `x` is `greatestFiniteMagnitude`, then `x.nextUp` is `infinity`.
932928
@_inlineable // FIXME(sil-serialize-all)
933929
public var nextUp: ${Self} {
934-
%if bits == 32 or bits == 64:
930+
%if bits != 80:
935931
// Silence signaling NaNs, map -0 to +0.
936932
let x = self + 0
937933
#if arch(arm)
938-
// On arm, skip positive subnormal values.
939-
if _slowPath(x.bitPattern & (-${Self}.infinity).bitPattern == 0) {
940-
return .leastNormalMagnitude
941-
}
934+
// On arm, treat subnormal values as zero.
935+
if _slowPath(x == 0) { return .leastNonzeroMagnitude }
936+
if _slowPath(x == -.leastNonzeroMagnitude) { return -0.0 }
942937
#endif
943938
if _fastPath(x < .infinity) {
944939
let increment = Int${bits}(bitPattern: x.bitPattern) &>> ${bits - 1} | 1
945940
let bitPattern_ = x.bitPattern &+ UInt${bits}(bitPattern: increment)
946-
#if arch(arm)
947-
// On arm, flush negative subnormal values to -0.
948-
if _slowPath(bitPattern_ & ${Self}.infinity.bitPattern == 0) {
949-
return -0.0
950-
}
951-
#endif
952941
return ${Self}(bitPattern: bitPattern_)
953942
}
954943
return x
@@ -1391,14 +1380,14 @@ extension ${Self}: BinaryFloatingPoint {
13911380
/// // y.exponent == 4
13921381
@_inlineable // FIXME(sil-serialize-all)
13931382
public var binade: ${Self} {
1394-
%if bits == 32 or bits == 64:
1383+
%if bits != 80:
13951384
guard _fastPath(isFinite) else { return .nan }
13961385
#if !arch(arm)
13971386
if _slowPath(isSubnormal) {
13981387
let bitPattern_ =
13991388
(self * 0x1p${SignificandBitCount}).bitPattern
14001389
& (-${Self}.infinity).bitPattern
1401-
return ${Self}(bitPattern: bitPattern_) / 0x1p${SignificandBitCount}
1390+
return ${Self}(bitPattern: bitPattern_) * 0x1p-${SignificandBitCount}
14021391
}
14031392
#endif
14041393
return ${Self}(bitPattern: bitPattern & (-${Self}.infinity).bitPattern)

0 commit comments

Comments
 (0)