[pypy-commit] pypy s390x-backend: guard_subclass, guard_is_object ported to s390x

plan_rich pypy.commits at gmail.com
Mon Jan 11 08:28:28 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81672:39f75f1f6c6b
Date: 2016-01-11 14:27 +0100
http://bitbucket.org/pypy/pypy/changeset/39f75f1f6c6b/

Log:	guard_subclass, guard_is_object ported to s390x simplified the code
	in int_shift_left (use some old code of the regalloc) impl of stack
	check slowpath and stack check

diff --git a/rpython/jit/backend/zarch/assembler.py b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -529,12 +529,11 @@
         #
         mc._pop_core_regs_from_jitframe([r.r14]) # restore the link on the jit frame
         # So we return to our caller, conditionally if "EQ"
-        # mc.LG(r.r14, l.addr(14*WORD, r.SP))
         mc.BCR(c.EQ, r.r14)
         #
         # Else, jump to propagate_exception_path
         assert self.propagate_exception_path
-        mc.b_abs(self.propagate_exception_path)
+        mc.branch_absolute(self.propagate_exception_path)
         #
         rawstart = mc.materialize(self.cpu, [])
         self.stack_check_slowpath = rawstart
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
@@ -112,15 +112,10 @@
         # in the addr part of the instruction
         l1 = addr(a1.getint())
     else:
-        self.rm.ensure_in_reg(a1, r.SCRATCH)
-        l1 = addr(0, r.SCRATCH)
-    l0 = self.ensure_reg(a0)
-    if l0.is_in_pool():
-        loc = self.force_allocate_reg(op)
-        self.assembler.mc.LG(loc, l0)
-        l0 = loc
-    else:
-        self.force_result_in_reg(op, a0)
+        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)
     self.free_op_vars()
     return [l0, l1]
 
diff --git a/rpython/jit/backend/zarch/opassembler.py b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -634,10 +634,7 @@
         # Note that the typeid half-word is at offset 0 on a little-endian
         # machine; it is at offset 2 or 4 on a big-endian machine.
         assert self.cpu.supports_guard_gc_type
-        if IS_PPC_32:
-            self.mc.lhz(targetreg.value, loc_ptr.value, 2 * IS_BIG_ENDIAN)
-        else:
-            self.mc.lwz(targetreg.value, loc_ptr.value, 4 * IS_BIG_ENDIAN)
+        self.mc.LGF(targetreg, l.addr(4, loc_ptr))
 
     def _cmp_guard_gc_type(self, loc_ptr, expected_typeid):
         self._read_typeid(r.SCRATCH2, loc_ptr)
@@ -666,9 +663,11 @@
 
         self._read_typeid(r.SCRATCH2, loc_object)
         self.mc.load_imm(r.SCRATCH, base_type_info + infobits_offset)
-        assert shift_by == 0     # on PPC64; fixme for PPC32
-        self.mc.lbzx(r.SCRATCH2.value, r.SCRATCH2.value, r.SCRATCH.value)
-        self.mc.andix(r.SCRATCH2.value, r.SCRATCH2.value, IS_OBJECT_FLAG & 0xff)
+        assert shift_by == 0
+        self.mc.AGR(r.SCRATCH, r.SCRATCH2)
+        self.mc.LLGC(r.SCRATCH2, l.addr(0, r.SCRATCH))
+        self.mc.LGHI(r.SCRATCH, l.imm(IS_OBJECT_FLAG & 0xff))
+        self.mc.NGR(r.SCRATCH2, r.SCRATCH)
         self.guard_success_cc = c.NE
         self._emit_guard(op, arglocs[1:])
 
@@ -683,7 +682,7 @@
             self.mc.LG(r.SCRATCH2, l.addr(offset, loc_object))
             # read the vtable's subclassrange_min field
             assert check_imm(offset2)
-            self.mc.LG(r.SCRATCH2.value, r.SCRATCH2.value, offset2)
+            self.mc.load(r.SCRATCH2, r.SCRATCH2, offset2)
         else:
             # read the typeid
             self._read_typeid(r.SCRATCH, loc_object)
@@ -692,8 +691,11 @@
             base_type_info, shift_by, sizeof_ti = (
                 self.cpu.gc_ll_descr.get_translated_info_for_typeinfo())
             self.mc.load_imm(r.SCRATCH2, base_type_info + sizeof_ti + offset2)
-            assert shift_by == 0     # on PPC64; fixme for PPC32
-            self.mc.ldx(r.SCRATCH2.value, r.SCRATCH2.value, r.SCRATCH.value)
+            assert shift_by == 0
+            # add index manually
+            # we cannot use r0 in l.addr(...)
+            self.mc.AGR(r.SCRATCH, r.SCRATCH2)
+            self.mc.load(r.SCRATCH2, r.SCRATCH, 0)
         # get the two bounds to check against
         vtable_ptr = loc_check_against_class.getint()
         vtable_ptr = rffi.cast(rclass.CLASSTYPE, vtable_ptr)
@@ -706,8 +708,8 @@
         assert 0 <= check_min <= 0x7fff
         assert 0 <= check_diff <= 0xffff
         # check by doing the unsigned comparison (tmp - min) < (max - min)
-        self.mc.subi(r.SCRATCH2.value, r.SCRATCH2.value, check_min)
-        self.mc.cmp_op(0, r.SCRATCH2.value, check_diff, imm=True, signed=False)
+        self.mc.AGHI(r.SCRATCH2, l.imm(-check_min))
+        self.mc.cmp_op(r.SCRATCH2, l.imm(check_diff), imm=True, signed=False)
         # the guard passes if we get a result of "below or equal"
         self.guard_success_cc = c.LE
         self._emit_guard(op, arglocs[2:])
@@ -831,7 +833,7 @@
             addr_loc = l.addr(offset_loc.value, base_loc, index_loc)
         else:
             self.mc.LGR(r.SCRATCH, index_loc)
-            slef.mc.AGR(r.SCRATCH, offset_loc)
+            self.mc.AGR(r.SCRATCH, offset_loc)
             addr_loc = l.addr(0, base_loc, r.SCRATCH)
         self._memory_read(result_loc, addr_loc, size_loc.value, sign_loc.value)
 
diff --git a/rpython/jit/backend/zarch/regalloc.py b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -286,31 +286,12 @@
             raise NoVariableToSpill()
         return even, odd
 
-    def ensure_in_reg(self, var, reg):
-        """ opposed to ensure_reg, this loads the contents of the variable
-            directly into reg """
-        if isinstance(var, ConstInt):
-            if -2**15 <= var.value and var.value <= 2*15-1:
-                self.assembler.mc.LGHI(reg, l.imm(var.value))
-            elif -2**31 <= var.value and var.value <= 2*31-1:
-                self.assembler.mc.LGFI(reg, l.imm(var.value))
-            else:
-                poolloc = self.ensure_reg(a1)
-                self.assembler.mc.LG(reg, poolloc)
-        else:
-            loc = self.loc(var, must_exist=True)
-            if loc is not reg:
-                self.assembler.regalloc_mov(loc, reg)
-            return reg
-
     def force_result_in_even_reg(self, result_v, loc, forbidden_vars=[]):
         pass
 
     def force_result_in_odd_reg(self, result_v, loc, forbidden_vars=[]):
         pass
 
-
-
 class ZARCHFrameManager(FrameManager):
     def __init__(self, base_ofs):
         FrameManager.__init__(self)


More information about the pypy-commit mailing list