From 47e0badbcaeeb178dab747f87ba528be011ee904 Mon Sep 17 00:00:00 2001 From: radik878 Date: Tue, 17 Feb 2026 22:11:56 +0200 Subject: [PATCH] fix(cranelift): correct sign extension operators to use ireduce result --- .../src/translate/code_translator.rs | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/crates/cranelift/src/translate/code_translator.rs b/crates/cranelift/src/translate/code_translator.rs index b7565bd24e12..2bdfe0cf344c 100644 --- a/crates/cranelift/src/translate/code_translator.rs +++ b/crates/cranelift/src/translate/code_translator.rs @@ -1161,33 +1161,28 @@ pub fn translate_operator( } Operator::I32Extend8S => { let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().ireduce(I8, val)); - let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().sextend(I32, val)); + let reduced = builder.ins().ireduce(I8, val); + environ.stacks.push1(builder.ins().sextend(I32, reduced)); } Operator::I32Extend16S => { let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().ireduce(I16, val)); - let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().sextend(I32, val)); + let reduced = builder.ins().ireduce(I16, val); + environ.stacks.push1(builder.ins().sextend(I32, reduced)); } Operator::I64Extend8S => { let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().ireduce(I8, val)); - let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().sextend(I64, val)); + let reduced = builder.ins().ireduce(I8, val); + environ.stacks.push1(builder.ins().sextend(I64, reduced)); } Operator::I64Extend16S => { let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().ireduce(I16, val)); - let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().sextend(I64, val)); + let reduced = builder.ins().ireduce(I16, val); + environ.stacks.push1(builder.ins().sextend(I64, reduced)); } Operator::I64Extend32S => { let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().ireduce(I32, val)); - let val = environ.stacks.pop1(); - environ.stacks.push1(builder.ins().sextend(I64, val)); + let reduced = builder.ins().ireduce(I32, val); + environ.stacks.push1(builder.ins().sextend(I64, reduced)); } /****************************** Binary Operators ************************************/ Operator::I32Add | Operator::I64Add => {