[pypy-svn] r53268 - in pypy/branch/jit-hotpath/pypy/jit/codegen/ia32: . test

fijal at codespeak.net fijal at codespeak.net
Thu Apr 3 06:18:48 CEST 2008


Author: fijal
Date: Thu Apr  3 06:18:46 2008
New Revision: 53268

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py
Log:
Obscure hack to have stack remapping work. There are few issues with it, but
seems to work more or less (one important issue is "how to move floats around")


Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	Thu Apr  3 06:18:46 2008
@@ -153,10 +153,14 @@
         return "const=$%s" % (self.value,)
 
 class IntConst(Const):
+    SIZE = 1
+    
     def newvar(self, builder):
         return builder.returnintvar(self.operand(builder))
 
 class FloatConst(Const):
+    SIZE = 2
+    
     def __init__(self, floatval):
         # XXX we should take more care who is creating this and
         #     eventually release this buffer
@@ -166,12 +170,14 @@
         self.rawbuf[0] = floatval
 
     def newvar(self, builder):
-        return builder.returnfloatvar(self.operand(builder))
+        return builder.newfloatfrommem(self.rawbuf)
 
     def operand(self, builder):
         return heap64(rffi.cast(rffi.INT, self.rawbuf))
 
 class BoolConst(Const):
+    SIZE = 1
+    
     def newvar(self, builder):
         return builder.returnboolvar(self.operand(builder))
 
@@ -524,6 +530,7 @@
             final_depth = self.stackdepth + numargs
             delta = ((final_depth+MASK)&~MASK)-final_depth
             if delta:
+                xxx
                 self.mc.SUB(esp, imm(delta*WORD))
                 self.stackdepth += delta
         for i in range(numargs-1, -1, -1):
@@ -620,7 +627,7 @@
         self.mc.PUSH(op)
         self.stackdepth += 1
 
-    def pushfloat(self, op):
+    def pushfloatfromst0(self, op):
         self.mc.SUB(esp, imm(WORD * FloatVar.SIZE))
         self.stackdepth += 2
         self.mc.FSTPL(op.operand(self))
@@ -641,7 +648,19 @@
 
     def returnfloatvar(self, op):
         res = FloatVar(self.stackdepth + 1)
-        self.pushfloat(res)
+        if op is st0:
+            self.pushfloatfromst0(res)
+        else:
+            raise NotImplementedError("Return float var not on fp stack")
+        return res
+
+    def newfloatfrommem(self, rawbuf):
+        # XXX obscure pointer arithmetics on ints. Think how do to it
+        #     better
+        res = FloatVar(self.stackdepth + 1)
+        self.mc.PUSH(heap(rffi.cast(rffi.INT, rawbuf)))
+        self.mc.PUSH(heap(rffi.cast(rffi.INT, rawbuf) + WORD))
+        self.stackdepth += 2
         return res
 
     @staticmethod
@@ -1027,6 +1046,7 @@
             res_positions.append(pos)
         else:
             assert gv.SIZE == 2
+            assert isinstance(gv, FloatVar)
             res_gv.append(IntVar(gv.stackpos))
             res_gv.append(IntVar(gv.stackpos - 1))
             res_positions.append(pos)
@@ -1053,9 +1073,8 @@
         builder.mc.SUB(esp, imm(WORD * (N - builder.stackdepth)))
         builder.stackdepth = N
 
-    #outputargs_gv, arg_positions = _remap_bigger_values(outputargs_gv,
-    #                                                    target.arg_positions)
-    arg_positions = target.arg_positions
+    outputargs_gv, arg_positions = _remap_bigger_values(outputargs_gv,
+                                                        target.arg_positions)
     M = len(outputargs_gv)
     assert M == len(arg_positions)
     targetlayout = [None] * N

Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py	Thu Apr  3 06:18:46 2008
@@ -36,7 +36,6 @@
     test_demo_f1_direct = skipped
 
     # float stack remap
-    test_float_loop_direct = skipped
 
 class TestRI386GenopCompile(AbstractRGenOpTestsCompile):
     RGenOp = RI386GenOp



More information about the Pypy-commit mailing list