PageRenderTime 52ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/rpython/jit/backend/ppc/test/test_runner.py

https://bitbucket.org/pypy/pypy/
Python | 251 lines | 241 code | 8 blank | 2 comment | 3 complexity | da15b9d5be10d829c99a6474e9193124 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.jit.backend.test.runner_test import LLtypeBackendTest
  2. from rpython.jit.backend.ppc.runner import PPC_CPU
  3. from rpython.jit.tool.oparser import parse
  4. from rpython.jit.metainterp.history import (AbstractFailDescr,
  5. AbstractDescr,
  6. BasicFailDescr, BasicFinalDescr,
  7. JitCellToken, TargetToken,
  8. ConstInt, ConstPtr,
  9. Const, ConstFloat)
  10. from rpython.jit.metainterp.resoperation import InputArgInt, InputArgFloat
  11. from rpython.rtyper.lltypesystem import lltype
  12. from rpython.jit.metainterp.resoperation import ResOperation, rop
  13. from rpython.jit.backend.ppc.arch import IS_PPC_32
  14. import py
  15. class FakeStats(object):
  16. pass
  17. class TestPPC(LLtypeBackendTest):
  18. # for the individual tests see
  19. # ====> ../../test/runner_test.py
  20. assert not IS_PPC_32
  21. load_imm_instructions = (
  22. "(li|lis(; ori)?)(; rldicr(; oris)?(; ori)?)?")
  23. add_loop_instructions = "ld; add; cmpdi; beq-?; b;"
  24. bridge_loop_instructions = (
  25. "ld; cmpdi; bge.; "
  26. "li; %s; mtctr; %s; bctrl; "
  27. "%s; mtctr; bctr;" % (
  28. load_imm_instructions, load_imm_instructions,
  29. load_imm_instructions))
  30. def get_cpu(self):
  31. cpu = PPC_CPU(rtyper=None, stats=FakeStats())
  32. cpu.setup_once()
  33. return cpu
  34. def test_compile_loop_many_int_args(self):
  35. for numargs in range(2, 16):
  36. ops = []
  37. arglist = "[%s]\n" % ", ".join(["i%d" % i for i in range(numargs)])
  38. ops.append(arglist)
  39. arg1 = 0
  40. arg2 = 1
  41. res = numargs
  42. for i in range(numargs - 1):
  43. op = "i%d = int_add(i%d, i%d)\n" % (res, arg1, arg2)
  44. arg1 = res
  45. res += 1
  46. arg2 += 1
  47. ops.append(op)
  48. ops.append("finish(i%d)" % (res - 1))
  49. ops = "".join(ops)
  50. loop = parse(ops)
  51. looptoken = JitCellToken()
  52. self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
  53. ARGS = [lltype.Signed] * numargs
  54. RES = lltype.Signed
  55. args = [i+1 for i in range(numargs)]
  56. deadframe = self.cpu.execute_token(looptoken, *args)
  57. assert self.cpu.get_int_value(deadframe, 0) == sum(args)
  58. def test_return_spilled_args(self):
  59. numargs = 50
  60. ops = []
  61. arglist = "[%s]\n" % ", ".join(["i%d" % i for i in range(numargs)])
  62. ops.append(arglist)
  63. # spill every inputarg
  64. for i in range(numargs):
  65. ops.append("force_spill(i%d)\n" % i)
  66. ops.append("guard_value(i0, -1) %s" % arglist)
  67. ops = "".join(ops)
  68. loop = parse(ops)
  69. looptoken = JitCellToken()
  70. faildescr = loop.operations[-1].getdescr()
  71. self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
  72. ARGS = [lltype.Signed] * numargs
  73. RES = lltype.Signed
  74. args = [i+1 for i in range(numargs)]
  75. deadframe = self.cpu.execute_token(looptoken, *args)
  76. fail = self.cpu.get_latest_descr(deadframe)
  77. assert fail is faildescr
  78. for i in range(numargs):
  79. assert self.cpu.get_int_value(deadframe, i) == i + 1
  80. bridgeops = [arglist]
  81. bridgeops.append("guard_value(i1, -5) %s" % arglist)
  82. bridgeops = "".join(bridgeops)
  83. bridge = parse(bridgeops)
  84. faildescr2 = bridge.operations[-1].getdescr()
  85. self.cpu.compile_bridge(faildescr, bridge.inputargs, bridge.operations, looptoken)
  86. deadframe = self.cpu.execute_token(looptoken, *args)
  87. fail = self.cpu.get_latest_descr(deadframe)
  88. assert fail is faildescr2
  89. for i in range(numargs):
  90. assert self.cpu.get_int_value(deadframe, i) == i + 1
  91. def test_unicodesetitem_really_needs_temploc(self):
  92. u_box = self.alloc_unicode(u"abcdsdasdsaddefg")
  93. targettoken = TargetToken()
  94. finaldescr = BasicFinalDescr(1)
  95. loop = parse('''
  96. [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, p10]
  97. label(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, p10, descr=targettoken)
  98. unicodesetitem(p10, i6, 123)
  99. i11 = int_add(i0, i1)
  100. i12 = int_add(i11, i2)
  101. i13 = int_add(i12, i3)
  102. i14 = int_add(i13, i4)
  103. i15 = int_add(i14, i5)
  104. i16 = int_add(i15, i6)
  105. i17 = int_add(i16, i7)
  106. i18 = int_add(i17, i8)
  107. i19 = int_add(i18, i9)
  108. finish(i19, descr=finaldescr)
  109. ''', namespace={'targettoken': targettoken,
  110. 'finaldescr': finaldescr})
  111. looptoken = JitCellToken()
  112. args = [(i + 1) for i in range(10)] + [u_box.getref_base()]
  113. self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
  114. deadframe = self.cpu.execute_token(looptoken, *args)
  115. fail = self.cpu.get_latest_descr(deadframe)
  116. assert fail.identifier == 1
  117. res = self.cpu.get_int_value(deadframe, 0)
  118. assert res == sum(args[:10])
  119. def test_debugger_on(self):
  120. py.test.skip("XXX")
  121. from rpython.rlib import debug
  122. targettoken, preambletoken = TargetToken(), TargetToken()
  123. loop = """
  124. [i0]
  125. label(i0, descr=preambletoken)
  126. debug_merge_point('xyz', 0)
  127. i1 = int_add(i0, 1)
  128. i2 = int_ge(i1, 10)
  129. guard_false(i2) []
  130. label(i1, descr=targettoken)
  131. debug_merge_point('xyz', 0)
  132. i11 = int_add(i1, 1)
  133. i12 = int_ge(i11, 10)
  134. guard_false(i12) []
  135. jump(i11, descr=targettoken)
  136. """
  137. ops = parse(loop, namespace={'targettoken': targettoken,
  138. 'preambletoken': preambletoken})
  139. debug._log = dlog = debug.DebugLog()
  140. try:
  141. self.cpu.assembler.set_debug(True)
  142. looptoken = JitCellToken()
  143. self.cpu.compile_loop(ops.inputargs, ops.operations, looptoken)
  144. self.cpu.execute_token(looptoken, 0)
  145. # check debugging info
  146. struct = self.cpu.assembler.loop_run_counters[0]
  147. assert struct.i == 1
  148. struct = self.cpu.assembler.loop_run_counters[1]
  149. assert struct.i == 1
  150. struct = self.cpu.assembler.loop_run_counters[2]
  151. assert struct.i == 9
  152. self.cpu.finish_once()
  153. finally:
  154. debug._log = None
  155. l0 = ('debug_print', 'entry -1:1')
  156. l1 = ('debug_print', preambletoken.repr_of_descr() + ':1')
  157. l2 = ('debug_print', targettoken.repr_of_descr() + ':9')
  158. assert ('jit-backend-counts', [l0, l1, l2]) in dlog
  159. def test_compile_more_than_32k(self):
  160. # the guard_true needs a "b.cond" jumping forward more than 32 kb
  161. looptoken = JitCellToken()
  162. targettoken = TargetToken()
  163. ops = [
  164. '[i0]',
  165. 'label(i0, descr=targettoken)',
  166. 'i1 = int_le(i0, 9)',
  167. 'guard_true(i1, descr=faildescr) [i0]',
  168. ]
  169. NUM = 8193
  170. iprevious = 'i0'
  171. for i in range(NUM):
  172. inext = 'i%d' % (i + 2,)
  173. ops.append('%s = int_add(%s, 1)' % (inext, iprevious))
  174. iprevious = inext
  175. ops.append('jump(%s, descr=targettoken)' % (iprevious,))
  176. loop = parse('\n'.join(ops), namespace={'targettoken': targettoken,
  177. 'faildescr': BasicFailDescr(5)})
  178. self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
  179. deadframe = self.cpu.execute_token(looptoken, -42)
  180. fail = self.cpu.get_latest_descr(deadframe)
  181. assert fail.identifier == 5
  182. res = self.cpu.get_int_value(deadframe, 0)
  183. assert res == -42 + NUM
  184. def test_call_many_float_args(self):
  185. from rpython.rtyper.annlowlevel import llhelper
  186. from rpython.jit.codewriter.effectinfo import EffectInfo
  187. seen = []
  188. def func(*args):
  189. seen.append(args)
  190. return -42
  191. F = lltype.Float
  192. I = lltype.Signed
  193. FUNC = self.FuncType([F] * 7 + [I] + [F] * 7 + [I] + [F], I)
  194. FPTR = self.Ptr(FUNC)
  195. func_ptr = llhelper(FPTR, func)
  196. cpu = self.cpu
  197. calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
  198. EffectInfo.MOST_GENERAL)
  199. funcbox = self.get_funcbox(cpu, func_ptr)
  200. argvals = [.1 * i for i in range(15)]
  201. argvals.insert(7, 77)
  202. argvals.insert(15, 1515)
  203. argvals = tuple(argvals)
  204. argboxes = []
  205. for x in argvals:
  206. if isinstance(x, float):
  207. argboxes.append(InputArgFloat(x))
  208. else:
  209. argboxes.append(InputArgInt(x))
  210. res = self.execute_operation(rop.CALL_I,
  211. [funcbox] + argboxes,
  212. 'int', descr=calldescr)
  213. assert res == -42
  214. assert seen == [argvals]
  215. def test_subi_range(self):
  216. for i in [-32769, -32768, -32767, 32767, 32768, 32769]:
  217. ops = '''
  218. [i0]
  219. i1 = int_sub(i0, %d)
  220. i2 = int_sub_ovf(i1, %d)
  221. finish(i2)
  222. ''' % (i, i)
  223. loop = parse(ops, self.cpu, namespace=locals())
  224. looptoken = JitCellToken()
  225. self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
  226. deadframe = self.cpu.execute_token(looptoken, 10000000)
  227. assert self.cpu.get_int_value(deadframe, 0) == 10000000 - 2 * i