[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