Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60839:05bcee86f659
Date: 2013-02-03 21:56 +0200
http://bitbucket.org/pypy/pypy/changeset/05bcee86f659/

Log:    Start moving frame to ebp (instead of ebp + 0x40)

diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -356,12 +356,8 @@
     @specialize.arg(1)
     def get_ofs_of_frame_field(self, name):
         descrs = self.gc_ll_descr.getframedescrs(self)
-        if name.startswith('jfi_'):
-            base_ofs = 0 # not relative to frame
-        else:
-            base_ofs = self.unpack_arraydescr(descrs.arraydescr)
         ofs = self.unpack_fielddescr(getattr(descrs, name))
-        return ofs - base_ofs
+        return ofs
 
     def get_baseofs_of_frame_field(self):
         descrs = self.gc_ll_descr.getframedescrs(self)
diff --git a/rpython/jit/backend/llsupport/regalloc.py 
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -241,15 +241,18 @@
         lst.append(var)
 
     # abstract methods that need to be overwritten for specific assemblers
-    @staticmethod
+
     def frame_pos(loc, type):
         raise NotImplementedError("Purely abstract")
+
     @staticmethod
     def frame_size(type):
         return 1
+
     @staticmethod
     def get_loc_index(loc):
         raise NotImplementedError("Purely abstract")
+
     @staticmethod
     def newloc(pos, size, tp):
         """ Reverse of get_loc_index
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
@@ -1,5 +1,4 @@
 
-import weakref
 import sys, os
 from rpython.jit.backend.llsupport import symbolic, jitframe
 from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
@@ -199,7 +198,6 @@
 
     def _build_stack_check_failure(self):
         mc = codebuf.MachineCodeBlockWrapper()
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats)
         assert not IS_X86_32
         # this is the gcmap stored by push_gcmap(mov=True) in 
_check_stack_frame
@@ -209,12 +207,12 @@
         # this is size that we're after, sanity checking only
         mc.MOV_rs(esi.value, WORD*2)
         # push first arg
-        mc.LEA_rb(edi.value, -base_ofs)
+        mc.MOV_rr(edi.value, ebp.value)
         # align
         mc.SUB_ri(esp.value, WORD)
         mc.CALL(imm(self.cpu.realloc_frame))
         mc.ADD_ri(esp.value, WORD)
-        mc.LEA_rm(ebp.value, (eax.value, base_ofs))
+        mc.MOV_rr(ebp.value, eax.value)
 
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
@@ -287,9 +285,8 @@
         propagate_exception_descr = rffi.cast(lltype.Signed,
                   cast_instance_to_gcref(self.cpu.propagate_exception_descr))
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         self.mc.MOV_bi(ofs, propagate_exception_descr)
-        self.mc.LEA_rb(eax.value, -base_ofs)
+        self.mc.MOV_rr(eax.value, ebp.value)
         #
         self._call_footer()
         rawstart = self.mc.materialize(self.cpu.asmmemmgr, [])
@@ -395,8 +392,7 @@
             # 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)
+            mc.MOV_rr(edi.value, ebp.value)
 
         mc.CALL(imm(func))
         #
@@ -674,11 +670,10 @@
         """
         descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
         ofs = self.cpu.unpack_fielddescr(descrs.arraydescr.lendescr)
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         if expected_size == -1:
-            mc.CMP_bi(ofs - base_ofs, 0xffffff)
+            mc.CMP_bi(ofs, 0xffffff)
         else:
-            mc.CMP_bi(ofs - base_ofs, expected_size)
+            mc.CMP_bi(ofs, expected_size)
         stack_check_cmp_ofs = mc.get_relative_pos() - 4
         assert not IS_X86_32
         mc.J_il8(rx86.Conditions['GE'], 0)
@@ -808,8 +803,7 @@
         self.mc.SUB_ri(esp.value, FRAME_FIXED_SIZE * WORD)
         self.mc.MOV_sr(PASS_ON_MY_FRAME * WORD, ebp.value)
         if IS_X86_64:
-            ofs = self.cpu.get_baseofs_of_frame_field()
-            self.mc.LEA_rm(ebp.value, (edi.value, ofs))
+            self.mc.MOV_rr(ebp.value, edi.value)
         else:
             xxx
 
@@ -1260,8 +1254,6 @@
             rst = gcrootmap.get_root_stack_top_addr()
             mc.MOV(edx, heap(rst))
             mc.MOV(ebp, mem(edx, -WORD))
-            base_ofs = self.cpu.get_baseofs_of_frame_field()
-            mc.ADD_ri(ebp.value, base_ofs)
         wbdescr = self.cpu.gc_ll_descr.write_barrier_descr
         if gcrootmap and wbdescr:
             # frame never uses card marking, so we enforce this is not
@@ -1899,12 +1891,13 @@
         target = self.failure_recovery_code[exc + 2 * withfloats]
         fail_descr = cast_instance_to_gcref(guardtok.faildescr)
         fail_descr = rffi.cast(lltype.Signed, fail_descr)
+        base_ofs = self.cpu.get_baseofs_of_frame_field()
         positions = [0] * len(guardtok.fail_locs)
         for i, loc in enumerate(guardtok.fail_locs):
             if loc is None:
                 positions[i] = -1
             elif isinstance(loc, StackLoc):
-                positions[i] = loc.value
+                positions[i] = loc.value - base_ofs
             else:
                 assert isinstance(loc, RegLoc)
                 assert loc is not ebp # for now
@@ -1969,18 +1962,19 @@
     def _push_all_regs_to_frame(self, mc, ignored_regs, withfloats,
                                 callee_only=False):
         # Push all general purpose registers
+        base_ofs = self.cpu.get_baseofs_of_frame_field()
         if callee_only:
             regs = gpr_reg_mgr_cls.save_around_call_regs
         else:
             regs = gpr_reg_mgr_cls.all_regs
         for i, gpr in enumerate(regs):
             if gpr not in ignored_regs:
-                mc.MOV_br(i * WORD, gpr.value)
+                mc.MOV_br(i * WORD + base_ofs, gpr.value)
         if withfloats:
             # Push all XMM regs
             ofs = len(gpr_reg_mgr_cls.all_regs)
             for i in range(len(xmm_reg_mgr_cls.all_regs)):
-                mc.MOVSD_bx((ofs + i) * WORD, i)
+                mc.MOVSD_bx((ofs + i) * WORD + base_ofs, i)
 
     def _pop_all_regs_from_frame(self, mc, ignored_regs, withfloats,
                                  callee_only=False):
@@ -2020,13 +2014,12 @@
         # did just above.
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
         ofs2 = self.cpu.get_ofs_of_frame_field('jf_gcmap')
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         mc.POP(eax)
         mc.MOV_br(ofs2, eax.value)
         mc.POP(eax)
         mc.MOV_br(ofs, eax.value)
         # store the gc pattern
-        mc.LEA_rb(eax.value, -base_ofs)
+        mc.MOV_rr(eax.value, ebp.value)
 
         self._call_footer()
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
@@ -2034,17 +2027,17 @@
         self.mc = None
 
     def genop_finish(self, op, arglocs, result_loc):
+        base_ofs = self.cpu.get_baseofs_of_frame_field()
         if len(arglocs) == 2:
             [return_val, fail_descr_loc] = arglocs
             if op.getarg(0).type == FLOAT and not IS_X86_64:
                 size = WORD * 2
             else:
                 size = WORD
-            self.save_into_mem(raw_stack(0), return_val, imm(size))
+            self.save_into_mem(raw_stack(base_ofs), return_val, imm(size))
         else:
             [fail_descr_loc] = arglocs
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         self.mov(fail_descr_loc, RawStackLoc(ofs))
         arglist = op.getarglist()
         if arglist and arglist[0].type == REF:
@@ -2055,7 +2048,7 @@
             # keep that one and kill all the others
             ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
             self.mc.MOV_bi(ofs, 0)
-        self.mc.LEA_rb(eax.value, -base_ofs)
+        self.mc.MOV_rr(eax.value, ebp.value)
         # exit function
         self._call_footer()
 
@@ -2297,9 +2290,8 @@
         gcref = cast_instance_to_gcref(value)
         rgc._make_sure_does_not_move(gcref)
         value = rffi.cast(lltype.Signed, gcref)
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
-        self.mc.CMP_mi((eax.value, base_ofs + ofs), value)
+        self.mc.CMP_mi((eax.value, ofs), value)
         # patched later
         self.mc.J_il8(rx86.Conditions['E'], 0) # goto B if we get 
'done_with_this_frame'
         je_location = self.mc.get_relative_pos()
@@ -2375,8 +2367,7 @@
         loc_base = arglocs[0]
         if is_frame:
             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 = raw_stack(descr.jit_wb_if_flag_byteofs)
         else:
             loc = addr_add_const(loc_base, descr.jit_wb_if_flag_byteofs)
         mc.TEST8(loc, imm(mask))
@@ -2540,9 +2531,9 @@
         self.mc.MOV(heap(nursery_free_adr), edi)
 
     def force_token(self, reg):
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
+        # XXX kill me
         assert isinstance(reg, RegLoc)
-        self.mc.LEA_rb(reg.value, -base_ofs)
+        self.mc.MOV_rr(reg.value, ebp.value)
 
 genop_discard_list = [Assembler386.not_implemented_op_discard] * rop._LAST
 genop_list = [Assembler386.not_implemented_op] * rop._LAST
@@ -2585,9 +2576,6 @@
 def raw_stack(offset, type=INT):
     return RawStackLoc(offset, type)
 
-def stack(index, type):
-    return StackLoc(index, get_ebp_ofs(index), type)
-
 def heap(addr):
     return AddressLoc(ImmedLoc(addr), imm0, 0, 0)
 
diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -100,15 +100,20 @@
         return RegisterManager.after_call(self, v)
 
 class X86FrameManager(FrameManager):
-    @staticmethod
-    def frame_pos(i, box_type):
-        return StackLoc(i, get_ebp_ofs(i), box_type)
+    def __init__(self, base_ofs):
+        FrameManager.__init__(self)
+        self.base_ofs = base_ofs
+    
+    def frame_pos(self, i, box_type):
+        return StackLoc(i, get_ebp_ofs(self.base_ofs, i), box_type)
+
     @staticmethod
     def frame_size(box_type):
         if IS_X86_32 and box_type == FLOAT:
             return 2
         else:
             return 1
+
     @staticmethod
     def get_loc_index(loc):
         assert isinstance(loc, StackLoc)
@@ -140,8 +145,8 @@
         self.final_jump_op = None
 
     def _prepare(self, inputargs, operations, allgcrefs):
-        self.fm = X86FrameManager()
         cpu = self.assembler.cpu
+        self.fm = X86FrameManager(cpu.get_baseofs_of_frame_field())
         operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
                                                        allgcrefs)
         # compute longevity of variables
@@ -1367,11 +1372,11 @@
         else:
             oplist[num] = value
 
-def get_ebp_ofs(position):
+def get_ebp_ofs(base_ofs, position):
     # Argument is a frame position (0, 1, 2...).
     # Returns (ebp+20), (ebp+24), (ebp+28)...
     # i.e. the n'th word beyond the fixed frame size.
-    return WORD * (position + JITFRAME_FIXED_SIZE)
+    return base_ofs + WORD * (position + JITFRAME_FIXED_SIZE)
 
 def _valid_addressing_size(size):
     return size == 1 or size == 2 or size == 4 or size == 8
diff --git a/rpython/jit/backend/x86/regloc.py 
b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -101,16 +101,14 @@
     _immutable_ = True
     
     def __init__(self, position, ebp_offset, type):
-        from rpython.jit.backend.x86.arch import JITFRAME_FIXED_SIZE, WORD
-        
         # _getregkey() returns self.value; the value returned must not
         # conflict with RegLoc._getregkey().  It doesn't a bit by chance,
         # so let it fail the following assert if it no longer does.
         assert ebp_offset >= 0
         #assert not (0 <= ebp_offset < 8 + 8 * IS_X86_64)
         self.position = position
-        if position != 9999:
-            assert (position + JITFRAME_FIXED_SIZE) * WORD == ebp_offset
+        #if position != 9999:
+        #    assert (position + JITFRAME_FIXED_SIZE) * WORD == ebp_offset
         self.value = ebp_offset
         # One of INT, REF, FLOAT
         self.type = type
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -48,6 +48,23 @@
 
         self.profile_agent = profile_agent
 
+        ad = self.gc_ll_descr.getframedescrs(self).arraydescr
+        self.signedarraydescr = ad
+        # the same as normal JITFRAME, however with an array of pointers
+        self.refarraydescr = ArrayDescr(ad.basesize, ad.itemsize, ad.lendescr,
+                                        FLAG_POINTER)
+        self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize, 
ad.lendescr,
+                                          FLAG_FLOAT)
+
+    def getarraydescr_for_frame(self, type, index):
+        if type == history.FLOAT:
+            descr = self.floatarraydescr
+        elif type == history.REF:
+            descr = self.refarraydescr
+        else:
+            descr = self.signedarraydescr
+        return JITFRAME_FIXED_SIZE + index, descr
+
     def set_debug(self, flag):
         return self.assembler.set_debug(flag)
 
@@ -202,25 +219,4 @@
     NUM_REGS = 16
     CALLEE_SAVE_REGISTERS = [regloc.ebx, regloc.r12, regloc.r13, regloc.r14, 
regloc.r15]
 
-    def __init__(self, *args, **kwargs):
-        assert sys.maxint == (2**63 - 1)
-        super(CPU_X86_64, self).__init__(*args, **kwargs)
-        descrs = self.gc_ll_descr.getframedescrs(self)
-        ad = descrs.arraydescr
-        # the same as normal JITFRAME, however with an array of pointers
-        self.signedarraydescr = ad
-        self.refarraydescr = ArrayDescr(ad.basesize, ad.itemsize, ad.lendescr,
-                                        FLAG_POINTER)
-        self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize, 
ad.lendescr,
-                                          FLAG_FLOAT)
-
-    def getarraydescr_for_frame(self, type, index):
-        if type == history.FLOAT:
-            descr = self.floatarraydescr
-        elif type == history.REF:
-            descr = self.refarraydescr
-        else:
-            descr = self.signedarraydescr
-        return JITFRAME_FIXED_SIZE + index, descr
-
 CPU = CPU386
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to