Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r61126:45ecdb12c70d
Date: 2013-02-12 13:05 +0200
http://bitbucket.org/pypy/pypy/changeset/45ecdb12c70d/
Log: fixes for gc_integration
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
@@ -322,14 +322,11 @@
# have been used to pass arguments. Note that we pass only
# one argument, that is the frame
mc.PUSH_r(edi.value)
+ mc.MOV_rr(edi.value, esp.value)
#
if IS_X86_32:
- xxx
- stack_size += 2*WORD
- mc.PUSH_r(eax.value) # alignment
+ mc.SUB_ri(esp.value, 2*WORD) # alignment
mc.PUSH_r(esp.value)
- elif IS_X86_64:
- mc.MOV_rr(edi.value, esp.value)
#
# esp is now aligned to a multiple of 16 again
mc.CALL(imm(slowpathaddr))
@@ -340,9 +337,8 @@
jnz_location = mc.get_relative_pos()
#
if IS_X86_32:
- xxxx
- mc.ADD_ri(esp.value, 2*WORD) # cancel the two PUSHes above
- elif IS_X86_64:
+ mc.ADD_ri(esp.value, 3*WORD) # alignment
+ else:
# restore the edi
mc.POP_r(edi.value)
#
@@ -396,16 +392,18 @@
mc.SUB_ri(esp.value, 2 * WORD)
mc.MOV_rs(eax.value, 3 * WORD) # 2 + 1
mc.MOV_sr(0, eax.value)
- elif IS_X86_64:
+ else:
mc.MOV_rs(edi.value, WORD)
else:
# we're possibly called from the slowpath of malloc, so we have
# one extra CALL on the stack, but one less PUSH,
# save to store stuff 2 locations away on the stack.
+ mc.MOV_sr(3 * WORD, eax.value) # save for later
if IS_X86_32:
- xxx
- mc.MOV_sr(3*WORD, eax.value)
- mc.MOV_rr(edi.value, ebp.value)
+ mc.SUB_ri(esp.value, 2 * WORD) # align
+ mc.MOV_sr(0, ebp.value)
+ else:
+ mc.MOV_rr(edi.value, ebp.value)
mc.CALL(imm(func))
#
@@ -429,8 +427,8 @@
mc.RET16_i(WORD)
else:
if IS_X86_32:
- XXX
- mc.MOV_rs(eax.value, 3 * WORD)
+ mc.LEA_rs(esp.value, 2 * WORD)
+ mc.MOV_rs(eax.value, 3 * WORD) # restore
mc.RET()
rawstart = mc.materialize(self.cpu.asmmemmgr, [])
diff --git a/rpython/jit/backend/x86/test/test_gc_integration.py
b/rpython/jit/backend/x86/test/test_gc_integration.py
--- a/rpython/jit/backend/x86/test/test_gc_integration.py
+++ b/rpython/jit/backend/x86/test/test_gc_integration.py
@@ -7,7 +7,7 @@
from rpython.jit.backend.llsupport.gc import GcLLDescription, GcLLDescr_boehm,\
GcLLDescr_framework, GcCache, JitFrameDescrs
from rpython.jit.backend.detect_cpu import getcpuclass
-from rpython.jit.backend.x86.arch import WORD, JITFRAME_FIXED_SIZE
+from rpython.jit.backend.x86.arch import WORD, JITFRAME_FIXED_SIZE, IS_X86_64
from rpython.jit.backend.llsupport import jitframe
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
from rpython.rtyper.annlowlevel import llhelper, llhelper_args
@@ -71,10 +71,15 @@
# the gcmap should contain three things, p0, p1 and p3
# p3 stays in a register
# while p0 and p1 are on the frame
- assert frame.jf_gcmap[0] == (1 << 11) | (1 << 12) | (1 << 31)
- assert frame.jf_frame[11]
- assert frame.jf_frame[12]
- assert frame.jf_frame[31]
+ if IS_X86_64:
+ nos = [11, 12, 31]
+ else:
+ nos = [4, 5, 25]
+ assert frame.jf_gcmap[0] == ((1 << nos[0]) | (1 << nos[1]) |
+ (1 << nos[2]))
+ assert frame.jf_frame[nos[0]]
+ assert frame.jf_frame[nos[1]]
+ assert frame.jf_frame[nos[2]]
def test_rewrite_constptr(self):
ops = '''
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit