Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
078bc37
Fix another case of Miri unsoundness (#11056)
alexcrichton Jun 17, 2025
4fd9de3
Use `VmPtr` for table elements (#11057)
alexcrichton Jun 17, 2025
8f13a27
winch(x64): Fix lowering of unsigned truncate (#11063)
saulecabrera Jun 17, 2025
c5fd5bb
Fix Cranelift-native fuzzers (#11062)
alexcrichton Jun 17, 2025
ef7a296
wasi-nn: update OpenVINO to v2025.1 (#11054)
abrown Jun 17, 2025
69c01c5
c-api: component-model: Resource table, WASI (#11055)
MangoPeachGrape Jun 18, 2025
5a6b4e9
Add vets for wasi-tls native-tls provider (#11066)
alexcrichton Jun 18, 2025
935097c
Switch some `Error` references to `core::error::Error` (#11067)
alexcrichton Jun 18, 2025
8963e02
pulley: Don't record explicit traps for frames (#11069)
alexcrichton Jun 18, 2025
8801023
Initial component model and GC support in fused adapters (#11020)
fitzgen Jun 18, 2025
ab44e32
fix: do not collect backtrace on each `gc_runtime` access (#11068)
rvolosatovs Jun 18, 2025
cfe17cb
Cranelift: Generate integer numeric ops and conversions for ISLE in t…
fitzgen Jun 19, 2025
90e703f
Add pabs variants to the new assembler (#11073)
jlb6740 Jun 19, 2025
f101b98
x64: Migrate cmp/test to the new assembler (#11072)
alexcrichton Jun 19, 2025
5b01f1b
Re-enable removed testing onnx from CI (#11071)
TrumsZ Jun 19, 2025
57dab9d
fuzzing: Temporarily disable `wide_arithmetic` in Wasmi (#11079)
saulecabrera Jun 19, 2025
329ae91
Update DWARF tests to Ubuntu 24.04 (#11077)
philipc Jun 19, 2025
e1aac8e
fixed broken link (#11078)
ifsheldon Jun 19, 2025
8eebe43
Add pack convert (*packss*, *packus*) instructions to new assembler (…
jlb6740 Jun 20, 2025
e813a92
x64: Optimize codegen of shift/rotate-by-1 (#11083)
alexcrichton Jun 20, 2025
18b42ef
Improve debug formatting for primary/secondary map (#11081)
simvux Jun 20, 2025
a7d9f3e
Avoid running wasm-opt when compiling test programs (#11075)
philipc Jun 20, 2025
ba63585
cargo vet: pulley-macros is audited as crates io (#11089)
pchickey Jun 20, 2025
a5a15bd
x64: convert unary VEX instructions (#11088)
abrown Jun 20, 2025
9decbc4
Propagate the `component-model-gc` feature from the fuzz config to `w…
fitzgen Jun 20, 2025
7dba8ef
Rename `Lift` and `Lower` trait methods (#11070)
fitzgen Jun 20, 2025
e2b4f8d
Make auto-publish script more robust (#11090)
alexcrichton Jun 20, 2025
4ff54e0
x64: Migrate `lea` to the new assembler (#11084)
alexcrichton Jun 20, 2025
903ec89
Adds palignr and vpalignr to the new assembler (#11082)
jlb6740 Jun 20, 2025
0de0089
x64: convert `vpextr*` instructions (#11094)
abrown Jun 21, 2025
79cf7e8
x64: Migrate `cmov*` to the new assembler (#11095)
alexcrichton Jun 21, 2025
2614e88
wasi-nn: add feature to use custom ONNX Runtime (#11060)
yanwucai Jun 23, 2025
8e650aa
Merge remote-tracking branch 'origin/main' into wasip3-main
dicej Jun 23, 2025
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
10 changes: 5 additions & 5 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -778,7 +778,7 @@ jobs:
test_wasi_nn:
strategy:
matrix:
feature: ["openvino"]
feature: ["openvino", "onnx-download"]
os: ["ubuntu-24.04", "windows-2025"]
include:
- os: windows-2025
Expand All @@ -794,7 +794,7 @@ jobs:
- uses: ./.github/actions/install-rust

# Install OpenVINO
- uses: abrown/install-openvino-action@v9
- uses: abrown/install-openvino-action@v10
if: runner.arch == 'X64'

# Install WinML for testing wasi-nn WinML backend. WinML is only available
Expand Down Expand Up @@ -835,7 +835,7 @@ jobs:
needs: determine
if: needs.determine.outputs.run-dwarf
name: Test DWARF debugging
runs-on: ubuntu-22.04 # FIXME: fails on `ubuntu-24.04` right now
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -848,14 +848,14 @@ jobs:
tar -xzf wasi-sdk-25.0-x86_64-linux.tar.gz
mv wasi-sdk-25.0-x86_64-linux wasi-sdk
- run: |
sudo apt-get update && sudo apt-get install -y gdb lldb-15 llvm
sudo apt-get update && sudo apt-get install -y gdb lldb-18 llvm
# workaround for https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1972855
sudo mkdir -p /usr/lib/local/lib/python3.10/dist-packages/lldb
sudo ln -s /usr/lib/llvm-15/lib/python3.10/dist-packages/lldb/* /usr/lib/python3/dist-packages/lldb/
# Only testing release since it is more likely to expose issues with our low-level symbol handling.
cargo test --release --test all -- --ignored --test-threads 1 debug::
env:
LLDB: lldb-15 # override default version, 14
LLDB: lldb-18
WASI_SDK_PATH: /tmp/wasi-sdk

build-preview1-component-adapter:
Expand Down
13 changes: 6 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions cranelift/assembler-x64/meta/src/dsl/features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,10 @@ impl Features {
}

pub(crate) fn is_sse(&self) -> bool {
self.0.iter().any(|f| {
matches!(
f,
Feature::sse | Feature::sse2 | Feature::ssse3 | Feature::sse41
)
})
use Feature::*;
self.0
.iter()
.any(|f| matches!(f, sse | sse2 | sse3 | ssse3 | sse41 | sse42))
}
}

Expand Down Expand Up @@ -86,6 +84,7 @@ pub enum Feature {
lzcnt,
popcnt,
avx,
avx2,
cmpxchg16b,
}

Expand All @@ -110,6 +109,7 @@ pub const ALL_FEATURES: &[Feature] = &[
Feature::lzcnt,
Feature::popcnt,
Feature::avx,
Feature::avx2,
Feature::cmpxchg16b,
];

Expand Down
28 changes: 25 additions & 3 deletions cranelift/assembler-x64/meta/src/dsl/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ pub enum Location {
xmm1,
xmm2,
xmm3,
xmm_m8,
xmm_m16,
xmm_m32,
xmm_m64,
Expand All @@ -352,7 +353,7 @@ impl Location {
pub fn bits(&self) -> u16 {
use Location::*;
match self {
al | cl | imm8 | r8 | rm8 | m8 => 8,
al | cl | imm8 | r8 | rm8 | m8 | xmm_m8 => 8,
ax | dx | imm16 | r16 | rm16 | m16 | xmm_m16 => 16,
eax | edx | imm32 | r32 | r32a | r32b | rm32 | m32 | xmm_m32 => 32,
rax | rbx | rcx | rdx | imm64 | r64 | r64a | r64b | rm64 | m64 | xmm_m64 => 64,
Expand Down Expand Up @@ -399,7 +400,7 @@ impl Location {
r8 | r16 | r32 | r32a | r32b | r64 | r64a | r64b | xmm1 | xmm2 | xmm3 => {
OperandKind::Reg(*self)
}
rm8 | rm16 | rm32 | rm64 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 => {
rm8 | rm16 | rm32 | rm64 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 => {
OperandKind::RegMem(*self)
}
m8 | m16 | m32 | m64 | m128 => OperandKind::Mem(*self),
Expand All @@ -417,7 +418,7 @@ impl Location {
imm8 | imm16 | imm32 | imm64 | m8 | m16 | m32 | m64 | m128 => None,
al | ax | eax | rax | rbx | cl | rcx | dx | edx | rdx | r8 | r16 | r32 | r32a
| r32b | r64 | r64a | r64b | rm8 | rm16 | rm32 | rm64 => Some(RegClass::Gpr),
xmm1 | xmm2 | xmm3 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | xmm0 => {
xmm1 | xmm2 | xmm3 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | xmm0 => {
Some(RegClass::Xmm)
}
}
Expand Down Expand Up @@ -461,6 +462,7 @@ impl core::fmt::Display for Location {
xmm1 => write!(f, "xmm1"),
xmm2 => write!(f, "xmm2"),
xmm3 => write!(f, "xmm3"),
xmm_m8 => write!(f, "xmm_m8"),
xmm_m16 => write!(f, "xmm_m16"),
xmm_m32 => write!(f, "xmm_m32"),
xmm_m64 => write!(f, "xmm_m64"),
Expand Down Expand Up @@ -598,6 +600,26 @@ pub enum Eflags {
RW,
}

impl Eflags {
/// Returns whether this represents a read of any bit in the EFLAGS
/// register.
pub fn is_read(&self) -> bool {
match self {
Eflags::None | Eflags::W => false,
Eflags::R | Eflags::RW => true,
}
}

/// Returns whether this represents a writes to any bit in the EFLAGS
/// register.
pub fn is_write(&self) -> bool {
match self {
Eflags::None | Eflags::R => false,
Eflags::W | Eflags::RW => true,
}
}
}

impl Default for Eflags {
fn default() -> Self {
Self::None
Expand Down
20 changes: 14 additions & 6 deletions cranelift/assembler-x64/meta/src/generate/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,26 +274,34 @@ impl dsl::Format {
assert!(!vex.is4);
let reg = reg_or_vvvv;
fmtln!(f, "let reg = self.{reg}.enc();");
fmtln!(f, "let vvvv = {};", "0b0");
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
fmtln!(f, "let vex = VexPrefix::two_op(reg, rm, {bits});");
ModRmStyle::RegMem {
reg: ModRmReg::Reg(*reg),
rm: *rm,
}
}
},
[Reg(reg), Reg(rm)] => {
[Reg(reg), Reg(rm)] | [Reg(reg), Reg(rm), Imm(_)] => {
assert!(!vex.is4);
fmtln!(f, "let reg = self.{reg}.enc();");
fmtln!(f, "let vvvv = 0;");
fmtln!(f, "let rm = (Some(self.{rm}.enc()), None);");
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
fmtln!(f, "let vex = VexPrefix::two_op(reg, rm, {bits});");
ModRmStyle::Reg {
reg: ModRmReg::Reg(*reg),
rm: *rm,
}
}
[Reg(reg), Mem(rm)] | [Mem(rm), Reg(reg)] | [RegMem(rm), Reg(reg), Imm(_)] => {
assert!(!vex.is4);
fmtln!(f, "let reg = self.{reg}.enc();");
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
fmtln!(f, "let vex = VexPrefix::two_op(reg, rm, {bits});");
ModRmStyle::RegMem {
reg: ModRmReg::Reg(*reg),
rm: *rm,
}
}
unknown => unimplemented!("unknown pattern: {unknown:?}"),
};

Expand Down
8 changes: 4 additions & 4 deletions cranelift/assembler-x64/meta/src/generate/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ impl dsl::Operand {
xmm1 | xmm2 | xmm3 => {
format!("Xmm<R::{mut_}Xmm>")
}
xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 => {
xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 => {
format!("XmmMem<R::{mut_}Xmm, R::ReadGpr>")
}
m8 | m16 | m32 | m64 | m128 => format!("Amode<R::ReadGpr>"),
Expand Down Expand Up @@ -64,8 +64,8 @@ impl dsl::Location {
None => format!("self.{self}.to_string(None)"),
}
}
xmm_m16 | xmm_m32 | xmm_m64 | xmm1 | xmm2 | xmm3 | xmm_m128 | m8 | m16 | m32 | m64
| m128 => {
xmm1 | xmm2 | xmm3 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | m8 | m16
| m32 | m64 | m128 => {
format!("self.{self}.to_string()")
}
}
Expand All @@ -84,7 +84,7 @@ impl dsl::Location {
m8 | m16 | m32 | m64 | m128 => {
panic!("no need to generate a size for memory-only access")
}
xmm1 | xmm2 | xmm3 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | xmm0 => None,
xmm1 | xmm2 | xmm3 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | xmm0 => None,
}
}
}
Expand Down
55 changes: 52 additions & 3 deletions cranelift/assembler-x64/meta/src/instructions.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
//! Defines x64 instructions using the DSL.

mod abs;
mod add;
mod align;
mod and;
mod atomic;
mod avg;
mod bitmanip;
mod cmov;
mod cmp;
mod cvt;
mod div;
Expand All @@ -17,6 +20,7 @@ mod mul;
mod neg;
mod nop;
mod or;
mod pack;
mod round;
mod shift;
mod sqrt;
Expand All @@ -31,11 +35,14 @@ use std::collections::HashMap;
#[must_use]
pub fn list() -> Vec<Inst> {
let mut all = vec![];
all.extend(abs::list());
all.extend(add::list());
all.extend(align::list());
all.extend(and::list());
all.extend(atomic::list());
all.extend(avg::list());
all.extend(bitmanip::list());
all.extend(cmov::list());
all.extend(cmp::list());
all.extend(cvt::list());
all.extend(div::list());
Expand All @@ -48,6 +55,7 @@ pub fn list() -> Vec<Inst> {
all.extend(neg::list());
all.extend(nop::list());
all.extend(or::list());
all.extend(pack::list());
all.extend(round::list());
all.extend(shift::list());
all.extend(sqrt::list());
Expand All @@ -74,7 +82,10 @@ fn check_avx_alternates(all: &mut [Inst]) {
.map(|(index, inst)| (inst.name().clone(), index))
.collect();
for inst in all.iter().filter(|inst| inst.alternate.is_some()) {
assert!(inst.features.is_sse());
assert!(
inst.features.is_sse(),
"expected an SSE instruction: {inst}"
);
let alternate = inst.alternate.as_ref().unwrap();
assert_eq!(alternate.feature, Feature::avx);
let avx_index = name_to_index.get(&alternate.name).expect(&format!(
Expand Down Expand Up @@ -116,16 +127,54 @@ fn check_sse_matches_avx(sse_inst: &Inst, avx_inst: &Inst) {
// may have slightly different operand semantics (e.g., `roundss` ->
// `vroundss`) and we want to be careful about matching too freely.
(
[(ReadWrite, Reg(_)), (Read, Reg(_) | RegMem(_) | Mem(_))],
[
(ReadWrite | Write, Reg(_)),
(Read, Reg(_) | RegMem(_) | Mem(_)),
],
[
(Write, Reg(_)),
(Read, Reg(_)),
(Read, Reg(_) | RegMem(_) | Mem(_)),
],
) => {}
(
[
(Write, Reg(_) | RegMem(_) | Mem(_)),
(Read, Reg(_) | RegMem(_) | Mem(_)),
],
[
(Write, Reg(_) | RegMem(_) | Mem(_)),
(Read, Reg(_) | RegMem(_) | Mem(_)),
],
) => {}
(
[
(Write, Reg(_) | RegMem(_)),
(Read, Reg(_) | RegMem(_)),
(Read, Imm(_)),
],
[
(Write, Reg(_) | RegMem(_)),
(Read, Reg(_) | RegMem(_)),
(Read, Imm(_)),
],
) => {}
(
[(ReadWrite, Reg(_)), (Read, RegMem(_)), (Read, Imm(_))],
[
(Write, Reg(_)),
(Read, Reg(_)),
(Read, RegMem(_)),
(Read, Imm(_)),
],
) => {}
// We panic on other formats for now; feel free to add more patterns to
// avoid this.
_ => panic!("unmatched formats for SSE-to-AVX alternate:\n{sse_inst}\n{avx_inst}"),
_ => panic!(
"unmatched formats for SSE-to-AVX alternate:\n{sse_inst}\n{avx_inst}. {:?}, {:?}",
list_ops(sse_inst),
list_ops(avx_inst)
),
}
}

Expand Down
14 changes: 14 additions & 0 deletions cranelift/assembler-x64/meta/src/instructions/abs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use crate::dsl::{Feature::*, Inst, Location::*, VexLength::*};
use crate::dsl::{align, fmt, inst, r, rex, vex, w};

#[rustfmt::skip] // Keeps instructions on a single line.
pub fn list() -> Vec<Inst> {
vec![
inst("pabsb", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1C]), _64b | compat | ssse3).alt(avx, "vpabsb_a"),
inst("vpabsb", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1C), _64b | compat | avx),
inst("pabsw", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1D]), _64b | compat | ssse3).alt(avx, "vpabsw_a"),
inst("vpabsw", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1D), _64b | compat | avx),
inst("pabsd", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1E]), _64b | compat | ssse3).alt(avx, "vpabsd_a"),
inst("vpabsd", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1E), _64b | compat | avx),
]
}
10 changes: 10 additions & 0 deletions cranelift/assembler-x64/meta/src/instructions/align.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use crate::dsl::{Feature::*, Inst, Location::*, VexLength::*};
use crate::dsl::{align, fmt, inst, r, rex, rw, vex, w};

#[rustfmt::skip] // Keeps instructions on a single line.
pub fn list() -> Vec<Inst> {
vec![
inst("palignr", fmt("A", [rw(xmm1), r(align(xmm_m128)), r(imm8)]), rex([0x66, 0x0F, 0x3A, 0x0F]).ib(), _64b | compat | ssse3).alt(avx, "vpalignr_b"),
inst("vpalignr", fmt("B", [w(xmm1), r(xmm2), r(xmm_m128), r(imm8)]), vex(L128)._66()._0f3a().ib().op(0x0F), _64b | compat | avx),
]
}
Loading
Loading