diff options
Diffstat (limited to 'src/boot')
| -rw-r--r-- | src/boot/be/x86.ml | 29 | ||||
| -rw-r--r-- | src/boot/me/trans.ml | 2 |
2 files changed, 7 insertions, 24 deletions
diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml index 826127a0..71f9cdcf 100644 --- a/src/boot/be/x86.ml +++ b/src/boot/be/x86.ml @@ -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; - - if bounce_rhs - then mov rhs_spill rhs; + mov lhs_spill lhs; + mov rhs_spill rhs; - mov lhs_eax - (if bounce_lhs - then (Il.Cell lhs_spill) - else lhs); + mov lhs_eax (Il.Cell lhs_spill); + mov rhs_ecx (Il.Cell rhs_spill); - 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 diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index 620b27e7..4fe63012 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -181,7 +181,7 @@ let trans_visitor match q with Il.Jmp _ -> flush_emitter_size_cache(); | _ -> () - end; + end; Il.emit (emitter()) q in |