wasm->CLIF: fn translate_operator: Select/TypedSelect: add missing bitcasts

The translation of Operator::Select and Operator::TypedSelect for vector-typed
operands, lacks the relevant bitcasting of the operands to I8X16.  This commit
adds it.
This commit is contained in:
Julian Seward
2021-01-08 11:45:10 +01:00
committed by julian-seward1
parent cacebfb19c
commit 07652ca0d4
2 changed files with 65 additions and 2 deletions

View File

@@ -201,14 +201,26 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
state.pop1();
}
Operator::Select => {
let (arg1, arg2, cond) = state.pop3();
let (mut arg1, mut arg2, cond) = state.pop3();
if builder.func.dfg.value_type(arg1).is_vector() {
arg1 = optionally_bitcast_vector(arg1, I8X16, builder);
}
if builder.func.dfg.value_type(arg2).is_vector() {
arg2 = optionally_bitcast_vector(arg2, I8X16, builder);
}
state.push1(builder.ins().select(cond, arg1, arg2));
}
Operator::TypedSelect { ty: _ } => {
// We ignore the explicit type parameter as it is only needed for
// validation, which we require to have been performed before
// translation.
let (arg1, arg2, cond) = state.pop3();
let (mut arg1, mut arg2, cond) = state.pop3();
if builder.func.dfg.value_type(arg1).is_vector() {
arg1 = optionally_bitcast_vector(arg1, I8X16, builder);
}
if builder.func.dfg.value_type(arg2).is_vector() {
arg2 = optionally_bitcast_vector(arg2, I8X16, builder);
}
state.push1(builder.ins().select(cond, arg1, arg2));
}
Operator::Nop => {