Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
5a9a6d8
ci: Move dependency installs to a separate script
tgross35 Aug 13, 2026
c2a81bf
ci: Enable `CARGO_TERM_VERBOSE`
tgross35 Aug 17, 2026
ca1a7c0
ci: Increase the timeout of MSRV builds
tgross35 Aug 17, 2026
90e1401
ci: Fix the command for local Docker use
tgross35 Aug 17, 2026
d03ac90
ci: Set `-Dlinker_messages`
tgross35 Aug 17, 2026
34ed943
ci: Split and sort docker dependencies
tgross35 Aug 17, 2026
482100d
bench: Update pinned nightly to 2026-08-06
tgross35 Aug 7, 2026
e45bb36
ci: Delete `RUST_TEST_THREADS=1`
tgross35 Aug 17, 2026
cfb82de
enable `f128` tests against system libs on windows
folkertdev Aug 14, 2026
06a0163
ci: Don't test with `--benches` in debug mode
tgross35 Aug 18, 2026
90c7ab4
ci: Group output into sections
tgross35 Aug 18, 2026
c0a0e10
Rename `#[ppc_alias]` to `#[ppc_name]`
beetrees Aug 18, 2026
18af4dd
c-b: Remove `#[aapcs_on_arm]`
beetrees Aug 18, 2026
c757f71
Prepare for merging from rust-lang/rust
invalid-email-address Aug 20, 2026
ad6805c
Merge ref 'f7d782a3be46' from rust-lang/rust
invalid-email-address Aug 20, 2026
c49aa70
bench: Update pinned nightly to 2026-08-19
tgross35 Aug 20, 2026
20da4a3
Revert "ci: Add a patch for compiler-rt execstack"
nicholasbishop Aug 23, 2026
467cc0c
ci: Disable install-action fallback for nextest
Gelbpunkt Aug 7, 2026
3d8ae4d
test: Allow Clippy's `needless-range-loop`
tgross35 Aug 25, 2026
c620c1c
implement `Complex` mul and div
folkertdev Aug 17, 2026
e853a10
test: Move `AlignedSlice` from the benchmark to `builtins-test`
tgross35 Aug 26, 2026
53e4a92
test: Move `mem` config and setup functions to `builtins-test`
tgross35 Aug 26, 2026
6fcc4fc
bench: Move `mem` from `AlignedVec` to `AlignedSlice`
tgross35 Aug 26, 2026
8c6c020
test: Add a test and icount benchmark for `strlen`
tgross35 Aug 26, 2026
1e4d3fd
ci: build and test with s390x-resolute runner
marcoieni Jul 9, 2026
ccc0ca9
libm: Remove an MSRV hack that is no longer needed
tgross35 Aug 26, 2026
61dec22
c-b: Drop the removed `abi_unadjusted` feature gate
HuzaifaAbdulRehman Aug 30, 2026
7b98255
ci: Disable the i686-pc-windows-gnu job
tgross35 Aug 31, 2026
12a11b5
Prepare for merging from rust-lang/rust
folkertdev Aug 31, 2026
56095fb
Merge ref '45f215f136e0' from rust-lang/rust
folkertdev Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 20 additions & 22 deletions library/compiler-builtins/.github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ concurrency:

env:
CARGO_TERM_COLOR: always
CARGO_TERM_VERBOSE: true
LIBM_BUILD_VERBOSE: true
RUSTDOCFLAGS: -Dwarnings
RUSTFLAGS: -Dwarnings
RUSTFLAGS: -Dwarnings -Dlinker_messages
RUST_BACKTRACE: full
BENCHMARK_RUSTC: nightly-2026-08-05 # Pin the toolchain for reproducable results
BENCHMARK_RUSTC: nightly-2026-08-19 # Pin the toolchain for reproducable results

defaults:
run:
Expand Down Expand Up @@ -91,6 +92,8 @@ jobs:
# os: ["self-hosted", "linux", "riscv64"]
- target: riscv64gc-unknown-linux-gnu
os: ubuntu-26.04
- target: s390x-unknown-linux-gnu
os: self-hosted-linux-s390x-resolute-large-rust # resolute == ubuntu-26.04
- target: s390x-unknown-linux-gnu
os: ubuntu-24.04-s390x
- target: thumbv6m-none-eabi
Expand All @@ -111,9 +114,10 @@ jobs:
os: windows-2025-vs2026
- target: x86_64-pc-windows-msvc
os: windows-2025-vs2026
- target: i686-pc-windows-gnu
os: windows-2025-vs2026
channel: nightly-i686-gnu
# FIXME(rust-lang/compiler-builtins#1306): disabled due to broken environment
# - target: i686-pc-windows-gnu
# os: windows-2025-vs2026
# channel: nightly-i686-gnu
- target: x86_64-pc-windows-gnu
os: windows-2025-vs2026
channel: nightly-x86_64-gnu
Expand All @@ -132,26 +136,20 @@ jobs:
lscpu || (sysctl -a | grep cpu) || true
echo "home: ${HOME:-not found}"
pwd

# Native ppc and s390x runners don't have rustup by default
- name: Install rustup
if: matrix.os == 'ubuntu-26.04-ppc64le' || matrix.os == 'ubuntu-26.04-s390x'
run: sudo apt-get update && sudo apt-get install -y rustup

- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: { persist-credentials: false }
- name: Install Rust (rustup)
run: |
channel="nightly"
# Account for channels that have required components (MinGW)
[ -n "$JOB_CHANNEL" ] && channel="$JOB_CHANNEL"
rustup update "$channel" --no-self-update
rustup default "$channel"
rustup target add "$JOB_TARGET"

- name: Set up dependencies and Rust
run: ./ci/install-test-deps.sh "$JOB_TARGET" "$JOB_CHANNEL" "$RUN_IN_DOCKER"

- uses: taiki-e/install-action@7f4eb899022d8fe70b20c4f3de697aa85c309026 # v2.85.11
continue-on-error: true
with:
tool: nextest@0.9.131
# On platforms without prebuilts, nextest can be installed system-wide
# or omitted. Building it probably takes longer than running tests
# without it
fallback: none

- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
Expand All @@ -172,7 +170,7 @@ jobs:
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: compiler-rt
key: ${{ runner.os }}-compiler-rt-${{ hashFiles('ci/download-compiler-rt.sh', 'ci/compiler-rt-patches') }}
key: ${{ runner.os }}-compiler-rt-${{ hashFiles('ci/download-compiler-rt.sh') }}
- name: Download compiler-rt reference sources
if: steps.cache-compiler-rt.outputs.cache-hit != 'true'
run: ./ci/download-compiler-rt.sh
Expand Down Expand Up @@ -345,7 +343,7 @@ jobs:
msrv:
name: Check libm MSRV
runs-on: ubuntu-26.04
timeout-minutes: 10
timeout-minutes: 20
env:
RUSTFLAGS: # No need to check warnings on old MSRV, unset `-Dwarnings`
steps:
Expand All @@ -358,7 +356,7 @@ jobs:
rustup update "$msrv" --no-self-update && rustup default "$msrv"
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- run: |
# FIXME(msrv): Remove the workspace Cargo.toml so 1.63 cargo doesn't see
# FIXME(msrv): Remove the workspace Cargo.toml so MSRV cargo doesn't see
# `edition = "2024"` and get spooked.
rm Cargo.toml
cargo build --manifest-path libm/Cargo.toml
Expand Down
4 changes: 4 additions & 0 deletions library/compiler-builtins/builtins-test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ icount = ["dep:gungraun"]
benchmarking-reports = ["walltime", "criterion/plotters", "criterion/html_reports"]
walltime = ["dep:criterion"]

[lints.clippy]
# This sometimes reads better
needless-range-loop = "allow"

[[bench]]
name = "float_add"
harness = false
Expand Down
91 changes: 30 additions & 61 deletions library/compiler-builtins/builtins-test/benches/mem.rs
Original file line number Diff line number Diff line change
@@ -1,72 +1,39 @@
#![feature(test)]

extern crate test;
use builtins_test::mem::AlignedSlice;
use test::{Bencher, black_box};

extern crate compiler_builtins;
use compiler_builtins::mem::{memcmp, memcpy, memmove, memset};

const WORD_SIZE: usize = core::mem::size_of::<usize>();

struct AlignedVec {
vec: Vec<usize>,
size: usize,
}

impl AlignedVec {
fn new(fill: u8, size: usize) -> Self {
let mut broadcast = fill as usize;
let mut bits = 8;
while bits < WORD_SIZE * 8 {
broadcast |= broadcast << bits;
bits *= 2;
}

let vec = vec![broadcast; (size + WORD_SIZE - 1) & !WORD_SIZE];
AlignedVec { vec, size }
}
}

impl core::ops::Deref for AlignedVec {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe { core::slice::from_raw_parts(self.vec.as_ptr() as *const u8, self.size) }
}
}

impl core::ops::DerefMut for AlignedVec {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe { core::slice::from_raw_parts_mut(self.vec.as_mut_ptr() as *mut u8, self.size) }
}
}

fn memcpy_builtin(b: &mut Bencher, n: usize, offset1: usize, offset2: usize) {
let v1 = AlignedVec::new(1, n + offset1);
let mut v2 = AlignedVec::new(0, n + offset2);
let v1 = AlignedSlice::new(1, n, offset1);
let mut v2 = AlignedSlice::new(0, n, offset2);
b.bytes = n as u64;
b.iter(|| {
let src: &[u8] = black_box(&v1[offset1..]);
let dst: &mut [u8] = black_box(&mut v2[offset2..]);
let src: &[u8] = black_box(&v1);
let dst: &mut [u8] = black_box(&mut v2);
dst.copy_from_slice(src);
})
}

fn memcpy_rust(b: &mut Bencher, n: usize, offset1: usize, offset2: usize) {
let v1 = AlignedVec::new(1, n + offset1);
let mut v2 = AlignedVec::new(0, n + offset2);
let v1 = AlignedSlice::new(1, n, offset1);
let mut v2 = AlignedSlice::new(0, n, offset2);
b.bytes = n as u64;
b.iter(|| {
let src: &[u8] = black_box(&v1[offset1..]);
let dst: &mut [u8] = black_box(&mut v2[offset2..]);
let src: &[u8] = black_box(&v1);
let dst: &mut [u8] = black_box(&mut v2);
unsafe { memcpy(dst.as_mut_ptr(), src.as_ptr(), n) }
})
}

fn memset_builtin(b: &mut Bencher, n: usize, offset: usize) {
let mut v1 = AlignedVec::new(0, n + offset);
let mut v1 = AlignedSlice::new(0, n, offset);
b.bytes = n as u64;
b.iter(|| {
let dst: &mut [u8] = black_box(&mut v1[offset..]);
let dst: &mut [u8] = black_box(&mut v1);
let val: u8 = black_box(27);
for b in dst {
*b = val;
Expand All @@ -75,18 +42,18 @@ fn memset_builtin(b: &mut Bencher, n: usize, offset: usize) {
}

fn memset_rust(b: &mut Bencher, n: usize, offset: usize) {
let mut v1 = AlignedVec::new(0, n + offset);
let mut v1 = AlignedSlice::new(0, n, offset);
b.bytes = n as u64;
b.iter(|| {
let dst: &mut [u8] = black_box(&mut v1[offset..]);
let dst: &mut [u8] = black_box(&mut v1);
let val = black_box(27);
unsafe { memset(dst.as_mut_ptr(), val, n) }
})
}

fn memcmp_builtin(b: &mut Bencher, n: usize) {
let v1 = AlignedVec::new(0, n);
let mut v2 = AlignedVec::new(0, n);
let v1 = AlignedSlice::new(0, n, 0);
let mut v2 = AlignedSlice::new(0, n, 0);
v2[n - 1] = 1;
b.bytes = n as u64;
b.iter(|| {
Expand All @@ -97,20 +64,20 @@ fn memcmp_builtin(b: &mut Bencher, n: usize) {
}

fn memcmp_builtin_unaligned(b: &mut Bencher, n: usize) {
let v1 = AlignedVec::new(0, n);
let mut v2 = AlignedVec::new(0, n);
let v1 = AlignedSlice::new(0, n, 0);
let mut v2 = AlignedSlice::new(0, n, 1);
v2[n - 1] = 1;
b.bytes = n as u64;
b.iter(|| {
let s1: &[u8] = black_box(&v1[0..]);
let s2: &[u8] = black_box(&v2[1..]);
let s1: &[u8] = black_box(&v1);
let s2: &[u8] = black_box(&v2);
s1.cmp(s2)
})
}

fn memcmp_rust(b: &mut Bencher, n: usize) {
let v1 = AlignedVec::new(0, n);
let mut v2 = AlignedVec::new(0, n);
let v1 = AlignedSlice::new(0, n, 0);
let mut v2 = AlignedSlice::new(0, n, 0);
v2[n - 1] = 1;
b.bytes = n as u64;
b.iter(|| {
Expand All @@ -121,19 +88,20 @@ fn memcmp_rust(b: &mut Bencher, n: usize) {
}

fn memcmp_rust_unaligned(b: &mut Bencher, n: usize) {
let v1 = AlignedVec::new(0, n);
let mut v2 = AlignedVec::new(0, n);
let v1 = AlignedSlice::new(0, n, 0);
let mut v2 = AlignedSlice::new(0, n, 1);
v2[n - 1] = 1;
b.bytes = n as u64;
b.iter(|| {
let s1: &[u8] = black_box(&v1[0..]);
let s2: &[u8] = black_box(&v2[1..]);
unsafe { memcmp(s1.as_ptr(), s2.as_ptr(), n - 1) }
let s1: &[u8] = black_box(&v1);
let s2: &[u8] = black_box(&v2);
unsafe { memcmp(s1.as_ptr(), s2.as_ptr(), n) }
})
}

fn memmove_builtin(b: &mut Bencher, n: usize, offset: usize) {
let mut v = AlignedVec::new(0, n + n / 2 + offset);
// Aligned source, misaligned dest
let mut v = AlignedSlice::new(0, n + n / 2 + offset, 0);
b.bytes = n as u64;
b.iter(|| {
let s: &mut [u8] = black_box(&mut v);
Expand All @@ -142,7 +110,8 @@ fn memmove_builtin(b: &mut Bencher, n: usize, offset: usize) {
}

fn memmove_rust(b: &mut Bencher, n: usize, offset: usize) {
let mut v = AlignedVec::new(0, n + n / 2 + offset);
// Aligned source, misaligned dest
let mut v = AlignedSlice::new(0, n + n / 2 + offset, 0);
b.bytes = n as u64;
b.iter(|| {
let dst: *mut u8 = black_box(&mut v[n / 2 + offset..]).as_mut_ptr();
Expand Down
Loading
Loading