diff --git a/Cargo.lock b/Cargo.lock index 569f52bc9..2e3b9add5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -682,9 +682,9 @@ dependencies = [ [[package]] name = "cranelift" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf99ca3e855b6ca01ee5a334542704274d046deb25cf3013a74eda9e1f7ce0f" +checksum = "68971376deb1edf5e9c0ac77ef00479d740ce7a60e6181adb0648afe1dc7b8f4" dependencies = [ "cranelift-codegen", "cranelift-frontend", @@ -693,42 +693,42 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "359c047862387091eb0363ce8b5cabb4a8be1cc16a6fa151fe079c09796461f3" +checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62afda29fcde09d922f125a7d47880b540fd1de069558bfa637b4ce7aa1ca" +checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3537273471ebdae55791869ee16f71a4a51e34ad47cdc64269a9c2255b5dce03" +checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b872fde1717c508f842ad1ad8768fbe16caf7e8e049215b0e09429bbf00d3ce9" +checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf" [[package]] name = "cranelift-codegen" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a74ef998eb9f985dc0d987d3aac0fe4bd1b59ec707461b2d6d20cda1b0a5e1" +checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -747,48 +747,50 @@ dependencies = [ "serde", "smallvec", "target-lexicon", + "wasmtime-internal-math", ] [[package]] name = "cranelift-codegen-meta" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04a532b9a7b69c28e7e37d15bca7f7f5cc56399df890ec399333e2d548004a" +checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", "cranelift-srcgen", + "heck", ] [[package]] name = "cranelift-codegen-shared" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95c4556174c6eb7d586bd1715b7f9c3a43a0835d6a95715893718b2f263af895" +checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a" [[package]] name = "cranelift-control" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d8e9ae221e352dbea7f6f389705365f8128e7e0a7de5cf787ab7b2ccd1c522" +checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40d10b531267cc86ba4fbb7b718b646df503713828b37841a867f332954b24ad" +checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6" dependencies = [ "cranelift-bitset", ] [[package]] name = "cranelift-frontend" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07540e6f75357d655743008965018fe243434ec6755078794616fde31f783a03" +checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109" dependencies = [ "cranelift-codegen", "log", @@ -798,15 +800,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0909e87af454a7ff542ece2d66f901f2cc9483ab36572a924eb5e58ce51fc0" +checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66" [[package]] name = "cranelift-jit" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e353bd2b08aed8e0a0da4838fcf1a5b6004464675e5651f050bdcd952f12f479" +checksum = "01527663ba63c10509d7c87fd1f8495d21170ba35bf714f57271495689d8fde5" dependencies = [ "anyhow", "cranelift-codegen", @@ -818,15 +820,15 @@ dependencies = [ "log", "region", "target-lexicon", - "wasmtime-jit-icache-coherence", - "windows-sys 0.59.0", + "wasmtime-internal-jit-icache-coherence", + "windows-sys 0.60.2", ] [[package]] name = "cranelift-module" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fa60ec6f91746d560064c8900d9566a239cb6ae788a62cd5b3908589ca749" +checksum = "72328edb49aeafb1655818c91c476623970cb7b8a89ffbdadd82ce7d13dedc1d" dependencies = [ "anyhow", "cranelift-codegen", @@ -835,9 +837,9 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d3963401ea1f8f84bdb0b654f1ca186be97e6ca94ccd2a8037b9edee47e17" +checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37" dependencies = [ "cranelift-codegen", "libc", @@ -846,9 +848,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.119.1" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823558b0a406b7f7d5dad0c925b29e8192792476faaa71615d40cb5a842a9040" +checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d" [[package]] name = "crc32fast" @@ -1336,9 +1338,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" dependencies = [ "fallible-iterator", "indexmap", @@ -2661,9 +2663,9 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.11.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a" +checksum = "4e249c660440317032a71ddac302f25f1d5dff387667bcc3978d1f77aa31ac34" dependencies = [ "allocator-api2", "bumpalo", @@ -4252,15 +4254,24 @@ dependencies = [ ] [[package]] -name = "wasmtime-jit-icache-coherence" -version = "32.0.1" +name = "wasmtime-internal-jit-icache-coherence" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ccb3dd740a0601addd260f4a6d91470cd3f7a2058efe46662054ca6b6da592" +checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22" dependencies = [ "anyhow", "cfg-if", "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "wasmtime-internal-math" +version = "39.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953" +dependencies = [ + "libm", ] [[package]] diff --git a/crates/jit/Cargo.toml b/crates/jit/Cargo.toml index 2ef8c344a..a79e48bac 100644 --- a/crates/jit/Cargo.toml +++ b/crates/jit/Cargo.toml @@ -17,9 +17,9 @@ num-traits = { workspace = true } thiserror = { workspace = true } libffi = { workspace = true } -cranelift = "0.119" -cranelift-jit = "0.119" -cranelift-module = "0.119" +cranelift = "0.126" +cranelift-jit = "0.126" +cranelift-module = "0.126" [dev-dependencies] rustpython-derive = { workspace = true } diff --git a/crates/jit/src/instructions.rs b/crates/jit/src/instructions.rs index 9ada6c327..8a70b9a73 100644 --- a/crates/jit/src/instructions.rs +++ b/crates/jit/src/instructions.rs @@ -111,13 +111,11 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let builder = &mut self.builder; let ty = val.to_jit_type().ok_or(JitCompileError::NotSupported)?; let local = self.variables[idx as usize].get_or_insert_with(|| { - let var = Variable::new(idx as usize); - let local = Local { + let var = builder.declare_var(ty.to_cranelift()); + Local { var, ty: ty.clone(), - }; - builder.declare_var(var, ty.to_cranelift()); - local + } }); if ty != local.ty { Err(JitCompileError::NotSupported) @@ -1021,7 +1019,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_b_zero, b_zero_block, &[], continue_block, &[]); self.builder.switch_to_block(b_zero_block); - self.builder.ins().jump(merge_block, &[one_f]); + self.builder.ins().jump(merge_block, &[one_f.into()]); self.builder.switch_to_block(continue_block); // --- Edge Case 2: b is NaN → return NaN @@ -1032,7 +1030,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_b_nan, b_nan_block, &[], continue_block2, &[]); self.builder.switch_to_block(b_nan_block); - self.builder.ins().jump(merge_block, &[nan_f]); + self.builder.ins().jump(merge_block, &[nan_f.into()]); self.builder.switch_to_block(continue_block2); // --- Edge Case 3: a == 0.0 → return 0.0 @@ -1043,7 +1041,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_a_zero, a_zero_block, &[], continue_block3, &[]); self.builder.switch_to_block(a_zero_block); - self.builder.ins().jump(merge_block, &[zero_f]); + self.builder.ins().jump(merge_block, &[zero_f.into()]); self.builder.switch_to_block(continue_block3); // --- Edge Case 4: a is NaN → return NaN @@ -1054,7 +1052,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_a_nan, a_nan_block, &[], continue_block4, &[]); self.builder.switch_to_block(a_nan_block); - self.builder.ins().jump(merge_block, &[nan_f]); + self.builder.ins().jump(merge_block, &[nan_f.into()]); self.builder.switch_to_block(continue_block4); // --- Edge Case 5: b == +infinity → return +infinity @@ -1065,7 +1063,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_b_inf, b_inf_block, &[], continue_block5, &[]); self.builder.switch_to_block(b_inf_block); - self.builder.ins().jump(merge_block, &[inf_f]); + self.builder.ins().jump(merge_block, &[inf_f.into()]); self.builder.switch_to_block(continue_block5); // --- Edge Case 6: b == -infinity → return 0.0 @@ -1076,7 +1074,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_b_neg_inf, b_neg_inf_block, &[], continue_block6, &[]); self.builder.switch_to_block(b_neg_inf_block); - self.builder.ins().jump(merge_block, &[zero_f]); + self.builder.ins().jump(merge_block, &[zero_f.into()]); self.builder.switch_to_block(continue_block6); // --- Edge Case 7: a == +infinity → return +infinity @@ -1087,7 +1085,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .ins() .brif(cmp_a_inf, a_inf_block, &[], continue_block7, &[]); self.builder.switch_to_block(a_inf_block); - self.builder.ins().jump(merge_block, &[inf_f]); + self.builder.ins().jump(merge_block, &[inf_f.into()]); self.builder.switch_to_block(continue_block7); // --- Edge Case 8: a == -infinity → check exponent parity @@ -1109,7 +1107,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { .brif(cmp_int, continue_neg_inf, &[], domain_error_blk, &[]); self.builder.switch_to_block(domain_error_blk); - self.builder.ins().jump(merge_block, &[nan_f]); + self.builder.ins().jump(merge_block, &[nan_f.into()]); self.builder.switch_to_block(continue_neg_inf); // b is an integer here; convert b_floor to an i64. @@ -1124,17 +1122,21 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let even_block = self.builder.create_block(); self.builder.append_block_param(odd_block, f64_ty); self.builder.append_block_param(even_block, f64_ty); - self.builder - .ins() - .brif(is_odd, odd_block, &[neg_inf_f], even_block, &[inf_f]); + self.builder.ins().brif( + is_odd, + odd_block, + &[neg_inf_f.into()], + even_block, + &[inf_f.into()], + ); self.builder.switch_to_block(odd_block); let phi_neg_inf = self.builder.block_params(odd_block)[0]; - self.builder.ins().jump(merge_block, &[phi_neg_inf]); + self.builder.ins().jump(merge_block, &[phi_neg_inf.into()]); self.builder.switch_to_block(even_block); let phi_inf = self.builder.block_params(even_block)[0]; - self.builder.ins().jump(merge_block, &[phi_inf]); + self.builder.ins().jump(merge_block, &[phi_inf.into()]); self.builder.switch_to_block(continue_block8); @@ -1154,7 +1156,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let product_dd = self.dd_mul(ln_a_dd, b_dd); let exp_dd = self.dd_exp(product_dd); let pos_res = self.dd_to_f64(exp_dd); - self.builder.ins().jump(merge_block, &[pos_res]); + self.builder.ins().jump(merge_block, &[pos_res.into()]); // ----- Case: a < 0: Only allow an integral exponent. self.builder.switch_to_block(a_neg_block); @@ -1168,7 +1170,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { // Domain error: non-integer exponent for negative base self.builder.switch_to_block(domain_error_blk); - self.builder.ins().jump(merge_block, &[nan_f]); + self.builder.ins().jump(merge_block, &[nan_f.into()]); // For negative base with an integer exponent: self.builder.switch_to_block(neg_int_block); @@ -1191,18 +1193,24 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { self.builder.append_block_param(odd_block, f64_ty); self.builder.append_block_param(even_block, f64_ty); // Pass mag_val to both branches: - self.builder - .ins() - .brif(is_odd, odd_block, &[mag_val], even_block, &[mag_val]); + self.builder.ins().brif( + is_odd, + odd_block, + &[mag_val.into()], + even_block, + &[mag_val.into()], + ); self.builder.switch_to_block(odd_block); let phi_mag_val = self.builder.block_params(odd_block)[0]; let neg_val = self.builder.ins().fneg(phi_mag_val); - self.builder.ins().jump(merge_block, &[neg_val]); + self.builder.ins().jump(merge_block, &[neg_val.into()]); self.builder.switch_to_block(even_block); let phi_mag_val_even = self.builder.block_params(even_block)[0]; - self.builder.ins().jump(merge_block, &[phi_mag_val_even]); + self.builder + .ins() + .jump(merge_block, &[phi_mag_val_even.into()]); // ----- Merge: Return the final result. self.builder.switch_to_block(merge_block); @@ -1239,7 +1247,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { self.builder.append_block_param(continue_block, types::I64); // base // Initial jump to check if exponent is negative - self.builder.ins().jump(check_negative, &[b, a]); + self.builder + .ins() + .jump(check_negative, &[b.into(), a.into()]); // Check if exponent is negative self.builder.switch_to_block(check_negative); @@ -1254,14 +1264,14 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { self.builder.ins().brif( is_negative, handle_negative, - &[exp_check, base_check], + &[exp_check.into(), base_check.into()], loop_block, - &[exp_check, one_i64, base_check], + &[exp_check.into(), one_i64.into(), base_check.into()], ); // Handle negative exponent (return 0 for integer exponentiation) self.builder.switch_to_block(handle_negative); - self.builder.ins().jump(exit_block, &[zero]); // Return 0 for negative exponents + self.builder.ins().jump(exit_block, &[zero.into()]); // Return 0 for negative exponents // Loop block logic (square-and-multiply algorithm) self.builder.switch_to_block(loop_block); @@ -1275,9 +1285,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { self.builder.ins().brif( is_zero, exit_block, - &[result_phi], + &[result_phi.into()], continue_block, - &[exp_phi, result_phi, base_phi], + &[exp_phi.into(), result_phi.into(), base_phi.into()], ); // Continue block for non-zero case @@ -1296,9 +1306,10 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { // Square the base and divide exponent by 2 let squared_base = self.builder.ins().imul(base_phi, base_phi); let new_exp = self.builder.ins().sshr_imm(exp_phi, 1); - self.builder - .ins() - .jump(loop_block, &[new_exp, new_result, squared_base]); + self.builder.ins().jump( + loop_block, + &[new_exp.into(), new_result.into(), squared_base.into()], + ); // Exit block self.builder.switch_to_block(exit_block);