Auto merge of #129060 - matthiaskrgr:rollup-s72gpif, r=matthiaskrgr · patricklam/verify-rust-std@fd2b339 (original) (raw)

`@@ -1496,18 +1496,17 @@ macro_rules! int_impl {

`

1496

1496

`let mut base = self;

`

1497

1497

`let mut acc: Self = 1;

`

1498

1498

``

1499

``

`-

while exp > 1 {

`

``

1499

`+

loop {

`

1500

1500

`if (exp & 1) == 1 {

`

1501

1501

` acc = try_opt!(acc.checked_mul(base));

`

``

1502

`+

// since exp!=0, finally the exp must be 1.

`

``

1503

`+

if exp == 1 {

`

``

1504

`+

return Some(acc);

`

``

1505

`+

}

`

1502

1506

`}

`

1503

1507

` exp /= 2;

`

1504

1508

` base = try_opt!(base.checked_mul(base));

`

1505

1509

`}

`

1506

``

`-

// since exp!=0, finally the exp must be 1.

`

1507

``

`-

// Deal with the final bit of the exponent separately, since

`

1508

``

`-

// squaring the base afterwards is not necessary and may cause a

`

1509

``

`-

// needless overflow.

`

1510

``

`-

acc.checked_mul(base)

`

1511

1510

`}

`

1512

1511

``

1513

1512

`` /// Strict exponentiation. Computes self.pow(exp), panicking if

``

`@@ -1547,18 +1546,17 @@ macro_rules! int_impl {

`

1547

1546

`let mut base = self;

`

1548

1547

`let mut acc: Self = 1;

`

1549

1548

``

1550

``

`-

while exp > 1 {

`

``

1549

`+

loop {

`

1551

1550

`if (exp & 1) == 1 {

`

1552

1551

` acc = acc.strict_mul(base);

`

``

1552

`+

// since exp!=0, finally the exp must be 1.

`

``

1553

`+

if exp == 1 {

`

``

1554

`+

return acc;

`

``

1555

`+

}

`

1553

1556

`}

`

1554

1557

` exp /= 2;

`

1555

1558

` base = base.strict_mul(base);

`

1556

1559

`}

`

1557

``

`-

// since exp!=0, finally the exp must be 1.

`

1558

``

`-

// Deal with the final bit of the exponent separately, since

`

1559

``

`-

// squaring the base afterwards is not necessary and may cause a

`

1560

``

`-

// needless overflow.

`

1561

``

`-

acc.strict_mul(base)

`

1562

1560

`}

`

1563

1561

``

1564

1562

`/// Returns the square root of the number, rounded down.

`

`@@ -2175,26 +2173,44 @@ macro_rules! int_impl {

`

2175

2173

` #[must_use = "this returns the result of the operation, \

`

2176

2174

` without modifying the original"]

`

2177

2175

` #[inline]

`

``

2176

`+

#[rustc_allow_const_fn_unstable(is_val_statically_known)]

`

2178

2177

`pub const fn wrapping_pow(self, mut exp: u32) -> Self {

`

2179

2178

`if exp == 0 {

`

2180

2179

`return 1;

`

2181

2180

`}

`

2182

2181

`let mut base = self;

`

2183

2182

`let mut acc: Self = 1;

`

2184

2183

``

2185

``

`-

while exp > 1 {

`

2186

``

`-

if (exp & 1) == 1 {

`

2187

``

`-

acc = acc.wrapping_mul(base);

`

``

2184

`+

if intrinsics::is_val_statically_known(exp) {

`

``

2185

`+

while exp > 1 {

`

``

2186

`+

if (exp & 1) == 1 {

`

``

2187

`+

acc = acc.wrapping_mul(base);

`

``

2188

`+

}

`

``

2189

`+

exp /= 2;

`

``

2190

`+

base = base.wrapping_mul(base);

`

2188

2191

`}

`

2189

``

`-

exp /= 2;

`

2190

``

`-

base = base.wrapping_mul(base);

`

2191

``

`-

}

`

2192

2192

``

2193

``

`-

// since exp!=0, finally the exp must be 1.

`

2194

``

`-

// Deal with the final bit of the exponent separately, since

`

2195

``

`-

// squaring the base afterwards is not necessary and may cause a

`

2196

``

`-

// needless overflow.

`

2197

``

`-

acc.wrapping_mul(base)

`

``

2193

`+

// since exp!=0, finally the exp must be 1.

`

``

2194

`+

// Deal with the final bit of the exponent separately, since

`

``

2195

`+

// squaring the base afterwards is not necessary.

`

``

2196

`+

acc.wrapping_mul(base)

`

``

2197

`+

} else {

`

``

2198

`+

// This is faster than the above when the exponent is not known

`

``

2199

`+

// at compile time. We can't use the same code for the constant

`

``

2200

`+

// exponent case because LLVM is currently unable to unroll

`

``

2201

`+

// this loop.

`

``

2202

`+

loop {

`

``

2203

`+

if (exp & 1) == 1 {

`

``

2204

`+

acc = acc.wrapping_mul(base);

`

``

2205

`+

// since exp!=0, finally the exp must be 1.

`

``

2206

`+

if exp == 1 {

`

``

2207

`+

return acc;

`

``

2208

`+

}

`

``

2209

`+

}

`

``

2210

`+

exp /= 2;

`

``

2211

`+

base = base.wrapping_mul(base);

`

``

2212

`+

}

`

``

2213

`+

}

`

2198

2214

`}

`

2199

2215

``

2200

2216

`` /// Calculates self + rhs.

``

`@@ -2690,9 +2706,14 @@ macro_rules! int_impl {

`

2690

2706

`// Scratch space for storing results of overflowing_mul.

`

2691

2707

`let mut r;

`

2692

2708

``

2693

``

`-

while exp > 1 {

`

``

2709

`+

loop {

`

2694

2710

`if (exp & 1) == 1 {

`

2695

2711

` r = acc.overflowing_mul(base);

`

``

2712

`+

// since exp!=0, finally the exp must be 1.

`

``

2713

`+

if exp == 1 {

`

``

2714

`+

r.1 |= overflown;

`

``

2715

`+

return r;

`

``

2716

`+

}

`

2696

2717

` acc = r.0;

`

2697

2718

` overflown |= r.1;

`

2698

2719

`}

`

`@@ -2701,14 +2722,6 @@ macro_rules! int_impl {

`

2701

2722

` base = r.0;

`

2702

2723

` overflown |= r.1;

`

2703

2724

`}

`

2704

``

-

2705

``

`-

// since exp!=0, finally the exp must be 1.

`

2706

``

`-

// Deal with the final bit of the exponent separately, since

`

2707

``

`-

// squaring the base afterwards is not necessary and may cause a

`

2708

``

`-

// needless overflow.

`

2709

``

`-

r = acc.overflowing_mul(base);

`

2710

``

`-

r.1 |= overflown;

`

2711

``

`-

r

`

2712

2725

`}

`

2713

2726

``

2714

2727

`` /// Raises self to the power of exp, using exponentiation by squaring.

``

`@@ -2728,26 +2741,45 @@ macro_rules! int_impl {

`

2728

2741

` without modifying the original"]

`

2729

2742

` #[inline]

`

2730

2743

` #[rustc_inherit_overflow_checks]

`

``

2744

`+

#[rustc_allow_const_fn_unstable(is_val_statically_known)]

`

2731

2745

`pub const fn pow(self, mut exp: u32) -> Self {

`

2732

2746

`if exp == 0 {

`

2733

2747

`return 1;

`

2734

2748

`}

`

2735

2749

`let mut base = self;

`

2736

2750

`let mut acc = 1;

`

2737

2751

``

2738

``

`-

while exp > 1 {

`

2739

``

`-

if (exp & 1) == 1 {

`

2740

``

`-

acc = acc * base;

`

``

2752

`+

if intrinsics::is_val_statically_known(exp) {

`

``

2753

`+

while exp > 1 {

`

``

2754

`+

if (exp & 1) == 1 {

`

``

2755

`+

acc = acc * base;

`

``

2756

`+

}

`

``

2757

`+

exp /= 2;

`

``

2758

`+

base = base * base;

`

2741

2759

`}

`

2742

``

`-

exp /= 2;

`

2743

``

`-

base = base * base;

`

2744

``

`-

}

`

2745

2760

``

2746

``

`-

// since exp!=0, finally the exp must be 1.

`

2747

``

`-

// Deal with the final bit of the exponent separately, since

`

2748

``

`-

// squaring the base afterwards is not necessary and may cause a

`

2749

``

`-

// needless overflow.

`

2750

``

`-

acc * base

`

``

2761

`+

// since exp!=0, finally the exp must be 1.

`

``

2762

`+

// Deal with the final bit of the exponent separately, since

`

``

2763

`+

// squaring the base afterwards is not necessary and may cause a

`

``

2764

`+

// needless overflow.

`

``

2765

`+

acc * base

`

``

2766

`+

} else {

`

``

2767

`+

// This is faster than the above when the exponent is not known

`

``

2768

`+

// at compile time. We can't use the same code for the constant

`

``

2769

`+

// exponent case because LLVM is currently unable to unroll

`

``

2770

`+

// this loop.

`

``

2771

`+

loop {

`

``

2772

`+

if (exp & 1) == 1 {

`

``

2773

`+

acc = acc * base;

`

``

2774

`+

// since exp!=0, finally the exp must be 1.

`

``

2775

`+

if exp == 1 {

`

``

2776

`+

return acc;

`

``

2777

`+

}

`

``

2778

`+

}

`

``

2779

`+

exp /= 2;

`

``

2780

`+

base = base * base;

`

``

2781

`+

}

`

``

2782

`+

}

`

2751

2783

`}

`

2752

2784

``

2753

2785

`/// Returns the square root of the number, rounded down.

`