[pypy-commit] pypy s390x-backend: finished memcpy call, adding stack frame to the routine correctly

plan_rich pypy.commits at gmail.com
Wed Dec 23 06:55:32 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81436:024661e7ca0b
Date: 2015-12-23 11:50 +0100
http://bitbucket.org/pypy/pypy/changeset/024661e7ca0b/

Log:	finished memcpy call, adding stack frame to the routine correctly

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
@@ -1,6 +1,7 @@
 from rpython.jit.backend.zarch import conditions as c
 from rpython.jit.backend.zarch import registers as r
 from rpython.jit.backend.zarch import locations as l
+from rpython.jit.backend.zarch.arch import STD_FRAME_SIZE_IN_BYTES
 from rpython.jit.backend.zarch.instruction_builder import build_instr_codes
 from rpython.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
 from rpython.jit.backend.llsupport.assembler import GuardToken
@@ -186,6 +187,13 @@
         """
         self.BASR(r.RETURN, call_reg)
 
+    def alloc_std_frame(self):
+        self.STG(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
+        self.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
+
+    def restore_std_frame(self):
+        self.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
+
 class OverwritingBuilder(BlockBuilderMixin, AbstractZARCHBuilder):
     def __init__(self, mc, start, num_insts=0):
         AbstractZARCHBuilder.__init__(self)
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
@@ -849,10 +849,10 @@
                 self.mc.load_imm(dst, value)
                 self.mc.AGR(dst, src_ptr)
         elif scale == 0:
-            self.mc.AGR(dst, src_ptr)
+            self.mc.LGR(dst, src_ptr)
             self.mc.AGR(dst, src_ofs)
         else:
-            self.mc.SLAG(dst, src_ofs, l.add(scale))
+            self.mc.SLAG(dst, src_ofs, l.addr(scale))
             self.mc.AGR(dst, src_ptr)
 
     def _emit_copycontent(self, arglocs, is_unicode):
@@ -879,16 +879,18 @@
             self.mc.load_imm(r.r4, length << scale)
         else:
             if scale > 0:
-                self.mc.sldi(r.r4.value, length_loc.value, scale)
-            elif length_loc is not r.r5:
+                self.mc.SLAG(r.r4, length_loc, l.addr(scale))
+            elif length_loc is not r.r4:
                 self.mc.LGR(r.r4, length_loc)
 
         self.mc.LGR(r.r3, r.r0)
         self.mc.AGHI(r.r3, l.imm(basesize))
         self.mc.AGHI(r.r2, l.imm(basesize))
 
+        self.mc.alloc_std_frame()
         self.mc.load_imm(self.mc.RAW_CALL_REG, self.memcpy_addr)
         self.mc.raw_call()
+        self.mc.restore_std_frame()
 
 
 class ForceOpAssembler(object):
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
@@ -1010,8 +1010,8 @@
         return locs
 
     def prepare_copystrcontent(self, op):
-        src_ptr_loc = self.ensure_reg(op.getarg(0))
-        dst_ptr_loc = self.ensure_reg(op.getarg(1))
+        src_ptr_loc = self.ensure_reg(op.getarg(0), force_in_reg=True)
+        dst_ptr_loc = self.ensure_reg(op.getarg(1), force_in_reg=True)
         src_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(2))
         dst_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(3))
         length_loc  = self.ensure_reg_or_any_imm(op.getarg(4))


More information about the pypy-commit mailing list