lj_vm.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. ** Assembler VM interface definitions.
  3. ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
  4. */
  5. #ifndef _LJ_VM_H
  6. #define _LJ_VM_H
  7. #include "lj_obj.h"
  8. /* Entry points for ASM parts of VM. */
  9. LJ_ASMF void lj_vm_call(lua_State *L, TValue *base, int nres1);
  10. LJ_ASMF int lj_vm_pcall(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);
  11. typedef TValue *(*lua_CPFunction)(lua_State *L, lua_CFunction func, void *ud);
  12. LJ_ASMF int lj_vm_cpcall(lua_State *L, lua_CFunction func, void *ud,
  13. lua_CPFunction cp);
  14. LJ_ASMF int lj_vm_resume(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);
  15. LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_c(void *cframe, int errcode);
  16. LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_ff(void *cframe);
  17. #if LJ_ABI_WIN && LJ_TARGET_X86
  18. LJ_ASMF_NORET void LJ_FASTCALL lj_vm_rtlunwind(void *cframe, void *excptrec,
  19. void *unwinder, int errcode);
  20. #endif
  21. LJ_ASMF void lj_vm_unwind_c_eh(void);
  22. LJ_ASMF void lj_vm_unwind_ff_eh(void);
  23. #if LJ_TARGET_X86ORX64
  24. LJ_ASMF void lj_vm_unwind_rethrow(void);
  25. #endif
  26. #if LJ_TARGET_MIPS
  27. LJ_ASMF void lj_vm_unwind_stub(void);
  28. #endif
  29. /* Miscellaneous functions. */
  30. #if LJ_TARGET_X86ORX64
  31. LJ_ASMF int lj_vm_cpuid(uint32_t f, uint32_t res[4]);
  32. #endif
  33. #if LJ_TARGET_PPC
  34. void lj_vm_cachesync(void *start, void *end);
  35. #endif
  36. LJ_ASMF double lj_vm_foldarith(double x, double y, int op);
  37. #if LJ_HASJIT
  38. LJ_ASMF double lj_vm_foldfpm(double x, int op);
  39. #endif
  40. #if !LJ_ARCH_HASFPU
  41. /* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */
  42. #endif
  43. /* Dispatch targets for recording and hooks. */
  44. LJ_ASMF void lj_vm_record(void);
  45. LJ_ASMF void lj_vm_inshook(void);
  46. LJ_ASMF void lj_vm_rethook(void);
  47. LJ_ASMF void lj_vm_callhook(void);
  48. LJ_ASMF void lj_vm_profhook(void);
  49. LJ_ASMF void lj_vm_IITERN(void);
  50. /* Trace exit handling. */
  51. LJ_ASMF char lj_vm_exit_handler[];
  52. LJ_ASMF char lj_vm_exit_interp[];
  53. /* Internal math helper functions. */
  54. #if LJ_TARGET_PPC || LJ_TARGET_ARM64 || (LJ_TARGET_MIPS && LJ_ABI_SOFTFP)
  55. #define lj_vm_floor floor
  56. #define lj_vm_ceil ceil
  57. #else
  58. LJ_ASMF double lj_vm_floor(double);
  59. LJ_ASMF double lj_vm_ceil(double);
  60. #if LJ_TARGET_ARM
  61. LJ_ASMF double lj_vm_floor_sf(double);
  62. LJ_ASMF double lj_vm_ceil_sf(double);
  63. #endif
  64. #endif
  65. #ifdef LUAJIT_NO_LOG2
  66. LJ_ASMF double lj_vm_log2(double);
  67. #else
  68. #define lj_vm_log2 log2
  69. #endif
  70. #if !(defined(_LJ_DISPATCH_H) && LJ_TARGET_MIPS)
  71. LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t);
  72. #endif
  73. #if LJ_HASJIT
  74. #if LJ_TARGET_X86ORX64
  75. LJ_ASMF void lj_vm_floor_sse(void);
  76. LJ_ASMF void lj_vm_ceil_sse(void);
  77. LJ_ASMF void lj_vm_trunc_sse(void);
  78. #endif
  79. #if LJ_TARGET_PPC || LJ_TARGET_ARM64
  80. #define lj_vm_trunc trunc
  81. #else
  82. LJ_ASMF double lj_vm_trunc(double);
  83. #if LJ_TARGET_ARM
  84. LJ_ASMF double lj_vm_trunc_sf(double);
  85. #endif
  86. #endif
  87. #if LJ_HASFFI
  88. LJ_ASMF int lj_vm_errno(void);
  89. #endif
  90. LJ_ASMF TValue *lj_vm_next(GCtab *t, uint32_t idx);
  91. #endif
  92. /* Continuations for metamethods. */
  93. LJ_ASMF void lj_cont_cat(void); /* Continue with concatenation. */
  94. LJ_ASMF void lj_cont_ra(void); /* Store result in RA from instruction. */
  95. LJ_ASMF void lj_cont_nop(void); /* Do nothing, just continue execution. */
  96. LJ_ASMF void lj_cont_condt(void); /* Branch if result is true. */
  97. LJ_ASMF void lj_cont_condf(void); /* Branch if result is false. */
  98. LJ_ASMF void lj_cont_hook(void); /* Continue from hook yield. */
  99. LJ_ASMF void lj_cont_stitch(void); /* Trace stitching. */
  100. /* Start of the ASM code. */
  101. LJ_ASMF char lj_vm_asm_begin[];
  102. /* Bytecode offsets are relative to lj_vm_asm_begin. */
  103. #define makeasmfunc(ofs) lj_ptr_sign((ASMFunction)(lj_vm_asm_begin + (ofs)), 0)
  104. #endif