about summary refs log tree commit diff
path: root/library/stdarch/ci
diff options
context:
space:
mode:
Diffstat (limited to 'library/stdarch/ci')
-rwxr-xr-xlibrary/stdarch/ci/build-std-detect.sh46
-rw-r--r--library/stdarch/ci/docker/aarch64-unknown-linux-gnu/Dockerfile19
-rw-r--r--library/stdarch/ci/docker/aarch64_be-unknown-linux-gnu/Dockerfile30
-rw-r--r--library/stdarch/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile13
-rw-r--r--library/stdarch/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile17
-rw-r--r--library/stdarch/ci/docker/i586-unknown-linux-gnu/Dockerfile7
-rw-r--r--library/stdarch/ci/docker/i686-unknown-linux-gnu/Dockerfile7
-rw-r--r--library/stdarch/ci/docker/loongarch64-unknown-linux-gnu/Dockerfile12
-rw-r--r--library/stdarch/ci/docker/mips-unknown-linux-gnu/Dockerfile13
-rw-r--r--library/stdarch/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile10
-rw-r--r--library/stdarch/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile10
-rw-r--r--library/stdarch/ci/docker/mipsel-unknown-linux-musl/Dockerfile25
-rw-r--r--library/stdarch/ci/docker/nvptx64-nvidia-cuda/Dockerfile5
-rw-r--r--library/stdarch/ci/docker/powerpc-unknown-linux-gnu/Dockerfile12
-rw-r--r--library/stdarch/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile14
-rw-r--r--library/stdarch/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile12
-rw-r--r--library/stdarch/ci/docker/riscv32gc-unknown-linux-gnu/Dockerfile15
-rw-r--r--library/stdarch/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile10
-rw-r--r--library/stdarch/ci/docker/s390x-unknown-linux-gnu/Dockerfile14
-rw-r--r--library/stdarch/ci/docker/wasm32-wasip1/Dockerfile13
-rw-r--r--library/stdarch/ci/docker/x86_64-unknown-linux-gnu/Dockerfile18
-rw-r--r--library/stdarch/ci/docker/x86_64-unknown-linux-gnu/cpuid.def71
-rwxr-xr-xlibrary/stdarch/ci/dox.sh41
-rwxr-xr-xlibrary/stdarch/ci/run-docker.sh60
-rwxr-xr-xlibrary/stdarch/ci/run.sh203
-rwxr-xr-xlibrary/stdarch/ci/style.sh22
26 files changed, 719 insertions, 0 deletions
diff --git a/library/stdarch/ci/build-std-detect.sh b/library/stdarch/ci/build-std-detect.sh
new file mode 100755
index 00000000000..e79a497cc35
--- /dev/null
+++ b/library/stdarch/ci/build-std-detect.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+
+# Build std_detect on non-Linux & non-x86 targets.
+#
+# In std_detect, non-x86 targets have OS-specific implementations,
+# but we can test only Linux in CI. This script builds targets supported
+# by std_detect but cannot be tested in CI.
+
+set -ex
+cd "$(dirname "$0")"/..
+
+targets=(
+    # Linux
+    aarch64-unknown-linux-musl
+    armv5te-unknown-linux-musleabi
+    aarch64-unknown-linux-ohos
+    armv7-unknown-linux-ohos
+
+    # Android
+    aarch64-linux-android
+    arm-linux-androideabi
+
+    # FreeBSD
+    aarch64-unknown-freebsd
+    armv6-unknown-freebsd
+    powerpc-unknown-freebsd
+    powerpc64-unknown-freebsd
+
+    # OpenBSD
+    aarch64-unknown-openbsd
+
+    # Windows
+    aarch64-pc-windows-msvc
+)
+
+rustup component add rust-src # for -Z build-std
+
+cd crates/std_detect
+for target in "${targets[@]}"; do
+    if rustup target add "${target}" &>/dev/null; then
+        cargo build --target "${target}"
+    else
+        # tier 3 targets requires -Z build-std.
+        cargo build -Z build-std="core,alloc" --target "${target}"
+    fi
+done
diff --git a/library/stdarch/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..17025efffea
--- /dev/null
+++ b/library/stdarch/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,19 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  g++ \
+  ca-certificates \
+  libc6-dev \
+  gcc-aarch64-linux-gnu \
+  g++-aarch64-linux-gnu \
+  libc6-dev-arm64-cross \
+  qemu-user \
+  make \
+  file \
+  clang-19 \
+  lld
+
+ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
+    CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64 -cpu max -L /usr/aarch64-linux-gnu" \
+    OBJDUMP=aarch64-linux-gnu-objdump \
+    STDARCH_TEST_SKIP_FEATURE=tme
diff --git a/library/stdarch/ci/docker/aarch64_be-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/aarch64_be-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..74f770556db
--- /dev/null
+++ b/library/stdarch/ci/docker/aarch64_be-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,30 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  g++ \
+  ca-certificates \
+  libc6-dev \
+  libc6-dev-arm64-cross \
+  qemu-user \
+  make \
+  file \
+  clang-19 \
+  curl \
+  xz-utils \
+  lld
+
+ENV TOOLCHAIN="arm-gnu-toolchain-14.2.rel1-x86_64-aarch64_be-none-linux-gnu"
+
+# Download the aarch64_be gcc toolchain
+RUN curl -L "https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/${TOOLCHAIN}.tar.xz" -o "${TOOLCHAIN}.tar.xz"
+RUN tar -xvf "${TOOLCHAIN}.tar.xz"
+RUN mkdir /toolchains && mv "./${TOOLCHAIN}" /toolchains
+
+ENV AARCH64_BE_TOOLCHAIN="/toolchains/${TOOLCHAIN}"
+ENV AARCH64_BE_LIBC="${AARCH64_BE_TOOLCHAIN}/aarch64_be-none-linux-gnu/libc"
+
+ENV CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_LINKER="${AARCH64_BE_TOOLCHAIN}/bin/aarch64_be-none-linux-gnu-gcc"
+ENV CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64_be -cpu max -L ${AARCH64_BE_LIBC}"
+ENV OBJDUMP="${AARCH64_BE_TOOLCHAIN}/bin/aarch64_be-none-linux-gnu-objdump"
+ENV STDARCH_TEST_SKIP_FEATURE=tme
diff --git a/library/stdarch/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/library/stdarch/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
new file mode 100644
index 00000000000..14eaf9f9eef
--- /dev/null
+++ b/library/stdarch/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
@@ -0,0 +1,13 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  ca-certificates \
+  libc6-dev \
+  gcc-arm-linux-gnueabihf \
+  libc6-dev-armhf-cross \
+  qemu-user \
+  make \
+  file
+ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
+    CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -cpu max -L /usr/arm-linux-gnueabihf" \
+    OBJDUMP=arm-linux-gnueabihf-objdump
diff --git a/library/stdarch/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile b/library/stdarch/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
new file mode 100644
index 00000000000..2086e117d92
--- /dev/null
+++ b/library/stdarch/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
@@ -0,0 +1,17 @@
+FROM ubuntu:24.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  g++ \
+  ca-certificates \
+  libc6-dev \
+  gcc-arm-linux-gnueabihf \
+  g++-arm-linux-gnueabihf \
+  libc6-dev-armhf-cross \
+  qemu-user \
+  make \
+  file \
+  clang-19 \
+  lld
+ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
+    CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -cpu max -L /usr/arm-linux-gnueabihf" \
+    OBJDUMP=arm-linux-gnueabihf-objdump
diff --git a/library/stdarch/ci/docker/i586-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/i586-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..5a4a22369a8
--- /dev/null
+++ b/library/stdarch/ci/docker/i586-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,7 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc-multilib \
+  libc6-dev \
+  file \
+  make \
+  ca-certificates
diff --git a/library/stdarch/ci/docker/i686-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/i686-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..5a4a22369a8
--- /dev/null
+++ b/library/stdarch/ci/docker/i686-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,7 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc-multilib \
+  libc6-dev \
+  file \
+  make \
+  ca-certificates
diff --git a/library/stdarch/ci/docker/loongarch64-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/loongarch64-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..99ccf286f36
--- /dev/null
+++ b/library/stdarch/ci/docker/loongarch64-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,12 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends \
+    gcc libc6-dev qemu-user-static ca-certificates \
+    gcc-14-loongarch64-linux-gnu libc6-dev-loong64-cross
+
+
+ENV CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_LINKER=loongarch64-linux-gnu-gcc-14 \
+    CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-loongarch64-static -cpu max -L /usr/loongarch64-linux-gnu" \
+    OBJDUMP=loongarch64-linux-gnu-objdump \
+    STDARCH_TEST_SKIP_FEATURE=frecipe
diff --git a/library/stdarch/ci/docker/mips-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/mips-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..f43a3c96633
--- /dev/null
+++ b/library/stdarch/ci/docker/mips-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,13 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-mips-linux-gnu libc6-dev-mips-cross \
+        qemu-system-mips \
+        qemu-user \
+        make \
+        file
+
+ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc \
+    CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_RUNNER="qemu-mips -L /usr/mips-linux-gnu" \
+    OBJDUMP=mips-linux-gnu-objdump
\ No newline at end of file
diff --git a/library/stdarch/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/library/stdarch/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
new file mode 100644
index 00000000000..235ac0997b1
--- /dev/null
+++ b/library/stdarch/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
@@ -0,0 +1,10 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-mips64-linux-gnuabi64 libc6-dev-mips64-cross \
+        qemu-system-mips64 qemu-user
+
+ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_LINKER=mips64-linux-gnuabi64-gcc \
+    CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_RUNNER="qemu-mips64 -L /usr/mips64-linux-gnuabi64" \
+    OBJDUMP=mips64-linux-gnuabi64-objdump
\ No newline at end of file
diff --git a/library/stdarch/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile b/library/stdarch/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
new file mode 100644
index 00000000000..6041d891174
--- /dev/null
+++ b/library/stdarch/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
@@ -0,0 +1,10 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-mips64el-linux-gnuabi64 libc6-dev-mips64el-cross \
+        qemu-system-mips64el
+
+ENV CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_GNUABI64_LINKER=mips64el-linux-gnuabi64-gcc \
+    CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_GNUABI64_RUNNER="qemu-mips64el -L /usr/mips64el-linux-gnuabi64" \
+    OBJDUMP=mips64el-linux-gnuabi64-objdump
\ No newline at end of file
diff --git a/library/stdarch/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/library/stdarch/ci/docker/mipsel-unknown-linux-musl/Dockerfile
new file mode 100644
index 00000000000..cd38348eeb5
--- /dev/null
+++ b/library/stdarch/ci/docker/mipsel-unknown-linux-musl/Dockerfile
@@ -0,0 +1,25 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends \
+    ca-certificates \
+    gcc \
+    libc6-dev \
+    make \
+    qemu-user \
+    qemu-system-mips \
+    bzip2 \
+    curl \
+    file
+
+RUN mkdir /toolchain
+
+# Note that this originally came from:
+# https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2
+RUN curl -L https://ci-mirrors.rust-lang.org/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \
+      tar xjf - -C /toolchain --strip-components=2
+
+ENV PATH=$PATH:/rust/bin:/toolchain/bin \
+    CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \
+    CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc \
+    CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain"
diff --git a/library/stdarch/ci/docker/nvptx64-nvidia-cuda/Dockerfile b/library/stdarch/ci/docker/nvptx64-nvidia-cuda/Dockerfile
new file mode 100644
index 00000000000..5b4869863c7
--- /dev/null
+++ b/library/stdarch/ci/docker/nvptx64-nvidia-cuda/Dockerfile
@@ -0,0 +1,5 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  libc6-dev \
+  ca-certificates
diff --git a/library/stdarch/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..baad95d5784
--- /dev/null
+++ b/library/stdarch/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,12 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \
+        qemu-system-ppc make file
+
+ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \
+    CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -cpu mpc8610 -L /usr/powerpc-linux-gnu" \
+    CC=powerpc-linux-gnu-gcc \
+    OBJDUMP=powerpc-linux-gnu-objdump \
+    STDARCH_TEST_SKIP_FEATURE=vsx
diff --git a/library/stdarch/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..dcbcb43513e
--- /dev/null
+++ b/library/stdarch/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,14 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-powerpc64-linux-gnu libc6-dev-ppc64-cross \
+        file make
+
+ENV CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_LINKER=powerpc64-linux-gnu-gcc \
+    CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc64 -cpu power11 -L /usr/powerpc64-linux-gnu" \
+    CC=powerpc64-linux-gnu-gcc \
+    OBJDUMP=powerpc64-linux-gnu-objdump \
+    STDARCH_TEST_SKIP_FEATURE=vsx \
+#   These 2 tests have erratic behaviour with qemu, see https://gitlab.com/qemu-project/qemu/-/issues/1623#note_2449012173
+    STDARCH_TEST_SKIP_FUNCTION=vec_lde_u16,vec_lde_u32
diff --git a/library/stdarch/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..8dfac0ec1e4
--- /dev/null
+++ b/library/stdarch/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,12 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross \
+        file make
+
+# Work around qemu triggering a sigill on vec_subs if the cpu target is not defined.
+ENV CARGO_TARGET_POWERPC64LE_UNKNOWN_LINUX_GNU_LINKER=powerpc64le-linux-gnu-gcc \
+    CARGO_TARGET_POWERPC64LE_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc64le -cpu power11 -L /usr/powerpc64le-linux-gnu" \
+    CC=powerpc64le-linux-gnu-gcc \
+    OBJDUMP=powerpc64le-linux-gnu-objdump
diff --git a/library/stdarch/ci/docker/riscv32gc-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/riscv32gc-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..81f7b6239af
--- /dev/null
+++ b/library/stdarch/ci/docker/riscv32gc-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,15 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        wget xz-utils make file llvm
+
+ENV VERSION=2025.01.20
+
+RUN wget "https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/${VERSION}/riscv32-glibc-ubuntu-24.04-gcc-nightly-${VERSION}-nightly.tar.xz" \
+    -O riscv-toolchain.tar.xz
+RUN tar -xJf riscv-toolchain.tar.xz
+
+ENV CARGO_TARGET_RISCV32GC_UNKNOWN_LINUX_GNU_LINKER=/riscv/bin/riscv32-unknown-linux-gnu-gcc \
+    CARGO_TARGET_RISCV32GC_UNKNOWN_LINUX_GNU_RUNNER="qemu-riscv32 -cpu max -L /riscv/sysroot" \
+    OBJDUMP=llvm-objdump
diff --git a/library/stdarch/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..7ee69e46e2e
--- /dev/null
+++ b/library/stdarch/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,10 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        gcc libc6-dev qemu-user ca-certificates \
+        gcc-riscv64-linux-gnu libc6-dev-riscv64-cross \
+        llvm
+
+ENV CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER=riscv64-linux-gnu-gcc \
+    CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_RUNNER="qemu-riscv64 -cpu max -L /usr/riscv64-linux-gnu" \
+    OBJDUMP=llvm-objdump
diff --git a/library/stdarch/ci/docker/s390x-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/s390x-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..af02ebcbd16
--- /dev/null
+++ b/library/stdarch/ci/docker/s390x-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,14 @@
+FROM ubuntu:25.04
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        curl ca-certificates \
+        gcc libc6-dev \
+        gcc-s390x-linux-gnu libc6-dev-s390x-cross \
+        qemu-user \
+        make \
+        clang \
+        file
+
+ENV CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_LINKER=s390x-linux-gnu-gcc \
+    CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER="qemu-s390x -cpu max -L /usr/s390x-linux-gnu" \
+    OBJDUMP=s390x-linux-gnu-objdump
diff --git a/library/stdarch/ci/docker/wasm32-wasip1/Dockerfile b/library/stdarch/ci/docker/wasm32-wasip1/Dockerfile
new file mode 100644
index 00000000000..eeafde79733
--- /dev/null
+++ b/library/stdarch/ci/docker/wasm32-wasip1/Dockerfile
@@ -0,0 +1,13 @@
+FROM ubuntu:25.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update -y && apt-get install -y --no-install-recommends \
+  ca-certificates \
+  curl \
+  xz-utils \
+  clang
+
+RUN curl -L https://github.com/bytecodealliance/wasmtime/releases/download/v18.0.2/wasmtime-v18.0.2-x86_64-linux.tar.xz | tar xJf -
+ENV PATH=$PATH:/wasmtime-v18.0.2-x86_64-linux
+
+ENV CARGO_TARGET_WASM32_WASIP1_RUNNER="wasmtime --dir /checkout/target/wasm32-wasip1/release/deps::."
diff --git a/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
new file mode 100644
index 00000000000..acde432794e
--- /dev/null
+++ b/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
@@ -0,0 +1,18 @@
+FROM ubuntu:25.04
+RUN apt-get update && apt-get install -y --no-install-recommends \
+  gcc \
+  libc6-dev \
+  file \
+  make \
+  ca-certificates \
+  wget \
+  xz-utils
+
+RUN wget http://ci-mirrors.rust-lang.org/stdarch/sde-external-9.53.0-2025-03-16-lin.tar.xz -O sde.tar.xz
+RUN mkdir intel-sde
+RUN tar -xJf sde.tar.xz --strip-components=1 -C intel-sde
+ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER="/intel-sde/sde64 \
+            -cpuid-in /checkout/ci/docker/x86_64-unknown-linux-gnu/cpuid.def \
+            -rtm-mode full -tsx --"
+# These tests fail with SDE as it doesn't support saving register data
+ENV STDARCH_TEST_SKIP_FUNCTION="xsave,xsaveopt,xsave64,xsaveopt64"
diff --git a/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/cpuid.def b/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/cpuid.def
new file mode 100644
index 00000000000..4cce9d7a3c0
--- /dev/null
+++ b/library/stdarch/ci/docker/x86_64-unknown-linux-gnu/cpuid.def
@@ -0,0 +1,71 @@
+# Copyright (C) 2024-2024 Intel Corporation.
+#
+# This software and the related documents are Intel copyrighted materials, and your
+# use of them is governed by the express license under which they were provided to
+# you ("License"). Unless the License provides otherwise, you may not use, modify,
+# copy, publish, distribute, disclose or transmit this software or the related
+# documents without Intel's prior written permission.
+#
+# This software and the related documents are provided as is, with no express or
+# implied warranties, other than those that are expressly stated in the License.
+#
+# The CPUID information in this file is for software enabling purposes only and
+# it is not a full and accurate representation of the CPU under development which
+# it represents.
+# The CPUID information in this file is not a guarantee of the availability of
+# features or characteristics in the final released CPU.
+#
+# CPUID_VERSION = 1.0
+#      Input      =>               Output
+# EAX      ECX    =>   EAX      EBX      ECX      EDX
+00000000 ******** => 00000024 68747541 444d4163 69746e65
+00000001 ******** => 000d06f0 00100800 7ffaf3ff bfebfbff
+00000002 ******** => 76035a01 00f0b6ff 00000000 00c10000
+00000003 ******** => 00000000 00000000 00000000 00000000
+00000004 00000000 => 7c004121 02c0003f 0000003f 00000000 #Deterministic Cache
+00000004 00000001 => 7c004122 01c0003f 0000003f 00000000
+00000004 00000002 => 7c004143 03c0003f 000007ff 00000000
+00000004 00000003 => 7c0fc163 04c0003f 0005ffff 00000004
+00000004 00000004 => 00000000 00000000 00000000 00000000
+00000005 ******** => 00000040 00000040 00000003 00042120 #MONITOR/MWAIT
+00000006 ******** => 00000077 00000002 00000001 00000000 #Thermal and Power
+00000007 00000000 => 00000001 f3bfbfbf bbc05ffe 03d55130 #Extended Features
+00000007 00000001 => 88ee00bf 00000002 00000000 1d29cd3e
+00000008 ******** => 00000000 00000000 00000000 00000000
+00000009 ******** => 00000000 00000000 00000000 00000000 #Direct Cache
+0000000a ******** => 07300403 00000000 00000000 00000603
+0000000b 00000000 => 00000001 00000002 00000100 0000001e #Extended Topology
+0000000b 00000001 => 00000004 00000002 00000201 0000001e
+0000000c ******** => 00000000 00000000 00000000 00000000
+0000000d 00000000 => 000e02e7 00002b00 00002b00 00000000 #xcr0
+0000000d 00000001 => 0000001f 00000240 00000100 00000000
+0000000d 00000002 => 00000100 00000240 00000000 00000000
+0000000d 00000005 => 00000040 00000440 00000000 00000000 #zmasks
+0000000d 00000006 => 00000200 00000480 00000000 00000000 #zmmh
+0000000d 00000007 => 00000400 00000680 00000000 00000000 #zmm
+0000000d 00000011 => 00000040 00000ac0 00000002 00000000 #tileconfig
+0000000d 00000012 => 00002000 00000b00 00000006 00000000 #tiles
+0000000d 00000013 => 00000080 000003c0 00000000 00000000 #APX
+00000014 00000000 => 00000000 00000010 00000000 00000000 #ptwrite
+00000019 ******** => 00000000 00000005 00000000 00000000 #Key Locker
+0000001d 00000000 => 00000001 00000000 00000000 00000000 #AMX Tile
+0000001d 00000001 => 04002000 00080040 00000010 00000000 #AMX Palette1
+0000001e 00000000 => 00000001 00004010 00000000 00000000 #AMX Tmul
+0000001e 00000001 => 000001ff 00000000 00000000 00000000
+0000001f 00000000 => 00000001 00000002 00000100 0000001e
+0000001f 00000001 => 00000007 00000070 00000201 0000001e
+0000001f 00000002 => 00000000 00000000 00000002 0000001e
+00000024 00000000 => 00000000 00070002 00000000 00000000 #AVX10
+80000000 ******** => 80000008 00000000 00000000 00000000
+80000001 ******** => 00000000 00000000 00200961 2c100000
+80000002 ******** => 00000000 00000000 00000000 00000000
+80000003 ******** => 00000000 00000000 00000000 00000000
+80000004 ******** => 00000000 00000000 00000000 00000000
+80000005 ******** => 00000000 00000000 00000000 00000000
+80000006 ******** => 00000000 00000000 01006040 00000000
+80000007 ******** => 00000000 00000000 00000000 00000100
+80000008 ******** => 00003028 00000200 00000200 00000000
+
+# This file was copied from intel-sde/misc/cpuid/dmr/cpuid.def, and modified to
+# use "AuthenticAMD" as the vendor and the support for `XOP`, `SSE4a`, `TBM`,
+# `AVX512_VP2INTERSECT` and the VEX variants of AVX512 was added in the CPUID.
diff --git a/library/stdarch/ci/dox.sh b/library/stdarch/ci/dox.sh
new file mode 100755
index 00000000000..910265fad84
--- /dev/null
+++ b/library/stdarch/ci/dox.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+
+# Builds documentation for all target triples that we have a registered URL for
+# in liblibc. This scrapes the list of triples to document from `src/lib.rs`
+# which has a bunch of `html_root_url` directives we pick up.
+
+set -ex
+
+export RUSTDOCFLAGS="-D warnings"
+
+dox() {
+  if [ "$CI" != "" ]; then
+    rustup target add "${1}" || true
+  fi
+
+  cargo clean --target "${1}"
+
+  cargo build --verbose --target "${1}" --manifest-path crates/core_arch/Cargo.toml
+  cargo build --verbose --target "${1}" --manifest-path crates/std_detect/Cargo.toml
+
+  cargo doc --verbose --target "${1}" --manifest-path crates/core_arch/Cargo.toml
+  cargo doc --verbose --target "${1}" --manifest-path crates/std_detect/Cargo.toml
+}
+
+if [ -z "$1" ]; then
+  dox i686-unknown-linux-gnu
+  dox x86_64-unknown-linux-gnu
+  dox armv7-unknown-linux-gnueabihf
+  dox aarch64-unknown-linux-gnu
+  dox powerpc-unknown-linux-gnu
+  dox powerpc64le-unknown-linux-gnu
+  dox loongarch64-unknown-linux-gnu
+  # MIPS targets disabled since they are dropped to tier 3.
+  # See https://github.com/rust-lang/compiler-team/issues/648
+  #dox mips-unknown-linux-gnu
+  #dox mips64-unknown-linux-gnuabi64
+  dox wasm32-unknown-unknown
+  dox nvptx64-nvidia-cuda
+else
+  dox "${1}"
+fi
diff --git a/library/stdarch/ci/run-docker.sh b/library/stdarch/ci/run-docker.sh
new file mode 100755
index 00000000000..657353004dc
--- /dev/null
+++ b/library/stdarch/ci/run-docker.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env sh
+
+# Small script to run tests for a target (or all targets) inside all the
+# respective docker images.
+
+set -ex
+
+if [ $# -lt 1 ]; then
+    >&2 echo "Usage: $0 <TARGET>"
+    exit 1
+fi
+
+run() {
+    # Set the linker that is used for the host (e.g. when compiling a build.rs)
+    # This overrides any configuration in e.g. `.cargo/config.toml`, which will
+    # probably not work within the docker container.
+    HOST_LINKER="CARGO_TARGET_$(rustc --print host-tuple | tr '[:lower:]-' '[:upper:]_')_LINKER"
+
+    # Prevent `Read-only file system (os error 30)`.
+    cargo generate-lockfile
+
+    echo "Building docker container for TARGET=${1}"
+    docker build -t stdarch -f "ci/docker/${1}/Dockerfile" ci/
+    mkdir -p target c_programs rust_programs
+    echo "Running docker"
+    # shellcheck disable=SC2016
+    docker run \
+      --rm \
+      --user "$(id -u)":"$(id -g)" \
+      --env CARGO_HOME=/cargo \
+      --env CARGO_TARGET_DIR=/checkout/target \
+      --env TARGET="${1}" \
+      --env "${HOST_LINKER}"="cc" \
+      --env STDARCH_TEST_EVERYTHING \
+      --env STDARCH_DISABLE_ASSERT_INSTR \
+      --env NOSTD \
+      --env NORUN \
+      --env RUSTFLAGS \
+      --env CARGO_UNSTABLE_BUILD_STD \
+      --env RUST_STD_DETECT_UNSTABLE \
+      --volume "${HOME}/.cargo":/cargo \
+      --volume "$(rustc --print sysroot)":/rust:ro \
+      --volume "$(pwd)":/checkout:ro \
+      --volume "$(pwd)"/target:/checkout/target \
+      --volume "$(pwd)"/c_programs:/checkout/c_programs \
+      --volume "$(pwd)"/rust_programs:/checkout/rust_programs \
+      --init \
+      --workdir /checkout \
+      --privileged \
+      stdarch \
+      sh -c "HOME=/tmp PATH=\$PATH:/rust/bin exec ci/run.sh ${1}"
+}
+
+if [ -z "$1" ]; then
+  for d in ci/docker/*; do
+    run "${d}"
+  done
+else
+  run "${1}"
+fi
diff --git a/library/stdarch/ci/run.sh b/library/stdarch/ci/run.sh
new file mode 100755
index 00000000000..8eadb9285c9
--- /dev/null
+++ b/library/stdarch/ci/run.sh
@@ -0,0 +1,203 @@
+#!/usr/bin/env sh
+
+set -ex
+
+: "${TARGET?The TARGET environment variable must be set.}"
+
+# Tests are all super fast anyway, and they fault often enough on travis that
+# having only one thread increases debuggability to be worth it.
+#export RUST_BACKTRACE=full
+#export RUST_TEST_NOCAPTURE=1
+#export RUST_TEST_THREADS=1
+
+export RUSTFLAGS="${RUSTFLAGS} -D warnings -Z merge-functions=disabled -Z verify-llvm-ir"
+export HOST_RUSTFLAGS="${RUSTFLAGS}"
+export PROFILE="${PROFILE:="--profile=release"}"
+
+case ${TARGET} in
+    # On Windows the linker performs identical COMDAT folding (ICF) by default
+    # in release mode which removes identical COMDAT sections. This interferes
+    # with our instruction assertions just like LLVM's MergeFunctions pass so
+    # we disable it.
+    *-pc-windows-msvc)
+        export RUSTFLAGS="${RUSTFLAGS} -Clink-args=/OPT:NOICF"
+        ;;
+    # On 32-bit use a static relocation model which avoids some extra
+    # instructions when dealing with static data, notably allowing some
+    # instruction assertion checks to pass below the 20 instruction limit. If
+    # this is the default, dynamic, then too many instructions are generated
+    # when we assert the instruction for a function and it causes tests to fail.
+    i686-* | i586-*)
+        export RUSTFLAGS="${RUSTFLAGS} -C relocation-model=static"
+        ;;
+    # Some x86_64 targets enable by default more features beyond SSE2,
+    # which cause some instruction assertion checks to fail.
+    x86_64-*)
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=-sse3"
+        ;;
+    #Unoptimized build uses fast-isel which breaks with msa
+    mips-* | mipsel-*)
+	export RUSTFLAGS="${RUSTFLAGS} -C llvm-args=-fast-isel=false"
+	;;
+    armv7-*eabihf | thumbv7-*eabihf)
+        export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon"
+        ;;
+    # Some of our test dependencies use the deprecated `gcc` crates which
+    # doesn't detect RISC-V compilers automatically, so do it manually here.
+    riscv*)
+        export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+zk,+zks,+zbb,+zbc"
+        ;;
+esac
+
+echo "RUSTFLAGS=${RUSTFLAGS}"
+echo "OBJDUMP=${OBJDUMP}"
+echo "STDARCH_DISABLE_ASSERT_INSTR=${STDARCH_DISABLE_ASSERT_INSTR}"
+echo "STDARCH_TEST_EVERYTHING=${STDARCH_TEST_EVERYTHING}"
+echo "STDARCH_TEST_SKIP_FEATURE=${STDARCH_TEST_SKIP_FEATURE}"
+echo "STDARCH_TEST_SKIP_FUNCTION=${STDARCH_TEST_SKIP_FUNCTION}"
+echo "PROFILE=${PROFILE}"
+
+cargo_test() {
+    cmd="cargo"
+    subcmd="test"
+    if [ "$NORUN" = "1" ]; then
+        export subcmd="build"
+    fi
+    cmd="$cmd ${subcmd} --target=$TARGET $1"
+    cmd="$cmd -- $2"
+
+    case ${TARGET} in
+        # wasm targets can't catch panics so if a test failures make sure the test
+        # harness isn't trying to capture output, otherwise we won't get any useful
+        # output.
+        wasm32*)
+            cmd="$cmd --nocapture"
+            ;;
+    esac
+    $cmd
+}
+
+CORE_ARCH="--manifest-path=crates/core_arch/Cargo.toml"
+STD_DETECT="--manifest-path=crates/std_detect/Cargo.toml"
+STDARCH_EXAMPLES="--manifest-path=examples/Cargo.toml"
+INTRINSIC_TEST="--manifest-path=crates/intrinsic-test/Cargo.toml"
+
+cargo_test "${CORE_ARCH} ${PROFILE}"
+
+if [ "$NOSTD" != "1" ]; then
+    cargo_test "${STD_DETECT} ${PROFILE}"
+
+    cargo_test "${STD_DETECT} --no-default-features"
+    cargo_test "${STD_DETECT} --no-default-features --features=std_detect_file_io"
+    cargo_test "${STD_DETECT} --no-default-features --features=std_detect_dlsym_getauxval"
+    cargo_test "${STD_DETECT} --no-default-features --features=std_detect_dlsym_getauxval,std_detect_file_io"
+
+    cargo_test "${STDARCH_EXAMPLES} ${PROFILE}"
+fi
+
+
+# Test targets compiled with extra features.
+case ${TARGET} in
+    x86_64-unknown-linux-gnu)
+        export STDARCH_DISABLE_ASSERT_INSTR=1
+
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+avx"
+        cargo_test "${PROFILE}"
+
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+avx512f"
+        cargo_test "${PROFILE}"
+        ;;
+    x86_64* | i686*)
+        export STDARCH_DISABLE_ASSERT_INSTR=1
+
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+avx"
+        cargo_test "${PROFILE}"
+        ;;
+    # FIXME: don't build anymore
+    #mips-*gnu* | mipsel-*gnu*)
+    #    export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+msa,+fp64,+mips32r5"
+    #    cargo_test "${PROFILE}"
+	  #    ;;
+    mips64*)
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+msa"
+        cargo_test "${PROFILE}"
+	      ;;
+    s390x*)
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+vector-enhancements-1"
+        cargo_test "${PROFILE}"
+	      ;;
+    powerpc64*)
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+altivec"
+        cargo_test "${PROFILE}"
+
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+vsx"
+        cargo_test "${PROFILE}"
+        ;;
+    powerpc*)
+        # qemu has a bug in PPC32 which leads to a crash when compiled with `vsx`
+        export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+altivec"
+        cargo_test "${PROFILE}"
+        ;;
+
+    # Setup aarch64 & armv7 specific variables, the runner, along with some 
+    # tests to skip
+    aarch64-unknown-linux-gnu*)
+        TEST_CPPFLAGS="-fuse-ld=lld -I/usr/aarch64-linux-gnu/include/ -I/usr/aarch64-linux-gnu/include/c++/9/aarch64-linux-gnu/"
+        TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_aarch64.txt
+        TEST_CXX_COMPILER="clang++-19"
+        TEST_RUNNER="${CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER}"
+        ;;
+
+    aarch64_be-unknown-linux-gnu*)
+        TEST_CPPFLAGS="-fuse-ld=lld"
+        TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_aarch64.txt
+        TEST_CXX_COMPILER="clang++-19"
+        TEST_RUNNER="${CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_RUNNER}"
+        ;;
+
+    armv7-unknown-linux-gnueabihf*)
+        TEST_CPPFLAGS="-fuse-ld=lld -I/usr/arm-linux-gnueabihf/include/ -I/usr/arm-linux-gnueabihf/include/c++/9/arm-linux-gnueabihf/"
+        TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_arm.txt
+        TEST_CXX_COMPILER="clang++-19"
+        TEST_RUNNER="${CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER}"
+        ;;
+    *)
+        ;;
+
+esac
+
+# Arm specific
+case "${TARGET}" in
+    aarch64-unknown-linux-gnu*|armv7-unknown-linux-gnueabihf*)
+        CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=warn \
+            cargo run "${INTRINSIC_TEST}" "${PROFILE}" \
+            --bin intrinsic-test -- intrinsics_data/arm_intrinsics.json \
+            --runner "${TEST_RUNNER}" \
+            --cppcompiler "${TEST_CXX_COMPILER}" \
+            --skip "${TEST_SKIP_INTRINSICS}" \
+            --target "${TARGET}"
+        ;;
+
+    aarch64_be-unknown-linux-gnu*)
+        CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=warn \
+            cargo run "${INTRINSIC_TEST}" "${PROFILE}"  \
+            --bin intrinsic-test -- intrinsics_data/arm_intrinsics.json \
+            --runner "${TEST_RUNNER}" \
+            --cppcompiler "${TEST_CXX_COMPILER}" \
+            --skip "${TEST_SKIP_INTRINSICS}" \
+            --target "${TARGET}" \
+            --linker "${CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_LINKER}" \
+            --cxx-toolchain-dir "${AARCH64_BE_TOOLCHAIN}"
+        ;;
+     *)
+        ;;
+esac
+
+if [ "$NORUN" != "1" ] && [ "$NOSTD" != 1 ]; then
+    # Test examples
+    (
+        cd examples
+        cargo test --target "$TARGET" "${PROFILE}"
+        echo test | cargo run --target "$TARGET" "${PROFILE}" hex
+    )
+fi
diff --git a/library/stdarch/ci/style.sh b/library/stdarch/ci/style.sh
new file mode 100755
index 00000000000..8f81883f3f6
--- /dev/null
+++ b/library/stdarch/ci/style.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env sh
+
+set -ex
+
+if rustup component add rustfmt-preview ; then
+    command -v rustfmt
+    rustfmt -V
+    cargo fmt --all -- --check
+fi
+
+# if rustup component add clippy-preview ; then
+#     cargo clippy -V
+#     cargo clippy --all -- -D clippy::pedantic
+# fi
+
+if shellcheck --version ; then
+    shellcheck -e SC2103 ci/*.sh
+else
+    echo "shellcheck not found"
+    exit 1
+fi
+