[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