[pypy-svn] r37562 - in pypy/dist/pypy/jit: codegen codegen/dump codegen/i386 codegen/llgraph codegen/ppc timeshifter
ac at codespeak.net
ac at codespeak.net
Mon Jan 29 20:01:10 CET 2007
Author: ac
Date: Mon Jan 29 20:01:04 2007
New Revision: 37562
Modified:
pypy/dist/pypy/jit/codegen/dump/rgenop.py
pypy/dist/pypy/jit/codegen/graph2rgenop.py
pypy/dist/pypy/jit/codegen/i386/rgenop.py
pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
pypy/dist/pypy/jit/codegen/model.py
pypy/dist/pypy/jit/codegen/ppc/rgenop.py
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
Log:
(pedronis, arre) Make genop of ptr test operations special so the llgraph
backend can do the right thing typewise. Share the replay builder between
machinecode backends.
Modified: pypy/dist/pypy/jit/codegen/dump/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/dump/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/dump/rgenop.py Mon Jan 29 20:01:04 2007
@@ -120,6 +120,44 @@
self.rgenop.vname(gv_arg2)))
return v
+ def genop_ptr_iszero(self, kind, gv_ptr):
+ v = self.llbuilder.genop_ptr_iszero(kind, gv_ptr)
+ self.dump("%s = %s.genop_ptr_iszero(%s, %s)" % (
+ self.rgenop.vname(v),
+ self.name,
+ self.rgenop.kindtokenname(kind),
+ self.rgenop.vname(gv_ptr)))
+ return v
+
+ def genop_ptr_nonzero(self, kind, gv_ptr):
+ v = self.llbuilder.genop_ptr_nonzero(kind, gv_ptr)
+ self.dump("%s = %s.genop_ptr_nonzero(%s, %s)" % (
+ self.rgenop.vname(v),
+ self.name,
+ self.rgenop.kindtokenname(kind),
+ self.rgenop.vname(gv_ptr)))
+ return v
+
+ def genop_ptr_eq(self, kind, gv_ptr1, gv_ptr2):
+ v = self.llbuilder.genop_ptr_eq(kind, gv_ptr1, gv_ptr2)
+ self.dump("%s = %s.genop_ptr_eq(%s, %s, %s)" % (
+ self.rgenop.vname(v),
+ self.name,
+ self.rgenop.kindtokenname(kind),
+ self.rgenop.vname(gv_ptr1),
+ self.rgenop.vname(gv_ptr2)))
+ return v
+
+ def genop_ptr_ne(self, kind, gv_ptr1, gv_ptr2):
+ v = self.llbuilder.genop_ptr_ne(kind, gv_ptr1, gv_ptr2)
+ self.dump("%s = %s.genop_ptr_ne(%s, %s, %s)" % (
+ self.rgenop.vname(v),
+ self.name,
+ self.rgenop.kindtokenname(kind),
+ self.rgenop.vname(gv_ptr1),
+ self.rgenop.vname(gv_ptr2)))
+ return v
+
def genop_same_as(self, kind, gv_x):
v = self.llbuilder.genop_same_as(kind, gv_x)
self.dump("%s = %s.genop_same_as(%s, %s)" % (
Modified: pypy/dist/pypy/jit/codegen/graph2rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/graph2rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/graph2rgenop.py Mon Jan 29 20:01:04 2007
@@ -151,6 +151,27 @@
elif op.opname == 'same_as':
token = rgenop.kindToken(op.args[0].concretetype)
gv_result = builder.genop_same_as(token, var2gv(op.args[0]))
+
+ elif op.opname == 'ptr_iszero':
+ token = rgenop.kindToken(op.args[0].concretetype)
+ gv_result = builder.genop_ptr_iszero(token, var2gv(op.args[0]))
+
+ elif op.opname == 'ptr_nonzero':
+ token = rgenop.kindToken(op.args[0].concretetype)
+ gv_result = builder.genop_ptr_nonzero(token, var2gv(op.args[0]))
+
+ elif op.opname == 'ptr_eq':
+ token = rgenop.kindToken(op.args[0].concretetype)
+ gv_result = builder.genop_ptr_eq(token,
+ var2gv(op.args[0]),
+ var2gv(op.args[1]))
+
+ elif op.opname == 'ptr_ne':
+ token = rgenop.kindToken(op.args[0].concretetype)
+ gv_result = builder.genop_ptr_ne(token,
+ var2gv(op.args[0]),
+ var2gv(op.args[1]))
+
elif len(op.args) == 1:
gv_result = builder.genop1(op.opname, var2gv(op.args[0]))
elif len(op.args) == 2:
Modified: pypy/dist/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/rgenop.py Mon Jan 29 20:01:04 2007
@@ -3,6 +3,7 @@
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.jit.codegen.model import AbstractRGenOp, GenLabel, GenBuilder
from pypy.jit.codegen.model import GenVar, GenConst, CodeGenSwitch
+from pypy.jit.codegen.model import ReplayBuilder
from pypy.jit.codegen.i386.codebuf import CodeBlockOverflow
from pypy.jit.codegen.i386.operation import *
from pypy.jit.codegen.i386.regalloc import RegAllocator, StorageInStack, Place
@@ -370,6 +371,30 @@
self.operations.append(op)
return op
+ def genop_ptr_iszero(self, kind, gv_ptr):
+ cls = getopclass1('ptr_iszero')
+ op = cls(gv_ptr)
+ self.operations.append(op)
+ return op
+
+ def genop_ptr_nonzero(self, kind, gv_ptr):
+ cls = getopclass1('ptr_nonzero')
+ op = cls(gv_ptr)
+ self.operations.append(op)
+ return op
+
+ def genop_ptr_eq(self, kind, gv_ptr1, gv_ptr2):
+ cls = getopclass2('ptr_eq')
+ op = cls(gv_ptr1, gv_ptr2)
+ self.operations.append(op)
+ return op
+
+ def genop_ptr_ne(self, kind, gv_ptr1, gv_ptr2):
+ cls = getopclass2('ptr_ne')
+ op = cls(gv_ptr1, gv_ptr2)
+ self.operations.append(op)
+ return op
+
def genop_same_as(self, kind, gv_x):
if gv_x.is_const: # must always return a var
op = OpSameAs(gv_x)
@@ -494,97 +519,6 @@
# ____________________________________________________________
-dummy_var = GenVar()
-
-class ReplayFlexSwitch(CodeGenSwitch):
-
- def __init__(self, replay_builder):
- self.replay_builder = replay_builder
-
- def add_case(self, gv_case):
- return self.replay_builder
-
-class ReplayBuilder(GenBuilder):
-
- def __init__(self, rgenop):
- self.rgenop = rgenop
-
- def end(self):
- pass
-
- @specialize.arg(1)
- def genop1(self, opname, gv_arg):
- return dummy_var
-
- @specialize.arg(1)
- def genop2(self, opname, gv_arg1, gv_arg2):
- return dummy_var
-
- def genop_getfield(self, fieldtoken, gv_ptr):
- return dummy_var
-
- def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
- return dummy_var
-
- def genop_getsubstruct(self, fieldtoken, gv_ptr):
- return dummy_var
-
- def genop_getarrayitem(self, arraytoken, gv_ptr, gv_index):
- return dummy_var
-
- def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
- return dummy_var
-
- def genop_getarraysize(self, arraytoken, gv_ptr):
- return dummy_var
-
- def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
- return dummy_var
-
- def genop_malloc_fixedsize(self, size):
- return dummy_var
-
- def genop_malloc_varsize(self, varsizealloctoken, gv_size):
- return dummy_var
-
- def genop_call(self, sigtoken, gv_fnptr, args_gv):
- return dummy_var
-
- def genop_same_as(self, kind, gv_x):
- return dummy_var
-
- def genop_debug_pdb(self): # may take an args_gv later
- pass
-
- def enter_next_block(self, kinds, args_gv):
- return None
-
- def jump_if_false(self, gv_condition, args_gv):
- return self
-
- def jump_if_true(self, gv_condition, args_gv):
- return self
-
- def finish_and_return(self, sigtoken, gv_returnvar):
- pass
-
- def finish_and_goto(self, outputargs_gv, target):
- pass
-
- def flexswitch(self, gv_exitswitch, args_gv):
- flexswitch = ReplayFlexSwitch(self)
- return flexswitch, self
-
- def show_incremental_progress(self):
- pass
-
- def genop_get_frame_base(self):
- return dummy_var
-
- def get_frame_info(self, vars_gv):
- return None
-
-# ____________________________________________________________
class RI386GenOp(AbstractRGenOp):
from pypy.jit.codegen.i386.codebuf import MachineCodeBlock
Modified: pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/rgenop.py Mon Jan 29 20:01:04 2007
@@ -37,6 +37,7 @@
gv_Void = gv_TYPE(lltype.Void)
gv_Signed = gv_TYPE(lltype.Signed)
+gv_Bool = gv_TYPE(lltype.Bool)
gv_dummy_placeholder = LLConst(llimpl.dummy_placeholder)
gv_Address = gv_TYPE(llmemory.Address)
@@ -201,6 +202,34 @@
"genop_same_as: bad currently_writing")
return LLVar(llimpl.genop(self.b, 'same_as', [gv_value], gv_TYPE.v))
+ def genop_ptr_iszero(self, gv_PTRTYPE, gv_ptr):
+ debug_assert(self.rgenop.currently_writing is self,
+ "genop_ptr_iszero: bad currently_writing")
+ gv_ptr = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr.v)
+ return LLVar(llimpl.genop(self.b, 'ptr_iszero', [gv_ptr], gv_Bool.v))
+
+ def genop_ptr_nonzero(self, gv_PTRTYPE, gv_ptr):
+ debug_assert(self.rgenop.currently_writing is self,
+ "genop_ptr_nonzero: bad currently_writing")
+ gv_ptr = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr.v)
+ return LLVar(llimpl.genop(self.b, 'ptr_nonzero', [gv_ptr], gv_Bool.v))
+
+ def genop_ptr_eq(self, gv_PTRTYPE, gv_ptr1, gv_ptr2):
+ debug_assert(self.rgenop.currently_writing is self,
+ "genop_ptr_eq: bad currently_writing")
+ gv_ptr1 = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr1.v)
+ gv_ptr2 = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr2.v)
+ return LLVar(llimpl.genop(self.b, 'ptr_eq', [gv_ptr1, gv_ptr2],
+ gv_Bool.v))
+
+ def genop_ptr_ne(self, gv_PTRTYPE, gv_ptr1, gv_ptr2):
+ debug_assert(self.rgenop.currently_writing is self,
+ "genop_ptr_ne: bad currently_writing")
+ gv_ptr1 = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr1.v)
+ gv_ptr2 = llimpl.cast(self.b, gv_PTRTYPE.v, gv_ptr2.v)
+ return LLVar(llimpl.genop(self.b, 'ptr_ne', [gv_ptr1, gv_ptr2],
+ gv_Bool.v))
+
def _newblock(self, kinds):
self.b = newb = llimpl.newblock()
return [LLVar(llimpl.geninputarg(newb, kind.v)) for kind in kinds]
Modified: pypy/dist/pypy/jit/codegen/model.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/model.py (original)
+++ pypy/dist/pypy/jit/codegen/model.py Mon Jan 29 20:01:04 2007
@@ -76,6 +76,10 @@
## def genop_call(self, sigtoken, gv_fnptr, args_gv):
## def genop_same_as(self, kindtoken, gv_x):
## def genop_debug_pdb(self): # may take an args_gv later
+## def genop_ptr_iszero(self, kindtoken, gv_ptr)
+## def genop_ptr_nonzero(self, kindtoken, gv_ptr)
+## def genop_ptr_eq(self, kindtoken, gv_ptr1, gv_ptr2)
+## def genop_ptr_ne(self, kindtoken, gv_ptr1, gv_ptr2)
# the other thing that happens for a given chunk is entering and
# leaving basic blocks inside it.
@@ -359,3 +363,107 @@
'''Make a new builder that will be jumped to when the
switched-on GenVar takes the value of the GenConst gv_case.'''
raise NotImplementedError
+
+# ____________________________________________________________
+
+dummy_var = GenVar()
+
+class ReplayFlexSwitch(CodeGenSwitch):
+
+ def __init__(self, replay_builder):
+ self.replay_builder = replay_builder
+
+ def add_case(self, gv_case):
+ return self.replay_builder
+
+class ReplayBuilder(GenBuilder):
+
+ def __init__(self, rgenop):
+ self.rgenop = rgenop
+
+ def end(self):
+ pass
+
+ @specialize.arg(1)
+ def genop1(self, opname, gv_arg):
+ return dummy_var
+
+ @specialize.arg(1)
+ def genop2(self, opname, gv_arg1, gv_arg2):
+ return dummy_var
+
+ def genop_ptr_iszero(self, kind, gv_ptr):
+ return dummy_var
+
+ def genop_ptr_nonzero(self, kind, gv_ptr):
+ return dummy_var
+
+ def genop_ptr_eq(self, kind, gv_ptr1, gv_ptr2):
+ return dummy_var
+
+ def genop_ptr_ne(self, kind, gv_ptr1, gv_ptr2):
+ return dummy_var
+
+ def genop_getfield(self, fieldtoken, gv_ptr):
+ return dummy_var
+
+ def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
+ return dummy_var
+
+ def genop_getsubstruct(self, fieldtoken, gv_ptr):
+ return dummy_var
+
+ def genop_getarrayitem(self, arraytoken, gv_ptr, gv_index):
+ return dummy_var
+
+ def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
+ return dummy_var
+
+ def genop_getarraysize(self, arraytoken, gv_ptr):
+ return dummy_var
+
+ def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
+ return dummy_var
+
+ def genop_malloc_fixedsize(self, size):
+ return dummy_var
+
+ def genop_malloc_varsize(self, varsizealloctoken, gv_size):
+ return dummy_var
+
+ def genop_call(self, sigtoken, gv_fnptr, args_gv):
+ return dummy_var
+
+ def genop_same_as(self, kind, gv_x):
+ return dummy_var
+
+ def genop_debug_pdb(self): # may take an args_gv later
+ pass
+
+ def enter_next_block(self, kinds, args_gv):
+ return None
+
+ def jump_if_false(self, gv_condition, args_gv):
+ return self
+
+ def jump_if_true(self, gv_condition, args_gv):
+ return self
+
+ def finish_and_return(self, sigtoken, gv_returnvar):
+ pass
+
+ def finish_and_goto(self, outputargs_gv, target):
+ pass
+
+ def flexswitch(self, gv_exitswitch, args_gv):
+ flexswitch = ReplayFlexSwitch(self)
+ return flexswitch, self
+
+ def show_incremental_progress(self):
+ pass
+
+ def genop_get_frame_base(self):
+ return dummy_var
+
+ def get_frame_info(self, vars_gv):
+ return None
Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py Mon Jan 29 20:01:04 2007
@@ -1,6 +1,7 @@
import py
from pypy.jit.codegen.model import AbstractRGenOp, GenLabel, GenBuilder
from pypy.jit.codegen.model import GenVar, GenConst, CodeGenSwitch
+from pypy.jit.codegen.model import ReplayBuilder
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.lltypesystem import lloperation
from pypy.rlib.objectmodel import specialize, we_are_translated
@@ -247,6 +248,18 @@
#print '->', id(r)
return r
+ def genop_ptr_iszero(self, kind, gv_ptr):
+ return self.op_ptr_iszero(gv_ptr)
+
+ def genop_ptr_nonzero(self, kind, gv_ptr):
+ return self.op_ptr_nonzero(gv_ptr)
+
+ def genop_ptr_eq(self, kind, gv_ptr1, gv_ptr2):
+ return self.op_ptr_eq(gv_ptr1, gv_ptr2)
+
+ def genop_ptr_ne(self, kind, gv_ptr1, gv_ptr2):
+ return self.op_ptr_ne(gv_ptr1, gv_ptr2)
+
def genop_call(self, sigtoken, gv_fnptr, args_gv):
self.insns.append(insn.SpillCalleeSaves())
for i in range(len(args_gv)):
@@ -960,91 +973,6 @@
# ... address operations ...
-dummy_var = GenVar()
-
-class ReplayFlexSwitch(CodeGenSwitch):
-
- def __init__(self, replay_builder):
- self.replay_builder = replay_builder
-
- def add_case(self, gv_case):
- return self.replay_builder
-
-class ReplayBuilder(GenBuilder):
-
- def __init__(self, rgenop):
- self.rgenop = rgenop
-
- def end(self):
- pass
-
- @specialize.arg(1)
- def genop1(self, opname, gv_arg):
- return dummy_var
-
- @specialize.arg(1)
- def genop2(self, opname, gv_arg1, gv_arg2):
- return dummy_var
-
- def genop_getfield(self, fieldtoken, gv_ptr):
- return dummy_var
-
- def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
- return dummy_var
-
- def genop_getsubstruct(self, fieldtoken, gv_ptr):
- return dummy_var
-
- def genop_getarrayitem(self, arraytoken, gv_ptr, gv_index):
- return dummy_var
-
- def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
- return dummy_var
-
- def genop_getarraysize(self, arraytoken, gv_ptr):
- return dummy_var
-
- def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
- return dummy_var
-
- def genop_malloc_fixedsize(self, size):
- return dummy_var
-
- def genop_malloc_varsize(self, varsizealloctoken, gv_size):
- return dummy_var
-
- def genop_call(self, sigtoken, gv_fnptr, args_gv):
- return dummy_var
-
- def genop_same_as(self, kind, gv_x):
- return dummy_var
-
- def genop_debug_pdb(self): # may take an args_gv later
- pass
-
- def enter_next_block(self, kinds, args_gv):
- return None
-
- def jump_if_false(self, gv_condition, args_gv):
- return self
-
- def jump_if_true(self, gv_condition, args_gv):
- return self
-
- def finish_and_return(self, sigtoken, gv_returnvar):
- pass
-
- def finish_and_goto(self, outputargs_gv, target):
- pass
-
- def flexswitch(self, gv_exitswitch, args_gv):
- flexswitch = ReplayFlexSwitch(self)
- return flexswitch, self
-
- def show_incremental_progress(self):
- pass
-
-
class RPPCGenOp(AbstractRGenOp):
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Mon Jan 29 20:01:04 2007
@@ -169,9 +169,9 @@
if argbox.content is None:
gv_addr = argbox.getgenvar(jitstate)
if reverse:
- gv_res = builder.genop1("ptr_iszero", gv_addr)
+ gv_res = builder.genop_ptr_iszero(argbox.kind, gv_addr)
else:
- gv_res = builder.genop1("ptr_nonzero", gv_addr)
+ gv_res = builder.genop_ptr_nonzero(argbox.kind, gv_addr)
else:
gv_res = builder.rgenop.genconst(True ^ reverse)
return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
@@ -188,9 +188,9 @@
gv_addr0 = argbox0.getgenvar(jitstate)
gv_addr1 = argbox1.getgenvar(jitstate)
if reverse:
- gv_res = builder.genop2("ptr_ne", gv_addr0, gv_addr1)
+ gv_res = builder.genop_ptr_ne(argbox0.kind, gv_addr0, gv_addr1)
else:
- gv_res = builder.genop2("ptr_eq", gv_addr0, gv_addr1)
+ gv_res = builder.genop_ptr_eq(argbox0.kind, gv_addr0, gv_addr1)
return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
# ____________________________________________________________
More information about the Pypy-commit
mailing list