[pypy-commit] pypy ppc-jit-backend: merge heads

bivab noreply at buildbot.pypy.org
Mon Feb 20 11:27:04 CET 2012


Author: David Schneider <david.schneider at picle.org>
Branch: ppc-jit-backend
Changeset: r52665:a419d8d766c6
Date: 2012-02-20 02:25 -0800
http://bitbucket.org/pypy/pypy/changeset/a419d8d766c6/

Log:	merge heads

diff --git a/pypy/jit/backend/ppc/ppc_assembler.py b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -301,7 +301,12 @@
         if IS_PPC_64:
             for _ in range(6):
                 mc.write32(0)
-
+        mc.subi(r.SP.value, r.SP.value, BACKCHAIN_SIZE * WORD + 1*WORD)
+        mc.mflr(r.SCRATCH.value)
+        if IS_PPC_32:
+            mc.stw(r.SCRATCH.value, r.SP.value, 0) 
+        else:
+            mc.std(r.SCRATCH.value, r.SP.value, 0)
         with Saved_Volatiles(mc):
             # Values to compute size stored in r3 and r4
             mc.subf(r.r3.value, r.r3.value, r.r4.value)
@@ -315,14 +320,25 @@
         mc.cmp_op(0, r.r3.value, 0, imm=True)
         jmp_pos = mc.currpos()
         mc.nop()
+
         nursery_free_adr = self.cpu.gc_ll_descr.get_nursery_free_addr()
         mc.load_imm(r.r4, nursery_free_adr)
         mc.load(r.r4.value, r.r4.value, 0)
+ 
+        mc.load(r.SCRATCH.value, r.SP.value, 0) 
+        mc.mtlr(r.SCRATCH.value)     # restore LR
+        mc.addi(r.SP.value, r.SP.value, BACKCHAIN_SIZE * WORD + 1*WORD) # restore old SP
+        mc.blr()
 
+        # if r3 == 0 we skip the return above and jump to the exception path
+        offset = mc.currpos() - jmp_pos
         pmc = OverwritingBuilder(mc, jmp_pos, 1)
-        pmc.bc(4, 2, jmp_pos) # jump if the two values are equal
+        pmc.bc(4, 2, offset) 
         pmc.overwrite()
         mc.b_abs(self.propagate_exception_path)
+
+
+        mc.prepare_insts_blocks()
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
         if IS_PPC_64:
             self.write_64_bit_func_descr(rawstart, rawstart+3*WORD)
@@ -372,8 +388,8 @@
         addr = rffi.cast(lltype.Signed, decode_func_addr)
 
         # load parameters into parameter registers
-        mc.load(r.r3.value, r.SPP.value, self.ENCODING_AREA)     # address of state encoding 
-        mc.mr(r.r4.value, r.SPP.value)         # load spilling pointer
+        mc.load(r.r3.value, r.SPP.value, self.FORCE_INDEX_AREA)    # address of state encoding 
+        mc.mr(r.r4.value, r.SPP.value)                             # load spilling pointer
         #
         # call decoding function
         mc.call(addr)
@@ -997,6 +1013,7 @@
         offset = self.mc.currpos() - fast_jmp_pos
         pmc = OverwritingBuilder(self.mc, fast_jmp_pos, 1)
         pmc.bc(4, 1, offset) # jump if LE (not GT)
+        pmc.overwrite()
         
         with scratch_reg(self.mc):
             self.mc.load_imm(r.SCRATCH, nursery_free_adr)


More information about the pypy-commit mailing list