about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-08-10 16:03:58 -0700
committerGraydon Hoare <graydon@mozilla.com>2010-08-10 16:03:58 -0700
commit9f6dec9e13f17bb8a42521f6884a09eebeb023cb (patch)
tree51ba27c76d0d129b4103b46282e8e3d252509a77
parent5b5bcf9cfb4f3f59e8f91ef4e178359dd499ef42 (diff)
downloadrust-9f6dec9e13f17bb8a42521f6884a09eebeb023cb.tar.gz
rust-9f6dec9e13f17bb8a42521f6884a09eebeb023cb.zip
Always bounce mul/div/mod ops. Closes #131 harder.
-rw-r--r--src/Makefile6
-rw-r--r--src/boot/be/x86.ml29
-rw-r--r--src/boot/me/trans.ml2
-rw-r--r--src/test/run-pass/arithmetic-interference.rs7
4 files changed, 7 insertions, 37 deletions
diff --git a/src/Makefile b/src/Makefile
index 496457bb067..63cc67d0a27 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -385,11 +385,7 @@ TASK_XFAILS := test/run-pass/acyclic-unwind.rs \
                test/run-pass/threads.rs \
                test/run-pass/yield.rs
 
-TEST_XFAILS := test/run-pass/arith-0.rs
-
 TEST_XFAILS_X86 :=  $(TASK_XFAILS) \
-					$(TEST_XFAILS) \
-                    test/run-pass/arithmetic-interference.rs \
                     test/run-pass/bind-obj-ctor.rs \
                     test/run-pass/child-outlives-parent.rs \
                     test/run-pass/clone-with-exterior.rs \
@@ -419,13 +415,11 @@ TEST_XFAILS_X86 :=  $(TASK_XFAILS) \
                     test/compile-fail/writing-through-read-alias.rs
 
 TEST_XFAILS_LLVM := $(TASK_XFAILS) \
-					$(TEST_XFAILS) \
                     $(addprefix test/run-pass/, \
                       arith-1.rs \
                       acyclic-unwind.rs \
                       alt-pattern-simple.rs \
                       alt-tag.rs \
-                      arithmetic-interference.rs \
                       argv.rs \
                       autoderef-full-lval.rs \
                       autoderef-objfn.rs \
diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml
index 826127a0b49..71f9cdcf084 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 620b27e7e0f..4fe6301217d 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
 
diff --git a/src/test/run-pass/arithmetic-interference.rs b/src/test/run-pass/arithmetic-interference.rs
deleted file mode 100644
index 588148bb81f..00000000000
--- a/src/test/run-pass/arithmetic-interference.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-// Testcase for issue #131.
-
-fn main() -> () {
-  let int a = 10;
-  log a;
-  check (a * (a - 1) == 90);
-}