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