Always bounce mul/div/mod ops. Closes #131 harder.
This commit is contained in:
parent
5b5bcf9cfb
commit
9f6dec9e13
4 changed files with 7 additions and 37 deletions
|
|
@ -303,7 +303,7 @@ let emit_target_specific
|
|||
let dst_eax = hr_like_cell eax dst in
|
||||
let lhs_eax = hr_like_op eax lhs in
|
||||
let rhs_ecx = hr_like_op ecx rhs in
|
||||
(* Horrible: we bounce complex mul inputs off spill slots
|
||||
(* Horrible: we bounce mul/div/mod inputs off spill slots
|
||||
* to ensure non-interference between the temporaries used
|
||||
* during mem-base-reg reloads and the registers we're
|
||||
* preparing. *)
|
||||
|
|
@ -311,32 +311,15 @@ let emit_target_specific
|
|||
Il.Mem (Il.next_spill_slot e
|
||||
(Il.ScalarTy (Il.operand_scalar_ty op)))
|
||||
in
|
||||
let is_mem op =
|
||||
match op with
|
||||
Il.Cell (Il.Mem _) -> true
|
||||
| _ -> false
|
||||
in
|
||||
let bounce_lhs = is_mem lhs in
|
||||
let bounce_rhs = is_mem rhs in
|
||||
let lhs_spill = next_spill_like lhs in
|
||||
let rhs_spill = next_spill_like rhs in
|
||||
|
||||
if bounce_lhs
|
||||
then mov lhs_spill lhs;
|
||||
mov lhs_spill lhs;
|
||||
mov rhs_spill rhs;
|
||||
|
||||
if bounce_rhs
|
||||
then mov rhs_spill rhs;
|
||||
mov lhs_eax (Il.Cell lhs_spill);
|
||||
mov rhs_ecx (Il.Cell rhs_spill);
|
||||
|
||||
mov lhs_eax
|
||||
(if bounce_lhs
|
||||
then (Il.Cell lhs_spill)
|
||||
else lhs);
|
||||
|
||||
mov rhs_ecx
|
||||
(if bounce_rhs
|
||||
then (Il.Cell rhs_spill)
|
||||
else rhs);
|
||||
|
||||
put (Il.Binary
|
||||
{ b with
|
||||
Il.binary_lhs = (Il.Cell lhs_eax);
|
||||
|
|
@ -344,7 +327,7 @@ let emit_target_specific
|
|||
Il.binary_dst = dst_eax; });
|
||||
if dst <> dst_eax
|
||||
then mov dst (Il.Cell dst_eax);
|
||||
|
||||
|
||||
| _ when (Il.Cell dst) <> lhs ->
|
||||
mov dst lhs;
|
||||
put (Il.Binary
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue