lj_ircall.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. /*
  2. ** IR CALL* instruction definitions.
  3. ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
  4. */
  5. #ifndef _LJ_IRCALL_H
  6. #define _LJ_IRCALL_H
  7. #include "lj_obj.h"
  8. #include "lj_ir.h"
  9. #include "lj_jit.h"
  10. /* C call info for CALL* instructions. */
  11. typedef struct CCallInfo {
  12. ASMFunction func; /* Function pointer. */
  13. uint32_t flags; /* Number of arguments and flags. */
  14. } CCallInfo;
  15. #define CCI_NARGS(ci) ((ci)->flags & 0xff) /* # of args. */
  16. #define CCI_NARGS_MAX 32 /* Max. # of args. */
  17. #define CCI_OTSHIFT 16
  18. #define CCI_OPTYPE(ci) ((ci)->flags >> CCI_OTSHIFT) /* Get op/type. */
  19. #define CCI_TYPE(ci) (((ci)->flags>>CCI_OTSHIFT) & IRT_TYPE)
  20. #define CCI_OPSHIFT 24
  21. #define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */
  22. #define CCI_CALL_N (IR_CALLN << CCI_OPSHIFT)
  23. #define CCI_CALL_A (IR_CALLA << CCI_OPSHIFT)
  24. #define CCI_CALL_L (IR_CALLL << CCI_OPSHIFT)
  25. #define CCI_CALL_S (IR_CALLS << CCI_OPSHIFT)
  26. #define CCI_CALL_FN (CCI_CALL_N|CCI_CC_FASTCALL)
  27. #define CCI_CALL_FA (CCI_CALL_A|CCI_CC_FASTCALL)
  28. #define CCI_CALL_FL (CCI_CALL_L|CCI_CC_FASTCALL)
  29. #define CCI_CALL_FS (CCI_CALL_S|CCI_CC_FASTCALL)
  30. /* C call info flags. */
  31. #define CCI_T (IRT_GUARD << CCI_OTSHIFT) /* May throw. */
  32. #define CCI_L 0x0100 /* Implicit L arg. */
  33. #define CCI_CASTU64 0x0200 /* Cast u64 result to number. */
  34. #define CCI_NOFPRCLOBBER 0x0400 /* Does not clobber any FPRs. */
  35. #define CCI_VARARG 0x0800 /* Vararg function. */
  36. #define CCI_CC_MASK 0x3000 /* Calling convention mask. */
  37. #define CCI_CC_SHIFT 12
  38. /* ORDER CC */
  39. #define CCI_CC_CDECL 0x0000 /* Default cdecl calling convention. */
  40. #define CCI_CC_THISCALL 0x1000 /* Thiscall calling convention. */
  41. #define CCI_CC_FASTCALL 0x2000 /* Fastcall calling convention. */
  42. #define CCI_CC_STDCALL 0x3000 /* Stdcall calling convention. */
  43. /* Extra args for SOFTFP, SPLIT 64 bit. */
  44. #define CCI_XARGS_SHIFT 14
  45. #define CCI_XARGS(ci) (((ci)->flags >> CCI_XARGS_SHIFT) & 3)
  46. #define CCI_XA (1u << CCI_XARGS_SHIFT)
  47. #if LJ_SOFTFP32 || (LJ_32 && LJ_HASFFI)
  48. #define CCI_XNARGS(ci) (CCI_NARGS((ci)) + CCI_XARGS((ci)))
  49. #else
  50. #define CCI_XNARGS(ci) CCI_NARGS((ci))
  51. #endif
  52. /* Helpers for conditional function definitions. */
  53. #define IRCALLCOND_ANY(x) x
  54. #if LJ_TARGET_X86ORX64 || LJ_TARGET_ARM64
  55. #define IRCALLCOND_FPMATH(x) NULL
  56. #else
  57. #define IRCALLCOND_FPMATH(x) x
  58. #endif
  59. #if LJ_SOFTFP
  60. #define IRCALLCOND_SOFTFP(x) x
  61. #if LJ_HASFFI
  62. #define IRCALLCOND_SOFTFP_FFI(x) x
  63. #else
  64. #define IRCALLCOND_SOFTFP_FFI(x) NULL
  65. #endif
  66. #else
  67. #define IRCALLCOND_SOFTFP(x) NULL
  68. #define IRCALLCOND_SOFTFP_FFI(x) NULL
  69. #endif
  70. #if LJ_SOFTFP && LJ_TARGET_MIPS
  71. #define IRCALLCOND_SOFTFP_MIPS(x) x
  72. #else
  73. #define IRCALLCOND_SOFTFP_MIPS(x) NULL
  74. #endif
  75. #if LJ_SOFTFP && LJ_TARGET_MIPS64
  76. #define IRCALLCOND_SOFTFP_MIPS64(x) x
  77. #else
  78. #define IRCALLCOND_SOFTFP_MIPS64(x) NULL
  79. #endif
  80. #define LJ_NEED_FP64 (LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS)
  81. #if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)
  82. #define IRCALLCOND_FP64_FFI(x) x
  83. #else
  84. #define IRCALLCOND_FP64_FFI(x) NULL
  85. #endif
  86. #if LJ_HASFFI
  87. #define IRCALLCOND_FFI(x) x
  88. #if LJ_32
  89. #define IRCALLCOND_FFI32(x) x
  90. #else
  91. #define IRCALLCOND_FFI32(x) NULL
  92. #endif
  93. #else
  94. #define IRCALLCOND_FFI(x) NULL
  95. #define IRCALLCOND_FFI32(x) NULL
  96. #endif
  97. #if LJ_HASBUFFER
  98. #define IRCALLCOND_BUFFER(x) x
  99. #else
  100. #define IRCALLCOND_BUFFER(x) NULL
  101. #endif
  102. #if LJ_HASBUFFER && LJ_HASFFI
  103. #define IRCALLCOND_BUFFFI(x) x
  104. #else
  105. #define IRCALLCOND_BUFFFI(x) NULL
  106. #endif
  107. #if LJ_SOFTFP
  108. #define XA_FP CCI_XA
  109. #define XA2_FP (CCI_XA+CCI_XA)
  110. #else
  111. #define XA_FP 0
  112. #define XA2_FP 0
  113. #endif
  114. #if LJ_SOFTFP32
  115. #define XA_FP32 CCI_XA
  116. #define XA2_FP32 (CCI_XA+CCI_XA)
  117. #else
  118. #define XA_FP32 0
  119. #define XA2_FP32 0
  120. #endif
  121. #if LJ_32
  122. #define XA_64 CCI_XA
  123. #define XA2_64 (CCI_XA+CCI_XA)
  124. #else
  125. #define XA_64 0
  126. #define XA2_64 0
  127. #endif
  128. /* Function definitions for CALL* instructions. */
  129. #define IRCALLDEF(_) \
  130. _(ANY, lj_str_cmp, 2, FN, INT, CCI_NOFPRCLOBBER) \
  131. _(ANY, lj_str_find, 4, N, PGC, 0) \
  132. _(ANY, lj_str_new, 3, S, STR, CCI_L|CCI_T) \
  133. _(ANY, lj_strscan_num, 2, FN, INT, 0) \
  134. _(ANY, lj_strfmt_int, 2, FN, STR, CCI_L|CCI_T) \
  135. _(ANY, lj_strfmt_num, 2, FN, STR, CCI_L|CCI_T) \
  136. _(ANY, lj_strfmt_char, 2, FN, STR, CCI_L|CCI_T) \
  137. _(ANY, lj_strfmt_putint, 2, FL, PGC, CCI_T) \
  138. _(ANY, lj_strfmt_putnum, 2, FL, PGC, CCI_T) \
  139. _(ANY, lj_strfmt_putquoted, 2, FL, PGC, CCI_T) \
  140. _(ANY, lj_strfmt_putfxint, 3, L, PGC, XA_64|CCI_T) \
  141. _(ANY, lj_strfmt_putfnum_int, 3, L, PGC, XA_FP|CCI_T) \
  142. _(ANY, lj_strfmt_putfnum_uint, 3, L, PGC, XA_FP|CCI_T) \
  143. _(ANY, lj_strfmt_putfnum, 3, L, PGC, XA_FP|CCI_T) \
  144. _(ANY, lj_strfmt_putfstr, 3, L, PGC, CCI_T) \
  145. _(ANY, lj_strfmt_putfchar, 3, L, PGC, CCI_T) \
  146. _(ANY, lj_buf_putmem, 3, S, PGC, CCI_T) \
  147. _(ANY, lj_buf_putstr, 2, FL, PGC, CCI_T) \
  148. _(ANY, lj_buf_putchar, 2, FL, PGC, CCI_T) \
  149. _(ANY, lj_buf_putstr_reverse, 2, FL, PGC, CCI_T) \
  150. _(ANY, lj_buf_putstr_lower, 2, FL, PGC, CCI_T) \
  151. _(ANY, lj_buf_putstr_upper, 2, FL, PGC, CCI_T) \
  152. _(ANY, lj_buf_putstr_rep, 3, L, PGC, CCI_T) \
  153. _(ANY, lj_buf_puttab, 5, L, PGC, CCI_T) \
  154. _(BUFFER, lj_bufx_set, 4, S, NIL, 0) \
  155. _(BUFFFI, lj_bufx_more, 2, FS, INT, CCI_T) \
  156. _(BUFFER, lj_serialize_put, 2, FS, PGC, CCI_T) \
  157. _(BUFFER, lj_serialize_get, 2, FS, PTR, CCI_T) \
  158. _(BUFFER, lj_serialize_encode, 2, FA, STR, CCI_L|CCI_T) \
  159. _(BUFFER, lj_serialize_decode, 3, A, INT, CCI_L|CCI_T) \
  160. _(ANY, lj_buf_tostr, 1, FL, STR, CCI_T) \
  161. _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L|CCI_T) \
  162. _(ANY, lj_tab_new1, 2, FA, TAB, CCI_L|CCI_T) \
  163. _(ANY, lj_tab_dup, 2, FA, TAB, CCI_L|CCI_T) \
  164. _(ANY, lj_tab_clear, 1, FS, NIL, 0) \
  165. _(ANY, lj_tab_newkey, 3, S, PGC, CCI_L|CCI_T) \
  166. _(ANY, lj_tab_keyindex, 2, FL, INT, 0) \
  167. _(ANY, lj_vm_next, 2, FL, PTR, 0) \
  168. _(ANY, lj_tab_len, 1, FL, INT, 0) \
  169. _(ANY, lj_tab_len_hint, 2, FL, INT, 0) \
  170. _(ANY, lj_gc_step_jit, 2, FS, NIL, CCI_L) \
  171. _(ANY, lj_gc_barrieruv, 2, FS, NIL, 0) \
  172. _(ANY, lj_mem_newgco, 2, FA, PGC, CCI_L|CCI_T) \
  173. _(ANY, lj_prng_u64d, 1, FS, NUM, CCI_CASTU64) \
  174. _(ANY, lj_vm_modi, 2, FN, INT, 0) \
  175. _(ANY, log10, 1, N, NUM, XA_FP) \
  176. _(ANY, exp, 1, N, NUM, XA_FP) \
  177. _(ANY, sin, 1, N, NUM, XA_FP) \
  178. _(ANY, cos, 1, N, NUM, XA_FP) \
  179. _(ANY, tan, 1, N, NUM, XA_FP) \
  180. _(ANY, asin, 1, N, NUM, XA_FP) \
  181. _(ANY, acos, 1, N, NUM, XA_FP) \
  182. _(ANY, atan, 1, N, NUM, XA_FP) \
  183. _(ANY, sinh, 1, N, NUM, XA_FP) \
  184. _(ANY, cosh, 1, N, NUM, XA_FP) \
  185. _(ANY, tanh, 1, N, NUM, XA_FP) \
  186. _(ANY, fputc, 2, S, INT, 0) \
  187. _(ANY, fwrite, 4, S, INT, 0) \
  188. _(ANY, fflush, 1, S, INT, 0) \
  189. /* ORDER FPM */ \
  190. _(FPMATH, lj_vm_floor, 1, N, NUM, XA_FP) \
  191. _(FPMATH, lj_vm_ceil, 1, N, NUM, XA_FP) \
  192. _(FPMATH, lj_vm_trunc, 1, N, NUM, XA_FP) \
  193. _(FPMATH, sqrt, 1, N, NUM, XA_FP) \
  194. _(ANY, log, 1, N, NUM, XA_FP) \
  195. _(ANY, lj_vm_log2, 1, N, NUM, XA_FP) \
  196. _(ANY, pow, 2, N, NUM, XA2_FP) \
  197. _(ANY, atan2, 2, N, NUM, XA2_FP) \
  198. _(ANY, ldexp, 2, N, NUM, XA_FP) \
  199. _(SOFTFP, lj_vm_tobit, 1, N, INT, XA_FP32) \
  200. _(SOFTFP, softfp_add, 2, N, NUM, XA2_FP32) \
  201. _(SOFTFP, softfp_sub, 2, N, NUM, XA2_FP32) \
  202. _(SOFTFP, softfp_mul, 2, N, NUM, XA2_FP32) \
  203. _(SOFTFP, softfp_div, 2, N, NUM, XA2_FP32) \
  204. _(SOFTFP, softfp_cmp, 2, N, NIL, XA2_FP32) \
  205. _(SOFTFP, softfp_i2d, 1, N, NUM, 0) \
  206. _(SOFTFP, softfp_d2i, 1, N, INT, XA_FP32) \
  207. _(SOFTFP_MIPS, lj_vm_sfmin, 2, N, NUM, XA2_FP32) \
  208. _(SOFTFP_MIPS, lj_vm_sfmax, 2, N, NUM, XA2_FP32) \
  209. _(SOFTFP_MIPS64, lj_vm_tointg, 1, N, INT, 0) \
  210. _(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \
  211. _(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \
  212. _(SOFTFP_FFI, softfp_d2ui, 1, N, INT, XA_FP32) \
  213. _(SOFTFP_FFI, softfp_d2f, 1, N, FLOAT, XA_FP32) \
  214. _(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \
  215. _(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \
  216. _(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \
  217. _(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \
  218. _(FP64_FFI, fp64_l2d, 1, N, NUM, XA_64) \
  219. _(FP64_FFI, fp64_ul2d, 1, N, NUM, XA_64) \
  220. _(FP64_FFI, fp64_l2f, 1, N, FLOAT, XA_64) \
  221. _(FP64_FFI, fp64_ul2f, 1, N, FLOAT, XA_64) \
  222. _(FP64_FFI, fp64_d2l, 1, N, I64, XA_FP) \
  223. _(FP64_FFI, fp64_d2ul, 1, N, U64, XA_FP) \
  224. _(FP64_FFI, fp64_f2l, 1, N, I64, 0) \
  225. _(FP64_FFI, fp64_f2ul, 1, N, U64, 0) \
  226. _(FFI, lj_carith_divi64, 2, N, I64, XA2_64|CCI_NOFPRCLOBBER) \
  227. _(FFI, lj_carith_divu64, 2, N, U64, XA2_64|CCI_NOFPRCLOBBER) \
  228. _(FFI, lj_carith_modi64, 2, N, I64, XA2_64|CCI_NOFPRCLOBBER) \
  229. _(FFI, lj_carith_modu64, 2, N, U64, XA2_64|CCI_NOFPRCLOBBER) \
  230. _(FFI, lj_carith_powi64, 2, N, I64, XA2_64|CCI_NOFPRCLOBBER) \
  231. _(FFI, lj_carith_powu64, 2, N, U64, XA2_64|CCI_NOFPRCLOBBER) \
  232. _(FFI, lj_cdata_newv, 4, S, CDATA, CCI_L) \
  233. _(FFI, lj_cdata_setfin, 4, S, NIL, CCI_L) \
  234. _(FFI, strlen, 1, L, INTP, 0) \
  235. _(FFI, memcpy, 3, S, PTR, 0) \
  236. _(FFI, memset, 3, S, PTR, 0) \
  237. _(FFI, lj_vm_errno, 0, S, INT, CCI_NOFPRCLOBBER) \
  238. _(FFI32, lj_carith_mul64, 2, N, I64, XA2_64|CCI_NOFPRCLOBBER) \
  239. _(FFI32, lj_carith_shl64, 2, N, U64, XA_64|CCI_NOFPRCLOBBER) \
  240. _(FFI32, lj_carith_shr64, 2, N, U64, XA_64|CCI_NOFPRCLOBBER) \
  241. _(FFI32, lj_carith_sar64, 2, N, U64, XA_64|CCI_NOFPRCLOBBER) \
  242. _(FFI32, lj_carith_rol64, 2, N, U64, XA_64|CCI_NOFPRCLOBBER) \
  243. _(FFI32, lj_carith_ror64, 2, N, U64, XA_64|CCI_NOFPRCLOBBER) \
  244. \
  245. /* End of list. */
  246. typedef enum {
  247. #define IRCALLENUM(cond, name, nargs, kind, type, flags) IRCALL_##name,
  248. IRCALLDEF(IRCALLENUM)
  249. #undef IRCALLENUM
  250. IRCALL__MAX
  251. } IRCallID;
  252. LJ_FUNC TRef lj_ir_call(jit_State *J, IRCallID id, ...);
  253. LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1];
  254. /* Soft-float declarations. */
  255. #if LJ_SOFTFP
  256. #if LJ_TARGET_ARM
  257. #define softfp_add __aeabi_dadd
  258. #define softfp_sub __aeabi_dsub
  259. #define softfp_mul __aeabi_dmul
  260. #define softfp_div __aeabi_ddiv
  261. #define softfp_cmp __aeabi_cdcmple
  262. #define softfp_i2d __aeabi_i2d
  263. #define softfp_d2i __aeabi_d2iz
  264. #define softfp_ui2d __aeabi_ui2d
  265. #define softfp_f2d __aeabi_f2d
  266. #define softfp_d2ui __aeabi_d2uiz
  267. #define softfp_d2f __aeabi_d2f
  268. #define softfp_i2f __aeabi_i2f
  269. #define softfp_ui2f __aeabi_ui2f
  270. #define softfp_f2i __aeabi_f2iz
  271. #define softfp_f2ui __aeabi_f2uiz
  272. #define fp64_l2d __aeabi_l2d
  273. #define fp64_ul2d __aeabi_ul2d
  274. #define fp64_l2f __aeabi_l2f
  275. #define fp64_ul2f __aeabi_ul2f
  276. #if LJ_TARGET_IOS
  277. #define fp64_d2l __fixdfdi
  278. #define fp64_d2ul __fixunsdfdi
  279. #define fp64_f2l __fixsfdi
  280. #define fp64_f2ul __fixunssfdi
  281. #else
  282. #define fp64_d2l __aeabi_d2lz
  283. #define fp64_d2ul __aeabi_d2ulz
  284. #define fp64_f2l __aeabi_f2lz
  285. #define fp64_f2ul __aeabi_f2ulz
  286. #endif
  287. #elif LJ_TARGET_MIPS || LJ_TARGET_PPC
  288. #define softfp_add __adddf3
  289. #define softfp_sub __subdf3
  290. #define softfp_mul __muldf3
  291. #define softfp_div __divdf3
  292. #define softfp_cmp __ledf2
  293. #define softfp_i2d __floatsidf
  294. #define softfp_d2i __fixdfsi
  295. #define softfp_ui2d __floatunsidf
  296. #define softfp_f2d __extendsfdf2
  297. #define softfp_d2ui __fixunsdfsi
  298. #define softfp_d2f __truncdfsf2
  299. #define softfp_i2f __floatsisf
  300. #define softfp_ui2f __floatunsisf
  301. #define softfp_f2i __fixsfsi
  302. #define softfp_f2ui __fixunssfsi
  303. #else
  304. #error "Missing soft-float definitions for target architecture"
  305. #endif
  306. extern double softfp_add(double a, double b);
  307. extern double softfp_sub(double a, double b);
  308. extern double softfp_mul(double a, double b);
  309. extern double softfp_div(double a, double b);
  310. extern void softfp_cmp(double a, double b);
  311. extern double softfp_i2d(int32_t a);
  312. extern int32_t softfp_d2i(double a);
  313. #if LJ_HASFFI
  314. extern double softfp_ui2d(uint32_t a);
  315. extern double softfp_f2d(float a);
  316. extern uint32_t softfp_d2ui(double a);
  317. extern float softfp_d2f(double a);
  318. extern float softfp_i2f(int32_t a);
  319. extern float softfp_ui2f(uint32_t a);
  320. extern int32_t softfp_f2i(float a);
  321. extern uint32_t softfp_f2ui(float a);
  322. #endif
  323. #if LJ_TARGET_MIPS
  324. extern double lj_vm_sfmin(double a, double b);
  325. extern double lj_vm_sfmax(double a, double b);
  326. #endif
  327. #endif
  328. #if LJ_HASFFI && LJ_NEED_FP64 && !(LJ_TARGET_ARM && LJ_SOFTFP)
  329. #if defined(__GNUC__) || defined(__clang__)
  330. #define fp64_l2d __floatdidf
  331. #define fp64_ul2d __floatundidf
  332. #define fp64_l2f __floatdisf
  333. #define fp64_ul2f __floatundisf
  334. #define fp64_d2l __fixdfdi
  335. #define fp64_d2ul __fixunsdfdi
  336. #define fp64_f2l __fixsfdi
  337. #define fp64_f2ul __fixunssfdi
  338. #else
  339. #error "Missing fp64 helper definitions for this compiler"
  340. #endif
  341. #endif
  342. #if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)
  343. extern double fp64_l2d(int64_t a);
  344. extern double fp64_ul2d(uint64_t a);
  345. extern float fp64_l2f(int64_t a);
  346. extern float fp64_ul2f(uint64_t a);
  347. extern int64_t fp64_d2l(double a);
  348. extern uint64_t fp64_d2ul(double a);
  349. extern int64_t fp64_f2l(float a);
  350. extern uint64_t fp64_f2ul(float a);
  351. #endif
  352. #endif