root/lj_ircall.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. IRCALLDEF

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

/* [<][>][^][v][top][bottom][index][help] */