@@ -625,18 +625,14 @@ extension ${Self}: BinaryFloatingPoint {
625
625
/// almost never is.
626
626
@_inlineable // FIXME(sil-serialize-all)
627
627
public var ulp : ${ Self} {
628
- % if bits == 32 or bits == 64 :
628
+ % if bits != 80 :
629
629
guard _fastPath ( isFinite) else { return . nan }
630
630
if _fastPath ( isNormal) {
631
631
let bitPattern_ = bitPattern & ${ Self} . infinity. bitPattern
632
- return ${ Self} ( bitPattern: bitPattern_) / 0x1 p${ SignificandBitCount}
632
+ return ${ Self} ( bitPattern: bitPattern_) * 0x1 p- ${ SignificandBitCount}
633
633
}
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 * 0x1 p- ${ SignificandBitCount}
640
636
% else :
641
637
guard _fastPath ( isFinite) else { return . nan }
642
638
if exponentBitPattern > UInt ( ${ Self} . significandBitCount) {
@@ -931,24 +927,17 @@ extension ${Self}: BinaryFloatingPoint {
931
927
/// - If `x` is `greatestFiniteMagnitude`, then `x.nextUp` is `infinity`.
932
928
@_inlineable // FIXME(sil-serialize-all)
933
929
public var nextUp : ${ Self} {
934
- % if bits == 32 or bits == 64 :
930
+ % if bits != 80 :
935
931
// Silence signaling NaNs, map -0 to +0.
936
932
let x = self + 0
937
933
#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 }
942
937
#endif
943
938
if _fastPath ( x < . infinity) {
944
939
let increment = Int ${ bits} ( bitPattern: x. bitPattern) &>> ${ bits - 1 } | 1
945
940
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
952
941
return ${ Self} ( bitPattern: bitPattern_)
953
942
}
954
943
return x
@@ -1391,14 +1380,14 @@ extension ${Self}: BinaryFloatingPoint {
1391
1380
/// // y.exponent == 4
1392
1381
@_inlineable // FIXME(sil-serialize-all)
1393
1382
public var binade : ${ Self} {
1394
- % if bits == 32 or bits == 64 :
1383
+ % if bits != 80 :
1395
1384
guard _fastPath ( isFinite) else { return . nan }
1396
1385
#if !arch(arm)
1397
1386
if _slowPath ( isSubnormal) {
1398
1387
let bitPattern_ =
1399
1388
( self * 0x1 p${ SignificandBitCount} ) . bitPattern
1400
1389
& ( - ${ Self} . infinity) . bitPattern
1401
- return ${ Self} ( bitPattern: bitPattern_) / 0x1 p${ SignificandBitCount}
1390
+ return ${ Self} ( bitPattern: bitPattern_) * 0x1 p- ${ SignificandBitCount}
1402
1391
}
1403
1392
#endif
1404
1393
return ${ Self} ( bitPattern: bitPattern & ( - ${ Self} . infinity) . bitPattern)
0 commit comments