Author: Remi Meier <[email protected]>
Branch: fix-longevity
Changeset: r82523:491569178ceb
Date: 2016-02-25 19:40 +0100
http://bitbucket.org/pypy/pypy/changeset/491569178ceb/
Log: (plan_rich,remi) replace is_callee_lookup with attribute on regloc
diff --git a/rpython/jit/backend/llsupport/regalloc.py
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -279,7 +279,6 @@
# TODO would be good to keep free_caller_regs sorted (according to the ABI)
free_callee_regs = []
free_caller_regs = []
- is_callee_lookup = None
def get_lower_byte_free_register(self, reg):
# try to return a volatile register first!
@@ -346,13 +345,13 @@
self.remove_free_register(r)
def remove_free_register(self, reg):
- if self.is_callee_lookup[reg.value]:
+ if not reg.save_around_calls:
self.free_callee_regs = [fr for fr in self.free_callee_regs if fr
is not reg]
else:
self.free_caller_regs = [fr for fr in self.free_caller_regs if fr
is not reg]
def put_back_register(self, reg):
- if self.is_callee_lookup[reg.value]:
+ if not reg.save_around_calls:
self.free_callee_regs.append(reg)
else:
self.free_caller_regs.append(reg)
@@ -374,14 +373,10 @@
self.save_in_callee_regs = [reg for reg in all_regs
if reg not in save_around_call_regs]
self._reinit_free_regs()
- if we_are_translated():
- self.is_callee_lookup = [True] * len(self.all_regs)
- else:
- # in tests the len of all_regs can change
- values = [r.value + 1 for r in self.all_regs]
- self.is_callee_lookup = [True] * max(values)
- for reg in self.save_around_call_regs:
- self.is_callee_lookup[reg.value] = False
+ if not we_are_translated():
+ # in tests we need to update regloc.save_around_calls
+ for r in self.all_regs:
+ r.save_around_calls = r in save_around_call_regs
def __init__(self, live_ranges, frame_manager=None, assembler=None):
self._change_regs(self.all_regs, self.save_around_call_regs)
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -39,6 +39,8 @@
no_lower_byte_regs = [esi, edi]
save_around_call_regs = [eax, edx, ecx]
frame_reg = ebp
+ for r in all_regs:
+ r.save_around_calls = r in save_around_call_regs
def call_result_location(self, v):
return eax
@@ -61,6 +63,9 @@
abi_param_regs = [edi, esi, ecx, r8, r9]
save_around_call_regs = abi_param_regs + [eax, edx, r10]
+ for r in all_regs:
+ r.save_around_calls = r in save_around_call_regs
+
def get_abi_param_register(self, i):
if not IS_X86_32 and 0 <= i < len(self.abi_param_regs):
return self.abi_param_regs[i]
diff --git a/rpython/jit/backend/x86/regloc.py
b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -130,6 +130,10 @@
class RegLoc(AssemblerLocation):
_immutable_ = True
+
+ # indicates if the register is caller-save:
+ save_around_calls = True
+
def __init__(self, regnum, is_xmm):
assert regnum >= 0
self.value = regnum
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit