[pypy-svn] r68077 - in pypy/branch/floats-via-sse2/pypy/jit/backend: test x86
fijal at codespeak.net
fijal at codespeak.net
Thu Oct 1 00:38:55 CEST 2009
Author: fijal
Date: Thu Oct 1 00:38:54 2009
New Revision: 68077
Modified:
pypy/branch/floats-via-sse2/pypy/jit/backend/test/runner_test.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
Log:
Yay. I think I'm done.
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/test/runner_test.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/test/runner_test.py Thu Oct 1 00:38:54 2009
@@ -281,6 +281,24 @@
'int', descr=calldescr)
assert res.value == 2 * num
+ if cpu.supports_floats:
+ def func(f0, f1, f2, f3, f4, f5, f6, i0, i1, f7, f8, f9):
+ return f0 + f1 + f2 + f3 + f4 + f5 + f6 + float(i0 + i1) + f7 + f8 + f9
+ F = lltype.Float
+ I = lltype.Signed
+ FUNC = self.FuncType([F] * 7 + [I] * 2 + [F] * 3, F)
+ FPTR = self.Ptr(FUNC)
+ func_ptr = llhelper(FPTR, func)
+ calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT)
+ funcbox = self.get_funcbox(cpu, func_ptr)
+ args = ([BoxFloat(.1) for i in range(7)] +
+ [BoxInt(1), BoxInt(2), BoxFloat(.2), BoxFloat(.3),
+ BoxFloat(.4)])
+ res = self.execute_operation(rop.CALL,
+ [funcbox] + args,
+ 'float', descr=calldescr)
+ assert res.value - 4.6 < 0.0001
+
def test_executor(self):
cpu = self.cpu
x = execute(cpu, rop.INT_ADD, None, BoxInt(100), ConstInt(42))
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py Thu Oct 1 00:38:54 2009
@@ -789,20 +789,20 @@
if isinstance(loc, REG):
if isinstance(loc, XMMREG):
self.mc.MOVSD(mem64(esp, p), loc)
- p += 2*WORD
else:
self.mc.MOV(mem(esp, p), loc)
- p += WORD
+ p += loc.width
p = 0
for i in range(2, nargs + 2):
loc = arglocs[i]
if not isinstance(loc, REG):
if isinstance(loc, MODRM64):
- xxx
+ self.mc.MOVSD(xmm0, loc)
+ self.mc.MOVSD(mem64(esp, p), xmm0)
else:
self.mc.MOV(tmp, loc)
self.mc.MOV(mem(esp, p), tmp)
- p += WORD
+ p += loc.width
self.mc.CALL(x)
self.mark_gc_roots()
self.mc.ADD(esp, imm(WORD * extra_on_stack))
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 Thu Oct 1 00:38:54 2009
@@ -570,10 +570,11 @@
self.rm.before_call(force_store)
self.xrm.before_call(force_store)
self.Perform(op, arglocs, eax)
- if op.result.type == FLOAT:
- self.xrm.after_call(op.result)
- else:
- self.rm.after_call(op.result)
+ if op.result is not None:
+ if op.result.type == FLOAT:
+ self.xrm.after_call(op.result)
+ else:
+ self.rm.after_call(op.result)
def consider_call(self, op, ignored):
calldescr = op.descr
More information about the Pypy-commit
mailing list