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