Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r61189:bcb1498b0dde
Date: 2013-02-13 22:36 +0200
http://bitbucket.org/pypy/pypy/changeset/bcb1498b0dde/

Log:    and another bites the dust

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -471,37 +471,9 @@
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
         self.failure_recovery_code[exc + 2 * withfloats] = rawstart
 
-    def generate_quick_failure(self, guardtok, fcond=c.AL):
-        assert isinstance(guardtok.exc, bool)
+    def generate_quick_failure(self, guardtok):
         startpos = self.mc.currpos()
-        withfloats = False
-        for box in guardtok.failargs:
-            if box is not None and box.type == FLOAT:
-                withfloats = True
-                break
-        exc = guardtok.exc
-        target = self.failure_recovery_code[exc + 2 * withfloats]
-        fail_descr = cast_instance_to_gcref(guardtok.faildescr)
-        fail_descr = rffi.cast(lltype.Signed, fail_descr)
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
-        positions = [0] * len(guardtok.fail_locs)
-        for i, loc in enumerate(guardtok.fail_locs):
-            if loc is None:
-                positions[i] = -1
-            elif loc.is_stack():
-                positions[i] = loc.value - base_ofs
-            else:
-                if loc.is_reg():
-                    assert loc is not r.fp # for now
-                    v = loc.value
-                else:
-                    assert loc.is_vfp_reg()
-                    v = len(CoreRegisterManager.all_regs) + loc.value * 2
-                positions[i] = v * WORD
-        # write down the positions of locs
-        guardtok.faildescr.rd_locs = positions
-        # we want the descr to keep alive
-        guardtok.faildescr.rd_loop_token = self.current_clt
+        fail_descr, target = self.store_info_on_descr(startpos, guardtok)
         self.regalloc_push(imm(fail_descr))
         self.push_gcmap(self.mc, gcmap=guardtok.gcmap, push=True)
         self.mc.BL(target)
diff --git a/rpython/jit/backend/arm/runner.py 
b/rpython/jit/backend/arm/runner.py
--- a/rpython/jit/backend/arm/runner.py
+++ b/rpython/jit/backend/arm/runner.py
@@ -2,6 +2,7 @@
 from rpython.jit.backend.arm.assembler import AssemblerARM
 from rpython.jit.backend.arm.regalloc import CoreRegisterManager,\
      VFPRegisterManager
+from rpython.jit.backend.arm.registers import fp, all_regs
 from rpython.jit.backend.llsupport import jitframe
 from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU
 from rpython.rlib.jit_hooks import LOOP_RUN_CONTAINER
@@ -19,9 +20,10 @@
     supports_singlefloats = True
 
     from rpython.jit.backend.arm.arch import JITFRAME_FIXED_SIZE
-    all_reg_indexes = range(16)
+    all_reg_indexes = all_regs
     gen_regs = CoreRegisterManager.all_regs
     float_regs = VFPRegisterManager.all_regs
+    frame_reg = fp
 
     use_hf_abi = False        # use hard float abi flag
 
diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -1,7 +1,9 @@
 
 from rpython.rlib.rarithmetic import r_uint
 from rpython.jit.backend.llsupport.symbolic import WORD
-from rpython.jit.metainterp.history import REF
+from rpython.jit.metainterp.history import REF, FLOAT
+from rpython.rtyper.annlowlevel import cast_instance_to_gcref
+from rpython.rtyper.lltypesystem import rffi, lltype
 
 class GuardToken(object):
     def __init__(self, cpu, gcmap, faildescr, failargs, fail_locs, exc,
@@ -64,3 +66,37 @@
                 locs.append(self.new_stack_loc(i, pos, tp))
             input_i += 1
         return locs
+
+    def store_info_on_descr(self, startspos, guardtok):
+        withfloats = False
+        for box in guardtok.failargs:
+            if box is not None and box.type == FLOAT:
+                withfloats = True
+                break
+        exc = guardtok.exc
+        target = self.failure_recovery_code[exc + 2 * withfloats]
+        fail_descr = cast_instance_to_gcref(guardtok.faildescr)
+        fail_descr = rffi.cast(lltype.Signed, fail_descr)
+        base_ofs = self.cpu.get_baseofs_of_frame_field()
+        positions = [0] * len(guardtok.fail_locs)
+        for i, loc in enumerate(guardtok.fail_locs):
+            if loc is None:
+                positions[i] = -1
+            elif loc.is_stack():
+                positions[i] = loc.value - base_ofs
+            else:
+                assert loc is not self.cpu.frame_reg # for now
+                if self.cpu.IS_64_BIT:
+                    coeff = 1
+                else:
+                    coeff = 2
+                if loc.is_float():
+                    v = len(self.cpu.gen_regs) + loc.value * coeff
+                else:
+                    v = self.cpu.all_reg_indexes[loc.value]
+                positions[i] = v * WORD
+        # write down the positions of locs
+        guardtok.faildescr.rd_locs = positions
+        # we want the descr to keep alive
+        guardtok.faildescr.rd_loop_token = self.current_clt
+        return fail_descr, target
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1864,51 +1864,13 @@
         return startpos
 
     def generate_quick_failure(self, guardtok):
-        """Generate the initial code for handling a failure.  We try to
-        keep it as compact as possible.
+        """ Gather information about failure
         """
-        mc = self.mc
-        startpos = mc.get_relative_pos()
-        withfloats = False
-        for box in guardtok.failargs:
-            if box is not None and box.type == FLOAT:
-                withfloats = True
-                break
-        exc = guardtok.exc
-        target = self.failure_recovery_code[exc + 2 * withfloats]
-        fail_descr = cast_instance_to_gcref(guardtok.faildescr)
-        fail_descr = rffi.cast(lltype.Signed, fail_descr)
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
-        positions = [0] * len(guardtok.fail_locs)
-        for i, loc in enumerate(guardtok.fail_locs):
-            if loc is None:
-                positions[i] = -1
-            elif isinstance(loc, StackLoc):
-                positions[i] = loc.value - base_ofs
-            else:
-                assert isinstance(loc, RegLoc)
-                assert loc is not ebp # for now
-                if IS_X86_64:
-                    coeff = 1
-                else:
-                    coeff = 2
-                if loc.is_xmm:
-                    v = len(gpr_reg_mgr_cls.all_regs) + loc.value * coeff
-                else:
-                    v = gpr_reg_mgr_cls.all_reg_indexes[loc.value]
-                positions[i] = v * WORD
-        # write down the positions of locs
-        guardtok.faildescr.rd_locs = positions
-        # we want the descr to keep alive
-        guardtok.faildescr.rd_loop_token = self.current_clt
-        #if WORD == 4:
-        #    mc.PUSH(imm(fail_descr))
-        #    mc.PUSH(imm(gcpattern))
-        #    mc.JMP(imm(target))
-        #else:
-        mc.PUSH(imm(fail_descr))
-        self.push_gcmap(mc, guardtok.gcmap, push=True)
-        mc.JMP(imm(target))
+        startpos = self.mc.get_relative_pos()
+        fail_descr, target = self.store_info_on_descr(startpos, guardtok)
+        self.mc.PUSH(imm(fail_descr))
+        self.push_gcmap(self.mc, guardtok.gcmap, push=True)
+        self.mc.JMP(imm(target))
         return startpos
 
     def push_gcmap(self, mc, gcmap, push=False, mov=False, store=False):
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -21,6 +21,7 @@
 
     dont_keepalive_stuff = False # for tests
     with_threads = False
+    frame_reg = regloc.ebp
 
     from rpython.jit.backend.x86.arch import JITFRAME_FIXED_SIZE
     all_reg_indexes = gpr_reg_mgr_cls.all_reg_indexes
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to