[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