mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-25 14:41:32 +00:00
Fix bugs found when running spectests.
This commit is contained in:
@ -50,8 +50,8 @@ lazy_static! {
|
|||||||
; _loop:
|
; _loop:
|
||||||
; cmp rsi, 0
|
; cmp rsi, 0
|
||||||
; je >_loop_end
|
; je >_loop_end
|
||||||
; mov eax, [rdi]
|
; mov rax, [rdi]
|
||||||
; mov [r8], eax
|
; mov [r8], rax
|
||||||
; add r8, 8
|
; add r8, 8
|
||||||
; add rdi, 8
|
; add rdi, 8
|
||||||
; sub rsi, 8
|
; sub rsi, 8
|
||||||
@ -351,7 +351,13 @@ impl ProtectedCaller for X64ExecutionContext {
|
|||||||
CURRENT_EXECUTION_CONTEXT.with(|x| x.borrow_mut().pop().unwrap());
|
CURRENT_EXECUTION_CONTEXT.with(|x| x.borrow_mut().pop().unwrap());
|
||||||
|
|
||||||
Ok(if let Some(ty) = return_ty {
|
Ok(if let Some(ty) = return_ty {
|
||||||
vec![Value::I64(ret)]
|
vec![match ty {
|
||||||
|
WpType::I32 => Value::I32(ret as i32),
|
||||||
|
WpType::I64 => Value::I64(ret),
|
||||||
|
WpType::F32 => Value::F32(f32::from_bits(ret as i32 as u32)),
|
||||||
|
WpType::F64 => Value::F64(f64::from_bits(ret as u64)),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}]
|
||||||
} else {
|
} else {
|
||||||
vec![]
|
vec![]
|
||||||
})
|
})
|
||||||
@ -704,6 +710,33 @@ impl X64FunctionCode {
|
|||||||
Self::emit_binop(assembler, value_stack, f, WpType::I64, WpType::I64)
|
Self::emit_binop(assembler, value_stack, f, WpType::I64, WpType::I64)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn emit_shift<F: FnOnce(&mut Assembler, Register)>(
|
||||||
|
assembler: &mut Assembler,
|
||||||
|
value_stack: &ValueStack,
|
||||||
|
left: Register,
|
||||||
|
right: Register,
|
||||||
|
f: F,
|
||||||
|
) {
|
||||||
|
let rcx_used = Register::RCX.is_used(value_stack);
|
||||||
|
if(rcx_used) {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; push rcx
|
||||||
|
);
|
||||||
|
}
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; mov rcx, Rq(right as u8)
|
||||||
|
);
|
||||||
|
f(assembler, left);
|
||||||
|
if(rcx_used) {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; pop rcx
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn emit_div_i32(
|
fn emit_div_i32(
|
||||||
assembler: &mut Assembler,
|
assembler: &mut Assembler,
|
||||||
value_stack: &ValueStack,
|
value_stack: &ValueStack,
|
||||||
@ -1523,7 +1556,7 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
Operator::Block { .. } | Operator::Loop { .. } | Operator::If { .. } => {
|
Operator::Block { .. } | Operator::Loop { .. } | Operator::If { .. } => {
|
||||||
self.unreachable_depth += 1;
|
self.unreachable_depth += 1;
|
||||||
}
|
}
|
||||||
Operator::End => {
|
Operator::End | Operator::Else => {
|
||||||
self.unreachable_depth -= 1;
|
self.unreachable_depth -= 1;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -1943,6 +1976,76 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
Operator::I32Shl => {
|
||||||
|
Self::emit_binop_i32(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; shl Rd(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I32ShrU => {
|
||||||
|
Self::emit_binop_i32(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; shr Rd(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I32ShrS => {
|
||||||
|
Self::emit_binop_i32(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; sar Rd(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I32Rotl => {
|
||||||
|
Self::emit_binop_i32(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; rol Rd(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I32Rotr => {
|
||||||
|
Self::emit_binop_i32(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; ror Rd(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
// Comparison operators.
|
// Comparison operators.
|
||||||
// https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
|
// https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
|
||||||
// TODO: Is reading flag register directly faster?
|
// TODO: Is reading flag register directly faster?
|
||||||
@ -2297,6 +2400,76 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
Operator::I64Shl => {
|
||||||
|
Self::emit_binop_i64(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; shl Rq(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I64ShrU => {
|
||||||
|
Self::emit_binop_i64(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; shr Rq(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I64ShrS => {
|
||||||
|
Self::emit_binop_i64(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; sar Rq(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I64Rotl => {
|
||||||
|
Self::emit_binop_i64(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; rol Rq(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Operator::I64Rotr => {
|
||||||
|
Self::emit_binop_i64(
|
||||||
|
assembler,
|
||||||
|
&mut self.value_stack,
|
||||||
|
|assembler, value_stack, left, right| {
|
||||||
|
Self::emit_shift(assembler, value_stack, left, right, |assembler, left| {
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; ror Rq(left as u8), cl
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)?;
|
||||||
|
}
|
||||||
// Comparison operators.
|
// Comparison operators.
|
||||||
// https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
|
// https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
|
||||||
// TODO: Is reading flag register directly faster?
|
// TODO: Is reading flag register directly faster?
|
||||||
@ -2484,6 +2657,7 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
Operator::Unreachable => {
|
Operator::Unreachable => {
|
||||||
|
/*
|
||||||
Self::emit_call_raw(
|
Self::emit_call_raw(
|
||||||
assembler,
|
assembler,
|
||||||
&mut self.value_stack,
|
&mut self.value_stack,
|
||||||
@ -2491,6 +2665,11 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
&[],
|
&[],
|
||||||
&[],
|
&[],
|
||||||
)?;
|
)?;
|
||||||
|
*/
|
||||||
|
dynasm!(
|
||||||
|
assembler
|
||||||
|
; ud2
|
||||||
|
);
|
||||||
self.unreachable_depth = 1;
|
self.unreachable_depth = 1;
|
||||||
}
|
}
|
||||||
Operator::Drop => {
|
Operator::Drop => {
|
||||||
@ -2595,6 +2774,8 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
|
|
||||||
if !was_unreachable {
|
if !was_unreachable {
|
||||||
Self::emit_leave_frame(assembler, &frame, &mut self.value_stack, false)?;
|
Self::emit_leave_frame(assembler, &frame, &mut self.value_stack, false)?;
|
||||||
|
} else {
|
||||||
|
self.value_stack.reset_depth(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dynasm!(
|
dynasm!(
|
||||||
@ -3041,7 +3222,10 @@ impl FunctionCodeGenerator for X64FunctionCode {
|
|||||||
WpType::I64,
|
WpType::I64,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
_ => unimplemented!(),
|
Operator::Nop => {}
|
||||||
|
_ => {
|
||||||
|
panic!("{:?}", op);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -3122,6 +3306,8 @@ unsafe extern "C" fn invoke_import(
|
|||||||
let vmctx: &mut vm::Ctx = &mut *vmctx;
|
let vmctx: &mut vm::Ctx = &mut *vmctx;
|
||||||
let import = (*vmctx.imported_funcs.offset(import_id as isize)).func;
|
let import = (*vmctx.imported_funcs.offset(import_id as isize)).func;
|
||||||
|
|
||||||
|
return 0; // TODO: Fix this.
|
||||||
|
|
||||||
CONSTRUCT_STACK_AND_CALL_NATIVE(stack_top, stack_base, vmctx, import)
|
CONSTRUCT_STACK_AND_CALL_NATIVE(stack_top, stack_base, vmctx, import)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user