[pypy-svn] r62684 - pypy/branch/pyjitpl5/pypy/jit/backend/x86

fijal at codespeak.net fijal at codespeak.net
Sat Mar 7 10:23:40 CET 2009


Author: fijal
Date: Sat Mar  7 10:23:39 2009
New Revision: 62684

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/ri386.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py
Log:
Translation fixes. ovf error is now handled correctly (by address, which
survives translation)


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py	Sat Mar  7 10:23:39 2009
@@ -219,9 +219,11 @@
                 loc = locs[i]
                 if isinstance(loc, REG):
                     self.mc2.MOV(stack_pos(stacklocs[i]), loc)
-            self.mc2.MOV(eax, imm(self._ovf_error_vtable))
+            ovf_error_vtable = self.cpu.cast_adr_to_int(self._ovf_error_vtable)
+            self.mc2.MOV(eax, imm(ovf_error_vtable))
             self.mc2.MOV(addr_add(imm(self._exception_addr), imm(0)), eax)
-            self.mc2.MOV(eax, imm(self._ovf_error_inst))
+            ovf_error_instance = self.cpu.cast_adr_to_int(self._ovf_error_inst)
+            self.mc2.MOV(eax, imm(ovf_error_instance))
             self.mc2.MOV(addr_add(imm(self._exception_addr), imm(WORD)), eax)
             self.mc2.PUSH(esp)           # frame address
             self.mc2.PUSH(imm(index))    # index of guard that failed
@@ -392,10 +394,10 @@
             self.mc.MOV(addr_add(base_loc, ofs_loc, baseofs.value,
                                  scale_loc.value), value_loc)
         elif scale_loc.value == 0:
-            self.mc.MOV(addr_add8(base_loc, ofs_loc, baseofs.value,
+            self.mc.MOV(addr8_add(base_loc, ofs_loc, baseofs.value,
                                  scale_loc.value), lower_byte(value_loc))
         else:
-            raise NotImplementedError("scale = %d" % scale)
+            raise NotImplementedError("scale = %d" % scale_loc.value)
 
     def genop_strsetitem(self, op, arglocs):
         base_loc, ofs_loc, val_loc = arglocs

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/ri386.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/ri386.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/ri386.py	Sat Mar  7 10:23:39 2009
@@ -1,5 +1,5 @@
 from pypy.rlib.rarithmetic import intmask
-from pypy.rlib.objectmodel import ComputedIntSymbolic
+from pypy.rlib.objectmodel import ComputedIntSymbolic, we_are_translated
 
 class OPERAND(object):
     _attrs_ = []
@@ -246,7 +246,8 @@
 def imm(value):
     if isinstance(value, ComputedIntSymbolic):
         value = value.compute_fn()
-    assert isinstance(value, int)
+    if not we_are_translated():
+        assert type(value) is int
     if single_byte(value):
         return imm8(value)
     else:

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py	Sat Mar  7 10:23:39 2009
@@ -65,19 +65,13 @@
         self.generated_mps = {}
 
     def _setup_ovf_error(self):
-        if self.translate_support_code:
-            self.assembler._ovf_error_vtable = 0
-            self.assembler._ovf_error_inst   = 0
-            xxx
-            # do something here
-        else:
-            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)
-            self.assembler._ovf_error_vtable = self.cast_ptr_to_int(ll_inst.typeptr)
-            self.assembler._ovf_error_inst = self.cast_ptr_to_int(ll_inst)
+        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)
+        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)
 
     def setup(self):
         self.assembler = Assembler386(self, self.translate_support_code)
@@ -464,6 +458,7 @@
             v = ord(rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs])
         elif size == 2:
             v = rffi.cast(rffi.CArrayPtr(rffi.USHORT), gcref)[ofs/2]
+            v = rffi.cast(lltype.Signed, v)
         elif size == WORD:
             v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs/WORD]
             if ptr:
@@ -486,7 +481,7 @@
             v = vbox.getint()
             rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs] = chr(v)
         elif size == 2:
-            v = vbox.getint()
+            v = rffi.cast(rffi.USHORT, vbox.getint())
             rffi.cast(rffi.CArrayPtr(rffi.USHORT), gcref)[ofs/2] = v
         elif size == WORD:
             a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py	Sat Mar  7 10:23:39 2009
@@ -10,6 +10,9 @@
 
 GC_MALLOC = lltype.Ptr(lltype.FuncType([lltype.Signed], llmemory.Address))
 
+def gc_malloc(size):
+    return llop.call_boehm_gc_alloc(llmemory.Address, size)
+
 def gc_malloc_fnaddr():
     """Returns the address of the Boehm 'malloc' function."""
     if we_are_translated():



More information about the Pypy-commit mailing list