[pypy-svn] r69916 - pypy/branch/esp-params/pypy/jit/backend/x86

pedronis at codespeak.net pedronis at codespeak.net
Sun Dec 6 02:01:38 CET 2009


Author: pedronis
Date: Sun Dec  6 02:01:36 2009
New Revision: 69916

Modified:
   pypy/branch/esp-params/pypy/jit/backend/x86/assembler.py
Log:
factor out the common logic in a helper, no esp adjusting for calls anymore



Modified: pypy/branch/esp-params/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/esp-params/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/esp-params/pypy/jit/backend/x86/assembler.py	Sun Dec  6 02:01:36 2009
@@ -391,14 +391,34 @@
 ##            self.mc.PUSH(imm(0))   --- or just use a single SUB(esp, imm)
 ##        return extra_on_stack
 
-    def call(self, addr, args, res):
-        nargs = len(args)
-        extra_on_stack = nargs #self.align_stack_for_call(nargs)
-        for i in range(nargs-1, -1, -1):
-            self.mc.PUSH(args[i])
-        self.mc.CALL(rel32(addr))
+    def _emit_call(self, x, arglocs, start=0, tmp=eax):
+        p = 0
+        n = len(arglocs)
+        for i in range(start, n):
+            loc = arglocs[i]
+            if isinstance(loc, REG):
+                if isinstance(loc, XMMREG):
+                    self.mc.MOVSD(mem64(esp, p), loc)
+                else:
+                    self.mc.MOV(mem(esp, p), loc)
+            p += round_up_to_4(loc.width)
+        p = 0
+        for i in range(start, n):
+            loc = arglocs[i]
+            if not isinstance(loc, REG):
+                if isinstance(loc, MODRM64):
+                    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 += round_up_to_4(loc.width)
+        self._regalloc.reserve_param(p//WORD)
+        self.mc.CALL(x)
         self.mark_gc_roots()
-        self.mc.ADD(esp, imm(extra_on_stack * WORD))
+        
+    def call(self, addr, args, res):
+        self._emit_call(rel32(addr), args)
         assert res is eax
 
     genop_int_neg = _unaryop("NEG")
@@ -1074,14 +1094,7 @@
         sizeloc = arglocs[0]
         assert isinstance(sizeloc, IMM32)
         size = sizeloc.value
-        nargs = len(op.args)-1
-        extra_on_stack = 0
-        for arg in range(2, nargs + 2):
-            extra_on_stack += round_up_to_4(arglocs[arg].width)
 
-        self._regalloc.reserve_param(extra_on_stack//4)
-        
-        #extra_on_stack = self.align_stack_for_call(extra_on_stack)
         if isinstance(op.args[0], Const):
             x = rel32(op.args[0].getint())
         else:
@@ -1090,28 +1103,9 @@
             tmp = ecx
         else:
             tmp = eax
-        p = 0
-        for i in range(2, nargs + 2):
-            loc = arglocs[i]
-            if isinstance(loc, REG):
-                if isinstance(loc, XMMREG):
-                    self.mc.MOVSD(mem64(esp, p), loc)
-                else:
-                    self.mc.MOV(mem(esp, p), loc)
-            p += round_up_to_4(loc.width)
-        p = 0
-        for i in range(2, nargs + 2):
-            loc = arglocs[i]
-            if not isinstance(loc, REG):
-                if isinstance(loc, MODRM64):
-                    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 += round_up_to_4(loc.width)
-        self.mc.CALL(x)
-        self.mark_gc_roots()
+            
+        self._emit_call(x, arglocs, 2, tmp=tmp)
+
         if isinstance(resloc, MODRM64):
             self.mc.FSTP(resloc)
         elif size == 1:
@@ -1199,14 +1193,13 @@
         mc.CMP(edx, heap(nursery_top_adr))
         mc.write(constlistofchars('\x76\x00')) # JNA after the block
         jmp_adr = mc.get_relative_pos()
-        mc.PUSH(imm(size))
-        mc.CALL(rel32(slowpath_addr))
-        self.mark_gc_roots()
+        self._emit_call(rel32(slowpath_addr), [imm(size)])
+
         # note that slowpath_addr returns a "long long", or more precisely
         # two results, which end up in eax and edx.
         # eax should contain the result of allocation, edx new value
         # of nursery_free_adr
-        mc.ADD(esp, imm(4))
+
         offset = mc.get_relative_pos() - jmp_adr
         assert 0 < offset <= 127
         mc.overwrite(jmp_adr-1, [chr(offset)])



More information about the Pypy-commit mailing list