float_ops.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. """Primitive float ops."""
  2. from __future__ import annotations
  3. from mypyc.ir.ops import ERR_MAGIC, ERR_MAGIC_OVERLAPPING, ERR_NEVER
  4. from mypyc.ir.rtypes import (
  5. bool_rprimitive,
  6. float_rprimitive,
  7. int_rprimitive,
  8. object_rprimitive,
  9. str_rprimitive,
  10. )
  11. from mypyc.primitives.registry import binary_op, function_op, load_address_op
  12. # Get the 'builtins.float' type object.
  13. load_address_op(name="builtins.float", type=object_rprimitive, src="PyFloat_Type")
  14. binary_op(
  15. name="//",
  16. arg_types=[float_rprimitive, float_rprimitive],
  17. return_type=float_rprimitive,
  18. c_function_name="CPyFloat_FloorDivide",
  19. error_kind=ERR_MAGIC_OVERLAPPING,
  20. )
  21. # float(int)
  22. int_to_float_op = function_op(
  23. name="builtins.float",
  24. arg_types=[int_rprimitive],
  25. return_type=float_rprimitive,
  26. c_function_name="CPyFloat_FromTagged",
  27. error_kind=ERR_MAGIC_OVERLAPPING,
  28. )
  29. # float(str)
  30. function_op(
  31. name="builtins.float",
  32. arg_types=[str_rprimitive],
  33. return_type=object_rprimitive,
  34. c_function_name="PyFloat_FromString",
  35. error_kind=ERR_MAGIC,
  36. )
  37. # abs(float)
  38. function_op(
  39. name="builtins.abs",
  40. arg_types=[float_rprimitive],
  41. return_type=float_rprimitive,
  42. c_function_name="fabs",
  43. error_kind=ERR_NEVER,
  44. )
  45. # math.sin(float)
  46. function_op(
  47. name="math.sin",
  48. arg_types=[float_rprimitive],
  49. return_type=float_rprimitive,
  50. c_function_name="CPyFloat_Sin",
  51. error_kind=ERR_MAGIC_OVERLAPPING,
  52. )
  53. # math.cos(float)
  54. function_op(
  55. name="math.cos",
  56. arg_types=[float_rprimitive],
  57. return_type=float_rprimitive,
  58. c_function_name="CPyFloat_Cos",
  59. error_kind=ERR_MAGIC_OVERLAPPING,
  60. )
  61. # math.tan(float)
  62. function_op(
  63. name="math.tan",
  64. arg_types=[float_rprimitive],
  65. return_type=float_rprimitive,
  66. c_function_name="CPyFloat_Tan",
  67. error_kind=ERR_MAGIC_OVERLAPPING,
  68. )
  69. # math.sqrt(float)
  70. function_op(
  71. name="math.sqrt",
  72. arg_types=[float_rprimitive],
  73. return_type=float_rprimitive,
  74. c_function_name="CPyFloat_Sqrt",
  75. error_kind=ERR_MAGIC_OVERLAPPING,
  76. )
  77. # math.exp(float)
  78. function_op(
  79. name="math.exp",
  80. arg_types=[float_rprimitive],
  81. return_type=float_rprimitive,
  82. c_function_name="CPyFloat_Exp",
  83. error_kind=ERR_MAGIC_OVERLAPPING,
  84. )
  85. # math.log(float)
  86. function_op(
  87. name="math.log",
  88. arg_types=[float_rprimitive],
  89. return_type=float_rprimitive,
  90. c_function_name="CPyFloat_Log",
  91. error_kind=ERR_MAGIC_OVERLAPPING,
  92. )
  93. # math.floor(float)
  94. function_op(
  95. name="math.floor",
  96. arg_types=[float_rprimitive],
  97. return_type=int_rprimitive,
  98. c_function_name="CPyFloat_Floor",
  99. error_kind=ERR_MAGIC,
  100. )
  101. # math.ceil(float)
  102. function_op(
  103. name="math.ceil",
  104. arg_types=[float_rprimitive],
  105. return_type=int_rprimitive,
  106. c_function_name="CPyFloat_Ceil",
  107. error_kind=ERR_MAGIC,
  108. )
  109. # math.fabs(float)
  110. function_op(
  111. name="math.fabs",
  112. arg_types=[float_rprimitive],
  113. return_type=float_rprimitive,
  114. c_function_name="fabs",
  115. error_kind=ERR_NEVER,
  116. )
  117. # math.pow(float, float)
  118. pow_op = function_op(
  119. name="math.pow",
  120. arg_types=[float_rprimitive, float_rprimitive],
  121. return_type=float_rprimitive,
  122. c_function_name="CPyFloat_Pow",
  123. error_kind=ERR_MAGIC_OVERLAPPING,
  124. )
  125. # math.copysign(float, float)
  126. copysign_op = function_op(
  127. name="math.copysign",
  128. arg_types=[float_rprimitive, float_rprimitive],
  129. return_type=float_rprimitive,
  130. c_function_name="copysign",
  131. error_kind=ERR_NEVER,
  132. )
  133. # math.isinf(float)
  134. function_op(
  135. name="math.isinf",
  136. arg_types=[float_rprimitive],
  137. return_type=bool_rprimitive,
  138. c_function_name="CPyFloat_IsInf",
  139. error_kind=ERR_NEVER,
  140. )
  141. # math.isnan(float)
  142. function_op(
  143. name="math.isnan",
  144. arg_types=[float_rprimitive],
  145. return_type=bool_rprimitive,
  146. c_function_name="CPyFloat_IsNaN",
  147. error_kind=ERR_NEVER,
  148. )