Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r48378:155a57d1d251
Date: 2011-10-24 17:52 +0200
http://bitbucket.org/pypy/pypy/changeset/155a57d1d251/
Log: Implemented basic array operations.
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py
b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -5,6 +5,7 @@
from pypy.jit.backend.ppc.ppcgen.arch import GPR_SAVE_AREA, IS_PPC_32, WORD
from pypy.jit.metainterp.history import LoopToken, AbstractFailDescr
+from pypy.rlib.objectmodel import we_are_translated
class GuardToken(object):
def __init__(self, descr, failargs, faillocs, offset, fcond=c.NE,
@@ -303,5 +304,66 @@
else:
assert 0, "size not supported"
+ # XXX 64 bit adjustment
+ def emit_arraylen_gc(self, op, arglocs, regalloc):
+ res, base_loc, ofs = arglocs
+ self.mc.lwz(res.value, base_loc.value, ofs.value)
+
+ # XXX 64 bit adjustment
+ def emit_setarrayitem_gc(self, op, arglocs, regalloc):
+ value_loc, base_loc, ofs_loc, scale, ofs = arglocs
+ if scale.value > 0:
+ scale_loc = r.r0
+ self.mc.load_imm(r.r0, scale.value)
+ self.mc.slw(r.r0.value, ofs_loc.value, r.r0.value)
+ else:
+ scale_loc = ofs_loc
+
+ if ofs.value > 0:
+ self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
+ scale_loc = r.r0
+
+ if scale.value == 3:
+ assert 0, "not implemented yet"
+ elif scale.value == 2:
+ self.mc.stwx(value_loc.value, base_loc.value, scale_loc.value)
+ elif scale.value == 1:
+ self.mc.sthx(value_loc.value, base_loc.value, scale_loc.value)
+ elif scale.value == 0:
+ self.mc.stbx(value_loc.value, base_loc.value, scale_loc.value)
+ else:
+ assert 0, "scale %s not supported" % (scale.value)
+
+ # XXX 64 bit adjustment
+ def emit_getarrayitem_gc(self, op, arglocs, regalloc):
+ res, base_loc, ofs_loc, scale, ofs = arglocs
+ if scale.value > 0:
+ scale_loc = r.r0
+ self.mc.load_imm(r.r0, scale.value)
+ self.mc.slw(r.r0.value, ofs_loc.value, scale.value)
+ else:
+ scale_loc = ofs_loc
+ if ofs.value > 0:
+ self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
+ scale_loc = r.r0
+
+ if scale.value == 3:
+ assert 0, "not implemented yet"
+ elif scale.value == 2:
+ self.mc.lwzx(res.value, base_loc.value, scale_loc.value)
+ elif scale.value == 1:
+ self.mc.lhzx(res.value, base_loc.value, scale_loc.value)
+ elif scale.value == 0:
+ self.mc.lbzx(res.value, base_loc.value, scale_loc.value)
+ else:
+ assert 0
+
+ #XXX Hack, Hack, Hack
+ if not we_are_translated():
+ descr = op.getdescr()
+ size = descr.get_item_size(False)
+ signed = descr.is_item_signed()
+ self._ensure_result_bit_extension(res, size, signed)
+
def nop(self):
self.mc.ori(0, 0, 0)
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -652,6 +652,27 @@
assert 0, "not supported location"
assert 0, "not supported location"
+ def _ensure_result_bit_extension(self, resloc, size, signed):
+ if size == 4:
+ return
+ if size == 1:
+ if not signed: #unsigned char
+ self.mc.load_imm(r.r0, 0xFF)
+ self.mc.and_(resloc.value, resloc.value, r.r0.value)
+ else:
+ self.mc.load_imm(r.r0, 24)
+ self.mc.slw(resloc.value, resloc.value, r.r0.value)
+ self.mc.sraw(resloc.value, resloc.value, r.r0.value)
+ elif size == 2:
+ if not signed:
+ self.mc.load_imm(r.r0, 16)
+ self.mc.slw(resloc.value, resloc.value, r.r0.value)
+ self.mc.srw(resloc.value, resloc.value, r.r0.value)
+ else:
+ self.mc.load_imm(r.r0, 16)
+ self.mc.slw(resloc.value, resloc.value, r.r0.value)
+ self.mc.sraw(resloc.value, resloc.value, r.r0.value)
+
def make_operations():
def not_implemented(builder, trace_op, cpu, *rest_args):
raise NotImplementedError, trace_op
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py
b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -374,6 +374,45 @@
self.possibly_free_var(op.result)
return [base_loc, ofs_loc, res, imm(size)]
+ def prepare_arraylen_gc(self, op):
+ arraydescr = op.getdescr()
+ assert isinstance(arraydescr, BaseArrayDescr)
+ ofs = arraydescr.get_ofs_length(self.cpu.translate_support_code)
+ arg = op.getarg(0)
+ base_loc, base_box = self._ensure_value_is_boxed(arg)
+ self.possibly_free_vars([arg, base_box])
+
+ res = self.force_allocate_reg(op.result)
+ self.possibly_free_var(op.result)
+ return [res, base_loc, imm(ofs)]
+
+ def prepare_setarrayitem_gc(self, op):
+ b0, b1, b2 = boxes = list(op.getarglist())
+ _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr())
+
+ base_loc, base_box = self._ensure_value_is_boxed(b0, boxes)
+ boxes.append(base_box)
+ ofs_loc, ofs_box = self._ensure_value_is_boxed(b1, boxes)
+ boxes.append(ofs_box)
+ #XXX check if imm would be fine here
+ value_loc, value_box = self._ensure_value_is_boxed(b2, boxes)
+ boxes.append(value_box)
+ self.possibly_free_vars(boxes)
+ return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)]
+
+ def prepare_getarrayitem_gc(self, op):
+ a0, a1 = boxes = list(op.getarglist())
+ _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr())
+
+ base_loc, base_box = self._ensure_value_is_boxed(a0, boxes)
+ boxes.append(base_box)
+ ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, boxes)
+ boxes.append(ofs_box)
+ self.possibly_free_vars(boxes)
+ res = self.force_allocate_reg(op.result)
+ self.possibly_free_var(op.result)
+ return [res, base_loc, ofs_loc, imm(scale), imm(ofs)]
+
# from ../x86/regalloc.py:791
def _unpack_fielddescr(self, fielddescr):
assert isinstance(fielddescr, BaseFieldDescr)
@@ -382,6 +421,22 @@
ptr = fielddescr.is_pointer_field()
return ofs, size, ptr
+ # from ../x86/regalloc.py:779
+ def _unpack_arraydescr(self, arraydescr):
+ assert isinstance(arraydescr, BaseArrayDescr)
+ cpu = self.cpu
+ ofs_length = arraydescr.get_ofs_length(cpu.translate_support_code)
+ ofs = arraydescr.get_base_size(cpu.translate_support_code)
+ size = arraydescr.get_item_size(cpu.translate_support_code)
+ ptr = arraydescr.is_array_of_pointers()
+ scale = 0
+ # XXX HACK, improve!
+ if not arraydescr._clsname.startswith("BoolArrayDescr"):
+ while (1 << scale) < size:
+ scale += 1
+ assert (1 << scale) == size
+ return size, scale, ofs, ofs_length, ptr
+
def make_operation_list():
def not_implemented(self, op, *args):
raise NotImplementedError, op
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit