Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r51027:81584461b2f7 Date: 2012-01-04 17:46 -0800 http://bitbucket.org/pypy/pypy/changeset/81584461b2f7/
Log: made test_array_basic pass diff --git a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py --- a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py +++ b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py @@ -1,14 +1,17 @@ from pypy.jit.metainterp.history import ConstInt +from pypy.rlib.objectmodel import we_are_translated def _check_imm_arg(arg, size=0xFF, allow_zero=True): - if isinstance(arg, ConstInt): - i = arg.getint() - if allow_zero: - lower_bound = i >= 0 - else: - lower_bound = i > 0 - return i <= size and lower_bound - return False + #assert not isinstance(arg, ConstInt) + #if not we_are_translated(): + # if not isinstance(arg, int): + # import pdb; pdb.set_trace() + i = arg + if allow_zero: + lower_bound = i >= 0 + else: + lower_bound = i > 0 + return i <= size and lower_bound def prepare_cmp_op(): def f(self, op): 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 @@ -545,9 +545,10 @@ self.mc.load(res.value, base_loc.value, ofs.value) def emit_setarrayitem_gc(self, op, arglocs, regalloc): - value_loc, base_loc, ofs_loc, scale, ofs, scratch_reg = arglocs + value_loc, base_loc, ofs_loc, scale, ofs = arglocs + assert ofs_loc.is_reg() if scale.value > 0: - scale_loc = scratch_reg + scale_loc = r.SCRATCH if IS_PPC_32: self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value) else: @@ -557,9 +558,8 @@ # add the base offset if ofs.value > 0: - assert scale_loc is not r.r0 - self.mc.addi(r.r0.value, scale_loc.value, ofs.value) - scale_loc = r.r0 + self.mc.addi(r.SCRATCH.value, scale_loc.value, ofs.value) + scale_loc = r.SCRATCH if scale.value == 3: self.mc.stdx(value_loc.value, base_loc.value, scale_loc.value) @@ -575,9 +575,10 @@ emit_setarrayitem_raw = emit_setarrayitem_gc def emit_getarrayitem_gc(self, op, arglocs, regalloc): - res, base_loc, ofs_loc, scale, ofs, scratch_reg = arglocs + res, base_loc, ofs_loc, scale, ofs = arglocs + assert ofs_loc.is_reg() if scale.value > 0: - scale_loc = scratch_reg + scale_loc = r.SCRATCH if IS_PPC_32: self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value) else: @@ -587,9 +588,8 @@ # add the base offset if ofs.value > 0: - assert scale_loc is not r.r0 - self.mc.addi(r.r0.value, scale_loc.value, ofs.value) - scale_loc = r.r0 + self.mc.addi(r.SCRATCH.value, scale_loc.value, ofs.value) + scale_loc = r.SCRATCH if scale.value == 3: self.mc.ldx(res.value, base_loc.value, scale_loc.value) @@ -605,7 +605,7 @@ #XXX Hack, Hack, Hack if not we_are_translated(): descr = op.getdescr() - size = descr.get_item_size(False) + size = descr.itemsize signed = descr.is_item_signed() self._ensure_result_bit_extension(res, size, signed) 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 @@ -416,7 +416,7 @@ fdescr = self.gen_64_bit_func_descr() # write instructions to memory - loop_start = self.materialize_loop(looptoken, True) + loop_start = self.materialize_loop(looptoken, False) self.fixup_target_tokens(loop_start) real_start = loop_start + direct_bootstrap_code @@ -461,7 +461,7 @@ spilling_area = self._assemble(operations, regalloc) self.write_pending_failure_recoveries() - rawstart = self.materialize_loop(looptoken, True) + rawstart = self.materialize_loop(looptoken, False) self.process_pending_guards(rawstart) self.patch_trace(faildescr, looptoken, rawstart, regalloc) 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 @@ -17,6 +17,7 @@ from pypy.jit.backend.ppc.ppcgen import locations from pypy.rpython.lltypesystem import rffi, lltype, rstr from pypy.jit.backend.llsupport import symbolic +from pypy.jit.backend.llsupport.descr import ArrayDescr from pypy.jit.codewriter.effectinfo import EffectInfo import pypy.jit.backend.ppc.ppcgen.register as r from pypy.jit.codewriter import heaptracker @@ -606,8 +607,8 @@ def prepare_arraylen_gc(self, op): arraydescr = op.getdescr() - assert isinstance(arraydescr, BaseArrayDescr) - ofs = arraydescr.get_ofs_length(self.cpu.translate_support_code) + assert isinstance(arraydescr, ArrayDescr) + ofs = arraydescr.lendescr.offset arg = op.getarg(0) base_loc, base_box = self._ensure_value_is_boxed(arg) self.possibly_free_vars([arg, base_box]) @@ -617,42 +618,31 @@ 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) - if scale > 0: - tmp, box = self.allocate_scratch_reg(forbidden_vars=boxes) - boxes.append(box) - else: - tmp = None - self.possibly_free_vars(boxes) - return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs), tmp] + a0, a1, a2 = list(op.getarglist()) + size, ofs, _ = unpack_arraydescr(op.getdescr()) + scale = get_scale(size) + args = op.getarglist() + base_loc, _ = self._ensure_value_is_boxed(a0, args) + ofs_loc, _ = self._ensure_value_is_boxed(a1, args) + value_loc, _ = self._ensure_value_is_boxed(a2, args) + assert _check_imm_arg(ofs) + return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)] prepare_setarrayitem_raw = prepare_setarrayitem_gc def prepare_getarrayitem_gc(self, op): a0, a1 = boxes = list(op.getarglist()) - _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr()) + size, ofs, _ = unpack_arraydescr(op.getdescr()) + scale = get_scale(size) 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) - if scale > 0: - tmp, box = self.allocate_scratch_reg(forbidden_vars=boxes) - boxes.append(box) - else: - tmp = None 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), tmp] + assert _check_imm_arg(ofs) + return [res, base_loc, ofs_loc, imm(scale), imm(ofs)] prepare_getarrayitem_raw = prepare_getarrayitem_gc prepare_getarrayitem_gc_pure = prepare_getarrayitem_gc @@ -1042,6 +1032,13 @@ operations = [notimplemented] * (rop._LAST + 1) operations_with_guard = [notimplemented_with_guard] * (rop._LAST + 1) +def get_scale(size): + scale = 0 + while (1 << scale) < size: + scale += 1 + assert (1 << scale) == size + return scale + for key, value in rop.__dict__.items(): key = key.lower() if key.startswith('_'): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit