From df642dc07aa157c03b8979ad3701c659411ae70d Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Fri, 10 Apr 2015 18:01:22 -0400 Subject: generate code for the division --- lo2.ml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'lo2.ml') diff --git a/lo2.ml b/lo2.ml index e284988..4595c99 100644 --- a/lo2.ml +++ b/lo2.ml @@ -524,7 +524,7 @@ let codegen (p: mprog): string = match is.(i) with | { ri_res = l; ri_ins = `Bop (l1, op, l2) } -> let l2 = - if l1 = l then l2 else + if l1 = l || op = Div then l2 else if l2 = l then begin move (LReg (-1)) l; move l l1; @@ -544,8 +544,12 @@ let codegen (p: mprog): string = | LReg _ -> oins 0x29 (regn l2) (regn l) | _ -> assert false end + | Div -> + move (LReg (-1)) l1; + outb 0x99; (* cltd *) + oins 0xf7 7 (regn l2); + move l (LReg (-1)); (* quotient in rax *) | Mul -> failwith "Mul not implemented" - | Div -> failwith "Div not implemented" | CLe -> failwith "CLe not implemented" | CEq -> failwith "CEq not implemented" end @@ -670,7 +674,7 @@ let oneshot () = let _ = if Array.length Sys.argv > 1 && Sys.argv.(1) = "test" then let oc = open_out "t.o" in - nregs := 2; + nregs := 3; let s = psum |> regalloc |> movgen |> codegen in Elf.barebones_elf oc "f" s; close_out oc; -- cgit 1.4.1