Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r63459:a1173abdf19e
Date: 2013-04-17 20:48 +0200
http://bitbucket.org/pypy/pypy/changeset/a1173abdf19e/

Log:    Expand the comments. No actual change in the code.

diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -178,7 +178,8 @@
             addr = self.cpu.gc_ll_descr.get_malloc_fn_addr('malloc_unicode')
         else:
             addr = self.cpu.gc_ll_descr.get_malloc_slowpath_array_addr()
-        mc.SUB_ri(esp.value, 16 - WORD)
+        mc.SUB_ri(esp.value, 16 - WORD)  # restore 16-byte alignment
+        # magically, the above is enough on X86_32 to reserve 3 stack places
         if kind == 'fixed':
             mc.SUB_rr(edi.value, eax.value) # compute the size we want
             # the arg is already in edi
@@ -191,21 +192,23 @@
                 mc.MOV_rr(esi.value, ebp.value)
         elif kind == 'str' or kind == 'unicode':
             if IS_X86_32:
-                # 1 for return value, 3 for alignment
-                mc.MOV_rs(edi.value, WORD * (3 + 1 + 1))
+                # stack layout: [---][---][---][ret][gcmap][length]...
+                mc.MOV_rs(edi.value, WORD * 5)  # pick 'length'
                 mc.MOV_sr(0, edi.value)
             else:
+                # stack layout: [---][ret][gcmap][length]...
                 mc.MOV_rs(edi.value, WORD * 3)
         else:
             if IS_X86_32:
-                mc.MOV_rs(edi.value, WORD * (3 + 1 + 1)) # itemsize
+                # stack layout: [--][--][--][ret][gcmap][itemsize][length][tid]
+                mc.MOV_rs(edi.value, WORD * 5)  # pick 'itemsize'
                 mc.MOV_sr(0, edi.value)
-                mc.MOV_rs(edi.value, WORD * (3 + 3 + 1))
-                mc.MOV_sr(WORD, edi.value) # tid
-                mc.MOV_rs(edi.value, WORD * (3 + 2 + 1))
-                mc.MOV_sr(2 * WORD, edi.value) # length
+                mc.MOV_rs(edi.value, WORD * 7)  # pick 'tid'
+                mc.MOV_sr(WORD, edi.value)
+                mc.MOV_rs(edi.value, WORD * 6)  # pick 'length'
+                mc.MOV_sr(2 * WORD, edi.value)
             else:
-                # offset is 1 extra for call + 1 for SUB above
+                # stack layout: [---][ret][gcmap][itemsize][length][tid]...
                 mc.MOV_rs(edi.value, WORD * 3) # itemsize
                 mc.MOV_rs(esi.value, WORD * 5) # tid
                 mc.MOV_rs(edx.value, WORD * 4) # length
@@ -2425,7 +2428,7 @@
                 addr = self.malloc_slowpath_unicode
             self.mc.MOV(RawEspLoc(WORD, INT), lengthloc)
         # save the gcmap
-        self.push_gcmap(self.mc, gcmap, mov=True)
+        self.push_gcmap(self.mc, gcmap, mov=True)   # mov into RawEspLoc(0)
         self.mc.CALL(imm(addr))
         offset = self.mc.get_relative_pos() - jmp_adr1
         assert 0 < offset <= 127
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to