mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
upgrade cranelift (#6331)
This commit is contained in:
1 parent
b3141d1231
commit
56a7fb129a
3 files changed
+101
-79
No files matched your search
Generated
+53
-42
@@ -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]]
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user