[pypy-svn] r62883 - in pypy/branch/pyjitpl5/pypy/jit: backend/llgraph backend/x86 backend/x86/test metainterp metainterp/test
arigo at codespeak.net
arigo at codespeak.net
Thu Mar 12 13:16:51 CET 2009
Author: arigo
Date: Thu Mar 12 13:16:48 2009
New Revision: 62883
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/symbolic.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_symbolic.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/executor.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/resoperation.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
Log:
Merge r62784 from pyjitpl5-bck: use instances of AbstractValue
instead of plain integers as descrs. (Cannot run tests so far...)
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py Thu Mar 12 13:16:48 2009
@@ -520,43 +520,45 @@
# delegating to the builtins do_xxx() (done automatically for simple cases)
def op_getarrayitem_gc(self, arraydescr, array, index):
- if arraydescr & 1:
+ if arraydescr.getint() & 1:
return do_getarrayitem_gc_ptr(array, index)
else:
return do_getarrayitem_gc_int(array, index, self.memocast)
def op_getfield_gc(self, fielddescr, struct):
+ fielddescr = fielddescr.getint()
if fielddescr & 1:
return do_getfield_gc_ptr(struct, fielddescr)
else:
return do_getfield_gc_int(struct, fielddescr, self.memocast)
def op_getfield_raw(self, fielddescr, struct):
- if fielddescr & 1:
+ if fielddescr.getint() & 1:
return do_getfield_raw_ptr(struct, fielddescr)
else:
return do_getfield_raw_int(struct, fielddescr, self.memocast)
def op_new_with_vtable(self, size, vtable):
- result = do_new(size)
+ result = do_new(size.getint())
value = lltype.cast_opaque_ptr(rclass.OBJECTPTR, result)
value.typeptr = cast_from_int(rclass.CLASSTYPE, vtable, self.memocast)
return result
def op_setarrayitem_gc(self, arraydescr, array, index, newvalue):
- if arraydescr & 1:
+ if arraydescr.getint() & 1:
do_setarrayitem_gc_ptr(array, index, newvalue)
else:
do_setarrayitem_gc_int(array, index, newvalue, self.memocast)
def op_setfield_gc(self, fielddescr, struct, newvalue):
+ fielddescr = fielddescr.getint()
if fielddescr & 1:
do_setfield_gc_ptr(struct, fielddescr, newvalue)
else:
do_setfield_gc_int(struct, fielddescr, newvalue, self.memocast)
def op_setfield_raw(self, fielddescr, struct, newvalue):
- if fielddescr & 1:
+ if fielddescr.getint() & 1:
do_setfield_raw_ptr(struct, fielddescr, newvalue)
else:
do_setfield_raw_int(struct, fielddescr, newvalue, self.memocast)
@@ -565,12 +567,15 @@
_call_args[:] = args
if calldescr == sys.maxint:
err_result = None
- elif calldescr & 1:
+ elif calldescr.getint() & 1:
err_result = lltype.nullptr(llmemory.GCREF.TO)
else:
err_result = 0
return _do_call_common(func, self.memocast, err_result)
+ def op_new_array(self, arraydescr, count):
+ return do_new_array(arraydescr.getint(), count)
+
# ____________________________________________________________
def cast_to_int(x, memocast):
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py Thu Mar 12 13:16:48 2009
@@ -186,7 +186,7 @@
@staticmethod
def sizeof(S):
- return symbolic.get_size(S)
+ return history.ConstInt(symbolic.get_size(S))
@staticmethod
def numof(S):
@@ -202,7 +202,7 @@
bit = 1
else:
bit = 0
- return ofs*2 + bit
+ return history.ConstInt(ofs*2 + bit)
@staticmethod
def arraydescrof(A):
@@ -213,7 +213,7 @@
bit = 1
else:
bit = 0
- return size*2 + bit
+ return history.ConstInt(size*2 + bit)
@staticmethod
def calldescrof(ARGS, RESULT):
@@ -227,6 +227,7 @@
@staticmethod
def typefor(fielddesc):
+ fielddesc = fielddesc.getint()
if fielddesc == sys.maxint:
return 'void'
if fielddesc % 2:
@@ -249,6 +250,12 @@
def cast_int_to_adr(self, int):
return llimpl.cast_int_to_adr(self.memo_cast, int)
+ def ofs_from_descr(self, descr):
+ return descr.getint()
+
+ def repack_descr(self, ofs):
+ return history.ConstInt(ofs)
+
# ---------- the backend-dependent operations ----------
def do_arraylen_gc(self, args, arraydescr):
@@ -273,9 +280,10 @@
return history.BoxInt(llimpl.do_getarrayitem_gc_int(array, index,
self.memo_cast))
- def do_getfield_gc(self, args, fielddescr):
+ def do_getfield_gc(self, args, fieldbox):
+ fielddescr = fieldbox.getint()
struct = args[0].getptr_base()
- if self.typefor(fielddescr) == 'ptr':
+ if self.typefor(fieldbox) == 'ptr':
return history.BoxPtr(llimpl.do_getfield_gc_ptr(struct,
fielddescr))
else:
@@ -294,18 +302,18 @@
self.memo_cast))
def do_new(self, args, size):
- return history.BoxPtr(llimpl.do_new(size))
+ return history.BoxPtr(llimpl.do_new(size.getint()))
def do_new_with_vtable(self, args, size):
vtable = args[0].getint()
- result = llimpl.do_new(size)
- llimpl.do_setfield_gc_int(result, self.fielddescrof_vtable, vtable,
- self.memo_cast)
+ result = llimpl.do_new(size.getint())
+ llimpl.do_setfield_gc_int(result, self.fielddescrof_vtable.getint(),
+ vtable, self.memo_cast)
return history.BoxPtr(result)
def do_new_array(self, args, size):
count = args[0].getint()
- return history.BoxPtr(llimpl.do_new_array(size, count))
+ return history.BoxPtr(llimpl.do_new_array(size.getint(), count))
def do_setarrayitem_gc(self, args, arraydescr):
array = args[0].getptr_base()
@@ -318,9 +326,10 @@
llimpl.do_setarrayitem_gc_int(array, index, newvalue,
self.memo_cast)
- def do_setfield_gc(self, args, fielddescr):
+ def do_setfield_gc(self, args, fieldbox):
+ fielddescr = fieldbox.getint()
struct = args[0].getptr_base()
- if self.typefor(fielddescr) == 'ptr':
+ if self.typefor(fieldbox) == 'ptr':
newvalue = args[1].getptr_base()
llimpl.do_setfield_gc_ptr(struct, fielddescr, newvalue)
else:
@@ -329,6 +338,7 @@
self.memo_cast)
def do_setfield_raw(self, args, fielddescr):
+ fielddescr = fielddescr.getint()
struct = self.cast_int_to_adr(args[0].getint())
if self.typefor(fielddescr) == 'ptr':
newvalue = args[1].getptr_base()
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 Thu Mar 12 13:16:48 2009
@@ -68,7 +68,7 @@
self.make_sure_mc_exists()
op0 = operations[0]
op0.position = self.mc.tell()
- regalloc = RegAlloc(operations, guard_op)
+ regalloc = RegAlloc(operations, guard_op, self.cpu.translate_support_code)
if not we_are_translated():
self._regalloc = regalloc # for debugging
computed_ops = regalloc.computed_ops
@@ -405,7 +405,8 @@
def genop_strsetitem(self, op, arglocs):
base_loc, ofs_loc, val_loc = arglocs
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.cpu.translate_support_code)
self.mc.MOV(addr8_add(base_loc, ofs_loc, basesize),
lower_byte(val_loc))
@@ -413,7 +414,8 @@
def genop_strlen(self, op, arglocs, resloc):
base_loc = arglocs[0]
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.cpu.translate_support_code)
self.mc.MOV(resloc, addr_add_const(base_loc, ofs_length))
def genop_arraylen_gc(self, op, arglocs, resloc):
@@ -422,7 +424,8 @@
def genop_strgetitem(self, op, arglocs, resloc):
base_loc, ofs_loc = arglocs
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.cpu.translate_support_code)
self.mc.MOVZX(resloc, addr8_add(base_loc, ofs_loc, basesize))
def genop_merge_point(self, op, locs):
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py Thu Mar 12 13:16:48 2009
@@ -99,8 +99,9 @@
raise ValueError("convert_to_imm: got a %s" % c)
class RegAlloc(object):
- def __init__(self, operations, guard_op=None):
+ def __init__(self, operations, guard_op=None, translate_support_code=False):
# variables that have place in register
+ self.translate_support_code = translate_support_code
self.reg_bindings = newcheckdict()
self.stack_bindings = {}
# compute longevity of variables
@@ -731,16 +732,14 @@
consider_call_pure = consider_call
def consider_new(self, op, ignored):
- return self._call(op, [imm(op.descr)])
+ return self._call(op, [imm(op.descr.getint())])
def consider_new_with_vtable(self, op, ignored):
- return self._call(op, [imm(op.descr), self.loc(op.args[0])])
+ return self._call(op, [imm(op.descr.getint()), self.loc(op.args[0])])
def consider_newstr(self, op, ignored):
- ofs = symbolic.get_field_token(rstr.STR, 'chars')[0]
- ofs_items = symbolic.get_field_token(rstr.STR.chars, 'items')[0]
- ofs_length = symbolic.get_field_token(rstr.STR.chars, 'length')[0]
- return self._malloc_varsize(ofs, ofs_items, ofs_length, 0, op.args[0],
+ ofs_items, _, ofs = symbolic.get_array_token(rstr.STR, self.translate_support_code)
+ return self._malloc_varsize(0, ofs_items, ofs, 0, op.args[0],
op.result)
def _malloc_varsize(self, ofs, ofs_items, ofs_length, size, v, res_v):
@@ -768,7 +767,7 @@
return res
def consider_new_array(self, op, ignored):
- size_of_field, basesize = self._unpack_arraydescr(op.descr)
+ size_of_field, basesize, _ = self._unpack_arraydescr(op.descr)
return self._malloc_varsize(0, basesize, 0, size_of_field, op.args[0],
op.result)
@@ -805,7 +804,7 @@
[PerformDiscard(op, [base_loc, ofs_loc, value_loc])])
def consider_setarrayitem_gc(self, op, ignored):
- scale, ofs = self._unpack_arraydescr(op.descr)
+ scale, ofs, _ = self._unpack_arraydescr(op.descr)
base_loc, ops0 = self.make_sure_var_in_reg(op.args[0], op.args)
ofs_loc, ops1 = self.make_sure_var_in_reg(op.args[1], op.args)
value_loc, ops2 = self.make_sure_var_in_reg(op.args[2], op.args)
@@ -825,7 +824,7 @@
consider_getfield_gc_pure = consider_getfield_gc
def consider_getarrayitem_gc(self, op, ignored):
- scale, ofs = self._unpack_arraydescr(op.descr)
+ scale, ofs, _ = self._unpack_arraydescr(op.descr)
base_loc, ops0 = self.make_sure_var_in_reg(op.args[0], op.args)
ofs_loc, ops1 = self.make_sure_var_in_reg(op.args[1], op.args)
self.eventually_free_vars(op.args)
@@ -891,7 +890,7 @@
return ops0 + more_ops + [Perform(op, [base_loc], result_loc)]
def consider_arraylen_gc(self, op, ignored):
- _, ofs = self._unpack_arraydescr(op.descr)
+ _, ofs, _ = self._unpack_arraydescr(op.descr)
base_loc, ops0 = self.make_sure_var_in_reg(op.args[0], op.args)
self.eventually_free_vars(op.args)
result_loc, more_ops = self.force_allocate_reg(op.result, [])
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 Thu Mar 12 13:16:48 2009
@@ -4,11 +4,11 @@
from pypy.rpython.lltypesystem import lltype, llmemory, ll2ctypes, rffi, rstr
from pypy.rpython.llinterp import LLInterpreter, LLException
from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rlib.objectmodel import CDefinedIntSymbolic, specialize
+from pypy.rlib.objectmodel import CDefinedIntSymbolic, specialize, Symbolic
from pypy.rlib.objectmodel import we_are_translated, keepalive_until_here
from pypy.annotation import model as annmodel
from pypy.rpython.lltypesystem import rclass
-from pypy.jit.metainterp import history
+from pypy.jit.metainterp import history, codewriter
from pypy.jit.metainterp.history import (ResOperation, Box, Const,
ConstInt, ConstPtr, BoxInt, BoxPtr, ConstAddr)
from pypy.jit.backend.x86.assembler import Assembler386, WORD, RETURN
@@ -23,6 +23,32 @@
PTR = 1
INT = 2
+class ConstDescr3(Const):
+ def __init__(self, v):
+ self.v = v
+
+ def _v(self):
+ l = []
+ for i in self.v:
+ if isinstance(i, Symbolic):
+ l.append(id(i))
+ else:
+ l.append(i)
+ return tuple(l)
+
+
+ def __hash__(self):
+ return hash(self._v())
+
+ def __eq__(self, other):
+ return self.__class__ is other.__class__ and self._v() == other._v()
+
+ def __ne__(self, other):
+ return not self == other
+
+ def _getrepr_(self):
+ return repr(self.v)
+
class CPU386(object):
debug = True
@@ -383,7 +409,7 @@
frame[mp.stacklocs[argindex]] = self.convert_box_to_int(valuebox)
def sizeof(self, S):
- return symbolic.get_size(S)
+ return ConstInt(symbolic.get_size(S, self.translate_support_code))
numof = sizeof
# addresssuffix = str(symbolic.get_size(llmemory.Address))
@@ -405,11 +431,7 @@
def do_getarrayitem_gc(self, args, arraydescr):
field = args[1].getint()
gcref = args[0].getptr(llmemory.GCREF)
- if arraydescr < 0:
- ptr = True
- else:
- ptr = False
- shift, ofs = self.unpack_arraydescr(arraydescr)
+ shift, ofs, ptr = self.unpack_arraydescr(arraydescr)
size = 1 << shift
if size == 1:
return BoxInt(ord(rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)
@@ -427,11 +449,7 @@
def do_setarrayitem_gc(self, args, arraydescr):
field = args[1].getint()
gcref = args[0].getptr(llmemory.GCREF)
- if arraydescr < 0:
- ptr = True
- else:
- ptr = False
- shift, ofs = self.unpack_arraydescr(arraydescr)
+ shift, ofs, ptr = self.unpack_arraydescr(arraydescr)
size = 1 << shift
if size == 1:
v = args[2].getint()
@@ -447,13 +465,15 @@
raise NotImplementedError("size = %d" % size)
def do_strlen(self, args, descr=0):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.translate_support_code)
gcref = args[0].getptr(llmemory.GCREF)
v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs_length/WORD]
return BoxInt(v)
def do_strgetitem(self, args, descr=0):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.translate_support_code)
gcref = args[0].getptr(llmemory.GCREF)
i = args[1].getint()
v = rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[basesize + i]
@@ -509,16 +529,16 @@
self._base_do_setfield(fielddescr, args[0].getint(), args[1])
def do_new(self, args, descrsize):
- res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(descrsize)
+ res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(descrsize.getint())
return BoxPtr(self.cast_int_to_gcref(res))
def do_new_with_vtable(self, args, descrsize):
- res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(descrsize)
+ res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(descrsize.getint())
rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[0] = args[0].getint()
return BoxPtr(self.cast_int_to_gcref(res))
def do_new_array(self, args, arraydescr):
- size_of_field, ofs = self.unpack_arraydescr(arraydescr)
+ size_of_field, ofs, ptr = self.unpack_arraydescr(arraydescr)
num_elem = args[0].getint()
size = ofs + (1 << size_of_field) * num_elem
res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(size)
@@ -526,7 +546,8 @@
return BoxPtr(self.cast_int_to_gcref(res))
def do_newstr(self, args, descr=0):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.translate_support_code)
assert itemsize == 1
num_elem = args[0].getint()
size = basesize + num_elem
@@ -535,7 +556,8 @@
return BoxPtr(self.cast_int_to_gcref(res))
def do_strsetitem(self, args, descr=0):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ self.translate_support_code)
index = args[1].getint()
v = args[2].getint()
a = args[0].getptr(llmemory.GCREF)
@@ -565,73 +587,80 @@
adr = llmemory.cast_ptr_to_adr(x)
return CPU386.cast_adr_to_int(adr)
- @staticmethod
- def arraydescrof(A):
+ def arraydescrof(self, A):
assert isinstance(A, lltype.GcArray)
- basesize, itemsize, ofs_length = symbolic.get_array_token(A)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(A,
+ self.translate_support_code)
assert ofs_length == 0
- counter = 0
- while itemsize != 1:
- itemsize >>= 1
- counter += 1
- res = basesize + counter * 0x10000
if isinstance(A.OF, lltype.Ptr):
- res = ~res
+ ptr = True
+ else:
+ ptr = False
+ return ConstDescr3((basesize, itemsize, ptr))
+
+ def ofs_from_descr(self, descr):
+ assert isinstance(descr, ConstDescr3)
+ x = (descr.v[0] << 16) + descr.v[1]
+ if descr.v[2]:
+ return ~x
+ return x
+
+ def repack_descr(self, ofs):
+ orig_ofs = ofs
+ if ofs < 0:
+ ptr = True
+ ofs = ~ofs
+ else:
+ ptr = False
+ res = ConstDescr3((ofs>>16, ofs & 0xffff, ptr))
+ assert self.ofs_from_descr(res) == orig_ofs
return res
@staticmethod
def unpack_arraydescr(arraydescr):
- # XXX move it to some saner place, regalloc is using it
- if arraydescr < 0:
- arraydescr = ~arraydescr
- assert arraydescr
- size_of_field = arraydescr >> 16
- ofs = arraydescr & 0xffff
- return size_of_field, ofs
+ assert isinstance(arraydescr, ConstDescr3)
+ basesize, itemsize, ptr = arraydescr.v
+ counter = 0
+ while itemsize != 1:
+ itemsize >>= 1
+ counter += 1
+ return counter, basesize, ptr
- @staticmethod
- def calldescrof(argtypes, resulttype):
+ def calldescrof(self, argtypes, resulttype):
if resulttype is lltype.Void:
size = 0
else:
- size = symbolic.get_size(resulttype)
- res = (len(argtypes) << 4) + size
+ size = symbolic.get_size(resulttype, self.translate_support_code)
if isinstance(resulttype, lltype.Ptr):
- return ~res
- return res
-
- @staticmethod
- def unpack_calldescr(calldescr):
- if calldescr < 0:
- calldescr = ~calldescr
ptr = True
else:
ptr = False
- return calldescr >> 4, calldescr & 0xf, ptr
+ return ConstDescr3((len(argtypes), size, ptr))
@staticmethod
- def fielddescrof(S, fieldname):
- ofs, size = symbolic.get_field_token(S, fieldname)
- val = (size << 16) + ofs
+ def unpack_calldescr(calldescr):
+ assert isinstance(calldescr, ConstDescr3)
+ return calldescr.v
+
+ def fielddescrof(self, S, fieldname):
+ ofs, size = symbolic.get_field_token(S, fieldname,
+ self.translate_support_code)
if (isinstance(getattr(S, fieldname), lltype.Ptr) and
getattr(S, fieldname).TO._gckind == 'gc'):
- return ~val
- return val
+ ptr = True
+ else:
+ ptr = False
+ return ConstDescr3((ofs, size, ptr))
@staticmethod
def unpack_fielddescr(fielddescr):
- ptr = False
- if fielddescr < 0:
- fielddescr = ~fielddescr
- ptr = True
- ofs = fielddescr & 0xffff
- size = fielddescr >> 16
- return ofs, size, ptr
+ assert isinstance(fielddescr, ConstDescr3)
+ return fielddescr.v
@staticmethod
def typefor(fielddesc):
- if fielddesc < 0:
- return "ptr"
+ if fieldesc[2]:
+ return 'ptr'
return "int"
@staticmethod
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/symbolic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/symbolic.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/symbolic.py Thu Mar 12 13:16:48 2009
@@ -1,34 +1,50 @@
import ctypes
-from pypy.rpython.lltypesystem import lltype, ll2ctypes
+from pypy.rpython.lltypesystem import lltype, ll2ctypes, llmemory
from pypy.rlib.objectmodel import specialize
@specialize.memo()
-def get_field_token(STRUCT, fieldname):
+def get_field_token(STRUCT, fieldname, translate_support_code):
+ if translate_support_code:
+ return (llmemory.offsetof(STRUCT, fieldname),
+ get_size(STRUCT, True))
cstruct = ll2ctypes.get_ctypes_type(STRUCT)
cfield = getattr(cstruct, fieldname)
return (cfield.offset, cfield.size)
@specialize.memo()
-def get_size(TYPE):
+def get_size(TYPE, translate_support_code):
+ if translate_support_code:
+ if TYPE._is_varsize():
+ return llmemory.sizeof(TYPE, 0)
+ return llmemory.sizeof(TYPE)
ctype = ll2ctypes.get_ctypes_type(TYPE)
return ctypes.sizeof(ctype)
@specialize.memo()
-def get_array_token(T):
+def get_array_token(T, translate_support_code):
# T can be an array or a var-sized structure
- if isinstance(T, lltype.Struct):
- assert T._arrayfld is not None, "%r is not variable-sized" % (T,)
- cstruct = ll2ctypes.get_ctypes_type(T)
- cfield = getattr(cstruct, T._arrayfld)
- before_array_part = cfield.offset
- T = getattr(T, T._arrayfld)
+ if translate_support_code:
+ basesize = llmemory.sizeof(T, 0)
+ if isinstance(T, lltype.Struct):
+ itemsize = llmemory.sizeof(getattr(T, T._arrayfld).OF)
+ ofs_length = llmemory.offsetof(T, T._arrayfld)
+ else:
+ itemsize = llmemory.sizeof(T.OF)
+ ofs_length = 0
else:
- before_array_part = 0
- carray = ll2ctypes.get_ctypes_type(T)
- assert carray.length.size == 4
- ofs_length = before_array_part + carray.length.offset
- basesize = before_array_part + carray.items.offset
- carrayitem = ll2ctypes.get_ctypes_type(T.OF)
- itemsize = ctypes.sizeof(carrayitem)
+ if isinstance(T, lltype.Struct):
+ assert T._arrayfld is not None, "%r is not variable-sized" % (T,)
+ cstruct = ll2ctypes.get_ctypes_type(T)
+ cfield = getattr(cstruct, T._arrayfld)
+ before_array_part = cfield.offset
+ T = getattr(T, T._arrayfld)
+ else:
+ before_array_part = 0
+ carray = ll2ctypes.get_ctypes_type(T)
+ assert carray.length.size == 4
+ ofs_length = before_array_part + carray.length.offset
+ basesize = before_array_part + carray.items.offset
+ carrayitem = ll2ctypes.get_ctypes_type(T.OF)
+ itemsize = ctypes.sizeof(carrayitem)
return basesize, itemsize, ofs_length
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py Thu Mar 12 13:16:48 2009
@@ -204,6 +204,7 @@
(rop.INT_FLOORDIV, [ConstInt(42), BoxInt(10)], 4),
(rop.INT_RSHIFT, [ConstInt(3), BoxInt(4)], 3>>4),
(rop.INT_RSHIFT, [BoxInt(3), ConstInt(10)], 3>>10),
+ #(rop.INT_LSHIFT, [BoxInt(3), BoxInt(1)], 3<<1),
]:
assert self.execute_operation(op, args, 'int').value == res
@@ -235,7 +236,7 @@
try:
saved_addr = self.cpu.assembler.malloc_func_addr
self.cpu.assembler.malloc_func_addr = addr
- ofs = symbolic.get_field_token(rstr.STR, 'chars')[0]
+ ofs = symbolic.get_field_token(rstr.STR, 'chars', False)[0]
res = self.execute_operation(rop.NEWSTR, [ConstInt(7)], 'ptr')
assert allocs[0] == 7 + ofs + WORD
@@ -252,7 +253,7 @@
# ------------------------------------------------------------
TP = lltype.GcArray(lltype.Signed)
- ofs = symbolic.get_field_token(TP, 'length')[0]
+ ofs = symbolic.get_field_token(TP, 'length', False)[0]
descr = self.cpu.arraydescrof(TP)
res = self.execute_operation(rop.NEW_ARRAY, [ConstInt(10)],
@@ -274,8 +275,8 @@
def test_stringitems(self):
from pypy.rpython.lltypesystem.rstr import STR
- ofs = symbolic.get_field_token(STR, 'chars')[0]
- ofs_items = symbolic.get_field_token(STR.chars, 'items')[0]
+ ofs = symbolic.get_field_token(STR, 'chars', False)[0]
+ ofs_items = symbolic.get_field_token(STR.chars, 'items', False)[0]
res = self.execute_operation(rop.NEWSTR, [ConstInt(10)], 'ptr')
self.execute_operation(rop.STRSETITEM, [res, ConstInt(2), ConstInt(ord('d'))], 'void')
@@ -288,8 +289,8 @@
def test_arrayitems(self):
TP = lltype.GcArray(lltype.Signed)
- ofs = symbolic.get_field_token(TP, 'length')[0]
- itemsofs = symbolic.get_field_token(TP, 'items')[0]
+ ofs = symbolic.get_field_token(TP, 'length', False)[0]
+ itemsofs = symbolic.get_field_token(TP, 'items', False)[0]
descr = self.cpu.arraydescrof(TP)
res = self.execute_operation(rop.NEW_ARRAY, [ConstInt(10)],
'ptr', descr)
@@ -540,3 +541,4 @@
# XXX cannot work without rtyper
#s = execute(cpu, rop.INT_MUL_OVF, [BoxInt(sys.maxint/2), BoxInt(10)])
#assert cpu.get_exception()
+
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_symbolic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_symbolic.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_symbolic.py Thu Mar 12 13:16:48 2009
@@ -1,3 +1,5 @@
+import py
+py.test.skip("update me")
from pypy.jit.backend.x86.symbolic import *
from pypy.jit.backend.x86.runner import CPU386
from pypy.rpython.lltypesystem import lltype, rffi
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py Thu Mar 12 13:16:48 2009
@@ -17,7 +17,7 @@
class JitCode(history.AbstractValue):
- def __init__(self, name, cfnptr=None, calldescr=0):
+ def __init__(self, name, cfnptr=None, calldescr=None):
self.name = name
self.cfnptr = cfnptr
self.calldescr = calldescr
@@ -34,7 +34,6 @@
dump.dump_bytecode(self, file=file)
print >> file
-
class IndirectCallset(history.AbstractValue):
def __init__(self, codewriter, graphs):
keys = []
@@ -226,12 +225,15 @@
self.bytecode.dump()
else:
print repr(self.bytecode)
+ self.bytecode.dump(open("/tmp/jitcodes/%s" % self.bytecode.name, "w"))
def const_position(self, constvalue):
"""Generate a constant of the given value.
Returns its index in the list self.positions[].
"""
if constvalue is _we_are_jitted: constvalue = True
+ if isinstance(constvalue, history.Const):
+ return self.get_position(constvalue)
const = Const._new(constvalue, self.cpu)
return self.get_position(const)
@@ -525,10 +527,10 @@
# store the vtable as an address -- that's fine, because the
# GC doesn't need to follow them
self.emit('new_with_vtable',
- self.cpu.sizeof(STRUCT),
+ self.const_position(self.cpu.sizeof(STRUCT)),
self.const_position(vtable))
else:
- self.emit('new', self.cpu.sizeof(STRUCT))
+ self.emit('new', self.const_position(self.cpu.sizeof(STRUCT)))
self.register_var(op.result)
def serialize_op_malloc_varsize(self, op):
@@ -540,7 +542,7 @@
ARRAY = op.args[0].value
arraydescr = self.cpu.arraydescrof(ARRAY)
self.emit('new_array')
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(op.args[2]))
self.register_var(op.result)
@@ -567,7 +569,7 @@
self.emit(self.var_position(v_inst))
offset = self.cpu.fielddescrof(v_inst.concretetype.TO,
c_fieldname.value)
- self.emit(offset)
+ self.emit(self.const_position(offset))
self.register_var(op.result)
#self._eventualy_builtin(op.result)
@@ -585,7 +587,7 @@
self.emit(self.var_position(v_inst))
offset = self.cpu.fielddescrof(v_inst.concretetype.TO,
c_fieldname.value)
- self.emit(offset)
+ self.emit(self.const_position(offset))
self.emit(self.var_position(v_value))
def is_typeptr_getset(self, op):
@@ -604,7 +606,7 @@
arraydescr = self.cpu.arraydescrof(ARRAY)
self.emit('getarrayitem_gc')
self.emit(self.var_position(op.args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(op.args[1]))
self.register_var(op.result)
@@ -614,7 +616,7 @@
arraydescr = self.cpu.arraydescrof(ARRAY)
self.emit('setarrayitem_gc')
self.emit(self.var_position(op.args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(op.args[1]))
self.emit(self.var_position(op.args[2]))
@@ -699,7 +701,7 @@
op.args[1:],
op.result)
self.emit('residual_call')
- self.emit(calldescr)
+ self.emit(self.const_position(calldescr))
self.emit_varargs([op.args[0]] + non_void_args)
self.register_var(op.result)
@@ -747,7 +749,7 @@
calldescr, non_void_args = self.codewriter.getcalldescr(c_func, args,
op.result)
self.emit(opname)
- self.emit(calldescr)
+ self.emit(self.const_position(calldescr))
self.emit_varargs([c_func] + non_void_args)
self.register_var(op.result)
@@ -771,7 +773,7 @@
v_default.value != TP.TO.OF._defl()):
return False # variable or non-null initial value
self.emit('new_array')
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(args[0]))
self.register_var(op.result)
return True
@@ -790,7 +792,7 @@
return False
self.emit('setarrayitem_gc')
self.emit(self.var_position(args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(index))
self.emit(self.var_position(args[2]))
self.register_var(op.result)
@@ -800,7 +802,7 @@
oopspec_name == 'list.len_foldable'):
self.emit('arraylen_gc')
self.emit(self.var_position(args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.register_var(op.result)
return True
#
@@ -812,7 +814,7 @@
return False
self.emit(opname)
self.emit(self.var_position(args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(index))
self.register_var(op.result)
return True
@@ -837,7 +839,7 @@
else:
self.emit('check_neg_index')
self.emit(self.var_position(args[0]))
- self.emit(arraydescr)
+ self.emit(self.const_position(arraydescr))
self.emit(self.var_position(args[1]))
v_posindex = Variable('posindex')
v_posindex.concretetype = lltype.Signed
@@ -879,7 +881,7 @@
self.emit('guard_nonvirtualized')
self.emit(self.var_position(op.args[0]))
self.emit(self.get_position(virtualizabledesc))
- self.emit(guard_field)
+ self.emit(self.const_position(guard_field))
# ----------
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/executor.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/executor.py Thu Mar 12 13:16:48 2009
@@ -13,34 +13,34 @@
# ____________________________________________________________
-def do_int_add(cpu, args, descr=0):
+def do_int_add(cpu, args, descr=None):
return ConstInt(args[0].getint() + args[1].getint())
-def do_int_sub(cpu, args, descr=0):
+def do_int_sub(cpu, args, descr=None):
return ConstInt(args[0].getint() - args[1].getint())
-def do_int_mul(cpu, args, descr=0):
+def do_int_mul(cpu, args, descr=None):
return ConstInt(args[0].getint() * args[1].getint())
-def do_int_floordiv(cpu, args, descr=0):
+def do_int_floordiv(cpu, args, descr=None):
return ConstInt(args[0].getint() // args[1].getint())
-def do_int_mod(cpu, args, descr=0):
+def do_int_mod(cpu, args, descr=None):
return ConstInt(args[0].getint() % args[1].getint())
-def do_int_and(cpu, args, descr=0):
+def do_int_and(cpu, args, descr=None):
return ConstInt(args[0].getint() & args[1].getint())
-def do_int_or(cpu, args, descr=0):
+def do_int_or(cpu, args, descr=None):
return ConstInt(args[0].getint() | args[1].getint())
-def do_int_xor(cpu, args, descr=0):
+def do_int_xor(cpu, args, descr=None):
return ConstInt(args[0].getint() ^ args[1].getint())
-def do_int_rshift(cpu, args, descr=0):
+def do_int_rshift(cpu, args, descr=None):
return ConstInt(args[0].getint() >> args[1].getint())
-def do_int_lshift(cpu, args, descr=0):
+def do_int_lshift(cpu, args, descr=None):
return ConstInt(args[0].getint() << args[1].getint())
do_uint_add = do_int_add
@@ -48,71 +48,71 @@
do_uint_mul = do_int_mul
do_uint_lshift = do_int_lshift
-def do_uint_rshift(cpu, args, descr=0):
+def do_uint_rshift(cpu, args, descr=None):
v = r_uint(args[0].getint()) >> r_uint(args[1].getint())
return ConstInt(intmask(v))
# ----------
-def do_int_lt(cpu, args, descr=0):
+def do_int_lt(cpu, args, descr=None):
return ConstInt(args[0].getint() < args[1].getint())
-def do_int_le(cpu, args, descr=0):
+def do_int_le(cpu, args, descr=None):
return ConstInt(args[0].getint() <= args[1].getint())
-def do_int_eq(cpu, args, descr=0):
+def do_int_eq(cpu, args, descr=None):
return ConstInt(args[0].getint() == args[1].getint())
-def do_int_ne(cpu, args, descr=0):
+def do_int_ne(cpu, args, descr=None):
return ConstInt(args[0].getint() != args[1].getint())
-def do_int_gt(cpu, args, descr=0):
+def do_int_gt(cpu, args, descr=None):
return ConstInt(args[0].getint() > args[1].getint())
-def do_int_ge(cpu, args, descr=0):
+def do_int_ge(cpu, args, descr=None):
return ConstInt(args[0].getint() >= args[1].getint())
-def do_uint_lt(cpu, args, descr=0):
+def do_uint_lt(cpu, args, descr=None):
return ConstInt(r_uint(args[0].getint()) < r_uint(args[1].getint()))
-def do_uint_le(cpu, args, descr=0):
+def do_uint_le(cpu, args, descr=None):
return ConstInt(r_uint(args[0].getint()) <= r_uint(args[1].getint()))
do_uint_eq = do_int_eq
do_uint_ne = do_int_ne
-def do_uint_gt(cpu, args, descr=0):
+def do_uint_gt(cpu, args, descr=None):
return ConstInt(r_uint(args[0].getint()) > r_uint(args[1].getint()))
-def do_uint_ge(cpu, args, descr=0):
+def do_uint_ge(cpu, args, descr=None):
return ConstInt(r_uint(args[0].getint()) >= r_uint(args[1].getint()))
# ----------
-def do_int_is_true(cpu, args, descr=0):
+def do_int_is_true(cpu, args, descr=None):
return ConstInt(bool(args[0].getint()))
do_uint_is_true = do_int_is_true
-def do_int_neg(cpu, args, descr=0):
+def do_int_neg(cpu, args, descr=None):
return ConstInt(-args[0].getint())
-def do_int_invert(cpu, args, descr=0):
+def do_int_invert(cpu, args, descr=None):
return ConstInt(~args[0].getint())
-def do_bool_not(cpu, args, descr=0):
+def do_bool_not(cpu, args, descr=None):
return ConstInt(not args[0].getint())
-def do_oononnull(cpu, args, descr=0):
+def do_oononnull(cpu, args, descr=None):
return ConstInt(bool(args[0].getptr_base()))
-def do_ooisnull(cpu, args, descr=0):
+def do_ooisnull(cpu, args, descr=None):
return ConstInt(not args[0].getptr_base())
-def do_oois(cpu, args, descr=0):
+def do_oois(cpu, args, descr=None):
return ConstInt(args[0].getptr_base() == args[1].getptr_base())
-def do_ooisnot(cpu, args, descr=0):
+def do_ooisnot(cpu, args, descr=None):
return ConstInt(args[0].getptr_base() != args[1].getptr_base())
# ----------
@@ -136,7 +136,7 @@
# ----------
-def do_int_add_ovf(cpu, args, descr=0):
+def do_int_add_ovf(cpu, args, descr=None):
x = args[0].getint()
y = args[1].getint()
try:
@@ -146,7 +146,7 @@
z = 0
return BoxInt(z)
-def do_int_sub_ovf(cpu, args, descr=0):
+def do_int_sub_ovf(cpu, args, descr=None):
x = args[0].getint()
y = args[1].getint()
try:
@@ -156,7 +156,7 @@
z = 0
return BoxInt(z)
-def do_int_mul_ovf(cpu, args, descr=0):
+def do_int_mul_ovf(cpu, args, descr=None):
x = args[0].getint()
y = args[1].getint()
try:
@@ -166,7 +166,7 @@
z = 0
return BoxInt(z)
-def do_int_neg_ovf(cpu, args, descr=0):
+def do_int_neg_ovf(cpu, args, descr=None):
x = args[0].getint()
try:
z = ovfcheck(-x)
@@ -175,7 +175,7 @@
z = 0
return BoxInt(z)
-def do_int_mod_ovf(cpu, args, descr=0):
+def do_int_mod_ovf(cpu, args, descr=None):
x = args[0].getint()
y = args[1].getint()
try:
@@ -213,7 +213,7 @@
return cpu._execute_list[opnum]
get_execute_function._annspecialcase_ = 'specialize:memo'
-def execute(cpu, opnum, argboxes, descr=0):
+def execute(cpu, opnum, argboxes, descr=None):
func = get_execute_function(cpu, opnum)
return func(cpu, argboxes, descr)
execute._annspecialcase_ = 'specialize:arg(1)'
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py Thu Mar 12 13:16:48 2009
@@ -1,6 +1,6 @@
from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rlib.objectmodel import we_are_translated, r_dict, ComputedIntSymbolic
+from pypy.rlib.objectmodel import we_are_translated, r_dict, Symbolic
from pypy.rlib.rarithmetic import intmask
from pypy.tool.uid import uid
from pypy.conftest import option
@@ -109,13 +109,23 @@
return 'Const(%s)' % self._getrepr_()
def __eq__(self, other):
- return self.__class__ is other.__class__ and self.value == other.value
+ if self.__class__ is not other.__class__:
+ return False
+ if isinstance(self.value, Symbolic):
+ v = id(self.value)
+ else:
+ v = self.value
+ if isinstance(other.value, Symbolic):
+ v2 = id(other.value)
+ else:
+ v2 = other.value
+ return v == v2
def __ne__(self, other):
return not (self == other)
def __hash__(self):
- if isinstance(self.value, ComputedIntSymbolic):
+ if isinstance(self.value, Symbolic):
return id(self.value)
return self.get_()
@@ -128,7 +138,7 @@
if isinstance(value, int):
value = int(value) # bool -> int
else:
- assert isinstance(value, ComputedIntSymbolic)
+ assert isinstance(value, Symbolic)
self.value = value
def clonebox(self):
@@ -257,7 +267,7 @@
if isinstance(value, int):
value = int(value) # bool -> int
else:
- assert isinstance(value, ComputedIntSymbolic)
+ assert isinstance(value, Symbolic)
self.value = value
def clonebox(self):
@@ -373,17 +383,17 @@
def __init__(self, cpu):
self.cpu = cpu
self.operations = []
- def record(self, opnum, argboxes, resbox, descr=0):
+ def record(self, opnum, argboxes, resbox, descr=None):
raise NotImplementedError
class History(RunningMatcher):
- def record(self, opnum, argboxes, resbox, descr=0):
+ def record(self, opnum, argboxes, resbox, descr=None):
op = ResOperation(opnum, argboxes, resbox, descr)
self.operations.append(op)
return op
class BlackHole(RunningMatcher):
- def record(self, opnum, argboxes, resbox, descr=0):
+ def record(self, opnum, argboxes, resbox, descr=None):
return None
def mp_eq(greenkey1, greenkey2):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py Thu Mar 12 13:16:48 2009
@@ -33,6 +33,11 @@
class CancelInefficientLoop(Exception):
pass
+def convert_vdesc(cpu, vdesc):
+ if vdesc:
+ return [cpu.ofs_from_descr(i) for i in vdesc.virtuals]
+ return []
+
class AllocationStorage(object):
def __init__(self):
# allocations: list of vtables to allocate
@@ -142,7 +147,7 @@
node.escape_if_startbox(memo)
else:
for key, node in self.curfields.items():
- if self.vdesc and key not in self.vdesc.virtuals:
+ if self.vdesc is not None and key not in self.vdesc:
esc_self = True
else:
esc_self = False
@@ -151,7 +156,7 @@
# if they're not marked specifically as ones that does not escape
for key, node in self.origfields.items():
if key not in self.curfields:
- if self.vdesc and key not in self.vdesc.virtuals:
+ if self.vdesc is not None and key not in self.vdesc:
esc_self = True
else:
esc_self = False
@@ -162,8 +167,8 @@
for ofs, node in self.origfields.items():
if ofs in other.curfields:
node.add_to_dependency_graph(other.curfields[ofs], dep_graph)
- if (self.virtualized and self.vdesc and
- ofs in self.vdesc.virtuals):
+ if (self.virtualized and self.vdesc is not None and
+ ofs in self.vdesc):
node.add_to_dependency_graph(other.origfields[ofs], dep_graph)
def intersect(self, other, nodes):
@@ -255,7 +260,7 @@
# This does "Perfect specialization" as per doc/jitpl5.txt.
perfect_specializer = PerfectSpecializer(loop, options)
- perfect_specializer.find_nodes()
+ perfect_specializer.find_nodes(cpu)
perfect_specializer.intersect_input_and_output()
for old_loop in old_loops:
if perfect_specializer.match_exactly(old_loop):
@@ -268,7 +273,7 @@
return old_loops[0]
perfect_specializer = PerfectSpecializer(bridge, options)
- perfect_specializer.find_nodes()
+ perfect_specializer.find_nodes(cpu)
for old_loop in old_loops:
if perfect_specializer.match(old_loop.operations):
perfect_specializer.adapt_for_match(old_loop.operations)
@@ -339,7 +344,7 @@
## instnode.cursize += 1
## self.dependency_graph.append((instnode, fieldnode))
- def find_nodes(self):
+ def find_nodes(self, cpu):
# Steps (1) and (2)
self.first_escaping_op = True
# only catch can have consts
@@ -421,19 +426,19 @@
continue
elif opnum == rop.SETFIELD_GC:
instnode = self.getnode(op.args[0])
- field = op.descr
+ field = cpu.ofs_from_descr(op.descr)
self.find_nodes_setfield(instnode, field,
self.getnode(op.args[1]))
continue
elif opnum == rop.GETFIELD_GC:
instnode = self.getnode(op.args[0])
- field = op.descr
+ field = cpu.ofs_from_descr(op.descr)
box = op.result
self.find_nodes_getfield(instnode, field, box)
continue
elif opnum == rop.GETFIELD_GC_PURE:
instnode = self.getnode(op.args[0])
- field = op.descr
+ field = cpu.ofs_from_descr(op.descr)
if not instnode.const:
box = op.result
self.find_nodes_getfield(instnode, field, box)
@@ -532,7 +537,7 @@
instnode.virtualized = True
if instnode.cls is None:
instnode.cls = InstanceNode(op.args[1], const=True)
- instnode.vdesc = op.vdesc
+ instnode.vdesc = convert_vdesc(cpu, op.vdesc)
continue
elif op.is_always_pure():
for arg in op.args:
@@ -593,14 +598,14 @@
specnodes.append(enternode.intersect(leavenode, self.nodes))
self.specnodes = specnodes
- def expanded_version_of(self, boxlist, oplist):
+ def expanded_version_of(self, boxlist, oplist, cpu):
# oplist is None means at the start
newboxlist = []
assert len(boxlist) == len(self.specnodes)
for i in range(len(boxlist)):
box = boxlist[i]
specnode = self.specnodes[i]
- specnode.expand_boxlist(self.nodes[box], newboxlist, oplist)
+ specnode.expand_boxlist(self.nodes[box], newboxlist, oplist, cpu)
return newboxlist
def optimize_guard(self, op, cpu):
@@ -718,7 +723,7 @@
# self.ready_results[newoperations[-1].results[0]] = None
opnum = op.opnum
if opnum == rop.MERGE_POINT:
- args = self.expanded_version_of(op.args, None)
+ args = self.expanded_version_of(op.args, None, cpu)
op = ResOperation(rop.MERGE_POINT, args, None)
newoperations.append(op)
#for arg in op.args:
@@ -728,11 +733,11 @@
# for arg in op.args:
# self.ready_results[arg] = None
elif opnum == rop.JUMP:
- args = self.expanded_version_of(op.args, newoperations)
+ args = self.expanded_version_of(op.args, newoperations, cpu)
for arg in args:
if arg in self.nodes:
assert not self.nodes[arg].virtual
- self.cleanup_field_caches(newoperations)
+ self.cleanup_field_caches(newoperations, cpu)
op = ResOperation(rop.JUMP, args, None)
newoperations.append(op)
continue
@@ -792,14 +797,16 @@
continue
elif opnum == rop.GETFIELD_GC:
instnode = self.nodes[op.args[0]]
- if self.optimize_getfield(instnode, op.descr, op.result):
+ ofs = cpu.ofs_from_descr(op.descr)
+ if self.optimize_getfield(instnode, ofs, op.result):
continue
# otherwise we need this getfield, but it does not
# invalidate caches
elif opnum == rop.GETFIELD_GC_PURE:
instnode = self.nodes[op.args[0]]
if not instnode.const:
- if self.optimize_getfield(instnode, op.descr, op.result):
+ ofs = cpu.ofs_from_descr(op.descr)
+ if self.optimize_getfield(instnode, ofs, op.result):
continue
elif opnum == rop.GETARRAYITEM_GC:
instnode = self.nodes[op.args[0]]
@@ -880,7 +887,7 @@
elif opnum == rop.SETFIELD_GC:
instnode = self.nodes[op.args[0]]
valuenode = self.nodes[op.args[1]]
- ofs = op.descr
+ ofs = cpu.ofs_from_descr(op.descr)
self.optimize_setfield(instnode, ofs, valuenode, op.args[1])
continue
elif opnum == rop.SETARRAYITEM_GC:
@@ -947,7 +954,7 @@
opnum != rop.SETARRAYITEM_GC):
# the setfield operations do not clean up caches, although
# they have side effects
- self.cleanup_field_caches(newoperations)
+ self.cleanup_field_caches(newoperations, cpu)
if op.can_raise():
exception_might_have_happened = True
box = op.result
@@ -959,7 +966,7 @@
newoperations[0].specnodes = self.specnodes
self.loop.operations = newoperations
- def cleanup_field_caches(self, newoperations):
+ def cleanup_field_caches(self, newoperations, cpu):
# we need to invalidate everything
for node in self.nodes.values():
for ofs, valuenode in node.dirtyfields.items():
@@ -972,8 +979,9 @@
[node.source, ConstInt(ofs), valuenode.source],
None, ld.arraydescr))
else:
+ descr = cpu.repack_descr(ofs)
newoperations.append(ResOperation(rop.SETFIELD_GC,
- [node.source, valuenode.source], None, ofs))
+ [node.source, valuenode.source], None, descr))
node.dirtyfields = {}
node.cleanfields = {}
@@ -1046,8 +1054,9 @@
box = box_from_index(allocated_boxes, allocated_lists,
boxes_from_frame,
index_in_alloc)
+ descr = metainterp.cpu.repack_descr(ofs)
metainterp.execute_and_record(rop.SETFIELD_GC,
- [box, fieldbox], ofs)
+ [box, fieldbox], descr)
for index_in_alloc, ad, ofs, index_in_arglist in storage.setitems:
itembox = box_from_index(allocated_boxes, allocated_lists,
boxes_from_frame, index_in_arglist)
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py Thu Mar 12 13:16:48 2009
@@ -311,38 +311,38 @@
except KeyError:
pass
- @arguments("int")
+ @arguments("constbox")
def opimpl_new(self, size):
self.execute(rop.NEW, [], descr=size)
- @arguments("int", "constbox")
+ @arguments("constbox", "constbox")
def opimpl_new_with_vtable(self, size, vtablebox):
self.execute(rop.NEW_WITH_VTABLE, [vtablebox], descr=size)
- @arguments("int", "box")
+ @arguments("constbox", "box")
def opimpl_new_array(self, itemsize, countbox):
self.execute(rop.NEW_ARRAY, [countbox], descr=itemsize)
- @arguments("box", "int", "box")
+ @arguments("box", "constbox", "box")
def opimpl_getarrayitem_gc(self, arraybox, arraydesc, indexbox):
self.execute(rop.GETARRAYITEM_GC, [arraybox, indexbox],
descr=arraydesc)
- @arguments("box", "int", "box")
+ @arguments("box", "constbox", "box")
def opimpl_getarrayitem_gc_pure(self, arraybox, arraydesc, indexbox):
self.execute(rop.GETARRAYITEM_GC_PURE, [arraybox, indexbox],
descr=arraydesc)
- @arguments("box", "int", "box", "box")
+ @arguments("box", "constbox", "box", "box")
def opimpl_setarrayitem_gc(self, arraybox, arraydesc, indexbox, itembox):
self.execute(rop.SETARRAYITEM_GC, [arraybox, indexbox, itembox],
descr=arraydesc)
- @arguments("box", "int")
+ @arguments("box", "constbox")
def opimpl_arraylen_gc(self, arraybox, arraydesc):
self.execute(rop.ARRAYLEN_GC, [arraybox], descr=arraydesc)
- @arguments("orgpc", "box", "int", "box")
+ @arguments("orgpc", "box", "constbox", "box")
def opimpl_check_neg_index(self, pc, arraybox, arraydesc, indexbox):
negbox = self.metainterp.execute_and_record(
rop.INT_LT, [indexbox, ConstInt(0)])
@@ -372,23 +372,23 @@
self.execute(rop.OOISNOT, [box1, box2])
- @arguments("box", "int")
+ @arguments("box", "constbox")
def opimpl_getfield_gc(self, box, fielddesc):
self.execute(rop.GETFIELD_GC, [box], descr=fielddesc)
- @arguments("box", "int")
+ @arguments("box", "constbox")
def opimpl_getfield_gc_pure(self, box, fielddesc):
self.execute(rop.GETFIELD_GC_PURE, [box], descr=fielddesc)
- @arguments("box", "int", "box")
+ @arguments("box", "constbox", "box")
def opimpl_setfield_gc(self, box, fielddesc, valuebox):
self.execute(rop.SETFIELD_GC, [box, valuebox], descr=fielddesc)
- @arguments("box", "int")
+ @arguments("box", "constbox")
def opimpl_getfield_raw(self, box, fielddesc):
self.execute(rop.GETFIELD_RAW, [box], descr=fielddesc)
- @arguments("box", "int")
+ @arguments("box", "constbox")
def opimpl_getfield_raw_pure(self, box, fielddesc):
self.execute(rop.GETFIELD_RAW_PURE, [box], descr=fielddesc)
- @arguments("box", "int", "box")
+ @arguments("box", "constbox", "box")
def opimpl_setfield_raw(self, box, fielddesc, valuebox):
self.execute(rop.SETFIELD_RAW, [box, valuebox], descr=fielddesc)
@@ -407,11 +407,11 @@
f.setup_call(varargs)
return True
- @arguments("int", "varargs")
+ @arguments("constbox", "varargs")
def opimpl_residual_call(self, calldescr, varargs):
return self.execute_with_exc(rop.CALL, varargs, descr=calldescr)
- @arguments("int", "varargs")
+ @arguments("constbox", "varargs")
def opimpl_residual_call_pure(self, calldescr, varargs):
self.execute(rop.CALL_PURE, varargs, descr=calldescr)
@@ -655,13 +655,13 @@
return ConstInt(self.metainterp.cpu.cast_adr_to_int(cls))
@specialize.arg(1)
- def execute(self, opnum, argboxes, descr=0):
+ def execute(self, opnum, argboxes, descr=None):
resbox = self.metainterp.execute_and_record(opnum, argboxes, descr)
if resbox is not None:
self.make_result_box(resbox)
@specialize.arg(1)
- def execute_with_exc(self, opnum, argboxes, descr=0):
+ def execute_with_exc(self, opnum, argboxes, descr=None):
cpu = self.metainterp.cpu
resbox = executor.execute(cpu, opnum, argboxes, descr)
if not we_are_translated():
@@ -763,7 +763,7 @@
return False
return True
- def execute_and_record(self, opnum, argboxes, descr=0):
+ def execute_and_record(self, opnum, argboxes, descr=None):
# execute the operation first
resbox = executor.execute(self.cpu, opnum, argboxes, descr)
# check if the operation can be constant-folded away
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/resoperation.py Thu Mar 12 13:16:48 2009
@@ -17,7 +17,8 @@
# for 'guard_nonvirtualizable'
vdesc = None
- def __init__(self, opnum, args, result, descr=0):
+ def __init__(self, opnum, args, result, descr=None):
+ from pypy.jit.metainterp.history import AbstractValue
assert isinstance(opnum, int)
self.opnum = opnum
self.args = list(args)
@@ -25,7 +26,8 @@
self.result = result
# for 'call', 'new', 'getfield_gc'...: the descr is a number provided
# by the backend holding details about the type of the operation
- assert isinstance(descr, int)
+ if descr is not None:
+ assert isinstance(descr, AbstractValue)
self.descr = descr
def __repr__(self):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py Thu Mar 12 13:16:48 2009
@@ -4,7 +4,7 @@
class SpecNode(object):
- def expand_boxlist(self, instnode, newboxlist, start):
+ def expand_boxlist(self, instnode, newboxlist, start, cpu):
newboxlist.append(instnode.source)
def extract_runtime_data(self, cpu, valuebox, resultlist):
@@ -119,15 +119,16 @@
return False
return True
- def expand_boxlist(self, instnode, newboxlist, start):
+ def expand_boxlist(self, instnode, newboxlist, start, cpu):
for ofs, subspecnode in self.fields:
subinstnode = instnode.curfields[ofs] # should really be there
- subspecnode.expand_boxlist(subinstnode, newboxlist, start)
+ subspecnode.expand_boxlist(subinstnode, newboxlist, start, cpu)
def extract_runtime_data(self, cpu, valuebox, resultlist):
for ofs, subspecnode in self.fields:
+ descr = cpu.repack_descr(ofs)
fieldbox = executor.execute(cpu, rop.GETFIELD_GC,
- [valuebox], ofs)
+ [valuebox], descr)
subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
def adapt_to(self, instnode):
@@ -136,9 +137,10 @@
class VirtualizedSpecNode(SpecNodeWithFields):
- def expand_boxlist(self, instnode, newboxlist, start):
+ def expand_boxlist(self, instnode, newboxlist, start, cpu):
newboxlist.append(instnode.source)
- SpecNodeWithFields.expand_boxlist(self, instnode, newboxlist, start)
+ SpecNodeWithFields.expand_boxlist(self, instnode, newboxlist, start,
+ cpu)
def extract_runtime_data(self, cpu, valuebox, resultlist):
resultlist.append(valuebox)
@@ -150,7 +152,7 @@
class DelayedSpecNode(VirtualizedSpecNode):
- def expand_boxlist(self, instnode, newboxlist, oplist):
+ def expand_boxlist(self, instnode, newboxlist, oplist, cpu):
newboxlist.append(instnode.source)
for ofs, subspecnode in self.fields:
assert isinstance(subspecnode, SpecNodeWithBox)
@@ -162,13 +164,14 @@
newboxlist.append(instnode.cleanfields[ofs].source)
else:
box = subspecnode.box.clonebox()
+ descr = cpu.repack_descr(ofs)
oplist.append(ResOperation(rop.GETFIELD_GC,
- [instnode.source], box, ofs))
+ [instnode.source], box, descr))
newboxlist.append(box)
class DelayedFixedListSpecNode(DelayedSpecNode):
- def expand_boxlist(self, instnode, newboxlist, oplist):
+ def expand_boxlist(self, instnode, newboxlist, oplist, cpu):
from pypy.jit.metainterp.history import ResOperation, ConstInt
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.optimize import FixedList
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize.py Thu Mar 12 13:16:48 2009
@@ -70,7 +70,7 @@
# Box._extended_display = saved
return True
-def ResOperation(opname, args, result, descr=0):
+def ResOperation(opname, args, result, descr=None):
if opname == 'escape':
opnum = -123 # random number not in the list
else:
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py Thu Mar 12 13:16:48 2009
@@ -168,7 +168,6 @@
locals().update(B.__dict__)
n2 = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
v2 = BoxInt(13)
- sizebox = ConstInt(cpu.sizeof(NODE))
ops = [
ResOperation('merge_point', [fr], None),
ResOperation('guard_nonvirtualized', [fr, ConstAddr(xy_vtable, cpu)],
More information about the Pypy-commit
mailing list