Skip to content

Commit 4f513d7

Browse files
committed
Fix bug in v128.replace_lane execution (#1444)
fix bug in replace_lane execution
1 parent 616907c commit 4f513d7

File tree

1 file changed

+8
-7
lines changed
  • crates/wasmi/src/engine/executor/instrs

1 file changed

+8
-7
lines changed

crates/wasmi/src/engine/executor/instrs/simd.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,37 +194,37 @@ impl Executor<'_> {
194194
lane: ImmLaneIdx16,
195195
value: i8,
196196
) {
197-
self.execute_replace_lane_impl(result, input, lane, value, simd::i8x16_replace_lane)
197+
self.execute_replace_lane_impl(result, input, lane, value, 1, simd::i8x16_replace_lane)
198198
}
199199

200200
/// Executes an [`Instruction::I16x8ReplaceLaneImm`] instruction.
201201
pub fn execute_i16x8_replace_lane_imm(&mut self, result: Reg, input: Reg, lane: ImmLaneIdx8) {
202202
let value = self.fetch_const32_as::<i32>() as i16;
203-
self.execute_replace_lane_impl(result, input, lane, value, simd::i16x8_replace_lane)
203+
self.execute_replace_lane_impl(result, input, lane, value, 2, simd::i16x8_replace_lane)
204204
}
205205

206206
/// Executes an [`Instruction::I32x4ReplaceLaneImm`] instruction.
207207
pub fn execute_i32x4_replace_lane_imm(&mut self, result: Reg, input: Reg, lane: ImmLaneIdx4) {
208208
let value = self.fetch_const32_as::<i32>();
209-
self.execute_replace_lane_impl(result, input, lane, value, simd::i32x4_replace_lane)
209+
self.execute_replace_lane_impl(result, input, lane, value, 2, simd::i32x4_replace_lane)
210210
}
211211

212212
/// Executes an [`Instruction::I64x2ReplaceLaneImm32`] instruction.
213213
pub fn execute_i64x2_replace_lane_imm32(&mut self, result: Reg, input: Reg, lane: ImmLaneIdx2) {
214214
let value = self.fetch_i64const32();
215-
self.execute_replace_lane_impl(result, input, lane, value, simd::i64x2_replace_lane)
215+
self.execute_replace_lane_impl(result, input, lane, value, 2, simd::i64x2_replace_lane)
216216
}
217217

218218
/// Executes an [`Instruction::F32x4ReplaceLaneImm`] instruction.
219219
pub fn execute_f32x4_replace_lane_imm(&mut self, result: Reg, input: Reg, lane: ImmLaneIdx4) {
220220
let value = self.fetch_const32_as::<f32>();
221-
self.execute_replace_lane_impl(result, input, lane, value, simd::f32x4_replace_lane)
221+
self.execute_replace_lane_impl(result, input, lane, value, 2, simd::f32x4_replace_lane)
222222
}
223223

224224
/// Executes an [`Instruction::F64x2ReplaceLaneImm32`] instruction.
225225
pub fn execute_f64x2_replace_lane_imm32(&mut self, result: Reg, input: Reg, lane: ImmLaneIdx2) {
226226
let value = self.fetch_f64const32();
227-
self.execute_replace_lane_impl(result, input, lane, value, simd::f64x2_replace_lane)
227+
self.execute_replace_lane_impl(result, input, lane, value, 2, simd::f64x2_replace_lane)
228228
}
229229

230230
/// Generically execute a SIMD replace lane instruction.
@@ -234,11 +234,12 @@ impl Executor<'_> {
234234
input: Reg,
235235
lane: LaneType,
236236
value: T,
237+
delta: usize,
237238
eval: fn(V128, LaneType, T) -> V128,
238239
) {
239240
let input = self.get_register_as::<V128>(input);
240241
self.set_register_as::<V128>(result, eval(input, lane, value));
241-
self.next_instr_at(2);
242+
self.next_instr_at(delta);
242243
}
243244

244245
impl_unary_executors! {

0 commit comments

Comments
 (0)