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

Reply via email to