Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r81757:41b2950af11a
Date: 2016-01-14 10:29 +0100
http://bitbucket.org/pypy/pypy/changeset/41b2950af11a/

Log:    still searching for this weird problem. seems to be introduced when
        switching from a guard to a bridge in a very rare case

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
@@ -535,11 +535,11 @@
             return chr(ord(c) + ord(c1))
 
         functions = [
-            #(func_int, lltype.Signed, types.sint, 655360, 655360),
-            #(func_int, lltype.Signed, types.sint, 655360, -293999429),
+            (func_int, lltype.Signed, types.sint, 655360, 655360),
+            (func_int, lltype.Signed, types.sint, 655360, -293999429),
             (func_int, rffi.SHORT, types.sint16, 1213, 1213),
-            #(func_int, rffi.SHORT, types.sint16, 1213, -12020),
-            #(func_char, lltype.Char, types.uchar, 12, 12),
+            (func_int, rffi.SHORT, types.sint16, 1213, -12020),
+            (func_char, lltype.Char, types.uchar, 12, 12),
             ]
 
         cpu = self.cpu
diff --git a/rpython/jit/backend/zarch/callbuilder.py 
b/rpython/jit/backend/zarch/callbuilder.py
--- a/rpython/jit/backend/zarch/callbuilder.py
+++ b/rpython/jit/backend/zarch/callbuilder.py
@@ -58,6 +58,7 @@
         gpr_regs = 0
         fpr_regs = 0
         stack_params = []
+        print("### prepare_arguemtns:")
         for i in range(num_args):
             loc = arglocs[i]
             if not arglocs[i].is_float():
@@ -65,8 +66,10 @@
                     non_float_locs.append(arglocs[i])
                     non_float_regs.append(self.GPR_ARGS[gpr_regs])
                     gpr_regs += 1
+                    print("  %d: %s at [%s];" % (i, arglocs[i], 
self.GPR_ARGS[gpr_regs-1]))
                 else:
                     stack_params.append(i)
+                    print("  %d: %s at stack[%d];" % (i,arglocs[i], 
len(stack_params)-1))
             else:
                 if fpr_regs < max_fpr_in_reg:
                     float_locs.append(arglocs[i])
@@ -74,8 +77,8 @@
                 else:
                     stack_params.append(i)
 
-        self.subtracted_to_sp += len(stack_params) * 8
-        base = -len(stack_params) * 8
+        self.subtracted_to_sp += len(stack_params) * WORD
+        base = -len(stack_params) * WORD
         if self.is_call_release_gil:
             self.subtracted_to_sp += 8*WORD
             base -= 8*WORD
@@ -139,8 +142,8 @@
         self.mc.raw_call()
 
     def restore_stack_pointer(self):
-        if self.subtracted_to_sp != 0:
-            self.mc.LAY(r.SP, l.addr(self.subtracted_to_sp, r.SP))
+        # it must at LEAST be 160 bytes
+        self.mc.LAY(r.SP, l.addr(self.subtracted_to_sp, r.SP))
 
     def load_result(self):
         assert (self.resloc is None or
@@ -226,30 +229,28 @@
         reg = self.resloc
         PARAM_SAVE_AREA_OFFSET = 0
         if reg is not None:
+            # save 1 word below the stack pointer
             if reg.is_core_reg():
-                self.mc.STG(reg, l.addr(-7*WORD, r.SP))
+                self.mc.STG(reg, l.addr(-1*WORD, r.SP))
             elif reg.is_fp_reg():
-                self.mc.STD(reg, l.addr(-7*WORD, r.SP))
+                self.mc.STD(reg, l.addr(-1*WORD, r.SP))
+        self.mc.push_std_frame(8*WORD)
         self.mc.load_imm(self.mc.RAW_CALL_REG, self.asm.reacqgil_addr)
         self.mc.raw_call()
+        self.mc.pop_std_frame(8*WORD)
         if reg is not None:
             if reg.is_core_reg():
-                self.mc.LG(reg, l.addr(-7*WORD, r.SP))
+                self.mc.LG(reg, l.addr(-1*WORD, r.SP))
             elif reg.is_fp_reg():
-                self.mc.LD(reg, l.addr(-7*WORD, r.SP))
+                self.mc.LD(reg, l.addr(-1*WORD, r.SP))
 
         # replace b1_location with BEQ(here)
         pmc = OverwritingBuilder(self.mc, b1_location, 1)
         pmc.BRCL(c.EQ, l.imm(self.mc.currpos() - b1_location))
         pmc.overwrite()
 
-        # restore the values that is void after LMG
-        if gcrootmap:
-            if gcrootmap.is_shadow_stack and self.is_call_release_gil:
-                self.mc.LGR(r.SCRATCH, RSHADOWOLD)
         self.mc.LMG(r.r8, r.r13, l.addr(-7*WORD, r.SP))
 
-
     def write_real_errno(self, save_err):
         if save_err & rffi.RFFI_READSAVED_ERRNO:
             # Just before a call, read '*_errno' and write it into the
diff --git a/rpython/jit/backend/zarch/codebuilder.py 
b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -217,12 +217,12 @@
     def restore_link(self):
         self.LG(r.RETURN, l.addr(14*WORD, r.SP))
 
-    def push_std_frame(self):
-        self.STG(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
-        self.LAY(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
+    def push_std_frame(self, additional_bytes=0):
+        self.STG(r.SP, l.addr(-(STD_FRAME_SIZE_IN_BYTES + additional_bytes), 
r.SP))
+        self.LAY(r.SP, l.addr(-(STD_FRAME_SIZE_IN_BYTES + additional_bytes), 
r.SP))
 
-    def pop_std_frame(self):
-        self.LAY(r.SP, l.addr(STD_FRAME_SIZE_IN_BYTES, r.SP))
+    def pop_std_frame(self, additional_bytes=0):
+        self.LAY(r.SP, l.addr(STD_FRAME_SIZE_IN_BYTES + additional_bytes, 
r.SP))
 
     def get_assembler_function(self):
         "NOT_RPYTHON: tests only"
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py 
b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -204,8 +204,9 @@
         self.a.mc.LARL(r.r5, loc.imm(-8))
         self.a.mc.LG(r.r4, loc.addr(8,r.r5))
         self.a.mc.AG(r.r4, loc.addr(0,r.r5))
+        self.a.mc.LGR(r.r2, r.r4)
         self.a.jmpto(r.r14)
-        assert run_asm(self.a) == 0
+        assert run_asm(self.a) == -2
 
     def test_xor(self):
         self.a.mc.XGR(r.r2, r.r2)
diff --git a/rpython/jit/backend/zarch/test/test_runner.py 
b/rpython/jit/backend/zarch/test/test_runner.py
--- a/rpython/jit/backend/zarch/test/test_runner.py
+++ b/rpython/jit/backend/zarch/test/test_runner.py
@@ -28,3 +28,36 @@
     # realloc frame takes the most space (from just after larl, to lay)
     bridge_loop_instructions = "larl; lg; cgfi; je; lghi; stg; " \
                                "lay; lgfi;( iihf;)? lgfi;( iihf;)? basr; lay; 
lg; br;$"
+
+    def test_multiple_arguments(self):
+        from rpython.rtyper.annlowlevel import llhelper
+        from rpython.jit.metainterp.typesystem import deref
+        from rpython.rlib.jit_libffi import types
+        from rpython.jit.codewriter.effectinfo import EffectInfo
+        from rpython.rlib.rarithmetic import intmask
+
+        def func_int(a, b, c, d, e, f):
+            sum = intmask(a) + intmask(b) + intmask(c) + intmask(d) + 
intmask(e) + intmask(f)
+            return sum
+
+        functions = [
+            (func_int, lltype.Signed, types.sint, 655360, 655360),
+            (func_int, lltype.Signed, types.sint, 655360, -293999429),
+            ]
+
+        cpu = self.cpu
+        for func, TP, ffi_type, num, num1 in functions:
+            #
+            FPTR = self.Ptr(self.FuncType([TP] * 6, TP))
+            func_ptr = llhelper(FPTR, func)
+            FUNC = deref(FPTR)
+            funcbox = self.get_funcbox(cpu, func_ptr)
+            # first, try it with the "normal" calldescr
+            calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
+                                        EffectInfo.MOST_GENERAL)
+            iargs = [0x7fffFFFFffffFFFF,1,0,0,0,0]
+            args = [InputArgInt(num) for num in iargs]
+            res = self.execute_operation(rop.CALL_I,
+                                         [funcbox] + args,
+                                         'int', descr=calldescr)
+            assert res == sum(iargs)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to