Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: regalloc-playground
Changeset: r92786:a98e7c269025
Date: 2017-10-18 08:56 +0200
http://bitbucket.org/pypy/pypy/changeset/a98e7c269025/
Log: start preparing for 32bit support
diff --git a/rpython/jit/backend/x86/reghint.py
b/rpython/jit/backend/x86/reghint.py
--- a/rpython/jit/backend/x86/reghint.py
+++ b/rpython/jit/backend/x86/reghint.py
@@ -14,8 +14,11 @@
SAVE_GCREF_REGS, SAVE_ALL_REGS)
from rpython.jit.backend.x86.regalloc import (
+ X86RegisterManager, X86XMMRegisterManager,
X86_64_RegisterManager, X86_64_XMMRegisterManager, compute_gc_level
- )
+)
+
+from rpython.jit.backend.x86.arch import IS_X86_32, IS_X86_64
# tell the register allocator hints about which variables should be placed in
# what registers (those are just hints, the register allocator will try its
@@ -153,34 +156,44 @@
num = getattr(rop, name.upper())
oplist[num] = value
+class CallHints32(object):
+ RegisterManager = X86RegisterManager
+ XMMRegisterManager = X86XMMRegisterManager
+ def _block_non_caller_save(self, position, save_all_regs, hinted_gpr=None,
hinted_xmm=None):
+ if hinted_gpr is None:
+ hinted_gpr = []
+ if hinted_xmm is None:
+ hinted_xmm = []
+ # block all remaining registers that are not caller save
-class CallHints64(object):
+ # XXX the case save_all_regs == SAVE_GCREF_REGS
+ # (save callee-save regs + gc ptrs) is no expressible atm
+ if save_all_regs == SAVE_ALL_REGS:
+ regs = self.RegisterManager.all_regs
+ else:
+ regs = self.RegisterManager.save_around_call_regs
+ for reg in regs:
+ if reg not in hinted_gpr:
+ self.longevity.fixed_register(position, reg)
+ for reg in self.XMMRegisterManager.all_regs:
+ if reg not in hinted_xmm:
+ self.longevity.fixed_register(position, reg)
+ def hint(self, position, args, argtypes, save_all_regs):
+ self._block_non_caller_save(position, save_all_regs)
+
+
+class CallHints64(CallHints32):
ARGUMENTS_GPR = [edi, esi, edx, ecx, r8, r9]
ARGUMENTS_XMM = [xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7]
+ RegisterManager = X86_64_RegisterManager
+ XMMRegisterManager = X86_64_XMMRegisterManager
def __init__(self, longevity):
self.longevity = longevity
- def _unused_gpr(self):
- i = self.next_arg_gpr
- self.next_arg_gpr = i + 1
- try:
- res = self.ARGUMENTS_GPR[i]
- except IndexError:
- return None
- return res
-
- def _unused_xmm(self):
- i = self.next_arg_xmm
- self.next_arg_xmm = i + 1
- try:
- return self.ARGUMENTS_XMM[i]
- except IndexError:
- return None
-
def hint(self, position, args, argtypes, save_all_regs):
hinted_xmm = []
hinted_gpr = []
@@ -205,17 +218,10 @@
hinted_gpr.append(tgt)
hinted_args.append(arg)
next_arg_gpr += 1
- # block all remaining registers that are not caller save
+ self._block_non_caller_save(position, save_all_regs, hinted_gpr,
hinted_xmm)
- # XXX the case save_all_regs == SAVE_GCREF_REGS
- # (save callee-save regs + gc ptrs) is no expressible atm
- if save_all_regs == SAVE_ALL_REGS:
- regs = X86_64_RegisterManager.all_regs
- else:
- regs = X86_64_RegisterManager.save_around_call_regs
- for reg in regs:
- if reg not in hinted_gpr:
- self.longevity.fixed_register(position, reg)
- for reg in X86_64_XMMRegisterManager.all_regs:
- if reg not in hinted_xmm:
- self.longevity.fixed_register(position, reg)
+
+if IS_X86_32:
+ CallHints = CallHints32
+if IS_X86_64:
+ CallHints = CallHints64
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit