aot_intrinsic.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * Copyright (C) 2021 XiaoMi Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef _AOT_INTRINSIC_H
  6. #define _AOT_INTRINSIC_H
  7. #include "aot_runtime.h"
  8. #if WASM_ENABLE_WAMR_COMPILER != 0 || WASM_ENABLE_JIT != 0
  9. #include "aot_llvm.h"
  10. #endif
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. #define AOT_INTRINSIC_GROUPS 2
  15. /* Use uint64 as flag container:
  16. * - The upper 16 bits are the intrinsic group number
  17. * - The lower 48 bits are the intrinsic capability mask
  18. */
  19. #define AOT_INTRINSIC_FLAG(group, number) \
  20. ((((uint64)(group & 0xffffLL)) << 48) | ((uint64)1 << number))
  21. #define AOT_INTRINSIC_FLAG_MASK (0x0000ffffffffffffLL)
  22. #define AOT_INTRINSIC_GET_GROUP_FROM_FLAG(flag) \
  23. ((((uint64)flag) >> 48) & 0xffffLL)
  24. /* clang-format off */
  25. #define AOT_INTRINSIC_FLAG_F32_FADD AOT_INTRINSIC_FLAG(0, 0)
  26. #define AOT_INTRINSIC_FLAG_F32_FSUB AOT_INTRINSIC_FLAG(0, 1)
  27. #define AOT_INTRINSIC_FLAG_F32_FMUL AOT_INTRINSIC_FLAG(0, 2)
  28. #define AOT_INTRINSIC_FLAG_F32_FDIV AOT_INTRINSIC_FLAG(0, 3)
  29. #define AOT_INTRINSIC_FLAG_F32_FABS AOT_INTRINSIC_FLAG(0, 4)
  30. #define AOT_INTRINSIC_FLAG_F32_CEIL AOT_INTRINSIC_FLAG(0, 5)
  31. #define AOT_INTRINSIC_FLAG_F32_FLOOR AOT_INTRINSIC_FLAG(0, 6)
  32. #define AOT_INTRINSIC_FLAG_F32_TRUNC AOT_INTRINSIC_FLAG(0, 7)
  33. #define AOT_INTRINSIC_FLAG_F32_RINT AOT_INTRINSIC_FLAG(0, 8)
  34. #define AOT_INTRINSIC_FLAG_F32_SQRT AOT_INTRINSIC_FLAG(0, 9)
  35. #define AOT_INTRINSIC_FLAG_F32_COPYSIGN AOT_INTRINSIC_FLAG(0, 10)
  36. #define AOT_INTRINSIC_FLAG_F32_MIN AOT_INTRINSIC_FLAG(0, 11)
  37. #define AOT_INTRINSIC_FLAG_F32_MAX AOT_INTRINSIC_FLAG(0, 12)
  38. #define AOT_INTRINSIC_FLAG_I32_CLZ AOT_INTRINSIC_FLAG(0, 13)
  39. #define AOT_INTRINSIC_FLAG_I32_CTZ AOT_INTRINSIC_FLAG(0, 14)
  40. #define AOT_INTRINSIC_FLAG_I32_POPCNT AOT_INTRINSIC_FLAG(0, 15)
  41. #define AOT_INTRINSIC_FLAG_I32_TO_F32 AOT_INTRINSIC_FLAG(0, 16)
  42. #define AOT_INTRINSIC_FLAG_U32_TO_F32 AOT_INTRINSIC_FLAG(0, 17)
  43. #define AOT_INTRINSIC_FLAG_I32_TO_F64 AOT_INTRINSIC_FLAG(0, 18)
  44. #define AOT_INTRINSIC_FLAG_U32_TO_F64 AOT_INTRINSIC_FLAG(0, 19)
  45. #define AOT_INTRINSIC_FLAG_F32_TO_I32 AOT_INTRINSIC_FLAG(0, 20)
  46. #define AOT_INTRINSIC_FLAG_F32_TO_U32 AOT_INTRINSIC_FLAG(0, 21)
  47. #define AOT_INTRINSIC_FLAG_F32_TO_I64 AOT_INTRINSIC_FLAG(0, 22)
  48. #define AOT_INTRINSIC_FLAG_F32_TO_U64 AOT_INTRINSIC_FLAG(0, 23)
  49. #define AOT_INTRINSIC_FLAG_F32_TO_F64 AOT_INTRINSIC_FLAG(0, 24)
  50. #define AOT_INTRINSIC_FLAG_F32_CMP AOT_INTRINSIC_FLAG(0, 25)
  51. #define AOT_INTRINSIC_FLAG_F32_CONST AOT_INTRINSIC_FLAG(0, 26)
  52. #define AOT_INTRINSIC_FLAG_I32_CONST AOT_INTRINSIC_FLAG(0, 27)
  53. #define AOT_INTRINSIC_FLAG_I32_DIV_U AOT_INTRINSIC_FLAG(0, 28)
  54. #define AOT_INTRINSIC_FLAG_I32_REM_S AOT_INTRINSIC_FLAG(0, 29)
  55. #define AOT_INTRINSIC_FLAG_I32_REM_U AOT_INTRINSIC_FLAG(0, 30)
  56. #define AOT_INTRINSIC_FLAG_I32_DIV_S AOT_INTRINSIC_FLAG(0, 31)
  57. #define AOT_INTRINSIC_FLAG_F64_FADD AOT_INTRINSIC_FLAG(1, 0)
  58. #define AOT_INTRINSIC_FLAG_F64_FSUB AOT_INTRINSIC_FLAG(1, 1)
  59. #define AOT_INTRINSIC_FLAG_F64_FMUL AOT_INTRINSIC_FLAG(1, 2)
  60. #define AOT_INTRINSIC_FLAG_F64_FDIV AOT_INTRINSIC_FLAG(1, 3)
  61. #define AOT_INTRINSIC_FLAG_F64_FABS AOT_INTRINSIC_FLAG(1, 4)
  62. #define AOT_INTRINSIC_FLAG_F64_CEIL AOT_INTRINSIC_FLAG(1, 5)
  63. #define AOT_INTRINSIC_FLAG_F64_FLOOR AOT_INTRINSIC_FLAG(1, 6)
  64. #define AOT_INTRINSIC_FLAG_F64_TRUNC AOT_INTRINSIC_FLAG(1, 7)
  65. #define AOT_INTRINSIC_FLAG_F64_RINT AOT_INTRINSIC_FLAG(1, 8)
  66. #define AOT_INTRINSIC_FLAG_F64_SQRT AOT_INTRINSIC_FLAG(1, 9)
  67. #define AOT_INTRINSIC_FLAG_F64_COPYSIGN AOT_INTRINSIC_FLAG(1, 10)
  68. #define AOT_INTRINSIC_FLAG_F64_MIN AOT_INTRINSIC_FLAG(1, 11)
  69. #define AOT_INTRINSIC_FLAG_F64_MAX AOT_INTRINSIC_FLAG(1, 12)
  70. #define AOT_INTRINSIC_FLAG_I64_CLZ AOT_INTRINSIC_FLAG(1, 13)
  71. #define AOT_INTRINSIC_FLAG_I64_CTZ AOT_INTRINSIC_FLAG(1, 14)
  72. #define AOT_INTRINSIC_FLAG_I64_POPCNT AOT_INTRINSIC_FLAG(1, 15)
  73. #define AOT_INTRINSIC_FLAG_I64_TO_F32 AOT_INTRINSIC_FLAG(1, 16)
  74. #define AOT_INTRINSIC_FLAG_U64_TO_F32 AOT_INTRINSIC_FLAG(1, 17)
  75. #define AOT_INTRINSIC_FLAG_I64_TO_F64 AOT_INTRINSIC_FLAG(1, 18)
  76. #define AOT_INTRINSIC_FLAG_U64_TO_F64 AOT_INTRINSIC_FLAG(1, 19)
  77. #define AOT_INTRINSIC_FLAG_F64_TO_I32 AOT_INTRINSIC_FLAG(1, 20)
  78. #define AOT_INTRINSIC_FLAG_F64_TO_U32 AOT_INTRINSIC_FLAG(1, 21)
  79. #define AOT_INTRINSIC_FLAG_F64_TO_I64 AOT_INTRINSIC_FLAG(1, 22)
  80. #define AOT_INTRINSIC_FLAG_F64_TO_U64 AOT_INTRINSIC_FLAG(1, 23)
  81. #define AOT_INTRINSIC_FLAG_F64_TO_F32 AOT_INTRINSIC_FLAG(1, 24)
  82. #define AOT_INTRINSIC_FLAG_F64_CMP AOT_INTRINSIC_FLAG(1, 25)
  83. #define AOT_INTRINSIC_FLAG_F64_CONST AOT_INTRINSIC_FLAG(1, 26)
  84. #define AOT_INTRINSIC_FLAG_I64_CONST AOT_INTRINSIC_FLAG(1, 27)
  85. #define AOT_INTRINSIC_FLAG_I64_DIV_S AOT_INTRINSIC_FLAG(1, 28)
  86. #define AOT_INTRINSIC_FLAG_I64_DIV_U AOT_INTRINSIC_FLAG(1, 29)
  87. #define AOT_INTRINSIC_FLAG_I64_REM_S AOT_INTRINSIC_FLAG(1, 30)
  88. #define AOT_INTRINSIC_FLAG_I64_REM_U AOT_INTRINSIC_FLAG(1, 31)
  89. #define AOT_INTRINSIC_FLAG_I64_BIT_OR AOT_INTRINSIC_FLAG(1, 32)
  90. #define AOT_INTRINSIC_FLAG_I64_BIT_AND AOT_INTRINSIC_FLAG(1, 33)
  91. #define AOT_INTRINSIC_FLAG_I64_MUL AOT_INTRINSIC_FLAG(1, 34)
  92. #define AOT_INTRINSIC_FLAG_I64_SHL AOT_INTRINSIC_FLAG(1, 35)
  93. #define AOT_INTRINSIC_FLAG_I64_SHR_S AOT_INTRINSIC_FLAG(1, 36)
  94. #define AOT_INTRINSIC_FLAG_I64_SHR_U AOT_INTRINSIC_FLAG(1, 37)
  95. /* clang-format on */
  96. float32
  97. aot_intrinsic_fadd_f32(float32 a, float32 b);
  98. float64
  99. aot_intrinsic_fadd_f64(float64 a, float64 b);
  100. float32
  101. aot_intrinsic_fsub_f32(float32 a, float32 b);
  102. float64
  103. aot_intrinsic_fsub_f64(float64 a, float64 b);
  104. float32
  105. aot_intrinsic_fmul_f32(float32 a, float32 b);
  106. float64
  107. aot_intrinsic_fmul_f64(float64 a, float64 b);
  108. float32
  109. aot_intrinsic_fdiv_f32(float32 a, float32 b);
  110. float64
  111. aot_intrinsic_fdiv_f64(float64 a, float64 b);
  112. float32
  113. aot_intrinsic_fabs_f32(float32 a);
  114. float64
  115. aot_intrinsic_fabs_f64(float64 a);
  116. float32
  117. aot_intrinsic_ceil_f32(float32 a);
  118. float64
  119. aot_intrinsic_ceil_f64(float64 a);
  120. float32
  121. aot_intrinsic_floor_f32(float32 a);
  122. float64
  123. aot_intrinsic_floor_f64(float64 a);
  124. float32
  125. aot_intrinsic_trunc_f32(float32 a);
  126. float64
  127. aot_intrinsic_trunc_f64(float64 a);
  128. float32
  129. aot_intrinsic_rint_f32(float32 a);
  130. float64
  131. aot_intrinsic_rint_f64(float64 a);
  132. float32
  133. aot_intrinsic_sqrt_f32(float32 a);
  134. float64
  135. aot_intrinsic_sqrt_f64(float64 a);
  136. float32
  137. aot_intrinsic_copysign_f32(float32 a, float32 b);
  138. float64
  139. aot_intrinsic_copysign_f64(float64 a, float64 b);
  140. float32
  141. aot_intrinsic_fmin_f32(float32 a, float32 b);
  142. float64
  143. aot_intrinsic_fmin_f64(float64 a, float64 b);
  144. float32
  145. aot_intrinsic_fmax_f32(float32 a, float32 b);
  146. float64
  147. aot_intrinsic_fmax_f64(float64 a, float64 b);
  148. uint32
  149. aot_intrinsic_clz_i32(uint32 type);
  150. uint64
  151. aot_intrinsic_clz_i64(uint64 type);
  152. uint32
  153. aot_intrinsic_ctz_i32(uint32 type);
  154. uint64
  155. aot_intrinsic_ctz_i64(uint64 type);
  156. uint32
  157. aot_intrinsic_popcnt_i32(uint32 u);
  158. uint64
  159. aot_intrinsic_popcnt_i64(uint64 u);
  160. float32
  161. aot_intrinsic_i32_to_f32(int32 i);
  162. float32
  163. aot_intrinsic_u32_to_f32(uint32 u);
  164. float64
  165. aot_intrinsic_i32_to_f64(int32 i);
  166. float64
  167. aot_intrinsic_u32_to_f64(uint32 u);
  168. float32
  169. aot_intrinsic_i64_to_f32(int64 i);
  170. float32
  171. aot_intrinsic_u64_to_f32(uint64 u);
  172. float64
  173. aot_intrinsic_i64_to_f64(int64 i);
  174. float64
  175. aot_intrinsic_u64_to_f64(uint64 u);
  176. int32
  177. aot_intrinsic_f32_to_i32(float32 f);
  178. uint32
  179. aot_intrinsic_f32_to_u32(float32 f);
  180. int64
  181. aot_intrinsic_f32_to_i64(float32 f);
  182. uint64
  183. aot_intrinsic_f32_to_u64(float32 f);
  184. int32
  185. aot_intrinsic_f64_to_i32(float64 f);
  186. uint32
  187. aot_intrinsic_f64_to_u32(float64 f);
  188. int64
  189. aot_intrinsic_f64_to_i64(float64 f);
  190. uint64
  191. aot_intrinsic_f64_to_u64(float64 f);
  192. float64
  193. aot_intrinsic_f32_to_f64(float32 f);
  194. float32
  195. aot_intrinsic_f64_to_f32(float64 f);
  196. int32
  197. aot_intrinsic_f32_cmp(AOTFloatCond cond, float32 lhs, float32 rhs);
  198. int32
  199. aot_intrinsic_f64_cmp(AOTFloatCond cond, float64 lhs, float64 rhs);
  200. int64
  201. aot_intrinsic_i64_div_s(int64 l, int64 r);
  202. int32
  203. aot_intrinsic_i32_div_s(int32 l, int32 r);
  204. uint32
  205. aot_intrinsic_i32_div_u(uint32 l, uint32 r);
  206. int32
  207. aot_intrinsic_i32_rem_s(int32 l, int32 r);
  208. uint32
  209. aot_intrinsic_i32_rem_u(uint32 l, uint32 r);
  210. uint64
  211. aot_intrinsic_i64_div_u(uint64 l, uint64 r);
  212. int64
  213. aot_intrinsic_i64_rem_s(int64 l, int64 r);
  214. uint64
  215. aot_intrinsic_i64_rem_u(uint64 l, uint64 r);
  216. uint64
  217. aot_intrinsic_i64_bit_or(uint64 l, uint64 r);
  218. uint64
  219. aot_intrinsic_i64_bit_and(uint64 l, uint64 r);
  220. uint64
  221. aot_intrinsic_i64_mul(uint64 l, uint64 r);
  222. uint64
  223. aot_intrinsic_i64_shl(uint64 l, uint64 r);
  224. uint64
  225. aot_intrinsic_i64_shr_s(uint64 l, uint64 r);
  226. uint64
  227. aot_intrinsic_i64_shr_u(uint64 l, uint64 r);
  228. #if WASM_ENABLE_WAMR_COMPILER != 0 || WASM_ENABLE_JIT != 0
  229. const char *
  230. aot_intrinsic_get_symbol(const char *llvm_intrinsic);
  231. bool
  232. aot_intrinsic_check_capability(const AOTCompContext *comp_ctx,
  233. const char *llvm_intrinsic);
  234. void
  235. aot_intrinsic_fill_capability_flags(AOTCompContext *comp_ctx);
  236. #endif
  237. #ifdef __cplusplus
  238. }
  239. #endif
  240. #endif /* end of _AOT_INTRINSIC_H */