[pypy-svn] r63964 - in pypy/branch/pyjitpl5-simplify/pypy/jit/backend: test x86

arigo at codespeak.net arigo at codespeak.net
Fri Apr 10 20:09:30 CEST 2009


Author: arigo
Date: Fri Apr 10 20:09:29 2009
New Revision: 63964

Modified:
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
Log:
In-progress: pass some of ovf tests.


Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py	Fri Apr 10 20:09:29 2009
@@ -132,7 +132,8 @@
             (rop.INT_LSHIFT_OVF, [(0x1f87611, 6, 0x7e1d8440),
                                   (-0x1f87611, 6, -0x7e1d8440),
                                   (sys.maxint//8+1, 3, boom),
-                                  (minint//2-1, 1, boom)]),
+                                  (minint//2-1, 1, boom),
+                                  (0, 345, 0)]),
             (rop.INT_FLOORDIV_OVF, [(110, 3, 36),
                                     (-110, 3, -36),
                                     (110, -3, -36),

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py	Fri Apr 10 20:09:29 2009
@@ -345,13 +345,9 @@
             getattr(self.mc, asmop)(arglocs[0], arglocs[1])
         return genop_binary
 
-    def _binaryop_ovf(asmop, can_swap=False, is_mod=False):
+    def _binaryop_ovf(asmop, can_swap=False):
         def genop_binary_ovf(self, op, guard_op, addr, arglocs, result_loc):
-            if is_mod:
-                self.mc.CDQ()
-                self.mc.IDIV(ecx)
-            else:
-                getattr(self.mc, asmop)(arglocs[0], arglocs[1])
+            getattr(self.mc, asmop)(arglocs[0], arglocs[1])
             self.mc.JO(rel32(addr))
         return genop_binary_ovf
 
@@ -413,7 +409,10 @@
     genop_guard_int_mul_ovf = _binaryop_ovf("IMUL", True)
     genop_guard_int_sub_ovf = _binaryop_ovf("SUB")
     genop_guard_int_add_ovf = _binaryop_ovf("ADD", True)
-    genop_guard_int_mod_ovf = _binaryop_ovf("IDIV", is_mod=True)
+
+    def genop_guard_int_neg_ovf(self, op, guard_op, addr, arglocs, result_loc):
+        self.mc.NEG(result_loc)
+        self.mc.JO(rel32(addr))
 
     genop_int_lt = _cmpop("L", "G")
     genop_int_le = _cmpop("LE", "GE")
@@ -525,10 +524,17 @@
         self.mc.CDQ()
         self.mc.IDIV(ecx)
 
-    def genop_int_floordiv(self, op, arglocs, resloc):
+    def genop_guard_int_mod_ovf(self, op, guard_op, addr, arglocs, result_loc):
+        self.mc.CMP(eax, imm(-sys.maxint-1))
+        self.mc.JE(rel32(addr))
+        self.mc.CMP(ecx, imm(-1))
+        self.mc.JE(rel32(addr))
         self.mc.CDQ()
         self.mc.IDIV(ecx)
 
+    genop_int_floordiv = genop_int_mod
+    genop_guard_int_floordiv_ovf = genop_guard_int_mod_ovf
+
     def genop_new_with_vtable(self, op, arglocs, result_loc):
         assert result_loc is eax
         loc_size, loc_vtable = arglocs
@@ -780,10 +786,10 @@
         if exc or ovf:
             box = TempBox()
             regalloc.position = -1
-            loc = regalloc.force_allocate_reg(box, [])
             if ovf:
-                self.generate_ovf_set(loc)
+                self.generate_ovf_set()
             else:
+                loc = regalloc.force_allocate_reg(box, [])
                 self.generate_exception_handling(loc)
             regalloc.eventually_free_var(box)
         regalloc.walk_guard_ops(guard_op.inputargs, guard_op.suboperations)
@@ -813,13 +819,13 @@
         self.mc.MOV(eax, imm(guard_index))
         self.mc.RET()
 
-    def generate_ovf_set(self, loc):
+    def generate_ovf_set(self):
         ovf_error_vtable = self.cpu.cast_adr_to_int(self._ovf_error_vtable)
-        self.mc.MOV(loc, imm(ovf_error_vtable))
-        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(0)), loc)
+        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(0)),
+                    imm(ovf_error_vtable))
         ovf_error_instance = self.cpu.cast_adr_to_int(self._ovf_error_inst)
-        self.mc.MOV(loc, imm(ovf_error_instance))
-        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)), loc)
+        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),
+                    imm(ovf_error_instance))
 
     def generate_exception_handling(self, loc):
         self.mc.MOV(loc, heap(self._exception_addr))

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py	Fri Apr 10 20:09:29 2009
@@ -738,7 +738,6 @@
     consider_int_mul_ovf = _consider_binop_ovf
     consider_int_sub_ovf = _consider_binop_ovf
     consider_int_add_ovf = _consider_binop_ovf
-    # XXX ovf_neg op
 
     def consider_int_neg(self, op, ignored):
         res = self.force_result_in_reg(op.result, op.args[0], [])
@@ -746,6 +745,15 @@
 
     consider_bool_not = consider_int_neg
 
+    def consider_int_neg_ovf(self, op, guard_op):
+        res = self.force_result_in_reg(op.result, op.args[0], [])
+        self.position += 1
+        regalloc = self.regalloc_for_guard(guard_op)
+        self.perform_with_guard(op, guard_op, regalloc, [res], res,
+                                overflow=True)
+        self.eventually_free_vars(guard_op.inputargs)
+        self.eventually_free_var(guard_op.result)
+
     def consider_int_rshift(self, op, ignored):
         tmpvar = TempBox()
         reg = self.force_allocate_reg(tmpvar, [], ecx)
@@ -774,25 +782,23 @@
         self.eventually_free_vars(guard_op.inputargs)
         self.eventually_free_var(guard_op.result)
 
-    def consider_int_mod(self, op, ignored):
+    def _consider_int_div_or_mod(self, op, trashreg):
         l0 = self.make_sure_var_in_reg(op.args[0], [], eax)
         l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
         l2 = self.force_allocate_reg(op.result, [], edx)
-        # eax is trashed after that operation
+        # the register (eax or edx) not holding what we are looking for
+        # will be just trash after that operation
         tmpvar = TempBox()
-        self.force_allocate_reg(tmpvar, [], eax)
+        self.force_allocate_reg(tmpvar, [], trashreg)
         assert (l0, l1, l2) == (eax, ecx, edx)
         self.eventually_free_vars(op.args + [tmpvar])
+
+    def consider_int_mod(self, op, ignored):
+        self._consider_int_div_or_mod(op, eax)
         self.Perform(op, [eax, ecx], edx)
 
     def consider_int_mod_ovf(self, op, guard_op):
-        l0 = self.make_sure_var_in_reg(op.args[0], [], eax)
-        l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
-        l2 = self.force_allocate_reg(op.result, [], edx)
-        tmpvar = TempBox()
-        self.force_allocate_reg(tmpvar, [], eax)
-        assert (l0, l1, l2) == (eax, ecx, edx)
-        self.eventually_free_vars(op.args + [tmpvar])
+        self._consider_int_div_or_mod(op, eax)
         self.position += 1
         regalloc = self.regalloc_for_guard(guard_op)
         self.perform_with_guard(op, guard_op, regalloc, [eax, ecx], edx,
@@ -800,15 +806,17 @@
         self.eventually_free_vars(guard_op.inputargs)
 
     def consider_int_floordiv(self, op, ignored):
-        tmpvar = TempBox()
-        l0 = self.force_result_in_reg(op.result, op.args[0], [], eax)
-        l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
-        # we need to make sure edx is empty, since we're going to use it
-        l2 = self.force_allocate_reg(tmpvar, [], edx)
-        assert (l0, l1, l2) == (eax, ecx, edx)
-        self.eventually_free_vars(op.args + [tmpvar])
+        self._consider_int_div_or_mod(op, edx)
         self.Perform(op, [eax, ecx], eax)
 
+    def consider_int_floordiv_ovf(self, op, guard_op):
+        self._consider_int_div_or_mod(op, edx)
+        self.position += 1
+        regalloc = self.regalloc_for_guard(guard_op)
+        self.perform_with_guard(op, guard_op, regalloc, [eax, ecx], eax,
+                                overflow=True)
+        self.eventually_free_vars(guard_op.inputargs)
+
     def _consider_compop(self, op, guard_op):
         vx = op.args[0]
         vy = op.args[1]

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	Fri Apr 10 20:09:29 2009
@@ -93,15 +93,21 @@
         self.caught_exception = None
         if rtyper is not None: # for tests
             self.lltype2vtable = rtyper.lltype_to_vtable_mapping()
-            self._setup_ovf_error()
+        self._setup_ovf_error()
         self.generated_mps = {}
 
     def _setup_ovf_error(self):
-        bk = self.rtyper.annotator.bookkeeper
-        clsdef = bk.getuniqueclassdef(OverflowError)
-        ovferror_repr = rclass.getclassrepr(self.rtyper, clsdef)
-        ll_inst = self.rtyper.exceptiondata.get_standard_ll_exc_instance(
-            self.rtyper, clsdef)
+        if self.rtyper is not None:   # normal case
+            bk = self.rtyper.annotator.bookkeeper
+            clsdef = bk.getuniqueclassdef(OverflowError)
+            ovferror_repr = rclass.getclassrepr(self.rtyper, clsdef)
+            ll_inst = self.rtyper.exceptiondata.get_standard_ll_exc_instance(
+                self.rtyper, clsdef)
+        else:
+            # for tests, a random emulated ll_inst will do
+            ll_inst = lltype.malloc(rclass.OBJECT)
+            ll_inst.typeptr = lltype.malloc(rclass.OBJECT_VTABLE,
+                                            immortal=True)
         self.assembler._ovf_error_vtable = llmemory.cast_ptr_to_adr(ll_inst.typeptr)
         self.assembler._ovf_error_inst   = llmemory.cast_ptr_to_adr(ll_inst)
 



More information about the Pypy-commit mailing list