Author: Richard Plangger <planri...@gmail.com>
Branch: regalloc
Changeset: r82423:f8ee5bddeb4b
Date: 2016-02-23 11:53 +0100
http://bitbucket.org/pypy/pypy/changeset/f8ee5bddeb4b/

Log:    (remi, plan_rich) work in progress

diff --git a/rpython/jit/backend/llsupport/test/test_regalloc_call.py 
b/rpython/jit/backend/llsupport/test/test_regalloc_call.py
--- a/rpython/jit/backend/llsupport/test/test_regalloc_call.py
+++ b/rpython/jit/backend/llsupport/test/test_regalloc_call.py
@@ -1,5 +1,6 @@
 from rpython.jit.tool.oparser import parse
 from rpython.jit.backend.x86.regalloc import RegAlloc
+from rpython.jit.backend.x86.regloc import REGLOCS
 from rpython.jit.backend.detect_cpu import getcpuclass
 from rpython.jit.backend.x86.arch import DEFAULT_FRAME_BYTES
 from rpython.jit.metainterp.history import TargetToken
@@ -11,7 +12,9 @@
     def __repr__(self):
         return 'r%d' % self.n
 
-r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 = [FakeReg(i) for i in range(1,11)]
+eax, ecx, edx, ebx, esp, ebp, esi, edi, r8, r9, r10, r11, r12, r13, r14, r15 = 
REGLOCS
+caller_saved = []
+callee_saved = []
 
 CPU = getcpuclass()
 
@@ -19,12 +22,11 @@
     ops = parse(text)
     tt = None
     tt = TargetToken(ops.operations[-1].getdescr())
-    ops.operations = [ResOperation(rop.LABEL, ops.inputargs, None, descr=tt)] 
+ ops.operations
     for op in ops.operations:
         if op.getopnum() == rop.JUMP:
             assert tt is not None
             op.setdescr(tt)
-    return ops
+    return tt, ops
 
 class FakeMachineCodeBuilder(object):
     _frame_size = DEFAULT_FRAME_BYTES
@@ -46,7 +48,10 @@
 CPURegalloc = RegAlloc
 class FakeRegAlloc(CPURegalloc):
     def __init__(self, tracealloc, caller_saved, callee_saved):
+        self.caller_saved = caller_saved
+        self.callee_saved = callee_saved
         self.all_regs = callee_saved[:] + callee_saved
+        self.free_regs = callee_saved[:] + callee_saved
         CPURegalloc.__init__(self, FakeAssembler(), False)
         self.tracealloc = tracealloc
         self.steps = set()
@@ -65,16 +70,28 @@
         self.compiled_loop_token = None
 
 class TraceAllocation(object):
-    def __init__(self, trace, caller_saved, callee_saved, binding):
+    def __init__(self, trace, caller_saved, callee_saved, binding, tt):
         self.trace = trace
         self.regalloc = FakeRegAlloc(self, caller_saved, callee_saved)
-        self.initial_binding = binding
+        self.initial_binding = { str(var): reg for var, reg in 
zip(trace.inputargs, binding) }
         looptoken = FakeLoopToken()
         gcrefs = None
+        tt._x86_arglocs = binding
+
         for op in trace.operations:
             for arg in op.getarglist():
                 pass
         self.regalloc.prepare_loop(self.trace.inputargs, 
self.trace.operations, looptoken, gcrefs)
+
+
+        for var, reg in zip(trace.inputargs, binding):
+            self.regalloc.rm.reg_bindings[var] = reg
+        fr = self.regalloc.rm.free_regs
+        self.regalloc.rm.free_regs = [reg for reg in fr if reg not in binding]
+
+        self.regalloc.rm.all_regs = self.regalloc.all_regs
+        self.regalloc.rm.save_around_call_regs = self.regalloc.caller_saved
+
         self.regalloc.walk_operations(trace.inputargs, trace.operations)
 
     def initial_register(self, name):
@@ -90,13 +107,13 @@
 class TestRegalloc(object):
 
     def test_allocate_register_into_jump_register(self):
-        ops = parse_loop("""
+        tt, ops = parse_loop("""
         [p0,i1]
         i2 = int_add(i1,i1)
         i3 = int_add(i2,i1)
         jump(p0,i2)
         """)
-        trace_alloc = TraceAllocation(ops, [r1, r2], [r3, r4], {'p0': r1, 
'i1': r2})
+        trace_alloc = TraceAllocation(ops, [eax, edx], [r8, r9], [eax, edx], 
tt)
         i2 = trace_alloc.initial_register('i2')
         i1 = trace_alloc.initial_register('i1')
         assert i2 == i1
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to