[pypy-commit] pypy continulet-jit-2: Finish bridge support. XXX far too heavy for now.
arigo
noreply at buildbot.pypy.org
Thu Mar 1 21:07:26 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: continulet-jit-2
Changeset: r53080:241e1f25e4f4
Date: 2012-03-01 21:07 +0100
http://bitbucket.org/pypy/pypy/changeset/241e1f25e4f4/
Log: Finish bridge support. XXX far too heavy for now.
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -514,7 +514,7 @@
operations,
self.current_clt.allgcrefs)
- #stackadjustpos = self._patchable_stackadjust()
+ frame_size_pos = self._enter_bridge_code()
(frame_depth #, param_depth
) = self._assemble(regalloc, operations)
codeendpos = self.mc.get_relative_pos()
@@ -526,8 +526,8 @@
debug_print("bridge out of Guard %d has address %x to %x" %
(descr_number, rawstart, rawstart + codeendpos))
debug_stop("jit-backend-addr")
- #self._patch_stackadjust(rawstart + stackadjustpos,
- # frame_depth + param_depth)
+ self._patch_stackadjust(rawstart + frame_size_pos,
+ frame_depth) # + param_depth)
self.patch_pending_failure_recoveries(rawstart)
if not we_are_translated():
# for the benefit of tests
@@ -725,6 +725,55 @@
self.mc.LEA32_rb(esp.value, 0)
return self.mc.get_relative_pos() - 4
+ def _enter_bridge_code(self):
+ # XXX XXX far too heavy saving and restoring
+ j = 0
+ if self.cpu.supports_floats:
+ for reg in self._regalloc.xrm.save_around_call_regs:
+ self.mc.MOVSD_sx(j, reg.value)
+ j += 8
+ #
+ save_regs = self._regalloc.rm.save_around_call_regs
+ if IS_X86_32:
+ assert len(save_regs) == 3
+ self.mc.MOV_sr(j, save_regs[0].value)
+ self.mc.PUSH_r(save_regs[1].value)
+ self.mc.PUSH_r(save_regs[2].value)
+ # 4 PUSHes in total, stack remains aligned
+ self.mc.PUSH_i32(0x77777777) # patched later
+ result = self.mc.get_relative_pos() - 4
+ self.mc.LEA_rb(eax.value, -WORD * (FRAME_FIXED_SIZE-1))
+ self.mc.PUSH_r(eax.value)
+ elif IS_X86_64:
+ # an even number of PUSHes, stack remains aligned
+ assert len(save_regs) & 1 == 0
+ for reg in save_regs:
+ self.mc.PUSH_r(reg.value)
+ self.mc.LEA_rb(edi.value, -WORD * (FRAME_FIXED_SIZE-1))
+ self.mc.MOV_riu32(esi.value, 0x77777777) # patched later
+ result = self.mc.get_relative_pos() - 4
+ #
+ self.mc.CALL(imm(self.offstack_realloc_addr))
+ #
+ self.mc.LEA_rm(ebp.value, (eax.value, WORD * (FRAME_FIXED_SIZE-1)))
+ #
+ if IS_X86_32:
+ self.mc.ADD_ri(esp.value, 2*WORD)
+ self.mc.POP_r(save_regs[2].value)
+ self.mc.POP_r(save_regs[1].value)
+ self.mc.MOV_rs(save_regs[0].value, j)
+ elif IS_X86_64:
+ for i in range(len(save_regs)-1, -1, -1):
+ self.mc.POP_r(save_regs[i].value)
+ #
+ if self.cpu.supports_floats:
+ j = 0
+ for reg in self._regalloc.xrm.save_around_call_regs:
+ self.mc.MOVSD_xs(reg.value, j)
+ j += 8
+ #
+ return result
+
def _patch_stackadjust(self, adr_to_fix, allocated_depth):
# patch the requested size in the call to malloc/realloc
mc = codebuf.MachineCodeBlockWrapper()
More information about the pypy-commit
mailing list