[pypy-commit] pypy s390x-backend: some more fixes, wrong offset was calculated by push/pop to jit frame

plan_rich pypy.commits at gmail.com
Thu Feb 18 09:17:52 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r82319:705395ae74a3
Date: 2016-02-18 15:16 +0100
http://bitbucket.org/pypy/pypy/changeset/705395ae74a3/

Log:	some more fixes, wrong offset was calculated by push/pop to jit
	frame

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
@@ -182,7 +182,7 @@
         RCS2 = r.r10
         RCS3 = r.r11
 
-        # r10,r11,r12,r2,f0 -> makes exactly 4 words + 8 byte
+        # r9,r10,r11,r2,f0 -> makes exactly 4 words + 8 byte
         extra_stack_size = 4 * WORD + 8
         if for_frame:
             # NOTE: don't save registers on the jitframe here!  It might
@@ -201,7 +201,7 @@
             mc.LG(r.SCRATCH, l.addr(0, r.SP))
             mc.STG(r.SCRATCH, l.addr(-extra_stack_size, r.SP))
             mc.LAY(r.SP, l.addr(-extra_stack_size, r.SP))
-            mc.STMG(r.r10, r.r12, l.addr(off, r.SP))
+            mc.STMG(r.r9, r.r11, l.addr(off, r.SP))
             mc.STG(r.r2, l.addr(off+3*WORD, r.SP))
             # OK to use STD, because offset is not negative
             mc.STD(r.f0, l.addr(off+4*WORD, r.SP))
@@ -253,7 +253,7 @@
 
         if for_frame:
             off = STD_FRAME_SIZE_IN_BYTES
-            mc.LMG(r.r10, r.r12, l.addr(off, r.SP))
+            mc.LMG(r.r9, r.r11, l.addr(off, r.SP))
             mc.LG(r.r2, l.addr(off+3*WORD, r.SP))
             mc.LD(r.f0, l.addr(off+4*WORD, r.SP))
             mc.LAY(r.SP, l.addr(extra_stack_size, r.SP))
@@ -418,7 +418,6 @@
         if supports_floats:
             self._push_fp_regs_to_jitframe(mc)
 
-        # allocate a stack frame!
         mc.raw_call(r.r11)
 
         # Finish
@@ -1092,7 +1091,8 @@
         base_ofs = self.cpu.get_baseofs_of_frame_field()
         if len(includes) == 1:
             iv = includes[0]
-            addr = l.addr(base_ofs + iv.value * WORD, r.SPP)
+            v = r.ALL_REG_INDEXES[iv]
+            addr = l.addr(base_ofs + v * WORD, r.SPP)
             if store:
                 mc.STG(iv, addr)
             else:
diff --git a/rpython/jit/backend/zarch/locations.py b/rpython/jit/backend/zarch/locations.py
--- a/rpython/jit/backend/zarch/locations.py
+++ b/rpython/jit/backend/zarch/locations.py
@@ -75,8 +75,8 @@
     def is_fp_reg(self):
         return True
 
-    def as_key(self):            # 20 <= as_key <= 35
-        return self.value + 20
+    def as_key(self):            # 16 <= as_key <= 32
+        return self.value + 16
 
     def is_float(self):
         return True
@@ -125,34 +125,11 @@
         return True
 
     def as_key(self):                # an aligned word + 10000
-        return self.position + 10000
+        return -self.position + 10000
 
     def is_float(self):
         return self.type == FLOAT
 
-class RawSPStackLocation(AssemblerLocation):
-    _immutable_ = True
-
-    def __init__(self, sp_offset, type=INT):
-        if type == FLOAT:
-            self.width = DOUBLE_WORD
-        else:
-            self.width = WORD
-        self.value = sp_offset
-        self.type = type
-
-    def __repr__(self):
-        return 'SP(%s)+%d' % (self.type, self.value,)
-
-    def is_raw_sp(self):
-        return True
-
-    def is_float(self):
-        return self.type == FLOAT
-
-    def as_key(self):            # a word >= 1000, and < 1000 + size of SP frame
-        return self.value + 1000
-
 class AddressLocation(AssemblerLocation):
     _immutable_ = True
 
@@ -173,9 +150,6 @@
         if length:
             self.length = length.value
 
-    def as_key(self):
-        return self.displace + 100000
-
 class PoolLoc(AddressLocation):
     _immutable_ = True
     width = WORD
@@ -205,6 +179,9 @@
     def __repr__(self):
         return "pool(i,%d)" %  self.displace
 
+    def as_key(self):
+        return -self.displace // 8 + 20000
+
 def addr(displace, basereg=None, indexreg=None, length=None):
     return AddressLocation(basereg, indexreg, displace, length)
 
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
@@ -404,8 +404,8 @@
         if regalloc.fprm.reg_bindings:
             floats = True
         cond_call_adr = self.cond_call_slowpath[floats * 2 + callee_only]
-        self.mc.load_imm(r.SCRATCH, cond_call_adr)
-        self.mc.BASR(r.RETURN, r.SCRATCH)
+        self.mc.load_imm(r.r14, cond_call_adr)
+        self.mc.BASR(r.r14, r.r14)
         # restoring the registers saved above, and doing pop_gcmap(), is left
         # to the cond_call_slowpath helper.  We never have any result value.
         relative_target = self.mc.currpos() - jmp_adr
diff --git a/rpython/jit/backend/zarch/registers.py b/rpython/jit/backend/zarch/registers.py
--- a/rpython/jit/backend/zarch/registers.py
+++ b/rpython/jit/backend/zarch/registers.py
@@ -38,7 +38,9 @@
     ALL_REG_INDEXES[_r] = len(ALL_REG_INDEXES)
 for _r in MANAGED_FP_REGS:
     ALL_REG_INDEXES[_r] = len(ALL_REG_INDEXES)
-JITFRAME_FIXED_SIZE = len(ALL_REG_INDEXES) + 1 # plus one word to have an even number
+# NOT used, but keeps JITFRAME_FIXED_SIZE even
+ALL_REG_INDEXES[f15] = len(ALL_REG_INDEXES)
+JITFRAME_FIXED_SIZE = len(ALL_REG_INDEXES)
 
 def odd_reg(r):
     assert r.value % 2 == 0


More information about the pypy-commit mailing list