[pypy-svn] r34611 - pypy/dist/pypy/jit/codegen/ppc

mwh at codespeak.net mwh at codespeak.net
Tue Nov 14 20:22:41 CET 2006


Author: mwh
Date: Tue Nov 14 20:22:38 2006
New Revision: 34611

Modified:
   pypy/dist/pypy/jit/codegen/ppc/emit_moves.py
   pypy/dist/pypy/jit/codegen/ppc/instruction.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
a couple more operations to get some test_genc_ts tests running, and a fix to
handle Constant arguments to finish_and_goto.


Modified: pypy/dist/pypy/jit/codegen/ppc/emit_moves.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/emit_moves.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/emit_moves.py	Tue Nov 14 20:22:38 2006
@@ -61,10 +61,15 @@
 
     if tarvar in data.emitted: return
 
+    #print "tarvar in data.tar2loc", tarvar in data.tar2loc
     tarloc = data.tar2loc[tarvar]
+    #print "tarvar in data.tar2src", tarvar in data.tar2src
     srcvar = data.tar2src[tarvar]
+    #print "srcvar in data.src2loc", srcvar, srcvar in data.src2loc
     srcloc = data.src2loc[srcvar]
 
+
+
     # if location we are about to write to is not going to be read
     # by anyone, we are safe
     if tarloc not in data.loc2src:
@@ -73,12 +78,15 @@
         return
 
     # Find source node that conflicts with us
+    #print "tarloc in data.loc2src", tarloc in data.loc2src
     conflictsrcvar = data.loc2src[tarloc]
 
     if conflictsrcvar not in data.srcstack:
         # No cycle on our stack yet
         data.srcstack.append(srcvar)
+        #print "conflictsrcvar in data.src2tar", conflictsrcvar in data.src2tar
         _cycle_walk(gen, data.src2tar[conflictsrcvar], data)
+        #print "srcvar in data.src2loc", srcvar in data.src2loc
         srcloc = data.src2loc[srcvar] # warning: may have changed, so reload
         gen.emit_move(tarloc, srcloc)
         data.emitted.append(tarvar)
@@ -87,6 +95,7 @@
     # Cycle detected, break it by moving the other node's source data
     # somewhere else so we can overwrite it
     freshloc = gen.create_fresh_location()
+    #print "conflictsrcvar in data.src2loc", conflictsrcvar in data.src2loc
     conflictsrcloc = data.src2loc[conflictsrcvar]
     gen.emit_move(freshloc, conflictsrcloc)
     data.src2loc[conflictsrcvar] = freshloc

Modified: pypy/dist/pypy/jit/codegen/ppc/instruction.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/instruction.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/instruction.py	Tue Nov 14 20:22:38 2006
@@ -123,6 +123,23 @@
                      self.arg_reg.number,
                      self.imm.value)
 
+class Insn_GPR__GPR(Insn):
+    def __init__(self, methptr, result, arg):
+        Insn.__init__(self)
+        self.methptr = methptr
+
+        self.result = result
+        self.result_regclass = GP_REGISTER
+        self.reg_args = [arg]
+        self.reg_arg_regclasses = [GP_REGISTER]
+    def allocate(self, allocator):
+        self.result_reg = allocator.loc_of(self.result)
+        self.arg_reg = allocator.loc_of(self.reg_args[0])
+    def emit(self, asm):
+        self.methptr(asm,
+                     self.result_reg.number,
+                     self.arg_reg.number)
+
 class Insn_GPR__IMM(Insn):
     def __init__(self, methptr, result, args):
         Insn.__init__(self)

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	Tue Nov 14 20:22:38 2006
@@ -128,8 +128,12 @@
     targetlocs = target.arg_locations
     for i in range(len(targetlocs)):
         tloc = targetlocs[i]
-        tar2loc[tloc] = tloc
-        tar2src[tloc] = sourcevars[i]
+        src = sourcevars[i]
+        if isinstance(src, Var):
+            tar2loc[tloc] = tloc
+            tar2src[tloc] = src
+        else:
+            src.load_now(asm, tloc)
 
     gen = JumpPatchupGenerator(asm, min_offset)
     emit_moves(gen, tar2src, tar2loc, src2loc)
@@ -215,7 +219,14 @@
 ##     def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
 ##     def genop_malloc_fixedsize(self, alloctoken):
 ##     def genop_malloc_varsize(self, varsizealloctoken, gv_size):
-##     def genop_same_as(self, kindtoken, gv_x):
+
+    def genop_same_as(self, kindtoken, gv_arg):
+        if not isinstance(gv_arg, Var):
+            gv_result = Var()
+            gv_arg.load(self.insns, gv_result)
+        else:
+            return gv_arg
+
 ##     def genop_debug_pdb(self):    # may take an args_gv later
 
     def enter_next_block(self, kinds, args_gv):
@@ -537,7 +548,13 @@
         self.insns.append(
             insn.CMPWI(self.cmp2info['ne'], gv_result, [gv_arg, self.rgenop.genconst(0)]))
         return gv_result
-        
+
+    def op_int_neg(self, gv_arg):
+        gv_result = Var()
+        self.insns.append(
+            insn.Insn_GPR__GPR(RPPCAssembler.neg, gv_result, gv_arg))
+        return gv_result
+
 
 class RPPCGenOp(AbstractRGenOp):
 



More information about the Pypy-commit mailing list