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:
@@ -132,6 +132,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
let (arg1, arg2, cond) = state.pop3();
|
||||
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 => {
|
||||
// We do nothing
|
||||
}
|
||||
@@ -968,9 +975,6 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
Operator::F32Le | Operator::F64Le => {
|
||||
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::RefIsNull => {
|
||||
let arg = state.pop1();
|
||||
|
||||
19
cranelift/wasmtests/select.wat
Normal file
19
cranelift/wasmtests/select.wat
Normal 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))
|
||||
)
|
||||
Reference in New Issue
Block a user