[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