Author: Armin Rigo <[email protected]>
Branch: guard-compatible
Changeset: r84572:0814411c063a
Date: 2016-05-22 16:49 +0200
http://bitbucket.org/pypy/pypy/changeset/0814411c063a/
Log: Remove outdated code
diff --git a/rpython/jit/backend/x86/guard_compat.py
b/rpython/jit/backend/x86/guard_compat.py
--- a/rpython/jit/backend/x86/guard_compat.py
+++ b/rpython/jit/backend/x86/guard_compat.py
@@ -408,217 +408,3 @@
mc.JMP_r(r11) # JMP *R11
assembler.guard_compat_search_tree = mc.materialize(assembler.cpu, [])
-
-
-
-
-
-# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-def generate_guard_compatible(assembler, guard_token, loc_reg, initial_value):
- # fast-path check
- mc = assembler.mc
- if IS_X86_64:
- mc.MOV_ri64(X86_64_SCRATCH_REG.value, initial_value)
- rel_pos_compatible_imm = mc.get_relative_pos()
- mc.CMP_rr(loc_reg.value, X86_64_SCRATCH_REG.value)
- elif IS_X86_32:
- mc.CMP_ri32(loc_reg.value, initial_value)
- rel_pos_compatible_imm = mc.get_relative_pos()
- mc.J_il8(rx86.Conditions['E'], 0)
- je_location = mc.get_relative_pos()
-
- # fast-path failed, call the slow-path checker
- checker = get_or_build_checker(assembler, loc_reg.value)
-
- # initialize 'compatinfo' with only 'initial_value' in it
- compatinfoaddr = assembler.datablockwrapper.malloc_aligned(
- 3 * WORD, alignment=WORD)
- compatinfo = rffi.cast(rffi.SIGNEDP, compatinfoaddr)
- compatinfo[1] = initial_value
- compatinfo[2] = -1
-
- if IS_X86_64:
- mc.MOV_ri64(X86_64_SCRATCH_REG.value, compatinfoaddr) # patchable
- guard_token.pos_compatinfo_offset = mc.get_relative_pos() - WORD
- mc.PUSH_r(X86_64_SCRATCH_REG.value)
- elif IS_X86_32:
- mc.PUSH_i32(compatinfoaddr) # patchable
- guard_token.pos_compatinfo_offset = mc.get_relative_pos() - WORD
- mc.CALL(imm(checker))
- mc.stack_frame_size_delta(-WORD)
-
- small_ofs = rel_pos_compatible_imm - mc.get_relative_pos()
- assert -128 <= small_ofs < 128
- compatinfo[0] = small_ofs & 0xFF
-
- assembler.guard_success_cc = rx86.Conditions['Z']
- assembler.implement_guard(guard_token)
- #
- # patch the JE above
- offset = mc.get_relative_pos() - je_location
- assert 0 < offset <= 127
- mc.overwrite(je_location-1, chr(offset))
-
-
-def patch_guard_compatible(rawstart, tok):
- descr = tok.faildescr
- if not we_are_translated() and isinstance(descr, BasicFailDescr):
- pass # for tests
- else:
- assert isinstance(descr, GuardCompatibleDescr)
- descr._backend_compatinfo = rawstart + tok.pos_compatinfo_offset
-
-
-def grow_switch(cpu, compiled_loop_token, guarddescr, gcref):
- # XXX is it ok to force gcref to be non-movable?
- if not rgc._make_sure_does_not_move(gcref):
- raise AssertionError("oops")
- new_value = rffi.cast(lltype.Signed, gcref)
-
- # XXX related to the above: for now we keep alive the gcrefs forever
- # in the compiled_loop_token
- if compiled_loop_token._keepalive_extra is None:
- compiled_loop_token._keepalive_extra = []
- compiled_loop_token._keepalive_extra.append(gcref)
-
- if not we_are_translated() and isinstance(guarddescr, BasicFailDescr):
- pass # for tests
- else:
- assert isinstance(guarddescr, GuardCompatibleDescr)
- compatinfop = rffi.cast(rffi.VOIDPP, guarddescr._backend_compatinfo)
- compatinfo = rffi.cast(rffi.SIGNEDP, compatinfop[0])
- length = 3
- while compatinfo[length - 1] != -1:
- length += 1
-
- allblocks = compiled_loop_token.get_asmmemmgr_blocks()
- datablockwrapper = MachineDataBlockWrapper(cpu.asmmemmgr, allblocks)
- newcompatinfoaddr = datablockwrapper.malloc_aligned(
- (length + 1) * WORD, alignment=WORD)
- datablockwrapper.done()
-
- newcompatinfo = rffi.cast(rffi.SIGNEDP, newcompatinfoaddr)
- newcompatinfo[0] = compatinfo[0]
-
- if GROW_POSITION == 0:
- newcompatinfo[1] = new_value
- for i in range(1, length):
- newcompatinfo[i + 1] = compatinfo[i]
- elif GROW_POSITION == 1:
- for i in range(1, length - 2):
- newcompatinfo[i] = compatinfo[i]
- newcompatinfo[length - 2] = new_value
- newcompatinfo[length - 1] = compatinfo[length - 2]
- newcompatinfo[length] = -1 # == compatinfo[length - 1]
- else:
- for i in range(1, length - 1):
- newcompatinfo[i] = compatinfo[i]
- newcompatinfo[length - 1] = new_value
- newcompatinfo[length] = -1 # == compatinfo[length - 1]
-
- # the old 'compatinfo' is not used any more, but will only be freed
- # when the looptoken is freed
- compatinfop[0] = rffi.cast(rffi.VOIDP, newcompatinfo)
- valgrind.discard_translations(rffi.cast(lltype.Signed, compatinfop), WORD)
-
- # the machine code is not updated here. We leave it to the actual
- # guard_compatible to update it if needed.
-
-
-def _build_inner_loop(mc, regnum, tmp, immediate_return):
- pos = mc.get_relative_pos()
- mc.CMP_mr((tmp, WORD), regnum)
- mc.J_il8(rx86.Conditions['E'], 0) # patched below
- je_location = mc.get_relative_pos()
- mc.CMP_mi((tmp, WORD), -1)
- mc.LEA_rm(tmp, (tmp, WORD))
- mc.J_il8(rx86.Conditions['NE'], pos - (mc.get_relative_pos() + 2))
- #
- # not found! Return the condition code 'Not Zero' to mean 'not found'.
- mc.OR_rr(tmp, tmp)
- #
- # if 'immediate_return', patch the JE above to jump here. When we
- # follow that path, we get condition code 'Zero', which means 'found'.
- if immediate_return:
- offset = mc.get_relative_pos() - je_location
- assert 0 < offset <= 127
- mc.overwrite(je_location-1, chr(offset))
- #
- if IS_X86_32:
- mc.POP_r(tmp)
- mc.RET16_i(WORD)
- mc.force_frame_size(8) # one word on X86_64, two words on X86_32
- #
- # if not 'immediate_return', patch the JE above to jump here.
- if not immediate_return:
- offset = mc.get_relative_pos() - je_location
- assert 0 < offset <= 127
- mc.overwrite(je_location-1, chr(offset))
-
-def get_or_build_checker(assembler, regnum):
- """Returns a piece of assembler that checks if the value is in
- some array (there is one such piece per input register 'regnum')
- """
- addr = assembler._guard_compat_checkers[regnum]
- if addr != 0:
- return addr
-
- mc = codebuf.MachineCodeBlockWrapper()
-
- if IS_X86_64:
- tmp = X86_64_SCRATCH_REG.value
- stack_ret = 0
- stack_arg = WORD
- elif IS_X86_32:
- if regnum != eax.value:
- tmp = eax.value
- else:
- tmp = edx.value
- mc.PUSH_r(tmp)
- stack_ret = WORD
- stack_arg = 2 * WORD
-
- mc.MOV_rs(tmp, stack_arg)
-
- if UPDATE_ASM > 0:
- CONST_TO_ADD = int((1 << 24) / (UPDATE_ASM + 0.3))
- if CONST_TO_ADD >= (1 << 23):
- CONST_TO_ADD = (1 << 23) - 1
- if CONST_TO_ADD < 1:
- CONST_TO_ADD = 1
- CONST_TO_ADD <<= 8
- #
- mc.ADD32_mi32((tmp, 0), CONST_TO_ADD)
- mc.J_il8(rx86.Conditions['C'], 0) # patched below
- jc_location = mc.get_relative_pos()
- else:
- jc_location = -1
-
- _build_inner_loop(mc, regnum, tmp, immediate_return=True)
-
- if jc_location != -1:
- # patch the JC above
- offset = mc.get_relative_pos() - jc_location
- assert 0 < offset <= 127
- mc.overwrite(jc_location-1, chr(offset))
- #
- _build_inner_loop(mc, regnum, tmp, immediate_return=False)
- #
- # found! update the assembler by writing the value at 'small_ofs'
- # bytes before our return address. This should overwrite the const in
- # 'MOV_ri64(r11, const)', first instruction of the guard_compatible.
- mc.MOV_rs(tmp, stack_arg)
- mc.MOVSX8_rm(tmp, (tmp, 0))
- mc.ADD_rs(tmp, stack_ret)
- mc.MOV_mr((tmp, -WORD), regnum)
- #
- # Return condition code 'Zero' to mean 'found'.
- mc.CMP_rr(regnum, regnum)
- if IS_X86_32:
- mc.POP_r(tmp)
- mc.RET16_i(WORD)
-
- addr = mc.materialize(assembler.cpu, [])
- assembler._guard_compat_checkers[regnum] = addr
- return addr
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit