Author: Maciej Fijalkowski <[email protected]>
Branch: fast-slowpath
Changeset: r65442:25fdf2bb3fc7
Date: 2013-07-17 17:03 +0200
http://bitbucket.org/pypy/pypy/changeset/25fdf2bb3fc7/
Log: allow a different number of args
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -2267,38 +2267,39 @@
assert s.data.tid == value
def test_cond_call(self):
- called = []
-
- def func_void(arg):
- called.append(arg)
-
- FUNC = self.FuncType([lltype.Signed], lltype.Void)
- func_ptr = llhelper(lltype.Ptr(FUNC), func_void)
- calldescr = self.cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
- EffectInfo.MOST_GENERAL)
-
- ops = '''
- [i0, i1, i2, i3, i4, i5, i6, f0, f1]
- cond_call(i1, ConstClass(func_ptr), i2, descr=calldescr)
- guard_false(i0, descr=faildescr) [i1, i2, i3, i4, i5, i6, f0, f1]
- '''
- loop = parse(ops, namespace={'faildescr': BasicFailDescr(),
- 'func_ptr': func_ptr,
- 'calldescr': calldescr})
- looptoken = JitCellToken()
- self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
- frame = self.cpu.execute_token(looptoken, 1, 0, 1, 2, 3, 4, 5, 1.2,
3.4)
- assert not called
+ def func_void(*args):
+ called.append(args)
+
for i in range(5):
- assert self.cpu.get_int_value(frame, i) == i
- assert self.cpu.get_float_value(frame, 6) == 1.2
- assert self.cpu.get_float_value(frame, 7) == 3.4
- frame = self.cpu.execute_token(looptoken, 1, 1, 1, 2, 3, 4, 5, 1.2,
3.4)
- assert called == [1]
- for i in range(4):
- assert self.cpu.get_int_value(frame, i + 1) == i + 1
- assert self.cpu.get_float_value(frame, 6) == 1.2
- assert self.cpu.get_float_value(frame, 7) == 3.4
+ called = []
+
+ FUNC = self.FuncType([lltype.Signed] * i, lltype.Void)
+ func_ptr = llhelper(lltype.Ptr(FUNC), func_void)
+ calldescr = self.cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
+ EffectInfo.MOST_GENERAL)
+
+ ops = '''
+ [i0, i1, i2, i3, i4, i5, i6, f0, f1]
+ cond_call(i1, ConstClass(func_ptr), %s, descr=calldescr)
+ guard_false(i0, descr=faildescr) [i1, i2, i3, i4, i5, i6, f0, f1]
+ ''' % ', '.join(['i%d' % (j + 2) for j in range(i)])
+ loop = parse(ops, namespace={'faildescr': BasicFailDescr(),
+ 'func_ptr': func_ptr,
+ 'calldescr': calldescr})
+ looptoken = JitCellToken()
+ self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
+ frame = self.cpu.execute_token(looptoken, 1, 0, 1, 2, 3, 4, 5,
1.2, 3.4)
+ assert not called
+ for j in range(5):
+ assert self.cpu.get_int_value(frame, j) == j
+ assert self.cpu.get_float_value(frame, 6) == 1.2
+ assert self.cpu.get_float_value(frame, 7) == 3.4
+ frame = self.cpu.execute_token(looptoken, 1, 1, 1, 2, 3, 4, 5,
1.2, 3.4)
+ assert called == [tuple(range(1, i + 1))]
+ for j in range(4):
+ assert self.cpu.get_int_value(frame, j + 1) == j + 1
+ assert self.cpu.get_float_value(frame, 6) == 1.2
+ assert self.cpu.get_float_value(frame, 7) == 3.4
def test_force_operations_returning_void(self):
values = []
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
@@ -56,6 +56,7 @@
no_lower_byte_regs = []
save_around_call_regs = [eax, ecx, edx, esi, edi, r8, r9, r10]
+ register_arguments = [edi, esi, edx, ecx]
class X86XMMRegisterManager(RegisterManager):
@@ -800,9 +801,13 @@
def consider_cond_call(self, op):
assert op.result is None
args = op.getarglist()
- assert len(args) == 1 + 2
- self.make_sure_var_in_reg(args[2], selected_reg=edi)
+ assert 2 <= len(args) <= 4 + 2
loc_call = self.make_sure_var_in_reg(args[1], args, selected_reg=eax)
+ args_so_far = [args[1]]
+ for i in range(2, len(args)):
+ reg = self.rm.register_arguments[i - 2]
+ self.make_sure_var_in_reg(args[i], args_so_far, selected_reg=reg)
+ args_so_far.append(args[i])
loc_cond = self.make_sure_var_in_reg(args[0], args)
self.assembler.cond_call(op, self.get_gcmap(), loc_cond, loc_call,
[edi])
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit