Wasm: Add support for typed select instruction

Reference types introduces a typed select operation. It has identical execution
semantics so no codegen change is needed.
This commit is contained in:
Ryan Hunt
2020-01-06 15:36:06 -06:00
parent fc58dd6aff
commit 32a95a89eb
2 changed files with 26 additions and 3 deletions

View File

@@ -132,6 +132,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
let (arg1, arg2, cond) = state.pop3(); let (arg1, arg2, cond) = state.pop3();
state.push1(builder.ins().select(cond, arg1, arg2)); 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();
state.push1(builder.ins().select(cond, arg1, arg2));
}
Operator::Nop => { Operator::Nop => {
// We do nothing // We do nothing
} }
@@ -968,9 +975,6 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
Operator::F32Le | Operator::F64Le => { Operator::F32Le | Operator::F64Le => {
translate_fcmp(FloatCC::LessThanOrEqual, builder, state) translate_fcmp(FloatCC::LessThanOrEqual, builder, state)
} }
Operator::TypedSelect { .. } => {
return Err(wasm_unsupported!("proposed typed select operator {:?}", op))
}
Operator::RefNull => state.push1(builder.ins().null(environ.reference_type())), Operator::RefNull => state.push1(builder.ins().null(environ.reference_type())),
Operator::RefIsNull => { Operator::RefIsNull => {
let arg = state.pop1(); let arg = state.pop1();

View File

@@ -0,0 +1,19 @@
(module
(func $untyped-select (result i32)
i32.const 42
i32.const 24
i32.const 1
select)
(func $typed-select-1 (result anyref)
ref.null
ref.null
i32.const 1
select (result anyref))
(func $typed-select-2 (param anyref) (result anyref)
ref.null
local.get 0
i32.const 1
select (result anyref))
)