/pypy/jit/codewriter/test/test_longlong.py

https://bitbucket.org/alex_gaynor/pypy-postgresql/ · Python · 213 lines · 193 code · 18 blank · 2 comment · 24 complexity · 47fc27d746f71221bf94b3060ab892f3 MD5 · raw file

  1. import py, sys
  2. from pypy.rlib.rarithmetic import r_longlong, intmask
  3. from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
  4. from pypy.objspace.flow.model import Block, Link
  5. from pypy.translator.unsimplify import varoftype
  6. from pypy.rpython.lltypesystem import lltype, rffi
  7. from pypy.jit.codewriter.jtransform import Transformer, NotSupported
  8. from pypy.jit.codewriter.effectinfo import EffectInfo
  9. from pypy.jit.codewriter.test.test_jtransform import const
  10. from pypy.jit.codewriter import longlong
  11. class FakeRTyper:
  12. pass
  13. class FakeBuiltinCallControl:
  14. def guess_call_kind(self, op):
  15. return 'builtin'
  16. def getcalldescr(self, op, oopspecindex=None, extraeffect=None):
  17. assert oopspecindex is not None # in this test
  18. return 'calldescr-%d' % oopspecindex
  19. def calldescr_canraise(self, calldescr):
  20. return False
  21. class FakeCPU:
  22. supports_longlong = True
  23. def __init__(self):
  24. self.rtyper = FakeRTyper()
  25. def test_functions():
  26. xll = longlong.getfloatstorage(3.5)
  27. assert longlong.getrealfloat(xll) == 3.5
  28. assert isinstance(longlong.gethash(xll), int)
  29. class TestLongLong:
  30. def setup_class(cls):
  31. if sys.maxint > 2147483647:
  32. py.test.skip("only for 32-bit platforms")
  33. def do_check(self, opname, oopspecindex, ARGS, RESULT):
  34. vlist = [varoftype(ARG) for ARG in ARGS]
  35. v_result = varoftype(RESULT)
  36. op = SpaceOperation(opname, vlist, v_result)
  37. tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
  38. op1 = tr.rewrite_operation(op)
  39. #
  40. def is_llf(TYPE):
  41. return (TYPE == lltype.SignedLongLong or
  42. TYPE == lltype.UnsignedLongLong or
  43. TYPE == lltype.Float)
  44. if is_llf(RESULT):
  45. assert op1.opname == 'residual_call_irf_f'
  46. else:
  47. assert op1.opname == 'residual_call_irf_i'
  48. gotindex = getattr(EffectInfo, 'OS_' + op1.args[0].value.upper())
  49. assert gotindex == oopspecindex
  50. assert op1.args[1] == 'calldescr-%d' % oopspecindex
  51. assert list(op1.args[2]) == [v for v in vlist
  52. if not is_llf(v.concretetype)]
  53. assert list(op1.args[3]) == []
  54. assert list(op1.args[4]) == [v for v in vlist
  55. if is_llf(v.concretetype)]
  56. assert op1.result == v_result
  57. def test_is_true(self):
  58. for opname, T in [('llong_is_true', lltype.SignedLongLong),
  59. ('ullong_is_true', lltype.UnsignedLongLong)]:
  60. v = varoftype(T)
  61. v_result = varoftype(lltype.Bool)
  62. op = SpaceOperation(opname, [v], v_result)
  63. tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
  64. oplist = tr.rewrite_operation(op)
  65. assert len(oplist) == 2
  66. assert oplist[0].opname == 'residual_call_irf_f'
  67. assert oplist[0].args[0].value == 'llong_from_int'
  68. assert oplist[0].args[1] == 'calldescr-84'
  69. assert list(oplist[0].args[2]) == [const(0)]
  70. assert list(oplist[0].args[3]) == []
  71. assert list(oplist[0].args[4]) == []
  72. v_x = oplist[0].result
  73. assert isinstance(v_x, Variable)
  74. assert v_x.concretetype is T
  75. assert oplist[1].opname == 'residual_call_irf_i'
  76. assert oplist[1].args[0].value == 'llong_ne'
  77. assert oplist[1].args[1] == 'calldescr-76'
  78. assert list(oplist[1].args[2]) == []
  79. assert list(oplist[1].args[3]) == []
  80. assert list(oplist[1].args[4]) == [v, v_x]
  81. assert oplist[1].result == v_result
  82. def test_llong_neg(self):
  83. T = lltype.SignedLongLong
  84. v = varoftype(T)
  85. v_result = varoftype(T)
  86. op = SpaceOperation('llong_neg', [v], v_result)
  87. tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
  88. oplist = tr.rewrite_operation(op)
  89. assert len(oplist) == 2
  90. assert oplist[0].opname == 'residual_call_irf_f'
  91. assert oplist[0].args[0].value == 'llong_from_int'
  92. assert oplist[0].args[1] == 'calldescr-84'
  93. assert list(oplist[0].args[2]) == [const(0)]
  94. assert list(oplist[0].args[3]) == []
  95. assert list(oplist[0].args[4]) == []
  96. v_x = oplist[0].result
  97. assert isinstance(v_x, Variable)
  98. assert oplist[1].opname == 'residual_call_irf_f'
  99. assert oplist[1].args[0].value == 'llong_sub'
  100. assert oplist[1].args[1] == 'calldescr-71'
  101. assert list(oplist[1].args[2]) == []
  102. assert list(oplist[1].args[3]) == []
  103. assert list(oplist[1].args[4]) == [v_x, v]
  104. assert oplist[1].result == v_result
  105. def test_unary_op(self):
  106. for opname, oopspecindex in [
  107. ('llong_invert', EffectInfo.OS_LLONG_INVERT),
  108. ('ullong_invert', EffectInfo.OS_LLONG_INVERT),
  109. ]:
  110. if opname.startswith('u'):
  111. T = lltype.UnsignedLongLong
  112. else:
  113. T = lltype.SignedLongLong
  114. self.do_check(opname, oopspecindex, [T], T)
  115. def test_comparison(self):
  116. for opname, oopspecindex in [
  117. ('llong_lt', EffectInfo.OS_LLONG_LT),
  118. ('llong_le', EffectInfo.OS_LLONG_LE),
  119. ('llong_eq', EffectInfo.OS_LLONG_EQ),
  120. ('llong_ne', EffectInfo.OS_LLONG_NE),
  121. ('llong_gt', EffectInfo.OS_LLONG_GT),
  122. ('llong_ge', EffectInfo.OS_LLONG_GE),
  123. ('ullong_lt', EffectInfo.OS_LLONG_ULT),
  124. ('ullong_le', EffectInfo.OS_LLONG_ULE),
  125. ('ullong_eq', EffectInfo.OS_LLONG_EQ),
  126. ('ullong_ne', EffectInfo.OS_LLONG_NE),
  127. ('ullong_gt', EffectInfo.OS_LLONG_UGT),
  128. ('ullong_ge', EffectInfo.OS_LLONG_UGE),
  129. ]:
  130. if opname.startswith('u'):
  131. T = lltype.UnsignedLongLong
  132. else:
  133. T = lltype.SignedLongLong
  134. self.do_check(opname, oopspecindex, [T, T], lltype.Bool)
  135. def test_binary_op(self):
  136. for opname, oopspecindex in [
  137. ('llong_add', EffectInfo.OS_LLONG_ADD),
  138. ('llong_sub', EffectInfo.OS_LLONG_SUB),
  139. ('llong_mul', EffectInfo.OS_LLONG_MUL),
  140. ('llong_and', EffectInfo.OS_LLONG_AND),
  141. ('llong_or', EffectInfo.OS_LLONG_OR),
  142. ('llong_xor', EffectInfo.OS_LLONG_XOR),
  143. ('ullong_add', EffectInfo.OS_LLONG_ADD),
  144. ('ullong_sub', EffectInfo.OS_LLONG_SUB),
  145. ('ullong_mul', EffectInfo.OS_LLONG_MUL),
  146. ('ullong_and', EffectInfo.OS_LLONG_AND),
  147. ('ullong_or', EffectInfo.OS_LLONG_OR),
  148. ('ullong_xor', EffectInfo.OS_LLONG_XOR),
  149. ]:
  150. if opname.startswith('u'):
  151. T = lltype.UnsignedLongLong
  152. else:
  153. T = lltype.SignedLongLong
  154. self.do_check(opname, oopspecindex, [T, T], T)
  155. def test_shifts(self):
  156. for opname, oopspecindex in [
  157. ('llong_lshift', EffectInfo.OS_LLONG_LSHIFT),
  158. ('llong_rshift', EffectInfo.OS_LLONG_RSHIFT),
  159. ('ullong_lshift', EffectInfo.OS_LLONG_LSHIFT),
  160. ('ullong_rshift', EffectInfo.OS_LLONG_URSHIFT),
  161. ]:
  162. if opname.startswith('u'):
  163. T = lltype.UnsignedLongLong
  164. else:
  165. T = lltype.SignedLongLong
  166. self.do_check(opname, oopspecindex, [T, lltype.Signed], T)
  167. def test_casts(self):
  168. self.do_check('cast_int_to_longlong', EffectInfo.OS_LLONG_FROM_INT,
  169. [lltype.Signed], lltype.SignedLongLong)
  170. self.do_check('cast_uint_to_longlong', EffectInfo.OS_LLONG_FROM_UINT,
  171. [lltype.Unsigned], lltype.SignedLongLong)
  172. self.do_check('truncate_longlong_to_int', EffectInfo.OS_LLONG_TO_INT,
  173. [lltype.SignedLongLong], lltype.Signed)
  174. self.do_check('cast_float_to_longlong', EffectInfo.OS_LLONG_FROM_FLOAT,
  175. [lltype.Float], lltype.SignedLongLong)
  176. self.do_check('cast_longlong_to_float', EffectInfo.OS_LLONG_TO_FLOAT,
  177. [lltype.SignedLongLong], lltype.Float)
  178. for T1 in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
  179. for T2 in [lltype.Signed, lltype.Unsigned]:
  180. self.do_check('cast_primitive', EffectInfo.OS_LLONG_TO_INT,
  181. [T1], T2)
  182. def test_constants(self):
  183. for TYPE in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
  184. v_x = varoftype(TYPE)
  185. vlist = [v_x, const(rffi.cast(TYPE, 7))]
  186. v_result = varoftype(TYPE)
  187. op = SpaceOperation('llong_add', vlist, v_result)
  188. tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
  189. op1 = tr.rewrite_operation(op)
  190. #
  191. assert op1.opname == 'residual_call_irf_f'
  192. assert list(op1.args[2]) == []
  193. assert list(op1.args[3]) == []
  194. assert list(op1.args[4]) == vlist
  195. assert op1.result == v_result