[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