Author: Remi Meier <remi.me...@gmail.com> Branch: stmgc-c4 Changeset: r65603:9187e5809794 Date: 2013-07-24 14:06 +0200 http://bitbucket.org/pypy/pypy/changeset/9187e5809794/
Log: little improvement to register usage 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 @@ -437,8 +437,8 @@ # new addr in eax, save to now unused arg if for_frame: # ||retadr|x||x|x||xmm0|x||rax|x|| - mc.PUSH_r(eax.value) - # ||retadr|x||x|x||xmm0|x||rax|x||result| + # directly move to rbp + mc.MOV_rr(ebp.value, eax.value) elif IS_X86_32: mc.MOV_sr(3 * WORD, eax.value) # ||val|retadr|x|val|| @@ -473,20 +473,15 @@ else: if IS_X86_32: mc.MOV_rs(edx.value, 5 * WORD) - # ||retadr|x||x|x||xmm0|x||rax|x||result| - mc.MOVSD_xs(xmm0.value, 4 * WORD) - mc.MOV_rs(eax.value, 2 * WORD) # restore + # ||retadr|x||x|x||xmm0|x||rax|x|| + mc.MOVSD_xs(xmm0.value, 3 * WORD) + mc.MOV_rs(eax.value, WORD) # restore self._restore_exception(mc, exc0, exc1) - mc.MOV(exc0, RawEspLoc(WORD * 6, REF)) - mc.MOV(exc1, RawEspLoc(WORD * 7, INT)) - - if IS_X86_32: - mc.POP_r(ecx.value) # return value - else: - mc.POP_r(edi.value) # return value + mc.MOV(exc0, RawEspLoc(WORD * 5, REF)) + mc.MOV(exc1, RawEspLoc(WORD * 6, INT)) mc.LEA_rs(esp.value, 7 * WORD) - + # retval already in ebp mc.RET() rawstart = mc.materialize(self.cpu.asmmemmgr, []) @@ -521,9 +516,9 @@ clt.allgcrefs = [] clt.frame_info.clear() # for now - if log: - operations = self._inject_debugging_code(looptoken, operations, - 'e', looptoken.number) + # if log: + # operations = self._inject_debugging_code(looptoken, operations, + # 'e', looptoken.number) regalloc = RegAlloc(self, self.cpu.translate_support_code) # @@ -582,9 +577,9 @@ self.setup(original_loop_token) descr_number = compute_unique_id(faildescr) - if log: - operations = self._inject_debugging_code(faildescr, operations, - 'b', descr_number) + # if log: + # operations = self._inject_debugging_code(faildescr, operations, + # 'b', descr_number) arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs) regalloc = RegAlloc(self, self.cpu.translate_support_code) @@ -838,10 +833,17 @@ self.mc.RET() def _load_shadowstack_top_in_ebx(self, mc, gcrootmap): + """Loads the shadowstack top in ebx, and returns an integer + that gives the address of the stack top. If this integer doesn't + fit in 32 bits, it will be loaded in r11. + """ rst = gcrootmap.get_root_stack_top_addr() if rx86.fits_in_32bits(rst): mc.MOV_rj(ebx.value, rst) # MOV ebx, [rootstacktop] else: + # The integer 'rst' doesn't fit in 32 bits, so we know that + # _load_shadowstack_top_in_ebx() above loaded it in r11. + # Reuse it. Be careful not to overwrite r11 in the middle! mc.MOV_ri(X86_64_SCRATCH_REG.value, rst) # MOV r11, rootstacktop mc.MOV_rm(ebx.value, (X86_64_SCRATCH_REG.value, 0)) # MOV ebx, [r11] @@ -2160,7 +2162,7 @@ assert self.cpu.gc_ll_descr.stm from rpython.jit.backend.llsupport.gc import STMBarrierDescr assert isinstance(descr, STMBarrierDescr) - assert descr.returns_modified_object + assert descr.returns_modified_object loc_base = arglocs[0] assert isinstance(loc_base, RegLoc) # Write only a CALL to the helper prepared in advance, passing it as @@ -2182,11 +2184,8 @@ mc.CALL(imm(func)) # get result: if is_frame: - # result in register: - if IS_X86_32: - mc.MOV_rr(loc_base.value, ecx.value) - else: - mc.MOV_rr(loc_base.value, edi.value) + # result already written back to ebp + assert loc_base is ebp else: # result where argument was: mc.POP_r(loc_base.value) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit