Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r46883:500d9ed3d490 Date: 2011-08-29 14:54 +0200 http://bitbucket.org/pypy/pypy/changeset/500d9ed3d490/
Log: Implemented STRLEN, STRGETITEM, STRSETITEM. Works for test_basic_string, but is not complete yet. 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 @@ -8,7 +8,8 @@ from pypy.jit.metainterp.history import Const, ConstPtr from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager -from pypy.rpython.lltypesystem import lltype, rffi +from pypy.jit.backend.llsupport import symbolic +from pypy.rpython.lltypesystem import lltype, rffi, rstr from pypy.jit.metainterp.resoperation import rop from pypy.jit.metainterp.history import BoxInt, ConstInt, Box @@ -1171,6 +1172,10 @@ self.li(free_reg, 0) self.adde(free_reg, free_reg, free_reg) + # ************************************************* + # FIELD AND ARRAY OPS * + # ************************************************* + def emit_setfield_gc(self, op, cpu): args = op.getarglist() fptr = args[0] @@ -1336,6 +1341,50 @@ def emit_getarrayitem_gc_pure(self, op, cpu): self.emit_getarrayitem_gc(op, cpu) + def emit_strlen(self, op, cpu): + args = op.getarglist() + base_box = args[0] + base_reg = cpu.reg_map[base_box] + free_reg = cpu.next_free_register + if IS_PPC_32: + self.lwz(free_reg, base_reg, 4) + else: + assert 0, "not implemented yet" + result = op.result + cpu.reg_map[result] = free_reg + cpu.next_free_register += 1 + + def emit_strgetitem(self, op, cpu): + args = op.getarglist() + ptr_box = args[0] + offset_box = args[1] + ptr_reg = cpu.reg_map[ptr_box] + offset_reg = cpu.reg_map[offset_box] + free_reg = cpu.next_free_register + basesize, itemsize, _ = symbolic.get_array_token(rstr.STR, + cpu.translate_support_code) + assert itemsize == 1 + self.addi(ptr_reg, ptr_reg, basesize) + self.lbzx(free_reg, ptr_reg, offset_reg) + result = op.result + cpu.reg_map[result] = free_reg + cpu.next_free_register += 1 + + def emit_strsetitem(self, op, cpu): + args = op.getarglist() + ptr_box = args[0] + offset_box = args[1] + value_box = args[2] + + ptr_reg = cpu.reg_map[ptr_box] + offset_reg = cpu.reg_map[offset_box] + value_reg = cpu.reg_map[value_box] + basesize, itemsize, _ = symbolic.get_array_token(rstr.STR, + cpu.translate_support_code) + assert itemsize == 1 + self.addi(ptr_reg, ptr_reg, basesize) + self.stbx(value_reg, ptr_reg, offset_reg) + ############################ # unary integer operations # ############################ @@ -1463,6 +1512,8 @@ self.mfcr(free_reg) self.rlwinm(free_reg, free_reg, 4, 31, 31) + #_____________________________________ + def emit_finish(self, op, cpu): descr = op.getdescr() identifier = self._get_identifier_from_descr(descr, cpu) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit