Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r81435:f8b4c491d659
Date: 2015-12-23 11:50 +0100
http://bitbucket.org/pypy/pypy/changeset/f8b4c491d659/
Log: added impl to call memcpy
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
@@ -8,6 +8,7 @@
from rpython.jit.backend.zarch.helper.regalloc import (check_imm,
check_imm_value)
from rpython.jit.backend.zarch.codebuilder import ZARCHGuardToken, InstrBuilder
+from rpython.jit.backend.llsupport import symbolic, jitframe
import rpython.jit.backend.zarch.conditions as c
import rpython.jit.backend.zarch.registers as r
import rpython.jit.backend.zarch.locations as l
@@ -832,6 +833,64 @@
def _mem_offset_supported(self, value):
return -2**19 <= value < 2**19
+ def emit_copystrcontent(self, op, arglocs, regalloc):
+ self._emit_copycontent(arglocs, is_unicode=False)
+
+ def emit_copyunicodecontent(self, op, arglocs, regalloc):
+ self._emit_copycontent(arglocs, is_unicode=True)
+
+ def _emit_load_for_copycontent(self, dst, src_ptr, src_ofs, scale):
+ if src_ofs.is_imm():
+ value = src_ofs.value << scale
+ if check_imm_value(value):
+ self.mc.LGR(dst, src_ptr)
+ self.mc.AGHI(dst, l.imm(value))
+ else:
+ self.mc.load_imm(dst, value)
+ self.mc.AGR(dst, src_ptr)
+ elif scale == 0:
+ self.mc.AGR(dst, src_ptr)
+ self.mc.AGR(dst, src_ofs)
+ else:
+ self.mc.SLAG(dst, src_ofs, l.add(scale))
+ self.mc.AGR(dst, src_ptr)
+
+ def _emit_copycontent(self, arglocs, is_unicode):
+ [src_ptr_loc, dst_ptr_loc,
+ src_ofs_loc, dst_ofs_loc, length_loc] = arglocs
+
+ if is_unicode:
+ basesize, itemsize, _ = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ if itemsize == 2: scale = 1
+ elif itemsize == 4: scale = 2
+ else: raise AssertionError
+ else:
+ basesize, itemsize, _ = symbolic.get_array_token(rstr.STR,
+ self.cpu.translate_support_code)
+ assert itemsize == 1
+ scale = 0
+
+ self._emit_load_for_copycontent(r.r0, src_ptr_loc, src_ofs_loc, scale)
+ self._emit_load_for_copycontent(r.r2, dst_ptr_loc, dst_ofs_loc, scale)
+
+ if length_loc.is_imm():
+ length = length_loc.getint()
+ 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.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.load_imm(self.mc.RAW_CALL_REG, self.memcpy_addr)
+ self.mc.raw_call()
+
+
class ForceOpAssembler(object):
_mixin_ = True
@@ -930,7 +989,6 @@
mc.copy_to_raw_memory(oldadr)
-
class MiscOpAssembler(object):
_mixin_ = True
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
@@ -1009,6 +1009,18 @@
locs = self._prepare_guard(op)
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_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))
+ self._spill_before_call(save_all_regs=False)
+ return [src_ptr_loc, dst_ptr_loc,
+ src_ofs_loc, dst_ofs_loc, length_loc]
+
+ prepare_copyunicodecontent = prepare_copystrcontent
+
def prepare_label(self, op):
descr = op.getdescr()
assert isinstance(descr, TargetToken)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit