summary refs log tree commit diff
path: root/lo2.ml
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-04-10 14:53:25 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-09-15 23:01:27 -0400
commitdd20e7c180e91f1587d94bd9878485d55bfee137 (patch)
tree9235cc7e2d4e1b69a667cb1bbd56ae6bd02a01a8 /lo2.ml
parent7ab237d8ed81702dfbe034fd49de2e9fc9eba08c (diff)
downloadroux-dd20e7c180e91f1587d94bd9878485d55bfee137.tar.gz
reserve edx in all cases for divisions
Diffstat (limited to 'lo2.ml')
-rw-r--r--lo2.ml10
1 files changed, 6 insertions, 4 deletions
diff --git a/lo2.ml b/lo2.ml
index 4b978f4..e284988 100644
--- a/lo2.ml
+++ b/lo2.ml
@@ -247,7 +247,9 @@ let regalloc (p: iprog): rprog =
            *)
           let rdx = 1 in
           if op = Div && not (List.mem rdx !free) then
-            getreg (List.filter ((<>) rdx) regs) |> ignore;
+            getreg (List.filter ((<>) rdx) regs) |> ignore
+          else
+            free := (List.filter ((<>) rdx) regs);
           let l1 = regloc frz ir1 in
           let frz = match l1 with
             | LReg r1 -> r1 :: frz
@@ -625,7 +627,7 @@ let psum: iprog =
        |]
      ; bb_inss =
        [| `Bop (IRPhi (1, 0), Sub, IRIns (0, 1))  (* n1 = n - 1 *)
-        ; `Bop (IRPhi (1, 1), Add, IRPhi (1, 0))  (* s1 = s + n *)
+        ; `Bop (IRPhi (1, 1), Div, IRPhi (1, 0))  (* s1 = s + n *)
        |]
      ; bb_jmp = `Brz (IRIns (1, 0), 2, 1)
      }
@@ -668,8 +670,8 @@ let oneshot () =
 let _ =
   if Array.length Sys.argv > 1 && Sys.argv.(1) = "test" then
     let oc = open_out "t.o" in
-    nregs := 2; 
-    let s = pspill |> regalloc |> movgen |> codegen in
+    nregs := 2;
+    let s = psum |> regalloc |> movgen |> codegen in
     Elf.barebones_elf oc "f" s;
     close_out oc;
   else