[pypy-svn] r79896 - in pypy/branch/arm-backend/pypy/jit/backend/arm: . test

david at codespeak.net david at codespeak.net
Wed Dec 8 15:55:30 CET 2010


Author: david
Date: Wed Dec  8 15:55:28 2010
New Revision: 79896

Modified:
   pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
   pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
   pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_zll_random.py
Log:
Fix malloc_varsize and some other register allocation issues

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py	Wed Dec  8 15:55:28 2010
@@ -469,7 +469,7 @@
         loc = None
         if isinstance(thing, Const):
             if isinstance(thing, ConstInt):
-                box = BoxInt()
+                box = BoxInt(thing.value)
             elif isinstance(thing, ConstPtr):
                 box = BoxPtr()
             else:

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	Wed Dec  8 15:55:28 2010
@@ -732,7 +732,8 @@
                                         is_unicode=is_unicode)
 
         # compute the length in bytes
-        length_loc, length_box = self._ensure_value_is_boxed(args[4], regalloc)
+        forbidden_vars = [srcaddr_box, dstaddr_box]
+        length_loc, length_box = self._ensure_value_is_boxed(args[4], regalloc, forbidden_vars)
         args.append(length_box)
         if is_unicode:
             forbidden_vars = [srcaddr_box, dstaddr_box]
@@ -747,10 +748,10 @@
         # call memcpy()
         self._emit_call(self.memcpy_addr, [dstaddr_box, srcaddr_box, length_box], regalloc)
 
+        regalloc.possibly_free_vars(args)
         regalloc.possibly_free_var(length_box)
         regalloc.possibly_free_var(dstaddr_box)
         regalloc.possibly_free_var(srcaddr_box)
-        regalloc.possibly_free_vars(args)
 
     def _load_address(self, sizereg, baseofs, scale, result, baseloc=None):
         if baseloc is not None:
@@ -1031,28 +1032,30 @@
 
     # from: ../x86/regalloc.py:750
     # XXX kill this function at some point
-    def _malloc_varsize(self, ofs_items, ofs_length, scale, v, res_v, regalloc):
-        tempbox = TempBox()
-        size_loc = regalloc.force_allocate_reg(tempbox)
-        self.mc.gen_load_int(size_loc.value, ofs_items + (v.getint() << scale))
-        self._emit_call(self.malloc_func_addr, [tempbox],
-                                regalloc, result=res_v)
-        loc = regalloc.make_sure_var_in_reg(v, [res_v])
-        base_loc = regalloc.loc(res_v)
-        value_loc = regalloc.loc(v)
-        regalloc.possibly_free_vars([v, res_v, tempbox])
+    def _malloc_varsize(self, ofs_items, ofs_length, itemsize, v, res_v, regalloc):
+        isize = ConstInt(itemsize)
+        iofsitems = ConstInt(ofs_items)
+        boxes = [v, res_v]
+        vloc, v = self._ensure_value_is_boxed(v, regalloc, [res_v])
+        boxes.append(v)
+        size, size_box = self._ensure_value_is_boxed(isize, regalloc, boxes)
+
+        self._emit_call(self.malloc_func_addr, [size_box], regalloc, result=res_v)
+        base_loc = regalloc.make_sure_var_in_reg(res_v)
+        value_loc = regalloc.make_sure_var_in_reg(v)
+        regalloc.possibly_free_vars(boxes)
 
-        # XXX combine with emit_op_setfield_gc operation
-        size = scale * 2
+        self.mc.MUL(size.value, size.value, vloc.value)
+        if self._check_imm_arg(iofsitems):
+            self.mc.ADD_ri(size.value, size.value, iofsitems.value)
+        else:
+            t, tbox = self._ensure_value_is_boxed(iofsitems, regalloc, boxes)
+            self.mc.ADD_rr(size.value, size.value, t.value)
+            regalloc.possibly_free_var(tbox)
+
+        size = itemsize
         ofs = ofs_length
-        if size == 4:
-            self.mc.STR_ri(value_loc.value, base_loc.value, ofs)
-        elif size == 2:
-            self.mc.STRH_ri(value_loc.value, base_loc.value, ofs)
-        elif size == 1:
-            self.mc.STRB_ri(value_loc.value, base_loc.value, ofs)
-        else:
-            assert 0
+        self.mc.STR_ri(value_loc.value, base_loc.value, ofs)
 
     def emit_op_new(self, op, regalloc, fcond):
         arglocs = self._prepare_args_for_new_op(op.getdescr(), regalloc)
@@ -1098,7 +1101,7 @@
         # boehm GC (XXX kill the following code at some point)
         itemsize, scale, basesize, ofs_length, _ = (
             self._unpack_arraydescr(op.getdescr()))
-        self._malloc_varsize(basesize, ofs_length, scale,
+        self._malloc_varsize(basesize, ofs_length, itemsize,
                                     op.getarg(0), op.result, regalloc)
         return fcond
 
@@ -1114,7 +1117,7 @@
         ofs_items, itemsize, ofs = symbolic.get_array_token(rstr.STR,
                                             self.cpu.translate_support_code)
         assert itemsize == 1
-        self._malloc_varsize(ofs_items, ofs, 1, op.getarg(0),
+        self._malloc_varsize(ofs_items, ofs, itemsize, op.getarg(0),
                                                         op.result, regalloc)
         return fcond
 
@@ -1130,20 +1133,11 @@
         # boehm GC (XXX kill the following code at some point)
         ofs_items, _, ofs = symbolic.get_array_token(rstr.UNICODE,
                                                self.cpu.translate_support_code)
-        scale = self._get_unicode_item_scale()
-        self._malloc_varsize(ofs_items, ofs, scale, op.getarg(0),
-                                                op.result, regalloc)
-        return fcond
-
-    def _get_unicode_item_scale(self):
         _, itemsize, _ = symbolic.get_array_token(rstr.UNICODE,
                                                   self.cpu.translate_support_code)
-        if itemsize == 4:
-            return 2
-        elif itemsize == 2:
-            return 1
-        else:
-            raise AssertionError("bad unicode item size")
+        self._malloc_varsize(ofs_items, ofs, itemsize, op.getarg(0),
+                                                op.result, regalloc)
+        return fcond
 
 class ResOpAssembler(GuardOpAssembler, IntOpAsslember,
                     OpAssembler, UnaryIntOpAssembler,

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_zll_random.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_zll_random.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/test/test_zll_random.py	Wed Dec  8 15:55:28 2010
@@ -5,44 +5,6 @@
 from pypy.jit.backend.test.test_random import check_random_function, Random
 from pypy.jit.metainterp.resoperation import rop
 
-# XXX Remove this list from here once all operations work and use the default
-# one
-OPERATIONS = test_random.OPERATIONS[:]
-
-for i in range(4):      # make more common
-    OPERATIONS.append(test_ll_random.GetFieldOperation(rop.GETFIELD_GC))
-    OPERATIONS.append(test_ll_random.GetFieldOperation(rop.GETFIELD_GC))
-    OPERATIONS.append(test_ll_random.SetFieldOperation(rop.SETFIELD_GC))
-    OPERATIONS.append(test_ll_random.NewOperation(rop.NEW))
-    OPERATIONS.append(test_ll_random.NewOperation(rop.NEW_WITH_VTABLE))
-
-    OPERATIONS.append(test_ll_random.GetArrayItemOperation(rop.GETARRAYITEM_GC))
-    OPERATIONS.append(test_ll_random.GetArrayItemOperation(rop.GETARRAYITEM_GC))
-    OPERATIONS.append(test_ll_random.SetArrayItemOperation(rop.SETARRAYITEM_GC))
-    #OPERATIONS.append(test_ll_random.NewArrayOperation(rop.NEW_ARRAY))
-    OPERATIONS.append(test_ll_random.ArrayLenOperation(rop.ARRAYLEN_GC))
-#    #OPERATIONS.append(test_ll_random.NewStrOperation(rop.NEWSTR))
-#    #OPERATIONS.append(test_ll_random.NewUnicodeOperation(rop.NEWUNICODE))
-    OPERATIONS.append(test_ll_random.StrGetItemOperation(rop.STRGETITEM))
-    OPERATIONS.append(test_ll_random.UnicodeGetItemOperation(rop.UNICODEGETITEM))
-    OPERATIONS.append(test_ll_random.StrSetItemOperation(rop.STRSETITEM))
-    OPERATIONS.append(test_ll_random.UnicodeSetItemOperation(rop.UNICODESETITEM))
-    OPERATIONS.append(test_ll_random.StrLenOperation(rop.STRLEN))
-    OPERATIONS.append(test_ll_random.UnicodeLenOperation(rop.UNICODELEN))
-#
-for i in range(2):
-#    OPERATIONS.append(test_ll_random.GuardClassOperation(rop.GUARD_CLASS))
-    OPERATIONS.append(test_ll_random.CallOperation(rop.CALL))
-    OPERATIONS.append(test_ll_random.RaisingCallOperation(rop.CALL))
-    OPERATIONS.append(test_ll_random.RaisingCallOperationGuardNoException(rop.CALL))
-    OPERATIONS.append(test_ll_random.RaisingCallOperationWrongGuardException(rop.CALL))
-    OPERATIONS.append(test_ll_random.CallOperationException(rop.CALL))
-#OPERATIONS.append(test_ll_random.GuardNonNullClassOperation(rop.GUARD_NONNULL_CLASS))
-
-
-
-LLtypeOperationBuilder.OPERATIONS = OPERATIONS
-
 CPU = getcpuclass()
 
 def test_stress():



More information about the Pypy-commit mailing list