diff --git a/cranelift/interpreter/src/step.rs b/cranelift/interpreter/src/step.rs index 638db5937c..bfba030176 100644 --- a/cranelift/interpreter/src/step.rs +++ b/cranelift/interpreter/src/step.rs @@ -76,6 +76,16 @@ where .as_slice(); DataValue::V128(buffer.try_into().expect("a 16-byte data buffer")) } + InstructionData::Shuffle { mask, .. } => { + let mask = state + .get_current_function() + .dfg + .immediates + .get(mask) + .unwrap() + .as_slice(); + DataValue::V128(mask.try_into().expect("a 16-byte vector mask")) + } _ => inst.imm_value().unwrap(), }) }; @@ -777,28 +787,18 @@ where ValueConversionKind::RoundNearestEven(ctrl_ty), )?), Opcode::Shuffle => { - if let InstructionData::Shuffle { mask, .. } = inst { - let mask = state - .get_current_function() - .dfg - .immediates - .get(mask) - .unwrap() - .as_slice(); - let a = Value::into_array(&arg(0)?)?; - let b = Value::into_array(&arg(1)?)?; - let mut new = [0u8; 16]; - for i in 0..mask.len() { - if (mask[i] as usize) < a.len() { - new[i] = a[mask[i] as usize]; - } else if (mask[i] as usize - a.len()) < b.len() { - new[i] = b[mask[i] as usize - a.len()]; - } // else leave as 0. - } - assign(Value::vector(new, ctrl_ty)?) - } else { - unreachable!(); + let mask = imm().into_array()?; + let a = Value::into_array(&arg(0)?)?; + let b = Value::into_array(&arg(1)?)?; + let mut new = [0u8; 16]; + for i in 0..mask.len() { + if (mask[i] as usize) < a.len() { + new[i] = a[mask[i] as usize]; + } else if (mask[i] as usize - a.len()) < b.len() { + new[i] = b[mask[i] as usize - a.len()]; + } // else leave as 0. } + assign(Value::vector(new, ctrl_ty)?) } Opcode::Swizzle => { let x = Value::into_array(&arg(0)?)?;