[pypy-svn] r68076 - in pypy/branch/floats-via-sse2/pypy/jit/backend: llsupport llsupport/test x86

fijal at codespeak.net fijal at codespeak.net
Thu Oct 1 00:27:34 CEST 2009


Author: fijal
Date: Thu Oct  1 00:27:33 2009
New Revision: 68076

Modified:
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
   pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py
Log:
Enough to pass the first, very basic call


Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/descr.py	Thu Oct  1 00:27:33 2009
@@ -1,6 +1,7 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.jit.backend.llsupport import symbolic
-from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr
+from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr,\
+     BoxFloat
 from pypy.jit.metainterp.history import BasicFailDescr
 from pypy.jit.metainterp.resoperation import ResOperation, rop
 
@@ -175,6 +176,7 @@
         result = []
         for c in self.arg_classes:
             if c == 'i': box = BoxInt()
+            elif c == 'f': box = BoxFloat()
             else:        box = BoxPtr()
             result.append(box)
         return result
@@ -189,12 +191,15 @@
         if self.executable_token is not None:
             return self.executable_token
         args = [BoxInt()] + self.instantiate_arg_classes()
-        if self.get_result_size(cpu.translate_support_code) == 0:
+        res_size = self.get_result_size(cpu.translate_support_code)
+        if res_size == 0:
             result = None
             result_list = []
         else:
             if self.returns_a_pointer():
                 result = BoxPtr()
+            elif res_size == 8:
+                result = BoxFloat()
             else:
                 result = BoxInt()
             result_list = [result]
@@ -240,6 +245,7 @@
         kind = getkind(ARG)
         if   kind == 'int': arg_classes.append('i')
         elif kind == 'ref': arg_classes.append('r')
+        elif kind == 'float': arg_classes.append('f')
         else:
             raise NotImplementedError('ARG = %r' % (ARG,))
     arg_classes = ''.join(arg_classes)

Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/llmodel.py	Thu Oct  1 00:27:33 2009
@@ -4,7 +4,8 @@
 from pypy.rpython.llinterp import LLInterpreter
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rlib.objectmodel import we_are_translated, specialize
-from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values
+from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values,\
+     BoxFloat
 from pypy.jit.backend.model import AbstractCPU
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
@@ -414,9 +415,12 @@
         self.execute_token(executable_token)
         # Note: if an exception is set, the rest of the code does a bit of
         # nonsense but nothing wrong (the return value should be ignored)
+        res = calldescr.get_result_size(self.translate_support_code)
         if calldescr.returns_a_pointer():
             return BoxPtr(self.get_latest_value_ref(0))
-        elif calldescr.get_result_size(self.translate_support_code) != 0:
+        elif res == self.FLOATSIZE:
+            return BoxFloat(self.get_latest_value_float(0))
+        elif res > 0:
             return BoxInt(self.get_latest_value_int(0))
         else:
             return None

Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/llsupport/test/test_descr.py	Thu Oct  1 00:27:33 2009
@@ -130,7 +130,10 @@
     assert isinstance(descr3.get_result_size(True), Symbolic)
     assert descr3.returns_a_pointer()
     assert descr3.arg_classes == "r"
-
+    #
+    c1 = GcCache(True)
+    descr4 = get_call_descr(c1, [lltype.Float, lltype.Float], lltype.Float)
+    assert descr4.get_result_size(False) == rffi.sizeof(lltype.Float)
 
 def test_repr_of_descr():
     c0 = GcCache(False)

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:27:33 2009
@@ -255,6 +255,9 @@
         else:
             self.mc.MOV(to_loc, from_loc)
 
+    def regalloc_fstp(self, loc):
+        self.mc.FSTP(loc)
+
     def regalloc_push(self, loc):
         self.mc.PUSH(loc)
 
@@ -780,15 +783,26 @@
             tmp = ecx
         else:
             tmp = eax
+        p = 0
         for i in range(2, nargs + 2):
             loc = arglocs[i]
             if isinstance(loc, REG):
-                self.mc.MOV(mem(esp, WORD * (i - 2)), loc)
+                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 = 0
         for i in range(2, nargs + 2):
             loc = arglocs[i]
             if not isinstance(loc, REG):
-                self.mc.MOV(tmp, loc)
-                self.mc.MOV(mem(esp, WORD * (i - 2)), tmp)
+                if isinstance(loc, MODRM64):
+                    xxx
+                else:
+                    self.mc.MOV(tmp, loc)
+                    self.mc.MOV(mem(esp, p), tmp)
+                    p += WORD
         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:27:33 2009
@@ -93,12 +93,11 @@
         return heap64(rffi.cast(lltype.Signed, arr) + num_pos * WORD * 2)
         
     def after_call(self, v):
-        xxx # test
         # the result is stored in st0, but we don't have this around,
         # so we move it to some stack location
         if v is not None:
-            loc = self.sm.stack_loc(v, 2)
-            self.assembler.regalloc_mov(st0, loc)
+            loc = self.stack_manager.loc(v, 2)
+            self.assembler.regalloc_fstp(loc)
 
 class X86StackManager(StackManager):
 
@@ -569,8 +568,12 @@
 
     def _call(self, op, arglocs, force_store=[]):
         self.rm.before_call(force_store)
+        self.xrm.before_call(force_store)
         self.Perform(op, arglocs, eax)
-        self.rm.after_call(op.result)
+        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

Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/runner.py	Thu Oct  1 00:27:33 2009
@@ -12,6 +12,7 @@
 class CPU386(AbstractLLCPU):
     debug = True
     supports_floats = True
+    FLOATSIZE = 8
 
     BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
     dont_keepalive_stuff = False # for tests



More information about the Pypy-commit mailing list