Skip to content

Commit 5674d1c

Browse files
committed
Auto merge of rust-lang#128673 - matthiaskrgr:rollup-gtvpkm7, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - rust-lang#128026 (std::thread: available_parallelism implementation for vxWorks proposal.) - rust-lang#128471 (rustdoc: Fix handling of `Self` type in search index and refactor its representation) - rust-lang#128607 (Use `object` in `run-make/symbols-visibility`) - rust-lang#128609 (Remove unnecessary constants from flt2dec dragon) - rust-lang#128611 (run-make: Remove cygpath) - rust-lang#128619 (Correct the const stabilization of `<[T]>::last_chunk`) - rust-lang#128630 (docs(resolve): more explain about `target`) - rust-lang#128660 (tests: more crashes) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 89fe6df + deb1d75 commit 5674d1c

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

core/src/num/flt2dec/strategy/dragon.rs

+26-23
Original file line numberDiff line numberDiff line change
@@ -12,48 +12,51 @@ use crate::num::flt2dec::{round_up, Decoded, MAX_SIG_DIGITS};
1212

1313
static POW10: [Digit; 10] =
1414
[1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000];
15-
static TWOPOW10: [Digit; 10] =
16-
[2, 20, 200, 2000, 20000, 200000, 2000000, 20000000, 200000000, 2000000000];
17-
18-
// precalculated arrays of `Digit`s for 10^(2^n)
19-
static POW10TO16: [Digit; 2] = [0x6fc10000, 0x2386f2];
20-
static POW10TO32: [Digit; 4] = [0, 0x85acef81, 0x2d6d415b, 0x4ee];
21-
static POW10TO64: [Digit; 7] = [0, 0, 0xbf6a1f01, 0x6e38ed64, 0xdaa797ed, 0xe93ff9f4, 0x184f03];
22-
static POW10TO128: [Digit; 14] = [
23-
0, 0, 0, 0, 0x2e953e01, 0x3df9909, 0xf1538fd, 0x2374e42f, 0xd3cff5ec, 0xc404dc08, 0xbccdb0da,
24-
0xa6337f19, 0xe91f2603, 0x24e,
15+
// precalculated arrays of `Digit`s for 5^(2^n).
16+
static POW5TO16: [Digit; 2] = [0x86f26fc1, 0x23];
17+
static POW5TO32: [Digit; 3] = [0x85acef81, 0x2d6d415b, 0x4ee];
18+
static POW5TO64: [Digit; 5] = [0xbf6a1f01, 0x6e38ed64, 0xdaa797ed, 0xe93ff9f4, 0x184f03];
19+
static POW5TO128: [Digit; 10] = [
20+
0x2e953e01, 0x3df9909, 0xf1538fd, 0x2374e42f, 0xd3cff5ec, 0xc404dc08, 0xbccdb0da, 0xa6337f19,
21+
0xe91f2603, 0x24e,
2522
];
26-
static POW10TO256: [Digit; 27] = [
27-
0, 0, 0, 0, 0, 0, 0, 0, 0x982e7c01, 0xbed3875b, 0xd8d99f72, 0x12152f87, 0x6bde50c6, 0xcf4a6e70,
28-
0xd595d80f, 0x26b2716e, 0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, 0xcc5573c0, 0x65f9ef17,
29-
0x55bc28f2, 0x80dcc7f7, 0xf46eeddc, 0x5fdcefce, 0x553f7,
23+
static POW5TO256: [Digit; 19] = [
24+
0x982e7c01, 0xbed3875b, 0xd8d99f72, 0x12152f87, 0x6bde50c6, 0xcf4a6e70, 0xd595d80f, 0x26b2716e,
25+
0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, 0xcc5573c0, 0x65f9ef17, 0x55bc28f2, 0x80dcc7f7,
26+
0xf46eeddc, 0x5fdcefce, 0x553f7,
3027
];
3128

3229
#[doc(hidden)]
3330
pub fn mul_pow10(x: &mut Big, n: usize) -> &mut Big {
3431
debug_assert!(n < 512);
32+
// Save ourself the left shift for the smallest cases.
33+
if n < 8 {
34+
return x.mul_small(POW10[n & 7]);
35+
}
36+
// Multiply by the powers of 5 and shift the 2s in at the end.
37+
// This keeps the intermediate products smaller and faster.
3538
if n & 7 != 0 {
36-
x.mul_small(POW10[n & 7]);
39+
x.mul_small(POW10[n & 7] >> (n & 7));
3740
}
3841
if n & 8 != 0 {
39-
x.mul_small(POW10[8]);
42+
x.mul_small(POW10[8] >> 8);
4043
}
4144
if n & 16 != 0 {
42-
x.mul_digits(&POW10TO16);
45+
x.mul_digits(&POW5TO16);
4346
}
4447
if n & 32 != 0 {
45-
x.mul_digits(&POW10TO32);
48+
x.mul_digits(&POW5TO32);
4649
}
4750
if n & 64 != 0 {
48-
x.mul_digits(&POW10TO64);
51+
x.mul_digits(&POW5TO64);
4952
}
5053
if n & 128 != 0 {
51-
x.mul_digits(&POW10TO128);
54+
x.mul_digits(&POW5TO128);
5255
}
5356
if n & 256 != 0 {
54-
x.mul_digits(&POW10TO256);
57+
x.mul_digits(&POW5TO256);
5558
}
56-
x
59+
x.mul_pow2(n)
5760
}
5861

5962
fn div_2pow10(x: &mut Big, mut n: usize) -> &mut Big {
@@ -62,7 +65,7 @@ fn div_2pow10(x: &mut Big, mut n: usize) -> &mut Big {
6265
x.div_rem_small(POW10[largest]);
6366
n -= largest;
6467
}
65-
x.div_rem_small(TWOPOW10[n]);
68+
x.div_rem_small(POW10[n] << 1);
6669
x
6770
}
6871

core/src/slice/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ impl<T> [T] {
522522
/// ```
523523
#[inline]
524524
#[stable(feature = "slice_first_last_chunk", since = "1.77.0")]
525-
#[rustc_const_stable(feature = "slice_first_last_chunk", since = "1.77.0")]
525+
#[rustc_const_stable(feature = "const_slice_last_chunk", since = "1.80.0")]
526526
pub const fn last_chunk<const N: usize>(&self) -> Option<&[T; N]> {
527527
if self.len() < N {
528528
None

std/src/sys/pal/unix/thread.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,18 @@ pub fn available_parallelism() -> io::Result<NonZero<usize>> {
455455

456456
Ok(NonZero::new_unchecked(sinfo.cpu_count as usize))
457457
}
458+
} else if #[cfg(target_os = "vxworks")] {
459+
// Note: there is also `vxCpuConfiguredGet`, closer to _SC_NPROCESSORS_CONF
460+
// expectations than the actual cores availability.
461+
extern "C" {
462+
fn vxCpuEnabledGet() -> libc::cpuset_t;
463+
}
464+
465+
// always fetches a valid bitmask
466+
let set = unsafe { vxCpuEnabledGet() };
467+
Ok(NonZero::new_unchecked(set.count_ones() as usize))
458468
} else {
459-
// FIXME: implement on vxWorks, Redox, l4re
469+
// FIXME: implement on Redox, l4re
460470
Err(io::const_io_error!(io::ErrorKind::Unsupported, "Getting the number of hardware threads is not supported on the target platform"))
461471
}
462472
}

0 commit comments

Comments
 (0)