Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r48308:528c82230eac Date: 2011-10-21 15:03 +0200 http://bitbucket.org/pypy/pypy/changeset/528c82230eac/
Log: Implemented GETFIELD_GC and SETFIELD_GC. 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 @@ -213,5 +213,49 @@ descr._ppc_frame_manager_depth) regalloc.frame_manager.frame_depth = new_fd + def emit_setfield_gc(self, op, arglocs, regalloc): + value_loc, base_loc, ofs, size = arglocs + if size.value == 8: + assert 0, "not implemented yet" + elif size.value == 4: + if ofs.is_imm(): + self.mc.stw(value_loc.value, base_loc.value, ofs.value) + else: + self.mc.stw(value_loc.value, base_loc.value, ofs.value) + elif size.value == 2: + if ofs.is_imm(): + self.mc.sth(value_loc.value, base_loc.value, ofs.value) + else: + self.mc.sthx(value_loc.value, base_loc.value, ofs.value) + elif size.value == 1: + if ofs.is_imm(): + self.mc.stb(value_loc.value, base_loc.value, ofs.value) + else: + self.mc.stbx(value_loc.value, base_loc.value, ofs.value) + else: + assert 0, "size not supported" + + def emit_getfield_gc(self, op, arglocs, regalloc): + base_loc, ofs, res, size = arglocs + if size.value == 8: + assert 0, "not implemented yet" + elif size.value == 4: + if ofs.is_imm(): + self.mc.lwz(res.value, base_loc.value, ofs.value) + else: + self.mc.lwzx(res.value, base_loc.value, ofs.value) + elif size.value == 2: + if ofs.is_imm(): + self.mc.lhz(res.value, base_loc.value, ofs.value) + else: + self.mc.lhzx(res.value, base_loc.value, ofs.value) + elif size.value == 1: + if ofs.is_imm(): + self.mc.lbz(res.value, base_loc.value, ofs.value) + else: + self.mc.lbzx(res.value, base_loc.value, ofs.value) + else: + assert 0, "size not supported" + def nop(self): self.mc.ori(0, 0, 0) 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 @@ -12,6 +12,8 @@ prepare_unary_cmp) from pypy.jit.metainterp.history import (INT, REF, FLOAT, Const, ConstInt, ConstPtr, LoopToken) +from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr, \ + BaseCallDescr, BaseSizeDescr from pypy.jit.metainterp.resoperation import rop from pypy.jit.backend.ppc.ppcgen import locations from pypy.rpython.lltypesystem import rffi, lltype @@ -293,6 +295,47 @@ [], [], None) return [] + def prepare_setfield_gc(self, op): + boxes = list(op.getarglist()) + b0, b1 = boxes + ofs, size, ptr = self._unpack_fielddescr(op.getdescr()) + base_loc, base_box = self._ensure_value_is_boxed(b0, boxes) + boxes.append(base_box) + value_loc, value_box = self._ensure_value_is_boxed(b1, boxes) + boxes.append(value_box) + 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, boxes) + boxes.append(ofs_box) + self.possibly_free_vars(boxes) + return [value_loc, base_loc, ofs_loc, imm(size)] + + def prepare_getfield_gc(self, op): + a0 = op.getarg(0) + ofs, size, ptr = self._unpack_fielddescr(op.getdescr()) + base_loc, base_box = self._ensure_value_is_boxed(a0) + 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(a0) + self.possibly_free_var(base_box) + res = self.force_allocate_reg(op.result) + self.possibly_free_var(op.result) + return [base_loc, ofs_loc, res, imm(size)] + + # from ../x86/regalloc.py:791 + def _unpack_fielddescr(self, fielddescr): + assert isinstance(fielddescr, BaseFieldDescr) + ofs = fielddescr.offset + size = fielddescr.get_field_size(self.cpu.translate_support_code) + ptr = fielddescr.is_pointer_field() + return ofs, size, ptr + def make_operation_list(): def not_implemented(self, op, *args): raise NotImplementedError, op _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit