Auto merge of #126608 - tgross35:f16-f128-library, r=Mark-Simulacrum · model-checking/verify-rust-std@a8b311e (original) (raw)

`@@ -489,6 +489,21 @@ impl f64 {

`

489

489

`#[stable(feature = "assoc_int_consts", since = "1.43.0")]

`

490

490

`pub const NEG_INFINITY: f64 = -1.0_f64 / 0.0_f64;

`

491

491

``

``

492

`+

/// Sign bit

`

``

493

`+

const SIGN_MASK: u64 = 0x8000_0000_0000_0000;

`

``

494

+

``

495

`+

/// Exponent mask

`

``

496

`+

const EXP_MASK: u64 = 0x7ff0_0000_0000_0000;

`

``

497

+

``

498

`+

/// Mantissa mask

`

``

499

`+

const MAN_MASK: u64 = 0x000f_ffff_ffff_ffff;

`

``

500

+

``

501

`+

/// Minimum representable positive value (min subnormal)

`

``

502

`+

const TINY_BITS: u64 = 0x1;

`

``

503

+

``

504

`+

/// Minimum representable negative value (min negative subnormal)

`

``

505

`+

const NEG_TINY_BITS: u64 = Self::TINY_BITS | Self::SIGN_MASK;

`

``

506

+

492

507

`` /// Returns true if this value is NaN.

``

493

508

`///

`

494

509

```` /// ```

````

`@@ -514,9 +529,7 @@ impl f64 {

`

514

529

`#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]

`

515

530

`pub(crate) const fn abs_private(self) -> f64 {

`

516

531

`// SAFETY: This transmutation is fine. Probably. For the reasons std is using it.

`

517

``

`-

unsafe {

`

518

``

`-

mem::transmute::<u64, f64>(mem::transmute::<f64, u64>(self) & 0x7fff_ffff_ffff_ffff)

`

519

``

`-

}

`

``

532

`+

unsafe { mem::transmute::<u64, f64>(mem::transmute::<f64, u64>(self) & !Self::SIGN_MASK) }

`

520

533

`}

`

521

534

``

522

535

`` /// Returns true if this value is positive infinity or negative infinity, and

``

`@@ -673,13 +686,10 @@ impl f64 {

`

673

686

`// and some normal floating point numbers truncated from an x87 FPU.

`

674

687

`#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]

`

675

688

`const unsafe fn partial_classify(self) -> FpCategory {

`

676

``

`-

const EXP_MASK: u64 = 0x7ff0000000000000;

`

677

``

`-

const MAN_MASK: u64 = 0x000fffffffffffff;

`

678

``

-

679

689

`// SAFETY: The caller is not asking questions for which this will tell lies.

`

680

690

`let b = unsafe { mem::transmute::<f64, u64>(self) };

`

681

``

`-

match (b & MAN_MASK, b & EXP_MASK) {

`

682

``

`-

(0, EXP_MASK) => FpCategory::Infinite,

`

``

691

`+

match (b & Self::MAN_MASK, b & Self::EXP_MASK) {

`

``

692

`+

(0, Self::EXP_MASK) => FpCategory::Infinite,

`

683

693

`(0, 0) => FpCategory::Zero,

`

684

694

`(_, 0) => FpCategory::Subnormal,

`

685

695

` _ => FpCategory::Normal,

`

`@@ -691,12 +701,9 @@ impl f64 {

`

691

701

`// plus a transmute. We do not live in a just world, but we can make it more so.

`

692

702

`#[rustc_const_unstable(feature = "const_float_classify", issue = "72505")]

`

693

703

`const fn classify_bits(b: u64) -> FpCategory {

`

694

``

`-

const EXP_MASK: u64 = 0x7ff0000000000000;

`

695

``

`-

const MAN_MASK: u64 = 0x000fffffffffffff;

`

696

``

-

697

``

`-

match (b & MAN_MASK, b & EXP_MASK) {

`

698

``

`-

(0, EXP_MASK) => FpCategory::Infinite,

`

699

``

`-

(_, EXP_MASK) => FpCategory::Nan,

`

``

704

`+

match (b & Self::MAN_MASK, b & Self::EXP_MASK) {

`

``

705

`+

(0, Self::EXP_MASK) => FpCategory::Infinite,

`

``

706

`+

(_, Self::EXP_MASK) => FpCategory::Nan,

`

700

707

`(0, 0) => FpCategory::Zero,

`

701

708

`(_, 0) => FpCategory::Subnormal,

`

702

709

` _ => FpCategory::Normal,

`

`@@ -756,7 +763,7 @@ impl f64 {

`

756

763

`// IEEE754 says: isSignMinus(x) is true if and only if x has negative sign. isSignMinus

`

757

764

`// applies to zeros and NaNs as well.

`

758

765

`// SAFETY: This is just transmuting to get the sign bit, it's fine.

`

759

``

`-

unsafe { mem::transmute::<f64, u64>(self) & 0x8000_0000_0000_0000 != 0 }

`

``

766

`+

unsafe { mem::transmute::<f64, u64>(self) & Self::SIGN_MASK != 0 }

`

760

767

`}

`

761

768

``

762

769

`#[must_use]

`

`@@ -797,19 +804,17 @@ impl f64 {

`

797

804

`#[unstable(feature = "float_next_up_down", issue = "91399")]

`

798

805

`#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]

`

799

806

`pub const fn next_up(self) -> Self {

`

800

``

`-

// We must use strictly integer arithmetic to prevent denormals from

`

801

``

`-

// flushing to zero after an arithmetic operation on some platforms.

`

802

``

`-

const TINY_BITS: u64 = 0x1; // Smallest positive f64.

`

803

``

`-

const CLEAR_SIGN_MASK: u64 = 0x7fff_ffff_ffff_ffff;

`

804

``

-

``

807

`+

// Some targets violate Rust's assumption of IEEE semantics, e.g. by flushing

`

``

808

`+

// denormals to zero. This is in general unsound and unsupported, but here

`

``

809

`+

// we do our best to still produce the correct result on such targets.

`

805

810

`let bits = self.to_bits();

`

806

811

`if self.is_nan() || bits == Self::INFINITY.to_bits() {

`

807

812

`return self;

`

808

813

`}

`

809

814

``

810

``

`-

let abs = bits & CLEAR_SIGN_MASK;

`

``

815

`+

let abs = bits & !Self::SIGN_MASK;

`

811

816

`let next_bits = if abs == 0 {

`

812

``

`-

TINY_BITS

`

``

817

`+

Self::TINY_BITS

`

813

818

`} else if bits == abs {

`

814

819

` bits + 1

`

815

820

`} else {

`

`@@ -847,19 +852,17 @@ impl f64 {

`

847

852

`#[unstable(feature = "float_next_up_down", issue = "91399")]

`

848

853

`#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]

`

849

854

`pub const fn next_down(self) -> Self {

`

850

``

`-

// We must use strictly integer arithmetic to prevent denormals from

`

851

``

`-

// flushing to zero after an arithmetic operation on some platforms.

`

852

``

`-

const NEG_TINY_BITS: u64 = 0x8000_0000_0000_0001; // Smallest (in magnitude) negative f64.

`

853

``

`-

const CLEAR_SIGN_MASK: u64 = 0x7fff_ffff_ffff_ffff;

`

854

``

-

``

855

`+

// Some targets violate Rust's assumption of IEEE semantics, e.g. by flushing

`

``

856

`+

// denormals to zero. This is in general unsound and unsupported, but here

`

``

857

`+

// we do our best to still produce the correct result on such targets.

`

855

858

`let bits = self.to_bits();

`

856

859

`if self.is_nan() || bits == Self::NEG_INFINITY.to_bits() {

`

857

860

`return self;

`

858

861

`}

`

859

862

``

860

``

`-

let abs = bits & CLEAR_SIGN_MASK;

`

``

863

`+

let abs = bits & !Self::SIGN_MASK;

`

861

864

`let next_bits = if abs == 0 {

`

862

``

`-

NEG_TINY_BITS

`

``

865

`+

Self::NEG_TINY_BITS

`

863

866

`} else if bits == abs {

`

864

867

` bits - 1

`

865

868

`} else {

`