mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-30 09:01:33 +00:00
Add Select opcode.
This commit is contained in:
@ -1635,6 +1635,56 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
was_unreachable,
|
was_unreachable,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
Operator::Select => {
|
||||||
|
Self::emit_pop_into_ax(assembler, &mut self.value_stack)?;
|
||||||
|
let v_b = self.value_stack.pop()?;
|
||||||
|
let v_a = self.value_stack.pop()?;
|
||||||
|
|
||||||
|
if v_b.ty != v_a.ty {
|
||||||
|
return Err(CodegenError {
|
||||||
|
message: "select: type mismatch",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; cmp eax, 0
|
||||||
|
);
|
||||||
|
match v_b.location {
|
||||||
|
ValueLocation::Stack => {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; cmove rax, [rsp]
|
||||||
|
; add rsp, 8
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ValueLocation::Register(x) => {
|
||||||
|
let reg = Register::from_scratch_reg(x);
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; cmove rax, Rq(reg as u8)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match v_a.location {
|
||||||
|
ValueLocation::Stack => {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; cmovne rax, [rsp]
|
||||||
|
; add rsp, 8
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ValueLocation::Register(x) => {
|
||||||
|
let reg = Register::from_scratch_reg(x);
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; cmovne rax, Rq(reg as u8)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Self::emit_push_from_ax(assembler, &mut self.value_stack, v_a.ty)?;
|
||||||
|
}
|
||||||
Operator::Br { relative_depth } => {
|
Operator::Br { relative_depth } => {
|
||||||
Self::emit_jmp(
|
Self::emit_jmp(
|
||||||
assembler,
|
assembler,
|
||||||
|
Reference in New Issue
Block a user