Fix stack depth in rem, update cranelift-codegen
This commit is contained in:
@@ -19,7 +19,7 @@ itertools = "0.8"
|
|||||||
capstone = "0.5.0"
|
capstone = "0.5.0"
|
||||||
failure = "0.1.3"
|
failure = "0.1.3"
|
||||||
failure_derive = "0.1.3"
|
failure_derive = "0.1.3"
|
||||||
cranelift-codegen = "0.30"
|
cranelift-codegen = "0.33"
|
||||||
multi_mut = "0.1"
|
multi_mut = "0.1"
|
||||||
either = "1.5"
|
either = "1.5"
|
||||||
wabt = "0.7"
|
wabt = "0.7"
|
||||||
|
|||||||
@@ -843,6 +843,8 @@ macro_rules! int_div {
|
|||||||
|
|
||||||
let is_neg1 = self.create_label();
|
let is_neg1 = self.create_label();
|
||||||
|
|
||||||
|
let current_depth = self.block_state.depth.clone();
|
||||||
|
|
||||||
// TODO: This could cause segfaults because of implicit push/pop
|
// TODO: This could cause segfaults because of implicit push/pop
|
||||||
let gen_neg1_case = match divisor {
|
let gen_neg1_case = match divisor {
|
||||||
ValueLocation::Immediate(_) => {
|
ValueLocation::Immediate(_) => {
|
||||||
@@ -858,6 +860,11 @@ macro_rules! int_div {
|
|||||||
let reg = self.into_reg(GPRType::Rq, divisor).unwrap();
|
let reg = self.into_reg(GPRType::Rq, divisor).unwrap();
|
||||||
dynasm!(self.asm
|
dynasm!(self.asm
|
||||||
; cmp $reg_ty(reg.rq().unwrap()), -1
|
; cmp $reg_ty(reg.rq().unwrap()), -1
|
||||||
|
);
|
||||||
|
// TODO: We could choose `current_depth` as the depth here instead but we currently
|
||||||
|
// don't for simplicity
|
||||||
|
self.set_stack_depth(current_depth.clone());
|
||||||
|
dynasm!(self.asm
|
||||||
; je =>is_neg1.0
|
; je =>is_neg1.0
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -867,6 +874,9 @@ macro_rules! int_div {
|
|||||||
let offset = self.adjusted_offset(offset);
|
let offset = self.adjusted_offset(offset);
|
||||||
dynasm!(self.asm
|
dynasm!(self.asm
|
||||||
; cmp $pointer_ty [rsp + offset], -1
|
; cmp $pointer_ty [rsp + offset], -1
|
||||||
|
);
|
||||||
|
self.set_stack_depth(current_depth.clone());
|
||||||
|
dynasm!(self.asm
|
||||||
; je =>is_neg1.0
|
; je =>is_neg1.0
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -902,6 +912,7 @@ macro_rules! int_div {
|
|||||||
|
|
||||||
if gen_neg1_case {
|
if gen_neg1_case {
|
||||||
let ret = self.create_label();
|
let ret = self.create_label();
|
||||||
|
self.set_stack_depth(current_depth.clone());
|
||||||
dynasm!(self.asm
|
dynasm!(self.asm
|
||||||
; jmp =>ret.0
|
; jmp =>ret.0
|
||||||
);
|
);
|
||||||
@@ -912,6 +923,7 @@ macro_rules! int_div {
|
|||||||
CCLoc::try_from(rem).expect("Programmer error")
|
CCLoc::try_from(rem).expect("Programmer error")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
self.set_stack_depth(current_depth.clone());
|
||||||
self.define_label(ret);
|
self.define_label(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user