Author: Remi Meier <remi.me...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit