Skip to content

Commit 54c2d6a

Browse files
committed
feature: convert all intrinsics::felt to use .rlib stub library
instead of WIT interface
1 parent 81e56a4 commit 54c2d6a

File tree

83 files changed

+5834
-4327
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+5834
-4327
lines changed

frontend/wasm/src/module/linker_stubs.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use wasmparser::{FunctionBody, Operator};
1818
use crate::{
1919
intrinsics::{convert_intrinsics_call, Intrinsic},
2020
miden_abi::{
21-
is_miden_abi_module, miden_abi_function_type,
22-
transform::transform_miden_abi_call,
21+
is_miden_abi_module, miden_abi_function_type, transform::transform_miden_abi_call,
2322
},
2423
module::{
2524
function_builder_ext::{FunctionBuilderContext, FunctionBuilderExt, SSABuilderListener},
@@ -70,6 +69,7 @@ pub fn maybe_lower_linker_stub(
7069
let borrowed = function_ref.borrow();
7170
borrowed.name().as_str().to_string()
7271
};
72+
// Expect stub export names to be fully-qualified MASM paths already (e.g. "intrinsics::felt::add").
7373
let func_ident = match midenc_hir::FunctionIdent::from_str(&name_string) {
7474
Ok(id) => id,
7575
Err(_) => return Ok(false),
@@ -82,19 +82,20 @@ pub fn maybe_lower_linker_stub(
8282
}
8383

8484
// Classify intrinsics and obtain signature when needed
85-
let (import_sig, intrinsic): (Signature, Option<Intrinsic>) = match Intrinsic::try_from(&import_path) {
86-
Ok(intr) => (function_ref.borrow().signature().clone(), Some(intr)),
87-
Err(_) => {
88-
let import_ft: FunctionType = miden_abi_function_type(&import_path);
89-
(
90-
Signature::new(
91-
import_ft.params.into_iter().map(AbiParam::new),
92-
import_ft.results.into_iter().map(AbiParam::new),
93-
),
94-
None,
95-
)
96-
}
97-
};
85+
let (import_sig, intrinsic): (Signature, Option<Intrinsic>) =
86+
match Intrinsic::try_from(&import_path) {
87+
Ok(intr) => (function_ref.borrow().signature().clone(), Some(intr)),
88+
Err(_) => {
89+
let import_ft: FunctionType = miden_abi_function_type(&import_path);
90+
(
91+
Signature::new(
92+
import_ft.params.into_iter().map(AbiParam::new),
93+
import_ft.results.into_iter().map(AbiParam::new),
94+
),
95+
None,
96+
)
97+
}
98+
};
9899

99100
// Build the function body for the stub and replace it with an exec to MASM
100101
let span = function_ref.borrow().name().span;
@@ -117,9 +118,7 @@ pub fn maybe_lower_linker_stub(
117118
// Declare MASM import callee in world and exec via TransformStrategy
118119
let results: Vec<ValueRef> = if let Some(intr) = intrinsic {
119120
// Decide whether the intrinsic is implemented as a function or an operation
120-
let conv = intr
121-
.conversion_result()
122-
.expect("unknown intrinsic");
121+
let conv = intr.conversion_result().expect("unknown intrinsic");
123122
if conv.is_function() {
124123
// Declare callee and call via convert_intrinsics_call with function_ref
125124
let import_module_ref = module_state

sdk/stdlib-sys/src/intrinsics/felt.rs

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,63 @@
11
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
22

3-
#[link(wasm_import_module = "miden:core-intrinsics/[email protected]")]
43
extern "C" {
5-
#[link_name = "from-u64-unchecked"]
4+
#[link_name = "intrinsics::felt::from_u64_unchecked"]
65
fn extern_from_u64_unchecked(value: u64) -> Felt;
76

8-
#[link_name = "from-u32"]
7+
#[link_name = "intrinsics::felt::from_u32"]
98
fn extern_from_u32(value: u32) -> Felt;
109

11-
#[link_name = "as-u64"]
10+
#[link_name = "intrinsics::felt::as_u64"]
1211
fn extern_as_u64(felt: Felt) -> u64;
13-
// add moved to stub; see separate extern block below
1412

15-
#[link_name = "sub"]
13+
#[link_name = "intrinsics::felt::sub"]
1614
fn extern_sub(a: Felt, b: Felt) -> Felt;
1715

18-
#[link_name = "mul"]
16+
#[link_name = "intrinsics::felt::mul"]
1917
fn extern_mul(a: Felt, b: Felt) -> Felt;
2018

21-
#[link_name = "div"]
19+
#[link_name = "intrinsics::felt::div"]
2220
fn extern_div(a: Felt, b: Felt) -> Felt;
2321

24-
#[link_name = "neg"]
22+
#[link_name = "intrinsics::felt::neg"]
2523
fn extern_neg(a: Felt) -> Felt;
2624

27-
#[link_name = "inv"]
25+
#[link_name = "intrinsics::felt::inv"]
2826
fn extern_inv(a: Felt) -> Felt;
2927

30-
#[link_name = "pow2"]
28+
#[link_name = "intrinsics::felt::pow2"]
3129
fn extern_pow2(a: Felt) -> Felt;
3230

33-
#[link_name = "exp"]
31+
#[link_name = "intrinsics::felt::exp"]
3432
fn extern_exp(a: Felt, b: Felt) -> Felt;
3533

36-
#[link_name = "eq"]
34+
#[link_name = "intrinsics::felt::eq"]
3735
fn extern_eq(a: Felt, b: Felt) -> i32;
3836

39-
#[link_name = "gt"]
37+
#[link_name = "intrinsics::felt::gt"]
4038
fn extern_gt(a: Felt, b: Felt) -> i32;
4139

42-
#[link_name = "lt"]
40+
#[link_name = "intrinsics::felt::lt"]
4341
fn extern_lt(a: Felt, b: Felt) -> i32;
4442

45-
#[link_name = "ge"]
43+
#[link_name = "intrinsics::felt::ge"]
4644
fn extern_ge(a: Felt, b: Felt) -> i32;
4745

48-
#[link_name = "le"]
46+
#[link_name = "intrinsics::felt::le"]
4947
fn extern_le(a: Felt, b: Felt) -> i32;
5048

51-
#[link_name = "is-odd"]
49+
#[link_name = "intrinsics::felt::is_odd"]
5250
fn extern_is_odd(a: Felt) -> i32;
5351

54-
#[link_name = "assert"]
52+
#[link_name = "intrinsics::felt::assert"]
5553
fn extern_assert(a: Felt);
5654

57-
#[link_name = "assertz"]
55+
#[link_name = "intrinsics::felt::assertz"]
5856
fn extern_assertz(a: Felt);
5957

60-
#[link_name = "assert-eq"]
58+
#[link_name = "intrinsics::felt::assert_eq"]
6159
fn extern_assert_eq(a: Felt, b: Felt);
62-
}
6360

64-
// Resolve add via linker stub rather than WIT import
65-
extern "C" {
6661
#[link_name = "intrinsics::felt::add"]
6762
fn extern_add(a: Felt, b: Felt) -> Felt;
6863
}

sdk/stdlib-sys/wit/miden-core-intrinsics.wit

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,39 @@ interface intrinsics-mem {
88
heap-base: func() -> s32;
99
}
1010

11-
interface intrinsics-felt {
11+
// interface intrinsics-felt {
1212

1313
// See sdk/stdlib-sys/src/intrinsics/felt.rs for `extern` function signatures
1414

1515
// Conversion operations
16-
from-u64-unchecked: func(a: u64) -> f32;
17-
from-u32: func(a: u32) -> f32;
18-
as-u64: func(a: f32) -> u64;
16+
// from-u64-unchecked: func(a: u64) -> f32;
17+
// from-u32: func(a: u32) -> f32;
18+
// as-u64: func(a: f32) -> u64;
1919

2020
// Arithmetic operations
2121
// add moved to linker stub
2222
// add: func(a: f32, b: f32) -> f32;
23-
sub: func(a: f32, b: f32) -> f32;
24-
mul: func(a: f32, b: f32) -> f32;
25-
div: func(a: f32, b: f32) -> f32;
26-
neg: func(a: f32) -> f32;
27-
inv: func(a: f32) -> f32;
28-
pow2: func(a: f32) -> f32;
29-
exp: func(a: f32, b: f32) -> f32;
23+
// sub: func(a: f32, b: f32) -> f32;
24+
// mul: func(a: f32, b: f32) -> f32;
25+
// div: func(a: f32, b: f32) -> f32;
26+
// neg: func(a: f32) -> f32;
27+
// inv: func(a: f32) -> f32;
28+
// pow2: func(a: f32) -> f32;
29+
// exp: func(a: f32, b: f32) -> f32;
3030

3131
// Comparison operations
32-
eq: func(a: f32, b: f32) -> s32;
33-
gt: func(a: f32, b: f32) -> s32;
34-
lt: func(a: f32, b: f32) -> s32;
35-
ge: func(a: f32, b: f32) -> s32;
36-
le: func(a: f32, b: f32) -> s32;
37-
is-odd: func(a: f32) -> s32;
32+
// eq: func(a: f32, b: f32) -> s32;
33+
// gt: func(a: f32, b: f32) -> s32;
34+
// lt: func(a: f32, b: f32) -> s32;
35+
// ge: func(a: f32, b: f32) -> s32;
36+
// le: func(a: f32, b: f32) -> s32;
37+
// is-odd: func(a: f32) -> s32;
3838

3939
// Assertion operations
40-
assert: func(a: f32);
41-
assertz: func(a: f32);
42-
assert-eq: func(a: f32, b: f32);
43-
}
40+
// assert: func(a: f32);
41+
// assertz: func(a: f32);
42+
// assert-eq: func(a: f32, b: f32);
43+
// }
4444

4545
interface intrinsics-debug {
4646

@@ -66,7 +66,7 @@ interface intrinsics-advice {
6666

6767
world intrinsics {
6868
import intrinsics-mem;
69-
import intrinsics-felt;
69+
// import intrinsics-felt;
7070
import intrinsics-debug;
7171
import intrinsics-crypto;
7272
import intrinsics-advice;

0 commit comments

Comments
 (0)