Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r81737:d411a9856766
Date: 2016-01-13 10:23 +0100
http://bitbucket.org/pypy/pypy/changeset/d411a9856766/

Log:    added to more tests & bug fix: do not use SRLG (logical right shift)
        or any other shift with parameters R_1 and R_3 that designate the
        same register

diff --git a/rpython/jit/backend/zarch/helper/assembler.py 
b/rpython/jit/backend/zarch/helper/assembler.py
--- a/rpython/jit/backend/zarch/helper/assembler.py
+++ b/rpython/jit/backend/zarch/helper/assembler.py
@@ -27,8 +27,10 @@
 
 def gen_emit_shift(func):
     def f(self, op, arglocs, regalloc):
-        l0, l1 = arglocs
-        getattr(self.mc, func)(l0, l0, l1)
+        lr, l0, l1 = arglocs
+        assert lr is not l0
+        getattr(self.mc, func)(lr, l0, l1)
+    f.name = 'emit_shift_' + func
     return f
 
 def gen_emit_rr_or_rpool(rr_func, rp_func):
diff --git a/rpython/jit/backend/zarch/helper/regalloc.py 
b/rpython/jit/backend/zarch/helper/regalloc.py
--- a/rpython/jit/backend/zarch/helper/regalloc.py
+++ b/rpython/jit/backend/zarch/helper/regalloc.py
@@ -115,9 +115,9 @@
         tmp = self.rm.ensure_reg(a1, force_in_reg=True)
         l1 = addr(0, tmp)
     l0 = self.ensure_reg(a0, force_in_reg=True)
-    self.force_result_in_reg(op, a0)
+    lr = self.force_allocate_reg(op)
     self.free_op_vars()
-    return [l0, l1]
+    return [lr, l0, l1]
 
 def generate_cmp_op(signed=True):
     def prepare_cmp_op(self, op):
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
@@ -177,6 +177,16 @@
         self.a.jmpto(r.r14)
         assert run_asm(self.a) == -1
 
+    def test_uint_rshift(self):
+        self.a.mc.XGR(r.r4, r.r4)
+        self.a.mc.LGFI(r.r5, loc.imm(63))
+        self.a.mc.NGR(r.r4, r.r5)
+        self.a.mc.LGFI(r.r3, loc.imm(18))
+        self.a.mc.LGFI(r.r2, loc.imm(0xffffffff))
+        self.a.mc.SRLG(r.r2, r.r3, loc.addr(18))
+        self.a.jmpto(r.r14)
+        assert run_asm(self.a) == 0
+
     def test_xor(self):
         self.a.mc.XGR(r.r2, r.r2)
         self.a.jmpto(r.r14)
diff --git a/rpython/jit/backend/zarch/test/test_int.py 
b/rpython/jit/backend/zarch/test/test_int.py
--- a/rpython/jit/backend/zarch/test/test_int.py
+++ b/rpython/jit/backend/zarch/test/test_int.py
@@ -16,6 +16,25 @@
     cpu = CPU_S390_64(rtyper=None, stats=FakeStats())
     cpu.setup_once()
 
+    def test_uint_rshift(self):
+        code = """
+        [i1]
+        i11 = int_and(i1, 63)
+        i10 = uint_rshift(18, i11)
+        i1402 = int_is_true(i10)
+        guard_false(i1402, descr=faildescr) [] # must NEVER exit with i1 == 0
+        finish(i1402, descr=finishdescr)
+        """
+        finishdescr = BasicFinalDescr(1)
+        faildescr = BasicFailDescr(2)
+        loop = parse(code, namespace={'faildescr': faildescr,
+                                      'finishdescr': finishdescr})
+        looptoken = JitCellToken()
+        self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
+        deadframe = self.cpu.execute_token(looptoken, 19)
+        fail = self.cpu.get_latest_descr(deadframe)
+        assert fail == finishdescr # ensures that guard is not taken!
+
     def test_double_evenodd_pair(self):
         code = """
         [i0]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to