[pypy-svn] r72398 - pypy/trunk/pypy/jit/backend/x86
fijal at codespeak.net
fijal at codespeak.net
Thu Mar 18 21:22:36 CET 2010
Author: fijal
Date: Thu Mar 18 21:22:28 2010
New Revision: 72398
Modified:
pypy/trunk/pypy/jit/backend/x86/assembler.py
Log:
Enough to pass float_is_true tests
Modified: pypy/trunk/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/trunk/pypy/jit/backend/x86/assembler.py Thu Mar 18 21:22:28 2010
@@ -282,7 +282,7 @@
faildescr._x86_bridge_frame_depth = frame_depth
faildescr._x86_bridge_param_depth = param_depth
# patch the jump from original guard
- self.patch_jump(faildescr, adr_bridge)
+ self.patch_jump_for_descr(faildescr, adr_bridge)
debug_print("Bridge out of guard",
descr_number,
"has address", adr_bridge, "to", self.mc.tell())
@@ -295,8 +295,13 @@
return ""
- def patch_jump(self, faildescr, adr_new_target):
+ def patch_jump_for_descr(self, faildescr, adr_new_target):
adr_jump_offset = faildescr._x86_adr_jump_offset
+ self.patch_jump(faildescr._x86_adr_jump_offset, adr_new_target)
+ if faildescr._x86_adr_jump_offset2:
+ self.patch_jump(faildescr._x86_adr_jump_offset2, adr_new_target)
+
+ def patch_jump(self, adr_jump_offset, adr_new_target):
mc = codebuf.InMemoryCodeBuilder(adr_jump_offset, adr_jump_offset + 4)
mc.write(packimm32(adr_new_target - adr_jump_offset - 4))
mc.valgrind_invalidated()
@@ -491,11 +496,11 @@
dispatch_opnum = guard_opnum
else:
dispatch_opnum = op.opnum
- adr_jump_offset = genop_guard_list[dispatch_opnum](self, op,
- guard_op,
- failaddr, arglocs,
- resloc)
+ t = genop_guard_list[dispatch_opnum](self, op, guard_op, failaddr,
+ arglocs, resloc)
+ adr_jump_offset, adr_jump_offset2 = t
faildescr._x86_adr_jump_offset = adr_jump_offset
+ faildescr._x86_adr_jump_offset2 = adr_jump_offset2
def regalloc_perform_guard(self, guard_op, faillocs, arglocs, resloc,
current_depths):
@@ -540,18 +545,18 @@
self.mc.CMP(arglocs[1], arglocs[0])
if guard_opnum == rop.GUARD_FALSE:
name = 'J' + rev_cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
else:
name = 'J' + false_rev_cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
else:
self.mc.CMP(arglocs[0], arglocs[1])
if guard_opnum == rop.GUARD_FALSE:
name = 'J' + cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
else:
name = 'J' + false_cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
return genop_cmp_guard
def _cmpop_guard_float(cond, false_cond):
@@ -561,10 +566,10 @@
self.mc.UCOMISD(arglocs[0], arglocs[1])
if guard_opnum == rop.GUARD_FALSE:
name = 'J' + cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
else:
name = 'J' + false_cond
- return self.implement_guard(addr, getattr(self.mc, name))
+ return self.implement_guard(addr, getattr(self.mc, name)), 0
return genop_cmp_guard_float
@specialize.arg(5)
@@ -674,9 +679,14 @@
self.mc.XORPD(loc0, loc0)
self.mc.UCOMISD(loc0, loc1)
if guard_opnum == rop.GUARD_TRUE:
- return self.implement_guard(addr, self.mc.JZ)
+ mc = self.mc._mc
+ mc.JP(rel32(mc.tell() + 2*6))
+ mc.JZ(rel32(addr))
+ return mc.tell() - 4, 0
else:
- return self.implement_guard(addr, self.mc.JNZ)
+ addr1 = self.implement_guard(addr, self.mc.JNZ)
+ addr2 = self.implement_guard(addr, self.mc.JP)
+ return addr1, addr2
def genop_float_is_true(self, op, arglocs, resloc):
loc0, loc1 = arglocs
@@ -717,9 +727,9 @@
guard_opnum = guard_op.opnum
self.mc.CMP(arglocs[0], imm8(0))
if guard_opnum == rop.GUARD_TRUE:
- return self.implement_guard(addr, self.mc.JZ)
+ return self.implement_guard(addr, self.mc.JZ), 0
else:
- return self.implement_guard(addr, self.mc.JNZ)
+ return self.implement_guard(addr, self.mc.JNZ), 0
def genop_int_is_true(self, op, arglocs, resloc):
self.mc.CMP(arglocs[0], imm8(0))
@@ -730,9 +740,9 @@
guard_opnum = guard_op.opnum
self.mc.CMP(arglocs[0], imm8(0))
if guard_opnum == rop.GUARD_TRUE:
- return self.implement_guard(addr, self.mc.JNZ)
+ return self.implement_guard(addr, self.mc.JNZ), 0
else:
- return self.implement_guard(addr, self.mc.JZ)
+ return self.implement_guard(addr, self.mc.JZ), 0
def genop_bool_not(self, op, arglocs, resloc):
self.mc.XOR(arglocs[0], imm8(1))
@@ -915,13 +925,13 @@
def genop_guard_guard_true(self, ign_1, guard_op, addr, locs, ign_2):
loc = locs[0]
self.mc.TEST(loc, loc)
- return self.implement_guard(addr, self.mc.JZ)
+ return self.implement_guard(addr, self.mc.JZ), 0
genop_guard_guard_nonnull = genop_guard_guard_true
def genop_guard_guard_no_exception(self, ign_1, guard_op, addr,
locs, ign_2):
self.mc.CMP(heap(self.cpu.pos_exception()), imm(0))
- return self.implement_guard(addr, self.mc.JNZ)
+ return self.implement_guard(addr, self.mc.JNZ), 0
def genop_guard_guard_exception(self, ign_1, guard_op, addr,
locs, resloc):
@@ -934,20 +944,20 @@
self.mc.MOV(resloc, heap(self.cpu.pos_exc_value()))
self.mc.MOV(heap(self.cpu.pos_exception()), imm(0))
self.mc.MOV(heap(self.cpu.pos_exc_value()), imm(0))
- return addr
+ return addr, 0
def genop_guard_guard_no_overflow(self, ign_1, guard_op, addr,
locs, resloc):
- return self.implement_guard(addr, self.mc.JO)
+ return self.implement_guard(addr, self.mc.JO), 0
def genop_guard_guard_overflow(self, ign_1, guard_op, addr,
locs, resloc):
- return self.implement_guard(addr, self.mc.JNO)
+ return self.implement_guard(addr, self.mc.JNO), 0
def genop_guard_guard_false(self, ign_1, guard_op, addr, locs, ign_2):
loc = locs[0]
self.mc.TEST(loc, loc)
- return self.implement_guard(addr, self.mc.JNZ)
+ return self.implement_guard(addr, self.mc.JNZ), 0
genop_guard_guard_isnull = genop_guard_guard_false
def genop_guard_guard_value(self, ign_1, guard_op, addr, locs, ign_2):
@@ -956,7 +966,7 @@
self.mc.UCOMISD(locs[0], locs[1])
else:
self.mc.CMP(locs[0], locs[1])
- return self.implement_guard(addr, self.mc.JNE)
+ return self.implement_guard(addr, self.mc.JNE), 0
def _cmp_guard_class(self, mc, locs):
offset = self.cpu.vtable_offset
@@ -982,7 +992,7 @@
mc = self._start_block()
self._cmp_guard_class(mc, locs)
self._stop_block()
- return self.implement_guard(addr, self.mc.JNE)
+ return self.implement_guard(addr, self.mc.JNE), 0
def genop_guard_guard_nonnull_class(self, ign_1, guard_op,
addr, locs, ign_2):
@@ -997,7 +1007,7 @@
mc.overwrite(jb_location-1, [chr(offset)])
self._stop_block()
#
- return self.implement_guard(addr, self.mc.JNE)
+ return self.implement_guard(addr, self.mc.JNE), 0
def implement_guard_recovery(self, guard_opnum, faildescr, failargs,
fail_locs):
@@ -1373,7 +1383,7 @@
self.mc.MOV(mem(ebp, FORCE_INDEX_OFS), imm(fail_index))
self.genop_call(op, arglocs, result_loc)
self.mc.CMP(mem(ebp, FORCE_INDEX_OFS), imm(0))
- return self.implement_guard(addr, self.mc.JL)
+ return self.implement_guard(addr, self.mc.JL), 0
def genop_guard_call_assembler(self, op, guard_op, addr,
arglocs, result_loc):
@@ -1406,7 +1416,7 @@
else:
assert result_loc is eax or result_loc is None
self.mc.CMP(mem(ebp, FORCE_INDEX_OFS), imm(0))
- return self.implement_guard(addr, self.mc.JL)
+ return self.implement_guard(addr, self.mc.JL), 0
def genop_discard_cond_call_gc_wb(self, op, arglocs):
# use 'mc._mc' directly instead of 'mc', to avoid
More information about the Pypy-commit
mailing list