[pypy-svn] r75794 - pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86

jcreigh at codespeak.net jcreigh at codespeak.net
Fri Jul 2 20:33:29 CEST 2010


Author: jcreigh
Date: Fri Jul  2 20:33:26 2010
New Revision: 75794

Modified:
   pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/assembler.py
Log:
try to fix 64-bit call_assembler

Modified: pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/assembler.py	Fri Jul  2 20:33:26 2010
@@ -444,8 +444,13 @@
         return adr_stackadjust
 
     def _assemble_bootstrap_direct_call_64(self, arglocs, jmpadr, stackdepth):
-        # XXX: Is this even remotely correct? Might arglocs contain some of
-        # the same locations that the calling convention uses?
+        # XXX: Very similar to _emit_call_64
+
+        src_locs = []
+        dst_locs = []
+        xmm_src_locs = []
+        xmm_dst_locs = []
+        get_from_stack = []
 
         # In reverse order for use with pop()
         unused_gpr = [r9, r8, ecx, edx, esi, edi]
@@ -455,30 +460,42 @@
         adr_stackadjust = self._call_header()
         self._patch_stackadjust(adr_stackadjust, stackdepth)
 
+        # The lists are padded with Nones
+        assert len(nonfloatlocs) == len(floatlocs)
+
         for i in range(len(nonfloatlocs)):
             loc = nonfloatlocs[i]
             if loc is not None:
                 if len(unused_gpr) > 0:
-                    self.mc.MOV(loc, unused_gpr.pop())
+                    src_locs.append(unused_gpr.pop())
+                    dst_locs.append(loc)
                 else:
-                    self.mc.ensure_bytes_available(32)
-                    self.mc.MOV_rb(X86_64_SCRATCH_REG.value, (2 + i) * WORD)
-                    self.mc.MOV(loc, X86_64_SCRATCH_REG)
+                    get_from_stack.append((loc, False))
 
-        for i in range(len(floatlocs)):
-            loc = floatlocs[i]
-            if loc is not None:
+            floc = floatlocs[i]
+            if floc is not None:
                 if len(unused_xmm) > 0:
-                    self.mc.MOVSD(loc, unused_xmm.pop())
+                    xmm_src_locs.append(unused_xmm.pop())
+                    xmm_dst_locs.append(floc)
                 else:
-                    self.mc.MOVSD_xb(X86_64_XMM_SCRATCH_REG.value, (2 + i) * WORD)
-                    self.mc.MOVSD(loc, X86_64_XMM_SCRATCH_REG)
+                    get_from_stack.append((floc, True))
 
-        self.mc.JMP(imm(jmpadr))
+        remap_frame_layout(self, src_locs, dst_locs, X86_64_SCRATCH_REG)
+        remap_frame_layout(self, xmm_src_locs, xmm_dst_locs, X86_64_XMM_SCRATCH_REG)
 
-        return adr_stackadjust
+        for i in range(len(get_from_stack)):
+            loc, is_xmm = get_from_stack[i]
+            self.mc.ensure_bytes_available(32)
+            if is_xmm:
+                self.mc.MOVSD_xb(X86_64_XMM_SCRATCH_REG.value, (2 + i) * WORD)
+                self.mc.MOVSD(loc, X86_64_XMM_SCRATCH_REG)
+            else:
+                self.mc.MOV_rb(X86_64_SCRATCH_REG.value, (2 + i) * WORD)
+                self.mc.MOV(loc, X86_64_SCRATCH_REG)
 
+        self.mc.JMP(imm(jmpadr))
 
+        return adr_stackadjust
 
     def _assemble_bootstrap_code(self, inputargs, arglocs):
         nonfloatlocs, floatlocs = arglocs



More information about the Pypy-commit mailing list