Author: Richard Plangger <[email protected]>
Branch: memop-simplify2
Changeset: r80974:2b979e24b5a8
Date: 2015-11-26 15:07 +0100
http://bitbucket.org/pypy/pypy/changeset/2b979e24b5a8/
Log: added gc_store/gc_store_indexed as operation, started migration of
setarrayitem in the backend to the new operations (also added the
rewrite logic)
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
@@ -113,6 +113,24 @@
assert not op.get_forwarded()
op.set_forwarded(newop)
+ def handle_setarrayitem(self, op):
+ itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+ args = op.getarglist()
+ base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ if itemsize == 1:
+ need_lower_byte = True
+ else:
+ need_lower_byte = False
+ value_loc = self.make_sure_var_in_reg(op.getarg(2), args,
+ need_lower_byte=need_lower_byte)
+ ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
+ self.perform_discard(op, [base_loc, ofs_loc, value_loc,
+ imm(itemsize), imm(ofs)])
+
+ def emit_gc_store_or_indexed(self, op, ptr_box, index_box, itemsize,
factor, offset, sign):
+ self._emit_mul_add_if_factor_offset_not_supported(factor, offset)
+ #
+
def handle_getarrayitem(self, op):
itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
ptr_box, index_box = op.getarglist()
@@ -123,7 +141,7 @@
ptr_box, index_box = op.getarglist()
self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, 1, ofs,
sign)
- def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize,
factor, offset, sign):
+ def _emit_mul_add_if_factor_offset_not_supported(self, factor, offset):
# factor
if factor != 1 and factor not in self.cpu.load_supported_factors:
index_box = ResOperation(rop.INT_MUL, [index_box,
ConstInt(factor)])
@@ -134,6 +152,9 @@
index_box = ResOperation(rop.INT_ADD, [index_box,
ConstInt(offset)])
self.emit_op(index_box)
offset = 0
+
+ def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize,
factor, offset, sign):
+ self._emit_mul_add_if_factor_offset_not_supported(factor, offset)
#
if sign:
# encode signed into the itemsize value
@@ -165,10 +186,14 @@
if op is self._changed_op:
op = self._changed_op_to
# ---------- GC_LOAD --------------
- if op.is_getarrayitem() or op.getopnum() in (
- rop.GETARRAYITEM_RAW_I,
- rop.GETARRAYITEM_RAW_F):
+ if op.is_getarrayitem() or \
+ op.getopnum() in (rop.GETARRAYITEM_RAW_I,
+ rop.GETARRAYITEM_RAW_F,
+ rop.GETARRAYITEM_RAW_R):
self.handle_getarrayitem(op)
+ if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW,
+ rop.RAW_STORE_I, rop.RAW_STORE_F):
+ self.handle_setarrayitem(op)
if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F):
self.handle_rawload(op)
# TODO
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1502,31 +1502,6 @@
genop_gc_load_indexed_r = _genop_gc_load_indexed
genop_gc_load_indexed_f = _genop_gc_load_indexed
- def _genop_getarrayitem(self, op, arglocs, resloc):
- base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
- assert isinstance(ofs, ImmedLoc)
- assert isinstance(size_loc, ImmedLoc)
- scale = get_scale(size_loc.value)
- src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale)
- self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
-
- genop_getarrayitem_gc_i = _genop_getarrayitem
- genop_getarrayitem_gc_r = _genop_getarrayitem
- genop_getarrayitem_gc_f = _genop_getarrayitem
- genop_getarrayitem_gc_pure_i = _genop_getarrayitem
- genop_getarrayitem_gc_pure_r = _genop_getarrayitem
- genop_getarrayitem_gc_pure_f = _genop_getarrayitem
- genop_getarrayitem_raw_i = _genop_getarrayitem
- genop_getarrayitem_raw_f = _genop_getarrayitem
-
- def _genop_raw_load(self, op, arglocs, resloc):
- base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
- assert isinstance(ofs, ImmedLoc)
- src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0)
- self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
- genop_raw_load_i = _genop_raw_load
- genop_raw_load_f = _genop_raw_load
-
def _imul_const_scaled(self, mc, targetreg, sourcereg, itemsize):
"""Produce one operation to do roughly
targetreg = sourcereg * itemsize
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1105,11 +1105,12 @@
consider_unicodesetitem = consider_strsetitem
- def consider_setarrayitem_gc(self, op):
+ def consider_gc_store(self, op):
itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
args = op.getarglist()
base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
- if itemsize == 1:
+ itemsize = abs(size)
+ if size < 0:
need_lower_byte = True
else:
need_lower_byte = False
@@ -1183,7 +1184,6 @@
sign_loc = imm1
else:
sign_loc = imm0
- print("GC_LOAD execute", base_loc, "+", ofs_loc, "scale", scale,
"offset", offset)
self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc)
consider_gc_load_i = _consider_gc_load
@@ -1199,7 +1199,6 @@
offset = op.getarg(3).value
size = op.getarg(4).value
size_loc = imm(abs(size))
- print("GC_LOAD_INDEXED execute", base_loc, "+", ofs_loc, "scale",
scale, "offset", offset)
if size < 0:
sign_loc = imm1
else:
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -401,10 +401,6 @@
rop.GETARRAYITEM_GC_PURE_F,
rop.GETARRAYITEM_GC_PURE_R)
- def is_rawarrayitem(self):
- return self.opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F,
- rop.GETARRAYITEM_RAW_R,
rop.GETARRAYITEM_GC_PURE_I,)
-
def is_real_call(self):
opnum = self.opnum
return (opnum == rop.CALL_I or
@@ -1142,6 +1138,10 @@
# must be forced, however we need to execute it anyway
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
+ # same paramters as GC_LOAD, but one additional for the value to store
+ 'GC_STORE/5d/n',
+ 'GC_STORE_INDEXED/6d/n',
+
'INCREMENT_DEBUG_COUNTER/1/n',
'_RAW_STORE_FIRST',
'SETARRAYITEM_GC/3d/n',
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit