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