Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r48407:7c2f8272c677 Date: 2011-10-25 09:46 +0200 http://bitbucket.org/pypy/pypy/changeset/7c2f8272c677/
Log: Implemented STRLEN, STRGETITEM, STRSETITEM. 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 @@ -371,5 +371,32 @@ signed = descr.is_item_signed() self._ensure_result_bit_extension(res, size, signed) + # XXX 64 bit adjustment needed + def emit_strlen(self, op, arglocs, regalloc): + l0, l1, res = arglocs + if l1.is_imm(): + self.mc.lwz(res.value, l0.value, l1.getint()) + else: + self.mc.lwzx(res.value, l0.value, l1.value) + + def emit_strgetitem(self, op, arglocs, regalloc): + res, base_loc, ofs_loc, basesize = arglocs + if ofs_loc.is_imm(): + self.mc.addi(res.value, base_loc.value, ofs_loc.getint()) + else: + self.mc.add(res.value, base_loc.value, ofs_loc.value) + + self.mc.load_imm(r.r0, basesize.value) + self.mc.lbzx(res.value, res.value, r.r0.value) + + def emit_strsetitem(self, op, arglocs, regalloc): + value_loc, base_loc, ofs_loc, basesize = arglocs + if ofs_loc.is_imm(): + self.mc.addi(base_loc.value, base_loc.value, ofs_loc.getint()) + else: + self.mc.add(base_loc.value, base_loc.value, ofs_loc.value) + self.mc.load_imm(r.r0, basesize.value) + self.mc.stbx(value_loc.value, base_loc.value, r.r0.value) + 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 @@ -16,7 +16,8 @@ BaseCallDescr, BaseSizeDescr from pypy.jit.metainterp.resoperation import rop from pypy.jit.backend.ppc.ppcgen import locations -from pypy.rpython.lltypesystem import rffi, lltype +from pypy.rpython.lltypesystem import rffi, lltype, rstr +from pypy.jit.backend.llsupport import symbolic import pypy.jit.backend.ppc.ppcgen.register as r class TempInt(TempBox): @@ -413,6 +414,67 @@ self.possibly_free_var(op.result) return [res, base_loc, ofs_loc, imm(scale), imm(ofs)] + def prepare_strlen(self, op): + l0, box = self._ensure_value_is_boxed(op.getarg(0)) + boxes = [box] + + basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, + self.cpu.translate_support_code) + ofs_box = ConstInt(ofs_length) + imm_ofs = _check_imm_arg(ofs_box) + + if imm_ofs: + l1 = self.make_sure_var_in_reg(ofs_box, boxes) + else: + l1, box1 = self._ensure_value_is_boxed(ofs_box, boxes) + boxes.append(box1) + + self.possibly_free_vars(boxes) + res = self.force_allocate_reg(op.result) + self.possibly_free_var(op.result) + return [l0, l1, res] + + def prepare_strgetitem(self, op): + boxes = list(op.getarglist()) + base_loc, box = self._ensure_value_is_boxed(boxes[0]) + boxes.append(box) + + a1 = boxes[1] + imm_a1 = _check_imm_arg(a1) + if imm_a1: + ofs_loc = self.make_sure_var_in_reg(a1, boxes) + else: + ofs_loc, box = self._ensure_value_is_boxed(a1, boxes) + boxes.append(box) + + self.possibly_free_vars(boxes) + res = self.force_allocate_reg(op.result) + self.possibly_free_var(op.result) + + basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, + self.cpu.translate_support_code) + assert itemsize == 1 + return [res, base_loc, ofs_loc, imm(basesize)] + + def prepare_strsetitem(self, op): + boxes = list(op.getarglist()) + + base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes) + boxes.append(box) + + ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes) + boxes.append(box) + + value_loc, box = self._ensure_value_is_boxed(boxes[2], boxes) + boxes.append(box) + + self.possibly_free_vars(boxes) + + basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, + self.cpu.translate_support_code) + assert itemsize == 1 + return [value_loc, base_loc, ofs_loc, imm(basesize)] + # from ../x86/regalloc.py:791 def _unpack_fielddescr(self, fielddescr): assert isinstance(fielddescr, BaseFieldDescr) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit