[pypy-commit] pypy ppc-jit-backend: made test_array_basic pass
hager
noreply at buildbot.pypy.org
Thu Jan 5 02:46:55 CET 2012
Author: hager <sven.hager at 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('_'):
More information about the pypy-commit
mailing list