Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r82630:2ea190038b88
Date: 2016-03-01 12:43 +0100
http://bitbucket.org/pypy/pypy/changeset/2ea190038b88/
Log: undo some of the changes of memop-simplify3 and pass length to the
length parameter instead of byte size
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -204,15 +204,15 @@
NOT_SIGNED = 0
CINT_ZERO = ConstInt(0)
opnum = op.getopnum()
- if opnum == rop.CALL_MALLOC_NURSERY_VARSIZE:
- v_length = op.getarg(2)
- scale = op.getarg(1).getint()
- if scale not in self.cpu.load_supported_factors:
- scale, offset, v_length = \
-
self._emit_mul_if_factor_offset_not_supported(v_length, scale, 0)
- op.setarg(1, ConstInt(scale))
- op.setarg(2, v_length)
- elif op.is_getarrayitem() or \
+ #if opnum == rop.CALL_MALLOC_NURSERY_VARSIZE:
+ # v_length = op.getarg(2)
+ # scale = op.getarg(1).getint()
+ # if scale not in self.cpu.load_supported_factors:
+ # scale, offset, v_length = \
+ #
self._emit_mul_if_factor_offset_not_supported(v_length, scale, 0)
+ # op.setarg(1, ConstInt(scale))
+ # op.setarg(2, v_length)
+ if op.is_getarrayitem() or \
opnum in (rop.GETARRAYITEM_RAW_I,
rop.GETARRAYITEM_RAW_F):
self.handle_getarrayitem(op)
@@ -793,12 +793,12 @@
arraydescr.lendescr.offset !=
gc_descr.standard_array_length_ofs)):
return False
self.emitting_an_operation_that_can_collect()
- scale = itemsize
- if scale not in self.cpu.load_supported_factors:
- scale, offset, v_length = \
- self._emit_mul_if_factor_offset_not_supported(v_length,
scale, 0)
+ #scale = itemsize
+ #if scale not in self.cpu.load_supported_factors:
+ # scale, offset, v_length = \
+ # self._emit_mul_if_factor_offset_not_supported(v_length,
scale, 0)
op = ResOperation(rop.CALL_MALLOC_NURSERY_VARSIZE,
- [ConstInt(kind), ConstInt(scale), v_length],
+ [ConstInt(kind), ConstInt(itemsize), v_length],
descr=arraydescr)
self.replace_op_with(v_result, op)
self.emit_op(op)
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
@@ -432,7 +432,7 @@
return mc.materialize(self.cpu, [])
def _build_malloc_slowpath(self, kind):
- """ While arriving on slowpath, we have a gcmap in SCRATCH.
+ """ While arriving on slowpath, we have a gcmap in r1.
The arguments are passed in r.RES and r.RSZ, as follows:
kind == 'fixed': nursery_head in r.RES and the size in r.RSZ - r.RES.
@@ -440,7 +440,7 @@
kind == 'str/unicode': length of the string to allocate in r.RES.
kind == 'var': itemsize in r.RES, length to allocate in r.RSZ,
- and tid in r.SCRATCH2.
+ and tid in r.r0.
This function must preserve all registers apart from r.RES and r.RSZ.
On return, SCRATCH must contain the address of nursery_free.
@@ -480,7 +480,7 @@
# arguments to the called function are [itemsize, tid, length]
# itemsize is already in r2
mc.LGR(r.r4, r.RSZ) # length
- mc.LGR(r.r3, r.SCRATCH2) # tid
+ mc.LGR(r.r3, r.r0) # tid
# Do the call
addr = rffi.cast(lltype.Signed, addr)
@@ -1355,6 +1355,26 @@
mc.STG(r.RSZ, l.addr(0, r.r1)) # store into nursery_free
+ SIZE2SCALE = dict([(1<<_i, _i) for _i in range(32)])
+ def _multiply_by_constant(self, loc, multiply_by, scratch_loc):
+ # XXX should die together with _apply_scale() but can't because
+ # of emit_zero_array() and malloc_cond_varsize() at the moment
+ assert loc.is_reg()
+ if multiply_by == 1:
+ return loc
+ try:
+ scale = self.SIZE2SCALE[multiply_by]
+ except KeyError:
+ if check_imm_value(multiply_by, lower_bound=-2**31,
upper_bound=2**31-1):
+ self.mc.LGR(scratch_loc, loc)
+ self.mc.MSGFI(scratch_loc, l.imm(multiply_by))
+ else:
+ self.mc.load_imm(scratch_loc, multiply_by)
+ self.mc.MSGR(scratch_loc, loc)
+ else:
+ self.mc.SLLG(scratch_loc, loc, l.addr(scale))
+ return scratch_loc
+
def malloc_cond_varsize(self, kind, nursery_free_adr, nursery_top_adr,
lengthloc, itemsize, maxlength, gcmap,
arraydescr):
@@ -1381,8 +1401,11 @@
assert check_imm_value(diff)
mc.load_imm(r.r1, nursery_free_adr)
- # no shifting needed, lengthloc is already multiplied by the
- # item size
+ varsizeloc = self._multiply_by_constant(lengthloc, itemsize, r.RSZ)
+
+ # varsizeloc is either RSZ here, or equal to lengthloc if
+ # itemsize == 1. It is the size of the variable part of the
+ # array, in bytes.
mc.load(r.RES, r.r1, 0) # load nursery_free
mc.load(r.SCRATCH2, r.r1, diff) # load nursery_top
@@ -1392,7 +1415,7 @@
force_realignment = (itemsize % WORD) != 0
if force_realignment:
constsize += WORD - 1
- mc.AGHIK(r.RSZ, lengthloc, l.imm(constsize))
+ mc.AGHIK(r.RSZ, varsizeloc, l.imm(constsize))
if force_realignment:
# "& ~(WORD-1)"
mc.RISBG(r.RSZ, r.RSZ, l.imm(0), l.imm(0x80 | 60), l.imm(0))
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
@@ -454,8 +454,7 @@
[lengthloc] = arglocs
arraydescr = op.getdescr()
itemsize = op.getarg(1).getint()
- assert itemsize == 1
- maxlength = (gc_ll_descr.max_size_of_young_obj - WORD * 2)
+ maxlength = (gc_ll_descr.max_size_of_young_obj - WORD * 2) // itemsize
gcmap = regalloc.get_gcmap([r.RES, r.RSZ])
self.malloc_cond_varsize(
op.getarg(0).getint(),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit