RuntimeLibcalls.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. //===-- CodeGen/RuntimeLibcalls.h - Runtime Library Calls -------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines the enum representing the list of runtime library calls
  11. // the backend may emit during code generation, and also some helper functions.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H
  15. #define LLVM_CODEGEN_RUNTIMELIBCALLS_H
  16. #include "llvm/CodeGen/ValueTypes.h"
  17. namespace llvm {
  18. namespace RTLIB {
  19. /// RTLIB::Libcall enum - This enum defines all of the runtime library calls
  20. /// the backend can emit. The various long double types cannot be merged,
  21. /// because 80-bit library functions use "xf" and 128-bit use "tf".
  22. ///
  23. /// When adding PPCF128 functions here, note that their names generally need
  24. /// to be overridden for Darwin with the xxx$LDBL128 form. See
  25. /// PPCISelLowering.cpp.
  26. ///
  27. enum Libcall {
  28. // Integer
  29. SHL_I16,
  30. SHL_I32,
  31. SHL_I64,
  32. SHL_I128,
  33. SRL_I16,
  34. SRL_I32,
  35. SRL_I64,
  36. SRL_I128,
  37. SRA_I16,
  38. SRA_I32,
  39. SRA_I64,
  40. SRA_I128,
  41. MUL_I8,
  42. MUL_I16,
  43. MUL_I32,
  44. MUL_I64,
  45. MUL_I128,
  46. MULO_I32,
  47. MULO_I64,
  48. MULO_I128,
  49. SDIV_I8,
  50. SDIV_I16,
  51. SDIV_I32,
  52. SDIV_I64,
  53. SDIV_I128,
  54. UDIV_I8,
  55. UDIV_I16,
  56. UDIV_I32,
  57. UDIV_I64,
  58. UDIV_I128,
  59. SREM_I8,
  60. SREM_I16,
  61. SREM_I32,
  62. SREM_I64,
  63. SREM_I128,
  64. UREM_I8,
  65. UREM_I16,
  66. UREM_I32,
  67. UREM_I64,
  68. UREM_I128,
  69. SDIVREM_I8,
  70. SDIVREM_I16,
  71. SDIVREM_I32,
  72. SDIVREM_I64,
  73. SDIVREM_I128,
  74. UDIVREM_I8,
  75. UDIVREM_I16,
  76. UDIVREM_I32,
  77. UDIVREM_I64,
  78. UDIVREM_I128,
  79. NEG_I32,
  80. NEG_I64,
  81. // FLOATING POINT
  82. ADD_F32,
  83. ADD_F64,
  84. ADD_F80,
  85. ADD_F128,
  86. ADD_PPCF128,
  87. SUB_F32,
  88. SUB_F64,
  89. SUB_F80,
  90. SUB_F128,
  91. SUB_PPCF128,
  92. MUL_F32,
  93. MUL_F64,
  94. MUL_F80,
  95. MUL_F128,
  96. MUL_PPCF128,
  97. DIV_F32,
  98. DIV_F64,
  99. DIV_F80,
  100. DIV_F128,
  101. DIV_PPCF128,
  102. REM_F32,
  103. REM_F64,
  104. REM_F80,
  105. REM_F128,
  106. REM_PPCF128,
  107. FMA_F32,
  108. FMA_F64,
  109. FMA_F80,
  110. FMA_F128,
  111. FMA_PPCF128,
  112. POWI_F32,
  113. POWI_F64,
  114. POWI_F80,
  115. POWI_F128,
  116. POWI_PPCF128,
  117. SQRT_F32,
  118. SQRT_F64,
  119. SQRT_F80,
  120. SQRT_F128,
  121. SQRT_PPCF128,
  122. LOG_F32,
  123. LOG_F64,
  124. LOG_F80,
  125. LOG_F128,
  126. LOG_PPCF128,
  127. LOG2_F32,
  128. LOG2_F64,
  129. LOG2_F80,
  130. LOG2_F128,
  131. LOG2_PPCF128,
  132. LOG10_F32,
  133. LOG10_F64,
  134. LOG10_F80,
  135. LOG10_F128,
  136. LOG10_PPCF128,
  137. EXP_F32,
  138. EXP_F64,
  139. EXP_F80,
  140. EXP_F128,
  141. EXP_PPCF128,
  142. EXP2_F32,
  143. EXP2_F64,
  144. EXP2_F80,
  145. EXP2_F128,
  146. EXP2_PPCF128,
  147. SIN_F32,
  148. SIN_F64,
  149. SIN_F80,
  150. SIN_F128,
  151. SIN_PPCF128,
  152. COS_F32,
  153. COS_F64,
  154. COS_F80,
  155. COS_F128,
  156. COS_PPCF128,
  157. SINCOS_F32,
  158. SINCOS_F64,
  159. SINCOS_F80,
  160. SINCOS_F128,
  161. SINCOS_PPCF128,
  162. POW_F32,
  163. POW_F64,
  164. POW_F80,
  165. POW_F128,
  166. POW_PPCF128,
  167. CEIL_F32,
  168. CEIL_F64,
  169. CEIL_F80,
  170. CEIL_F128,
  171. CEIL_PPCF128,
  172. TRUNC_F32,
  173. TRUNC_F64,
  174. TRUNC_F80,
  175. TRUNC_F128,
  176. TRUNC_PPCF128,
  177. RINT_F32,
  178. RINT_F64,
  179. RINT_F80,
  180. RINT_F128,
  181. RINT_PPCF128,
  182. NEARBYINT_F32,
  183. NEARBYINT_F64,
  184. NEARBYINT_F80,
  185. NEARBYINT_F128,
  186. NEARBYINT_PPCF128,
  187. ROUND_F32,
  188. ROUND_F64,
  189. ROUND_F80,
  190. ROUND_F128,
  191. ROUND_PPCF128,
  192. FLOOR_F32,
  193. FLOOR_F64,
  194. FLOOR_F80,
  195. FLOOR_F128,
  196. FLOOR_PPCF128,
  197. COPYSIGN_F32,
  198. COPYSIGN_F64,
  199. COPYSIGN_F80,
  200. COPYSIGN_F128,
  201. COPYSIGN_PPCF128,
  202. FMIN_F32,
  203. FMIN_F64,
  204. FMIN_F80,
  205. FMIN_F128,
  206. FMIN_PPCF128,
  207. FMAX_F32,
  208. FMAX_F64,
  209. FMAX_F80,
  210. FMAX_F128,
  211. FMAX_PPCF128,
  212. // CONVERSION
  213. FPEXT_F64_F128,
  214. FPEXT_F32_F128,
  215. FPEXT_F32_F64,
  216. FPEXT_F16_F32,
  217. FPROUND_F32_F16,
  218. FPROUND_F64_F16,
  219. FPROUND_F80_F16,
  220. FPROUND_F128_F16,
  221. FPROUND_PPCF128_F16,
  222. FPROUND_F64_F32,
  223. FPROUND_F80_F32,
  224. FPROUND_F128_F32,
  225. FPROUND_PPCF128_F32,
  226. FPROUND_F80_F64,
  227. FPROUND_F128_F64,
  228. FPROUND_PPCF128_F64,
  229. FPTOSINT_F32_I8,
  230. FPTOSINT_F32_I16,
  231. FPTOSINT_F32_I32,
  232. FPTOSINT_F32_I64,
  233. FPTOSINT_F32_I128,
  234. FPTOSINT_F64_I8,
  235. FPTOSINT_F64_I16,
  236. FPTOSINT_F64_I32,
  237. FPTOSINT_F64_I64,
  238. FPTOSINT_F64_I128,
  239. FPTOSINT_F80_I32,
  240. FPTOSINT_F80_I64,
  241. FPTOSINT_F80_I128,
  242. FPTOSINT_F128_I32,
  243. FPTOSINT_F128_I64,
  244. FPTOSINT_F128_I128,
  245. FPTOSINT_PPCF128_I32,
  246. FPTOSINT_PPCF128_I64,
  247. FPTOSINT_PPCF128_I128,
  248. FPTOUINT_F32_I8,
  249. FPTOUINT_F32_I16,
  250. FPTOUINT_F32_I32,
  251. FPTOUINT_F32_I64,
  252. FPTOUINT_F32_I128,
  253. FPTOUINT_F64_I8,
  254. FPTOUINT_F64_I16,
  255. FPTOUINT_F64_I32,
  256. FPTOUINT_F64_I64,
  257. FPTOUINT_F64_I128,
  258. FPTOUINT_F80_I32,
  259. FPTOUINT_F80_I64,
  260. FPTOUINT_F80_I128,
  261. FPTOUINT_F128_I32,
  262. FPTOUINT_F128_I64,
  263. FPTOUINT_F128_I128,
  264. FPTOUINT_PPCF128_I32,
  265. FPTOUINT_PPCF128_I64,
  266. FPTOUINT_PPCF128_I128,
  267. SINTTOFP_I32_F32,
  268. SINTTOFP_I32_F64,
  269. SINTTOFP_I32_F80,
  270. SINTTOFP_I32_F128,
  271. SINTTOFP_I32_PPCF128,
  272. SINTTOFP_I64_F32,
  273. SINTTOFP_I64_F64,
  274. SINTTOFP_I64_F80,
  275. SINTTOFP_I64_F128,
  276. SINTTOFP_I64_PPCF128,
  277. SINTTOFP_I128_F32,
  278. SINTTOFP_I128_F64,
  279. SINTTOFP_I128_F80,
  280. SINTTOFP_I128_F128,
  281. SINTTOFP_I128_PPCF128,
  282. UINTTOFP_I32_F32,
  283. UINTTOFP_I32_F64,
  284. UINTTOFP_I32_F80,
  285. UINTTOFP_I32_F128,
  286. UINTTOFP_I32_PPCF128,
  287. UINTTOFP_I64_F32,
  288. UINTTOFP_I64_F64,
  289. UINTTOFP_I64_F80,
  290. UINTTOFP_I64_F128,
  291. UINTTOFP_I64_PPCF128,
  292. UINTTOFP_I128_F32,
  293. UINTTOFP_I128_F64,
  294. UINTTOFP_I128_F80,
  295. UINTTOFP_I128_F128,
  296. UINTTOFP_I128_PPCF128,
  297. // COMPARISON
  298. OEQ_F32,
  299. OEQ_F64,
  300. OEQ_F128,
  301. UNE_F32,
  302. UNE_F64,
  303. UNE_F128,
  304. OGE_F32,
  305. OGE_F64,
  306. OGE_F128,
  307. OLT_F32,
  308. OLT_F64,
  309. OLT_F128,
  310. OLE_F32,
  311. OLE_F64,
  312. OLE_F128,
  313. OGT_F32,
  314. OGT_F64,
  315. OGT_F128,
  316. UO_F32,
  317. UO_F64,
  318. UO_F128,
  319. O_F32,
  320. O_F64,
  321. O_F128,
  322. // MEMORY
  323. MEMCPY,
  324. MEMSET,
  325. MEMMOVE,
  326. // EXCEPTION HANDLING
  327. UNWIND_RESUME,
  328. // Family ATOMICs
  329. SYNC_VAL_COMPARE_AND_SWAP_1,
  330. SYNC_VAL_COMPARE_AND_SWAP_2,
  331. SYNC_VAL_COMPARE_AND_SWAP_4,
  332. SYNC_VAL_COMPARE_AND_SWAP_8,
  333. SYNC_VAL_COMPARE_AND_SWAP_16,
  334. SYNC_LOCK_TEST_AND_SET_1,
  335. SYNC_LOCK_TEST_AND_SET_2,
  336. SYNC_LOCK_TEST_AND_SET_4,
  337. SYNC_LOCK_TEST_AND_SET_8,
  338. SYNC_LOCK_TEST_AND_SET_16,
  339. SYNC_FETCH_AND_ADD_1,
  340. SYNC_FETCH_AND_ADD_2,
  341. SYNC_FETCH_AND_ADD_4,
  342. SYNC_FETCH_AND_ADD_8,
  343. SYNC_FETCH_AND_ADD_16,
  344. SYNC_FETCH_AND_SUB_1,
  345. SYNC_FETCH_AND_SUB_2,
  346. SYNC_FETCH_AND_SUB_4,
  347. SYNC_FETCH_AND_SUB_8,
  348. SYNC_FETCH_AND_SUB_16,
  349. SYNC_FETCH_AND_AND_1,
  350. SYNC_FETCH_AND_AND_2,
  351. SYNC_FETCH_AND_AND_4,
  352. SYNC_FETCH_AND_AND_8,
  353. SYNC_FETCH_AND_AND_16,
  354. SYNC_FETCH_AND_OR_1,
  355. SYNC_FETCH_AND_OR_2,
  356. SYNC_FETCH_AND_OR_4,
  357. SYNC_FETCH_AND_OR_8,
  358. SYNC_FETCH_AND_OR_16,
  359. SYNC_FETCH_AND_XOR_1,
  360. SYNC_FETCH_AND_XOR_2,
  361. SYNC_FETCH_AND_XOR_4,
  362. SYNC_FETCH_AND_XOR_8,
  363. SYNC_FETCH_AND_XOR_16,
  364. SYNC_FETCH_AND_NAND_1,
  365. SYNC_FETCH_AND_NAND_2,
  366. SYNC_FETCH_AND_NAND_4,
  367. SYNC_FETCH_AND_NAND_8,
  368. SYNC_FETCH_AND_NAND_16,
  369. SYNC_FETCH_AND_MAX_1,
  370. SYNC_FETCH_AND_MAX_2,
  371. SYNC_FETCH_AND_MAX_4,
  372. SYNC_FETCH_AND_MAX_8,
  373. SYNC_FETCH_AND_MAX_16,
  374. SYNC_FETCH_AND_UMAX_1,
  375. SYNC_FETCH_AND_UMAX_2,
  376. SYNC_FETCH_AND_UMAX_4,
  377. SYNC_FETCH_AND_UMAX_8,
  378. SYNC_FETCH_AND_UMAX_16,
  379. SYNC_FETCH_AND_MIN_1,
  380. SYNC_FETCH_AND_MIN_2,
  381. SYNC_FETCH_AND_MIN_4,
  382. SYNC_FETCH_AND_MIN_8,
  383. SYNC_FETCH_AND_MIN_16,
  384. SYNC_FETCH_AND_UMIN_1,
  385. SYNC_FETCH_AND_UMIN_2,
  386. SYNC_FETCH_AND_UMIN_4,
  387. SYNC_FETCH_AND_UMIN_8,
  388. SYNC_FETCH_AND_UMIN_16,
  389. // Stack Protector Fail.
  390. STACKPROTECTOR_CHECK_FAIL,
  391. UNKNOWN_LIBCALL
  392. };
  393. /// getFPEXT - Return the FPEXT_*_* value for the given types, or
  394. /// UNKNOWN_LIBCALL if there is none.
  395. Libcall getFPEXT(EVT OpVT, EVT RetVT);
  396. /// getFPROUND - Return the FPROUND_*_* value for the given types, or
  397. /// UNKNOWN_LIBCALL if there is none.
  398. Libcall getFPROUND(EVT OpVT, EVT RetVT);
  399. /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
  400. /// UNKNOWN_LIBCALL if there is none.
  401. Libcall getFPTOSINT(EVT OpVT, EVT RetVT);
  402. /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
  403. /// UNKNOWN_LIBCALL if there is none.
  404. Libcall getFPTOUINT(EVT OpVT, EVT RetVT);
  405. /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
  406. /// UNKNOWN_LIBCALL if there is none.
  407. Libcall getSINTTOFP(EVT OpVT, EVT RetVT);
  408. /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
  409. /// UNKNOWN_LIBCALL if there is none.
  410. Libcall getUINTTOFP(EVT OpVT, EVT RetVT);
  411. /// Return the SYNC_FETCH_AND_* value for the given opcode and type, or
  412. /// UNKNOWN_LIBCALL if there is none.
  413. Libcall getATOMIC(unsigned Opc, MVT VT);
  414. }
  415. }
  416. #endif