diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_ir.h | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/lj_ir.h b/src/lj_ir.h index b245d1b8..cd8df59d 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
@@ -40,6 +40,7 @@ | |||
40 | _(USE, S , ref, ___) \ | 40 | _(USE, S , ref, ___) \ |
41 | _(PHI, S , ref, ref) \ | 41 | _(PHI, S , ref, ref) \ |
42 | _(RENAME, S , ref, lit) \ | 42 | _(RENAME, S , ref, lit) \ |
43 | _(PROF, S , ___, ___) \ | ||
43 | \ | 44 | \ |
44 | /* Constants. */ \ | 45 | /* Constants. */ \ |
45 | _(KPRI, N , ___, ___) \ | 46 | _(KPRI, N , ___, ___) \ |
@@ -96,6 +97,7 @@ | |||
96 | _(UREFC, LW, ref, lit) \ | 97 | _(UREFC, LW, ref, lit) \ |
97 | _(FREF, R , ref, lit) \ | 98 | _(FREF, R , ref, lit) \ |
98 | _(STRREF, N , ref, ref) \ | 99 | _(STRREF, N , ref, ref) \ |
100 | _(LREF, L , ___, ___) \ | ||
99 | \ | 101 | \ |
100 | /* Loads and Stores. These must be in the same order. */ \ | 102 | /* Loads and Stores. These must be in the same order. */ \ |
101 | _(ALOAD, L , ref, ___) \ | 103 | _(ALOAD, L , ref, ___) \ |
@@ -120,6 +122,11 @@ | |||
120 | _(CNEW, AW, ref, ref) \ | 122 | _(CNEW, AW, ref, ref) \ |
121 | _(CNEWI, NW, ref, ref) /* CSE is ok, not marked as A. */ \ | 123 | _(CNEWI, NW, ref, ref) /* CSE is ok, not marked as A. */ \ |
122 | \ | 124 | \ |
125 | /* Buffer operations. */ \ | ||
126 | _(BUFHDR, L , ref, lit) \ | ||
127 | _(BUFPUT, L , ref, ref) \ | ||
128 | _(BUFSTR, A , ref, ref) \ | ||
129 | \ | ||
123 | /* Barriers. */ \ | 130 | /* Barriers. */ \ |
124 | _(TBAR, S , ref, ___) \ | 131 | _(TBAR, S , ref, ___) \ |
125 | _(OBAR, S , ref, ref) \ | 132 | _(OBAR, S , ref, ref) \ |
@@ -128,11 +135,12 @@ | |||
128 | /* Type conversions. */ \ | 135 | /* Type conversions. */ \ |
129 | _(CONV, NW, ref, lit) \ | 136 | _(CONV, NW, ref, lit) \ |
130 | _(TOBIT, N , ref, ref) \ | 137 | _(TOBIT, N , ref, ref) \ |
131 | _(TOSTR, N , ref, ___) \ | 138 | _(TOSTR, N , ref, lit) \ |
132 | _(STRTO, N , ref, ___) \ | 139 | _(STRTO, N , ref, ___) \ |
133 | \ | 140 | \ |
134 | /* Calls. */ \ | 141 | /* Calls. */ \ |
135 | _(CALLN, N , ref, lit) \ | 142 | _(CALLN, N , ref, lit) \ |
143 | _(CALLA, A , ref, lit) \ | ||
136 | _(CALLL, L , ref, lit) \ | 144 | _(CALLL, L , ref, lit) \ |
137 | _(CALLS, S , ref, lit) \ | 145 | _(CALLS, S , ref, lit) \ |
138 | _(CALLXS, S , ref, ref) \ | 146 | _(CALLXS, S , ref, ref) \ |
@@ -186,6 +194,8 @@ IRFPMDEF(FPMENUM) | |||
186 | _(STR_LEN, offsetof(GCstr, len)) \ | 194 | _(STR_LEN, offsetof(GCstr, len)) \ |
187 | _(FUNC_ENV, offsetof(GCfunc, l.env)) \ | 195 | _(FUNC_ENV, offsetof(GCfunc, l.env)) \ |
188 | _(FUNC_PC, offsetof(GCfunc, l.pc)) \ | 196 | _(FUNC_PC, offsetof(GCfunc, l.pc)) \ |
197 | _(FUNC_FFID, offsetof(GCfunc, l.ffid)) \ | ||
198 | _(THREAD_ENV, offsetof(lua_State, env)) \ | ||
189 | _(TAB_META, offsetof(GCtab, metatable)) \ | 199 | _(TAB_META, offsetof(GCtab, metatable)) \ |
190 | _(TAB_ARRAY, offsetof(GCtab, array)) \ | 200 | _(TAB_ARRAY, offsetof(GCtab, array)) \ |
191 | _(TAB_NODE, offsetof(GCtab, node)) \ | 201 | _(TAB_NODE, offsetof(GCtab, node)) \ |
@@ -221,13 +231,16 @@ IRFLDEF(FLENUM) | |||
221 | #define IRXLOAD_VOLATILE 2 /* Load from volatile data. */ | 231 | #define IRXLOAD_VOLATILE 2 /* Load from volatile data. */ |
222 | #define IRXLOAD_UNALIGNED 4 /* Unaligned load. */ | 232 | #define IRXLOAD_UNALIGNED 4 /* Unaligned load. */ |
223 | 233 | ||
234 | /* BUFHDR mode, stored in op2. */ | ||
235 | #define IRBUFHDR_RESET 0 /* Reset buffer. */ | ||
236 | #define IRBUFHDR_APPEND 1 /* Append to buffer. */ | ||
237 | |||
224 | /* CONV mode, stored in op2. */ | 238 | /* CONV mode, stored in op2. */ |
225 | #define IRCONV_SRCMASK 0x001f /* Source IRType. */ | 239 | #define IRCONV_SRCMASK 0x001f /* Source IRType. */ |
226 | #define IRCONV_DSTMASK 0x03e0 /* Dest. IRType (also in ir->t). */ | 240 | #define IRCONV_DSTMASK 0x03e0 /* Dest. IRType (also in ir->t). */ |
227 | #define IRCONV_DSH 5 | 241 | #define IRCONV_DSH 5 |
228 | #define IRCONV_NUM_INT ((IRT_NUM<<IRCONV_DSH)|IRT_INT) | 242 | #define IRCONV_NUM_INT ((IRT_NUM<<IRCONV_DSH)|IRT_INT) |
229 | #define IRCONV_INT_NUM ((IRT_INT<<IRCONV_DSH)|IRT_NUM) | 243 | #define IRCONV_INT_NUM ((IRT_INT<<IRCONV_DSH)|IRT_NUM) |
230 | #define IRCONV_TRUNC 0x0400 /* Truncate number to integer. */ | ||
231 | #define IRCONV_SEXT 0x0800 /* Sign-extend integer to integer. */ | 244 | #define IRCONV_SEXT 0x0800 /* Sign-extend integer to integer. */ |
232 | #define IRCONV_MODEMASK 0x0fff | 245 | #define IRCONV_MODEMASK 0x0fff |
233 | #define IRCONV_CONVMASK 0xf000 | 246 | #define IRCONV_CONVMASK 0xf000 |
@@ -238,6 +251,11 @@ IRFLDEF(FLENUM) | |||
238 | #define IRCONV_INDEX (2<<IRCONV_CSH) /* Check + special backprop rules. */ | 251 | #define IRCONV_INDEX (2<<IRCONV_CSH) /* Check + special backprop rules. */ |
239 | #define IRCONV_CHECK (3<<IRCONV_CSH) /* Number checked for integerness. */ | 252 | #define IRCONV_CHECK (3<<IRCONV_CSH) /* Number checked for integerness. */ |
240 | 253 | ||
254 | /* TOSTR mode, stored in op2. */ | ||
255 | #define IRTOSTR_INT 0 /* Convert integer to string. */ | ||
256 | #define IRTOSTR_NUM 1 /* Convert number to string. */ | ||
257 | #define IRTOSTR_CHAR 2 /* Convert char value to string. */ | ||
258 | |||
241 | /* -- IR operands --------------------------------------------------------- */ | 259 | /* -- IR operands --------------------------------------------------------- */ |
242 | 260 | ||
243 | /* IR operand mode (2 bit). */ | 261 | /* IR operand mode (2 bit). */ |
@@ -302,6 +320,7 @@ IRTDEF(IRTENUM) | |||
302 | IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32, | 320 | IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32, |
303 | IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT, | 321 | IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT, |
304 | IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32, | 322 | IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32, |
323 | /* TODO_GC64: major changes required for all uses of IRT_P32. */ | ||
305 | 324 | ||
306 | /* Additional flags. */ | 325 | /* Additional flags. */ |
307 | IRT_MARK = 0x20, /* Marker for misc. purposes. */ | 326 | IRT_MARK = 0x20, /* Marker for misc. purposes. */ |
@@ -353,7 +372,12 @@ typedef struct IRType1 { uint8_t irt; } IRType1; | |||
353 | #define irt_isaddr(t) (irt_typerange((t), IRT_LIGHTUD, IRT_UDATA)) | 372 | #define irt_isaddr(t) (irt_typerange((t), IRT_LIGHTUD, IRT_UDATA)) |
354 | #define irt_isint64(t) (irt_typerange((t), IRT_I64, IRT_U64)) | 373 | #define irt_isint64(t) (irt_typerange((t), IRT_I64, IRT_U64)) |
355 | 374 | ||
356 | #if LJ_64 | 375 | #if LJ_GC64 |
376 | #define IRT_IS64 \ | ||
377 | ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|\ | ||
378 | (1u<<IRT_LIGHTUD)|(1u<<IRT_STR)|(1u<<IRT_THREAD)|(1u<<IRT_PROTO)|\ | ||
379 | (1u<<IRT_FUNC)|(1u<<IRT_CDATA)|(1u<<IRT_TAB)|(1u<<IRT_UDATA)) | ||
380 | #elif LJ_64 | ||
357 | #define IRT_IS64 \ | 381 | #define IRT_IS64 \ |
358 | ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|(1u<<IRT_LIGHTUD)) | 382 | ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|(1u<<IRT_LIGHTUD)) |
359 | #else | 383 | #else |
@@ -374,7 +398,7 @@ static LJ_AINLINE IRType itype2irt(const TValue *tv) | |||
374 | return IRT_INT; | 398 | return IRT_INT; |
375 | else if (tvisnum(tv)) | 399 | else if (tvisnum(tv)) |
376 | return IRT_NUM; | 400 | return IRT_NUM; |
377 | #if LJ_64 | 401 | #if LJ_64 && !LJ_GC64 |
378 | else if (tvislightud(tv)) | 402 | else if (tvislightud(tv)) |
379 | return IRT_LIGHTUD; | 403 | return IRT_LIGHTUD; |
380 | #endif | 404 | #endif |
@@ -464,6 +488,7 @@ typedef uint32_t TRef; | |||
464 | #define tref_isnil(tr) (tref_istype((tr), IRT_NIL)) | 488 | #define tref_isnil(tr) (tref_istype((tr), IRT_NIL)) |
465 | #define tref_isfalse(tr) (tref_istype((tr), IRT_FALSE)) | 489 | #define tref_isfalse(tr) (tref_istype((tr), IRT_FALSE)) |
466 | #define tref_istrue(tr) (tref_istype((tr), IRT_TRUE)) | 490 | #define tref_istrue(tr) (tref_istype((tr), IRT_TRUE)) |
491 | #define tref_islightud(tr) (tref_istype((tr), IRT_LIGHTUD)) | ||
467 | #define tref_isstr(tr) (tref_istype((tr), IRT_STR)) | 492 | #define tref_isstr(tr) (tref_istype((tr), IRT_STR)) |
468 | #define tref_isfunc(tr) (tref_istype((tr), IRT_FUNC)) | 493 | #define tref_isfunc(tr) (tref_istype((tr), IRT_FUNC)) |
469 | #define tref_iscdata(tr) (tref_istype((tr), IRT_CDATA)) | 494 | #define tref_iscdata(tr) (tref_istype((tr), IRT_CDATA)) |
@@ -528,6 +553,7 @@ typedef union IRIns { | |||
528 | MRef ptr; /* Pointer constant (overlaps op12). */ | 553 | MRef ptr; /* Pointer constant (overlaps op12). */ |
529 | } IRIns; | 554 | } IRIns; |
530 | 555 | ||
556 | /* TODO_GC64: major changes required. */ | ||
531 | #define ir_kgc(ir) check_exp((ir)->o == IR_KGC, gcref((ir)->gcr)) | 557 | #define ir_kgc(ir) check_exp((ir)->o == IR_KGC, gcref((ir)->gcr)) |
532 | #define ir_kstr(ir) (gco2str(ir_kgc((ir)))) | 558 | #define ir_kstr(ir) (gco2str(ir_kgc((ir)))) |
533 | #define ir_ktab(ir) (gco2tab(ir_kgc((ir)))) | 559 | #define ir_ktab(ir) (gco2tab(ir_kgc((ir)))) |