Path: blob/main/crates/cranelift/src/func_environ/stack_switching/control_effect.rs
1693 views
use cranelift_codegen::ir;1use cranelift_codegen::ir::InstBuilder;2use cranelift_codegen::ir::types::{I32, I64};3use cranelift_frontend::FunctionBuilder;45/// Universal control effect. This structure encodes return signal,6/// resume signal, suspension signal, and handler index into a7/// u64 value. This instance is used at compile time. There is a runtime8/// counterpart in `continuations/src/lib.rs`.9/// We convert to and from u64 as follows: The low 32 bits of the u64 are the10/// discriminant, the high 32 bits are the handler_index (if `Suspend`)11#[derive(Clone, Copy)]12pub struct ControlEffect(ir::Value);1314impl ControlEffect {15// Returns the discriminant16pub fn signal(&self, builder: &mut FunctionBuilder) -> ir::Value {17builder.ins().ushr_imm(self.0, 32)18}1920pub fn from_u64(val: ir::Value) -> Self {21Self(val)22}2324pub fn to_u64(&self) -> ir::Value {25self.026}2728pub fn encode_resume(builder: &mut FunctionBuilder) -> Self {29let discriminant = builder.ins().iconst(30I64,31i64::from(wasmtime_environ::CONTROL_EFFECT_RESUME_DISCRIMINANT),32);33let val = builder.ins().ishl_imm(discriminant, 32);3435Self(val)36}3738pub fn encode_switch(builder: &mut FunctionBuilder) -> Self {39let discriminant = builder.ins().iconst(40I64,41i64::from(wasmtime_environ::CONTROL_EFFECT_SWITCH_DISCRIMINANT),42);43let val = builder.ins().ishl_imm(discriminant, 32);4445Self(val)46}4748pub fn encode_suspend(builder: &mut FunctionBuilder, handler_index: ir::Value) -> Self {49let discriminant = builder.ins().iconst(50I64,51i64::from(wasmtime_environ::CONTROL_EFFECT_SUSPEND_DISCRIMINANT),52);53let val = builder.ins().ishl_imm(discriminant, 32);54let handler_index = builder.ins().uextend(I64, handler_index);55let val = builder.ins().bor(val, handler_index);5657Self(val)58}5960/// Returns the payload of the `Suspend` variant61pub fn handler_index(self, builder: &mut FunctionBuilder) -> ir::Value {62builder.ins().ireduce(I32, self.0)63}64}656667