Author: David Schneider <david.schnei...@picle.org> Branch: ppc-jit-backend Changeset: r51295:6a95268fe8c5 Date: 2012-01-13 02:32 -0800 http://bitbucket.org/pypy/pypy/changeset/6a95268fe8c5/
Log: (edelsohn, bivab): Implement get_ and set_ interiorfileld 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 @@ -537,6 +537,54 @@ emit_getfield_raw_pure = emit_getfield_gc emit_getfield_gc_pure = emit_getfield_gc + def emit_getinteriorfield_gc(self, op, arglocs, regalloc): + (base_loc, index_loc, res_loc, + ofs_loc, ofs, itemsize, fieldsize) = arglocs + self.mc.load_imm(r.SCRATCH, itemsize.value) + self.mc.mullw(r.SCRATCH.value, index_loc.value, r.SCRATCH.value) + if ofs.value > 0: + if ofs_loc.is_imm(): + self.mc.addic(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value) + else: + self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value) + + if fieldsize.value == 8: + self.mc.ldx(res_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 4: + self.mc.lwzx(res_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 2: + self.mc.lhzx(res_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 1: + self.mc.lbzx(res_loc.value, base_loc.value, r.SCRATCH.value) + else: + assert 0 + + #XXX Hack, Hack, Hack + if not we_are_translated(): + signed = op.getdescr().fielddescr.is_field_signed() + self._ensure_result_bit_extension(res_loc, fieldsize.value, signed) + + def emit_setinteriorfield_gc(self, op, arglocs, regalloc): + (base_loc, index_loc, value_loc, + ofs_loc, ofs, itemsize, fieldsize) = arglocs + self.mc.load_imm(r.SCRATCH, itemsize.value) + self.mc.mullw(r.SCRATCH.value, index_loc.value, r.SCRATCH.value) + if ofs.value > 0: + if ofs_loc.is_imm(): + self.mc.addic(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value) + else: + self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value) + if fieldsize.value == 8: + self.mc.stdx(value_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 4: + self.mc.stwx(value_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 2: + self.mc.sthx(value_loc.value, base_loc.value, r.SCRATCH.value) + elif fieldsize.value == 1: + self.mc.stbx(value_loc.value, base_loc.value, r.SCRATCH.value) + else: + assert 0 + class ArrayOpAssembler(object): 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 @@ -602,6 +602,46 @@ prepare_getfield_raw_pure = prepare_getfield_gc prepare_getfield_gc_pure = prepare_getfield_gc + def prepare_getinteriorfield_gc(self, op): + t = unpack_interiorfielddescr(op.getdescr()) + ofs, itemsize, fieldsize, sign = t + args = op.getarglist() + base_loc, base_box = self._ensure_value_is_boxed(op.getarg(0), args) + index_loc, index_box = self._ensure_value_is_boxed(op.getarg(1), args) + c_ofs = ConstInt(ofs) + if _check_imm_arg(c_ofs): + ofs_loc = imm(ofs) + else: + ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, [base_box]) + self.possibly_free_var(ofs_box) + self.possibly_free_vars_for_op(op) + self.possibly_free_var(base_box) + self.possibly_free_var(index_box) + self.free_temp_vars() + result_loc = self.force_allocate_reg(op.result) + self.possibly_free_var(op.result) + return [base_loc, index_loc, result_loc, ofs_loc, imm(ofs), + imm(itemsize), imm(fieldsize)] + + def prepare_setinteriorfield_gc(self, op): + t = unpack_interiorfielddescr(op.getdescr()) + ofs, itemsize, fieldsize, sign = t + args = op.getarglist() + base_loc, base_box = self._ensure_value_is_boxed(op.getarg(0), args) + index_loc, index_box = self._ensure_value_is_boxed(op.getarg(1), args) + value_loc, value_box = self._ensure_value_is_boxed(op.getarg(2), args) + c_ofs = ConstInt(ofs) + if _check_imm_arg(c_ofs): + ofs_loc = imm(ofs) + else: + ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, [base_box]) + self.possibly_free_var(ofs_box) + self.possibly_free_var(base_box) + self.possibly_free_var(index_box) + self.possibly_free_var(value_box) + return [base_loc, index_loc, value_loc, ofs_loc, imm(ofs), + imm(itemsize), imm(fieldsize)] + def prepare_arraylen_gc(self, op): arraydescr = op.getdescr() assert isinstance(arraydescr, ArrayDescr) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit