Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60096:47864e6b39c1
Date: 2013-01-15 20:30 +0200
http://bitbucket.org/pypy/pypy/changeset/47864e6b39c1/
Log: rip off some unused tests
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
@@ -1853,6 +1853,7 @@
mc.JMP_r(X86_64_SCRATCH_REG.value)
# write tight data that describes the failure recovery
positions = [0] * len(guardtok.fail_locs)
+ gcpattern = 0
for i, loc in enumerate(guardtok.fail_locs):
if loc is None:
positions[i] = -1
@@ -1864,10 +1865,13 @@
v = len(gpr_reg_mgr_cls.all_regs) + loc.value
else:
v = gpr_reg_mgr_cls.all_reg_indexes[loc.value]
+ if guardtok.failargs[i].type == REF:
+ gcpattern |= v
positions[i] = v * WORD
# write down the positions of locs
guardtok.faildescr.rd_locs = positions
# write down the GC pattern
+ guardtok.faildescr.rd_gcpattern = gcpattern
return startpos
def rebuild_faillocs_from_descr(self, descr, inputargs):
diff --git a/pypy/jit/backend/x86/test/test_assembler.py
b/pypy/jit/backend/x86/test/test_assembler.py
--- a/pypy/jit/backend/x86/test/test_assembler.py
+++ b/pypy/jit/backend/x86/test/test_assembler.py
@@ -45,217 +45,6 @@
def hide(self, cpu):
return rffi.cast(llmemory.GCREF, 123)
-def test_write_failure_recovery_description():
- assembler = Assembler386(FakeCPU())
- mc = FakeMC()
- failargs = [BoxInt(), BoxPtr(), BoxFloat()] * 3
- failargs.insert(6, None)
- failargs.insert(7, None)
- locs = [X86FrameManager.frame_pos(0, INT),
- X86FrameManager.frame_pos(1, REF),
- X86FrameManager.frame_pos(10, FLOAT),
- X86FrameManager.frame_pos(100, INT),
- X86FrameManager.frame_pos(101, REF),
- X86FrameManager.frame_pos(110, FLOAT),
- None,
- None,
- ebx,
- esi,
- xmm2]
- assert len(failargs) == len(locs)
- assembler.write_failure_recovery_description(mc, failargs, locs)
- base = 8 + 8*IS_X86_64
- nums = [Assembler386.DESCR_INT + 4*(base+0),
- Assembler386.DESCR_REF + 4*(base+1),
- Assembler386.DESCR_FLOAT + 4*(base+10),
- Assembler386.DESCR_INT + 4*(base+100),
- Assembler386.DESCR_REF + 4*(base+101),
- Assembler386.DESCR_FLOAT + 4*(base+110),
- Assembler386.CODE_HOLE,
- Assembler386.CODE_HOLE,
- Assembler386.DESCR_INT + 4*ebx.value,
- Assembler386.DESCR_REF + 4*esi.value,
- Assembler386.DESCR_FLOAT + 4*xmm2.value]
- double_byte_nums = []
- for num in nums[3:6]:
- double_byte_nums.append((num & 0x7F) | 0x80)
- double_byte_nums.append(num >> 7)
- assert mc.content == (nums[:3] + double_byte_nums + nums[6:] +
- [assembler.CODE_STOP])
-
- # also test rebuild_faillocs_from_descr(), which should not
- # reproduce the holes at all
- bytecode = lltype.malloc(rffi.UCHARP.TO, len(mc.content), flavor='raw',
- immortal=True)
- for i in range(len(mc.content)):
- assert 0 <= mc.content[i] <= 255
- bytecode[i] = rffi.cast(rffi.UCHAR, mc.content[i])
- bytecode_addr = rffi.cast(lltype.Signed, bytecode)
- newlocs = assembler.rebuild_faillocs_from_descr(bytecode_addr)
- assert ([loc.assembler() for loc in newlocs] ==
- [loc.assembler() for loc in locs if loc is not None])
-
-# ____________________________________________________________
-
-def test_failure_recovery_func_no_floats():
- do_failure_recovery_func(withfloats=False)
-
-def test_failure_recovery_func_with_floats():
- do_failure_recovery_func(withfloats=True)
-
-def do_failure_recovery_func(withfloats):
- import random
- S = lltype.GcStruct('S')
-
- def get_random_int():
- return random.randrange(-10000, 10000)
-
- def get_random_ptr():
- return lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S))
-
- def get_random_float():
- # Returns <float>, <low word>, <high word>
- # NB: on 64-bit, <low word> will be the entire float and <high word>
- # will be random garbage from malloc!
- assert withfloats
- value = random.random() - 0.5
- # make sure it fits into 64 bits
- tmp = lltype.malloc(rffi.LONGP.TO, 2, flavor='raw',
- track_allocation=False)
- rffi.cast(rffi.DOUBLEP, tmp)[0] = value
- return rffi.cast(rffi.DOUBLEP, tmp)[0], tmp[0], tmp[1]
-
- if IS_X86_32:
- main_registers = X86RegisterManager.all_regs
- xmm_registers = X86XMMRegisterManager.all_regs
- elif IS_X86_64:
- main_registers = X86_64_RegisterManager.all_regs
- xmm_registers = X86_64_XMMRegisterManager.all_regs
-
- # memory locations: 26 integers, 26 pointers, 26 floats
- # main registers: half of them as signed and the other half as ptrs
- # xmm registers: all floats, from xmm0 to xmm(7|15)
- # holes: 8
- locations = []
- baseloc = 4
- for i in range(26+26+26):
- if baseloc < 128:
- baseloc += random.randrange(2, 20)
- else:
- baseloc += random.randrange(2, 1000)
- locations.append(baseloc)
- random.shuffle(locations)
- content = ([('int', locations.pop()) for _ in range(26)] +
- [('ptr', locations.pop()) for _ in range(26)] +
- [(['int', 'ptr'][random.randrange(0, 2)], reg)
- for reg in main_registers])
- if withfloats:
- content += ([('float', locations.pop()) for _ in range(26)] +
- [('float', reg) for reg in xmm_registers])
- for i in range(8):
- content.append(('hole', None))
- random.shuffle(content)
-
- # prepare the expected target arrays, the descr_bytecode,
- # the 'registers' and the 'stack' arrays according to 'content'
- xmmregisters = lltype.malloc(rffi.LONGP.TO, 16+ACTUAL_CPU.NUM_REGS+1,
- flavor='raw', immortal=True)
- registers = rffi.ptradd(xmmregisters, 16)
- stacklen = baseloc + 30
- stack = lltype.malloc(rffi.LONGP.TO, stacklen, flavor='raw',
- immortal=True)
- expected_ints = [None] * len(content)
- expected_ptrs = [None] * len(content)
- expected_floats = [None] * len(content)
-
- def write_in_stack(loc, value):
- assert loc >= 0
- ofs = get_ebp_ofs(loc)
- assert ofs < 0
- assert (ofs % WORD) == 0
- stack[stacklen + ofs//WORD] = value
-
- descr_bytecode = []
- for i, (kind, loc) in enumerate(content):
- if kind == 'hole':
- num = Assembler386.CODE_HOLE
- else:
- if kind == 'float':
- value, lo, hi = get_random_float()
- expected_floats[i] = longlong.getfloatstorage(value)
- kind = Assembler386.DESCR_FLOAT
- if isinstance(loc, RegLoc):
- if WORD == 4:
- xmmregisters[2*loc.value] = lo
- xmmregisters[2*loc.value+1] = hi
- elif WORD == 8:
- xmmregisters[loc.value] = lo
- else:
- if WORD == 4:
- write_in_stack(loc, hi)
- write_in_stack(loc+1, lo)
- elif WORD == 8:
- write_in_stack(loc, lo)
- else:
- if kind == 'int':
- value = get_random_int()
- expected_ints[i] = value
- kind = Assembler386.DESCR_INT
- elif kind == 'ptr':
- value = get_random_ptr()
- expected_ptrs[i] = value
- kind = Assembler386.DESCR_REF
- value = rffi.cast(rffi.LONG, value)
- else:
- assert 0, kind
- if isinstance(loc, RegLoc):
- registers[loc.value] = value
- else:
- write_in_stack(loc, value)
-
- if isinstance(loc, RegLoc):
- num = kind + 4*loc.value
- else:
- num = kind + Assembler386.CODE_FROMSTACK + (4*loc)
- while num >= 0x80:
- descr_bytecode.append((num & 0x7F) | 0x80)
- num >>= 7
- descr_bytecode.append(num)
-
- descr_bytecode.append(Assembler386.CODE_STOP)
- descr_bytecode.append(0xC3) # fail_index = 0x1C3
- descr_bytecode.append(0x01)
- descr_bytecode.append(0x00)
- descr_bytecode.append(0x00)
- descr_bytecode.append(0xCC) # end marker
- descr_bytes = lltype.malloc(rffi.UCHARP.TO, len(descr_bytecode),
- flavor='raw', immortal=True)
- for i in range(len(descr_bytecode)):
- assert 0 <= descr_bytecode[i] <= 255
- descr_bytes[i] = rffi.cast(rffi.UCHAR, descr_bytecode[i])
- registers[ACTUAL_CPU.NUM_REGS] = rffi.cast(rffi.LONG, descr_bytes)
- registers[ebp.value] = rffi.cast(rffi.LONG, stack) + WORD*stacklen
-
- XXX # rewrite
-
- # run!
- assembler = Assembler386(FakeCPU())
- deadframe = assembler.failure_recovery_func(registers)
- deadframe = lltype.cast_opaque_ptr(jitframe.DEADFRAMEPTR, deadframe)
- assert deadframe.jf_descr == rffi.cast(llmemory.GCREF, 123)
-
- # check the fail_boxes
- for i in range(len(content)):
- if expected_ints[i] is not None:
- assert deadframe.jf_values[i].int == expected_ints[i]
- if expected_ptrs[i] is not None:
- assert deadframe.jf_values[i].ref == expected_ptrs[i]
- # note: we expect *exact* results below. If you have only
- # an approximate result, it might mean that only the first 32
- # bits of the float were correctly saved and restored.
- if expected_floats[i] is not None:
- assert deadframe.jf_values[i].float == expected_floats[i]
-
# ____________________________________________________________
class TestRegallocPushPop(object):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit