[pypy-svn] r68051 - in pypy/branch/floats-via-sse2/pypy/jit/backend/x86: . test
fijal at codespeak.net
fijal at codespeak.net
Wed Sep 30 19:55:59 CEST 2009
Author: fijal
Date: Wed Sep 30 19:55:59 2009
New Revision: 68051
Modified:
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/test/test_regalloc.py
Log:
* Fix test regalloc
* Write a test for XXX test me
* Fix various places that lacked correct register management
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py Wed Sep 30 19:55:59 2009
@@ -71,7 +71,6 @@
def convert_to_imm(self, c):
if self.constant_array_counter >= BASE_CONSTANT_SIZE:
- xxx # test me
self.constant_arrays.append(self.new_const_array())
self.constant_array_counter = 0
res = self.constant_array_counter
@@ -167,9 +166,20 @@
# otherwise we have it saved on stack, so no worry
self.rm.free_regs.insert(0, tmpreg)
assert tmpreg not in locs
- self.rm.possibly_free_vars(inputargs)
+ for arg in inputargs:
+ self.possibly_free_var(arg)
return locs
+ def possibly_free_var(self, var):
+ if var.type == FLOAT:
+ self.xrm.possibly_free_var(var)
+ else:
+ self.rm.possibly_free_var(var)
+
+ def possibly_free_vars(self, vars):
+ for var in vars:
+ self.possibly_free_var(var)
+
def _compute_loop_consts(self, inputargs, jump):
if jump.opnum != rop.JUMP or jump.jump_target is not None:
loop_consts = {}
@@ -219,6 +229,7 @@
def perform_with_guard(self, op, guard_op, arglocs, result_loc):
faillocs = self.locs_for_fail(guard_op)
self.rm.position += 1
+ self.xrm.position += 1
self.assembler.regalloc_perform_with_guard(op, guard_op, faillocs,
arglocs, result_loc,
self.sm.stack_depth)
@@ -263,7 +274,7 @@
while i < len(operations):
op = operations[i]
self.rm.position = i
- # XXX ^^^ and also self.xrm.position = i.... :-(
+ self.xrm.position = i
if op.has_no_side_effect() and op.result not in self.longevity:
i += 1
self.rm.possibly_free_vars(op.args)
@@ -274,7 +285,7 @@
else:
oplist[op.opnum](self, op, None)
if op.result is not None:
- self.rm.possibly_free_var(op.result)
+ self.possibly_free_var(op.result)
self.rm._check_invariants()
self.xrm._check_invariants()
i += 1
@@ -329,7 +340,7 @@
locs = [self.loc(arg) for arg in op.args]
self.assembler.generate_failure(self.assembler.mc, op.descr, op.args,
locs, self.exc)
- self.rm.possibly_free_vars(op.args)
+ self.possibly_free_vars(op.args)
consider_finish = consider_fail # for now
@@ -461,6 +472,7 @@
loc0 = self.xrm.force_result_in_reg(op.result, op.args[0], op.args)
loc1 = self.xrm.loc(op.args[1])
self.Perform(op, [loc0, loc1], loc0)
+ self.xrm.possibly_free_vars(op.args)
def _call(self, op, arglocs, force_store=[]):
self.rm.before_call(force_store)
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/test/test_regalloc.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/test/test_regalloc.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/test/test_regalloc.py Wed Sep 30 19:55:59 2009
@@ -8,7 +8,8 @@
from pypy.jit.metainterp.resoperation import rop, ResOperation
from pypy.jit.backend.llsupport.descr import GcCache
from pypy.jit.backend.x86.runner import CPU
-from pypy.jit.backend.x86.regalloc import RegAlloc, WORD, X86RegisterManager
+from pypy.jit.backend.x86.regalloc import RegAlloc, WORD, X86RegisterManager,\
+ BASE_CONSTANT_SIZE
from pypy.jit.metainterp.test.oparser import parse
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.rpython.annlowlevel import llhelper
@@ -515,3 +516,12 @@
'''
self.interpret(ops, [0.1, .2, .3, .4, .5, .6, .7, .8, .9])
assert self.getfloats(9) == [.1+.2, .9+3.5, .3, .4, .5, .6, .7, .8, .9]
+
+ def test_float_overflow_const_list(self):
+ ops = ['[f0]']
+ for i in range(BASE_CONSTANT_SIZE * 2):
+ ops.append('f%d = float_add(f%d, 3.5)' % (i + 1, i))
+ ops.append('fail(f%d)' % (BASE_CONSTANT_SIZE * 2))
+ ops = "\n".join(ops)
+ self.interpret(ops, [0.1])
+ assert self.getfloat(0) - (1 + BASE_CONSTANT_SIZE * 2) * 3.5 + 0.1 < 0.00001
More information about the Pypy-commit
mailing list