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

Reply via email to