Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r45131:50a9cc9699ce Date: 2011-06-26 11:51 +0200 http://bitbucket.org/pypy/pypy/changeset/50a9cc9699ce/
Log: Fix for issue758 (hopefully -- hard for me to test). 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 @@ -703,22 +703,28 @@ # we need to put two words into the shadowstack: the MARKER # and the address of the frame (ebp, actually) rst = gcrootmap.get_root_stack_top_addr() - assert rx86.fits_in_32bits(rst) - if IS_X86_64: - # cannot use rdx here, it's used to pass arguments! - tmp = X86_64_SCRATCH_REG + if rx86.fits_in_32bits(rst): + self.mc.MOV_rj(eax.value, rst) # MOV eax, [rootstacktop] else: - tmp = edx - self.mc.MOV_rj(eax.value, rst) # MOV eax, [rootstacktop] - self.mc.LEA_rm(tmp.value, (eax.value, 2*WORD)) # LEA edx, [eax+2*WORD] + self.mc.MOV_ri64(r13.value, rst) # MOV r13, rootstacktop + self.mc.MOV_rm(eax.value, (r13.value, 0)) # MOV eax, [r13] + # + self.mc.LEA_rm(ebx.value, (eax.value, 2*WORD)) # LEA ebx, [eax+2*WORD] self.mc.MOV_mi((eax.value, 0), gcrootmap.MARKER) # MOV [eax], MARKER self.mc.MOV_mr((eax.value, WORD), ebp.value) # MOV [eax+WORD], ebp - self.mc.MOV_jr(rst, tmp.value) # MOV [rootstacktop], edx + # + if rx86.fits_in_32bits(rst): + self.mc.MOV_jr(rst, ebx.value) # MOV [rootstacktop], ebx + else: + self.mc.MOV_mr((r13.value, 0), ebx.value) # MOV [r13], ebx def _call_footer_shadowstack(self, gcrootmap): rst = gcrootmap.get_root_stack_top_addr() - assert rx86.fits_in_32bits(rst) - self.mc.SUB_ji8(rst, 2*WORD) # SUB [rootstacktop], 2*WORD + if rx86.fits_in_32bits(rst): + self.mc.SUB_ji8(rst, 2*WORD) # SUB [rootstacktop], 2*WORD + else: + self.mc.MOV_ri64(ebx.value, rst) # MOV ebx, rootstacktop + self.mc.SUB_mi8((ebx.value, 0), 2*WORD) # SUB [ebx], 2*WORD def _assemble_bootstrap_direct_call(self, arglocs, jmppos, stackdepth): if IS_X86_64: diff --git a/pypy/jit/backend/x86/rx86.py b/pypy/jit/backend/x86/rx86.py --- a/pypy/jit/backend/x86/rx86.py +++ b/pypy/jit/backend/x86/rx86.py @@ -283,7 +283,7 @@ # with immediate(argnum)). def encode_abs(mc, _1, _2, orbyte): - # expands to either '\x05' on 32-bit, or '\x04\x25' or 64-bit + # expands to either '\x05' on 32-bit, or '\x04\x25' on 64-bit if mc.WORD == 8: mc.writechar(chr(0x04 | orbyte)) mc.writechar(chr(0x25)) @@ -370,6 +370,8 @@ INSN_rj = insn(rex_w, chr(base+3), register(1,8), abs_, immediate(2)) INSN_ji8 = insn(rex_w, '\x83', orbyte(base), abs_, immediate(1), immediate(2,'b')) + INSN_mi8 = insn(rex_w, '\x83', orbyte(base), mem_reg_plus_const(1), + immediate(2,'b')) INSN_bi8 = insn(rex_w, '\x83', orbyte(base), stack_bp(1), immediate(2,'b')) INSN_bi32= insn(rex_w, '\x81', orbyte(base), stack_bp(1), immediate(2)) @@ -388,7 +390,7 @@ INSN_bi._always_inline_ = True # try to constant-fold single_byte() return (INSN_ri, INSN_rr, INSN_rb, INSN_bi, INSN_br, INSN_rm, INSN_rj, - INSN_ji8) + INSN_ji8, INSN_mi8) def select_8_or_32_bit_immed(insn_8, insn_32): def INSN(*args): @@ -467,13 +469,13 @@ # ------------------------------ Arithmetic ------------------------------ - ADD_ri, ADD_rr, ADD_rb, _, _, ADD_rm, ADD_rj, _ = common_modes(0) - OR_ri, OR_rr, OR_rb, _, _, OR_rm, OR_rj, _ = common_modes(1) - AND_ri, AND_rr, AND_rb, _, _, AND_rm, AND_rj, _ = common_modes(4) - SUB_ri, SUB_rr, SUB_rb, _, _, SUB_rm, SUB_rj, SUB_ji8 = common_modes(5) - SBB_ri, SBB_rr, SBB_rb, _, _, SBB_rm, SBB_rj, _ = common_modes(3) - XOR_ri, XOR_rr, XOR_rb, _, _, XOR_rm, XOR_rj, _ = common_modes(6) - CMP_ri, CMP_rr, CMP_rb, CMP_bi, CMP_br, CMP_rm, CMP_rj, _ = common_modes(7) + ADD_ri,ADD_rr,ADD_rb,_,_,ADD_rm,ADD_rj,_,_ = common_modes(0) + OR_ri, OR_rr, OR_rb, _,_,OR_rm, OR_rj, _,_ = common_modes(1) + AND_ri,AND_rr,AND_rb,_,_,AND_rm,AND_rj,_,_ = common_modes(4) + SUB_ri,SUB_rr,SUB_rb,_,_,SUB_rm,SUB_rj,SUB_ji8,SUB_mi8 = common_modes(5) + SBB_ri,SBB_rr,SBB_rb,_,_,SBB_rm,SBB_rj,_,_ = common_modes(3) + XOR_ri,XOR_rr,XOR_rb,_,_,XOR_rm,XOR_rj,_,_ = common_modes(6) + CMP_ri,CMP_rr,CMP_rb,CMP_bi,CMP_br,CMP_rm,CMP_rj,_,_ = common_modes(7) CMP_mi8 = insn(rex_w, '\x83', orbyte(7<<3), mem_reg_plus_const(1), immediate(2, 'b')) CMP_mi32 = insn(rex_w, '\x81', orbyte(7<<3), mem_reg_plus_const(1), immediate(2)) diff --git a/pypy/jit/backend/x86/test/test_rx86.py b/pypy/jit/backend/x86/test/test_rx86.py --- a/pypy/jit/backend/x86/test/test_rx86.py +++ b/pypy/jit/backend/x86/test/test_rx86.py @@ -185,6 +185,13 @@ cb = CodeBuilder32 assert_encodes_as(cb, 'PUSH_i32', (9,), '\x68\x09\x00\x00\x00') +def test_sub_ji8(): + cb = CodeBuilder32 + assert_encodes_as(cb, 'SUB_ji8', (11223344, 55), + '\x83\x2D\x30\x41\xAB\x00\x37') + assert_encodes_as(cb, 'SUB_mi8', ((edx, 16), 55), + '\x83\x6A\x10\x37') + class CodeBuilder64(CodeBuilderMixin, X86_64_CodeBuilder): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit