[pypy-commit] pypy default: Change FORCE_TOKEN in the x86 backend to return the register 'ebp'
arigo
noreply at buildbot.pypy.org
Mon Sep 5 12:29:42 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r47078:906f5d65a98b
Date: 2011-09-05 10:38 +0200
http://bitbucket.org/pypy/pypy/changeset/906f5d65a98b/
Log: Change FORCE_TOKEN in the x86 backend to return the register 'ebp'
directly, thus not producing any code at all.
diff --git a/pypy/jit/backend/llsupport/regalloc.py b/pypy/jit/backend/llsupport/regalloc.py
--- a/pypy/jit/backend/llsupport/regalloc.py
+++ b/pypy/jit/backend/llsupport/regalloc.py
@@ -57,11 +57,13 @@
all_regs = []
no_lower_byte_regs = []
save_around_call_regs = []
-
+ frame_reg = None
+
def __init__(self, longevity, frame_manager=None, assembler=None):
self.free_regs = self.all_regs[:]
self.longevity = longevity
self.reg_bindings = {}
+ self.bindings_to_frame_reg = {}
self.position = -1
self.frame_manager = frame_manager
self.assembler = assembler
@@ -218,6 +220,10 @@
self.reg_bindings[v] = loc
return loc
+ def force_allocate_frame_reg(self, v):
+ """ Allocate the new variable v in the frame register."""
+ self.bindings_to_frame_reg[v] = None
+
def force_spill_var(self, var):
self._sync_var(var)
try:
@@ -236,6 +242,8 @@
try:
return self.reg_bindings[box]
except KeyError:
+ if box in self.bindings_to_frame_reg:
+ return self.frame_reg
return self.frame_manager.loc(box)
def return_constant(self, v, forbidden_vars=[], selected_reg=None):
@@ -264,8 +272,9 @@
self._check_type(v)
if isinstance(v, Const):
return self.return_constant(v, forbidden_vars, selected_reg)
-
prev_loc = self.loc(v)
+ if prev_loc is self.frame_reg and selected_reg is None:
+ return prev_loc
loc = self.force_allocate_reg(v, forbidden_vars, selected_reg,
need_lower_byte=need_lower_byte)
if prev_loc is not loc:
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -2510,11 +2510,6 @@
genop_discard_cond_call_gc_wb_array = genop_discard_cond_call_gc_wb
- def genop_force_token(self, op, arglocs, resloc):
- # RegAlloc.consider_force_token ensures this:
- assert isinstance(resloc, RegLoc)
- self.mc.LEA_rb(resloc.value, FORCE_INDEX_OFS)
-
def not_implemented_op_discard(self, op, arglocs):
not_implemented("not implemented operation: %s" % op.getopname())
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -29,6 +29,7 @@
all_regs = [eax, ecx, edx, ebx, esi, edi]
no_lower_byte_regs = [esi, edi]
save_around_call_regs = [eax, edx, ecx]
+ frame_reg = ebp
REGLOC_TO_GCROOTMAP_REG_INDEX = {
ebx: 1,
@@ -1358,8 +1359,8 @@
self.assembler.datablockwrapper)
def consider_force_token(self, op):
- loc = self.rm.force_allocate_reg(op.result)
- self.Perform(op, [], loc)
+ # the FORCE_TOKEN operation returns directly 'ebp'
+ self.rm.force_allocate_frame_reg(op.result)
def not_implemented_op(self, op):
not_implemented("not implemented operation: %s" % op.getopname())
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -119,7 +119,8 @@
setitem(index, null)
def get_latest_force_token(self):
- return self.assembler.fail_ebp + FORCE_INDEX_OFS
+ # the FORCE_TOKEN operation and this helper both return 'ebp'.
+ return self.assembler.fail_ebp
def execute_token(self, executable_token):
addr = executable_token._x86_bootstrap_code
@@ -153,8 +154,9 @@
flavor='raw', zero=True,
immortal=True)
- def force(self, addr_of_force_index):
+ def force(self, addr_of_force_token):
TP = rffi.CArrayPtr(lltype.Signed)
+ addr_of_force_index = addr_of_force_token + FORCE_INDEX_OFS
fail_index = rffi.cast(TP, addr_of_force_index)[0]
assert fail_index >= 0, "already forced!"
faildescr = self.get_fail_descr_from_number(fail_index)
@@ -164,7 +166,7 @@
# start of "no gc operation!" block
fail_index_2 = self.assembler.grab_frame_values(
bytecode,
- addr_of_force_index - FORCE_INDEX_OFS,
+ addr_of_force_token,
self.all_null_registers)
self.assembler.leave_jitted_hook()
# end of "no gc operation!" block
More information about the pypy-commit
mailing list