Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60444:6d54d21d2cbe
Date: 2013-01-25 13:30 +0200
http://bitbucket.org/pypy/pypy/changeset/6d54d21d2cbe/

Log:    tests and fixes

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
@@ -241,8 +241,7 @@
             mc.LEA_rb(esi.value, -base_ofs)
         mc.SUB_ri(esp.value, 16 - WORD)
         mc.CALL(imm(addr))
-        # Note: we check this after the code above, just because the code
-        # above is more than 127 bytes on 64-bits...
+        mc.ADD_ri(esp.value, 16 - WORD)
         mc.TEST_rr(eax.value, eax.value)
         mc.J_il(rx86.Conditions['Z'], 0xfffff) # patched later
         jz_location = mc.get_relative_pos()
@@ -250,7 +249,6 @@
         nursery_free_adr = self.cpu.gc_ll_descr.get_nursery_free_addr()
         self._reload_frame_if_necessary(mc)
         self._pop_all_regs_from_frame(mc, [eax, edi], self.cpu.supports_floats)
-        mc.LEA_rs(esp.value, 16 - WORD)
         mc.MOV(edi, heap(nursery_free_adr))   # load this in EDX
         # clear the gc pattern
         mc.MOV_bi(ofs, 0)
@@ -387,15 +385,20 @@
         #
         if not for_frame:
             self._push_all_regs_to_frame(mc, [], withfloats, callee_only=True)
+            if IS_X86_32:
+                XXX
+                mc.MOV_rs(eax.value, WORD)
+                mc.MOV_sr(0, eax.value)
+            elif IS_X86_64:
+                mc.MOV_rs(edi.value, WORD)
         else:
-            mc.MOV_sr(0, eax.value)
+            # 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)
+            base_ofs = self.cpu.get_baseofs_of_frame_field()
+            mc.LEA_rb(edi.value, -base_ofs)
 
-        if IS_X86_32:
-            XXX
-            mc.MOV_rs(eax.value, WORD)
-            mc.MOV_sr(0, eax.value)
-        elif IS_X86_64:
-            mc.MOV_rs(edi.value, WORD)
         mc.CALL(imm(func))
         #
         if withcards:
@@ -409,14 +412,15 @@
 
         if not for_frame:
             self._pop_all_regs_from_frame(mc, [], withfloats, callee_only=True)
+            mc.RET16_i(WORD)
         else:
-            mc.MOV_rs(eax.value, 0)
+            mc.MOV_rs(eax.value, 3 * WORD)
+            mc.RET()
         #
         # ADD esp, correct_esp_by --- but cannot use ADD, because
         # of its effects on the CPU flags
         
         #mc.LEA_rs(esp.value, WORD)
-        mc.RET16_i(WORD)
         #
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
         if for_frame:
@@ -2340,7 +2344,6 @@
             assert loc_base is ebp
             extra_ofs = self.cpu.get_baseofs_of_frame_field()
             loc = raw_stack(descr.jit_wb_if_flag_byteofs - extra_ofs)
-            loc_base = raw_stack(-extra_ofs)
         else:
             loc = addr_add_const(loc_base, descr.jit_wb_if_flag_byteofs)
         mc.TEST8(loc, imm(mask))
@@ -2361,7 +2364,9 @@
         # argument the address of the structure we are writing into
         # (the first argument to COND_CALL_GC_WB).
         helper_num = card_marking
-        if self._regalloc is not None and self._regalloc.xrm.reg_bindings:
+        if is_frame:
+            helper_num = 4
+        elif self._regalloc is not None and self._regalloc.xrm.reg_bindings:
             helper_num += 2
         if self.wb_slowpath[helper_num] == 0:    # tests only
             assert not we_are_translated()
@@ -2370,7 +2375,8 @@
                                     bool(self._regalloc.xrm.reg_bindings))
             assert self.wb_slowpath[helper_num] != 0
         #
-        mc.PUSH(loc_base)
+        if not is_frame:
+            mc.PUSH(loc_base)
         mc.CALL(imm(self.wb_slowpath[helper_num]))
 
         if card_marking:
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
@@ -326,8 +326,8 @@
     jit_wb_if_flag_singlebyte = 1
     
     def __init__(self, gc_ll_descr):
-        def write_barrier(x):
-            gc_ll_descr.write_barrier_on_frame_called = True
+        def write_barrier(frame):
+            gc_ll_descr.write_barrier_on_frame_called = frame
 
         self.write_barrier_fn = llhelper_args(write_barrier,
                                               [lltype.Signed], lltype.Void)
@@ -563,4 +563,4 @@
         thing = frame.jf_frame[unpack_gcmap(frame)[0]]
         assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery)
         assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size
-        assert cpu.gc_ll_descr.write_barrier_on_frame_called
+        assert rffi.cast(JITFRAMEPTR, 
cpu.gc_ll_descr.write_barrier_on_frame_called) == frame
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to