diff options
Diffstat (limited to 'src/lj_ir.h')
-rw-r--r-- | src/lj_ir.h | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/src/lj_ir.h b/src/lj_ir.h index 4c72d88f..22127806 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
@@ -15,7 +15,7 @@ | |||
15 | /* Miscellaneous ops. */ \ | 15 | /* Miscellaneous ops. */ \ |
16 | _(NOP, N , ___, ___) \ | 16 | _(NOP, N , ___, ___) \ |
17 | _(BASE, N , lit, lit) \ | 17 | _(BASE, N , lit, lit) \ |
18 | _(LOOP, G , ___, ___) \ | 18 | _(LOOP, S , ___, ___) \ |
19 | _(PHI, S , ref, ref) \ | 19 | _(PHI, S , ref, ref) \ |
20 | _(RENAME, S , ref, lit) \ | 20 | _(RENAME, S , ref, lit) \ |
21 | \ | 21 | \ |
@@ -30,21 +30,21 @@ | |||
30 | \ | 30 | \ |
31 | /* Guarded assertions. */ \ | 31 | /* Guarded assertions. */ \ |
32 | /* Must be properly aligned to flip opposites (^1) and (un)ordered (^4). */ \ | 32 | /* Must be properly aligned to flip opposites (^1) and (un)ordered (^4). */ \ |
33 | _(EQ, GC, ref, ref) \ | 33 | _(EQ, C , ref, ref) \ |
34 | _(NE, GC, ref, ref) \ | 34 | _(NE, C , ref, ref) \ |
35 | \ | 35 | \ |
36 | _(ABC, G , ref, ref) \ | 36 | _(ABC, N , ref, ref) \ |
37 | _(RETF, SG, ref, ref) \ | 37 | _(RETF, S , ref, ref) \ |
38 | \ | 38 | \ |
39 | _(LT, G , ref, ref) \ | 39 | _(LT, N , ref, ref) \ |
40 | _(GE, G , ref, ref) \ | 40 | _(GE, N , ref, ref) \ |
41 | _(LE, G , ref, ref) \ | 41 | _(LE, N , ref, ref) \ |
42 | _(GT, G , ref, ref) \ | 42 | _(GT, N , ref, ref) \ |
43 | \ | 43 | \ |
44 | _(ULT, G , ref, ref) \ | 44 | _(ULT, N , ref, ref) \ |
45 | _(UGE, G , ref, ref) \ | 45 | _(UGE, N , ref, ref) \ |
46 | _(ULE, G , ref, ref) \ | 46 | _(ULE, N , ref, ref) \ |
47 | _(UGT, G , ref, ref) \ | 47 | _(UGT, N , ref, ref) \ |
48 | \ | 48 | \ |
49 | /* Bit ops. */ \ | 49 | /* Bit ops. */ \ |
50 | _(BNOT, N , ref, ___) \ | 50 | _(BNOT, N , ref, ___) \ |
@@ -75,27 +75,27 @@ | |||
75 | _(MAX, C , ref, ref) \ | 75 | _(MAX, C , ref, ref) \ |
76 | \ | 76 | \ |
77 | /* Overflow-checking arithmetic ops. */ \ | 77 | /* Overflow-checking arithmetic ops. */ \ |
78 | _(ADDOV, GC, ref, ref) \ | 78 | _(ADDOV, C , ref, ref) \ |
79 | _(SUBOV, G , ref, ref) \ | 79 | _(SUBOV, N , ref, ref) \ |
80 | \ | 80 | \ |
81 | /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \ | 81 | /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \ |
82 | \ | 82 | \ |
83 | /* Memory references. */ \ | 83 | /* Memory references. */ \ |
84 | _(AREF, R , ref, ref) \ | 84 | _(AREF, R , ref, ref) \ |
85 | _(HREFK, RG, ref, ref) \ | 85 | _(HREFK, R , ref, ref) \ |
86 | _(HREF, L , ref, ref) \ | 86 | _(HREF, L , ref, ref) \ |
87 | _(NEWREF, S , ref, ref) \ | 87 | _(NEWREF, S , ref, ref) \ |
88 | _(UREFO, LG, ref, lit) \ | 88 | _(UREFO, LW, ref, lit) \ |
89 | _(UREFC, LG, ref, lit) \ | 89 | _(UREFC, LW, ref, lit) \ |
90 | _(FREF, R , ref, lit) \ | 90 | _(FREF, R , ref, lit) \ |
91 | _(STRREF, N , ref, ref) \ | 91 | _(STRREF, N , ref, ref) \ |
92 | \ | 92 | \ |
93 | /* Loads and Stores. These must be in the same order. */ \ | 93 | /* Loads and Stores. These must be in the same order. */ \ |
94 | _(ALOAD, LG, ref, ___) \ | 94 | _(ALOAD, L , ref, ___) \ |
95 | _(HLOAD, LG, ref, ___) \ | 95 | _(HLOAD, L , ref, ___) \ |
96 | _(ULOAD, LG, ref, ___) \ | 96 | _(ULOAD, L , ref, ___) \ |
97 | _(FLOAD, L , ref, lit) \ | 97 | _(FLOAD, L , ref, lit) \ |
98 | _(SLOAD, LG, lit, lit) \ | 98 | _(SLOAD, L , lit, lit) \ |
99 | _(XLOAD, L , ref, lit) \ | 99 | _(XLOAD, L , ref, lit) \ |
100 | \ | 100 | \ |
101 | _(ASTORE, S , ref, ref) \ | 101 | _(ASTORE, S , ref, ref) \ |
@@ -105,8 +105,8 @@ | |||
105 | \ | 105 | \ |
106 | /* Allocations. */ \ | 106 | /* Allocations. */ \ |
107 | _(SNEW, N , ref, ref) /* CSE is ok, so not marked as A. */ \ | 107 | _(SNEW, N , ref, ref) /* CSE is ok, so not marked as A. */ \ |
108 | _(TNEW, A , lit, lit) \ | 108 | _(TNEW, AW, lit, lit) \ |
109 | _(TDUP, A , ref, ___) \ | 109 | _(TDUP, AW, ref, ___) \ |
110 | \ | 110 | \ |
111 | /* Write barriers. */ \ | 111 | /* Write barriers. */ \ |
112 | _(TBAR, S , ref, ___) \ | 112 | _(TBAR, S , ref, ___) \ |
@@ -117,7 +117,7 @@ | |||
117 | _(TOINT, N , ref, lit) \ | 117 | _(TOINT, N , ref, lit) \ |
118 | _(TOBIT, N , ref, ref) \ | 118 | _(TOBIT, N , ref, ref) \ |
119 | _(TOSTR, N , ref, ___) \ | 119 | _(TOSTR, N , ref, ___) \ |
120 | _(STRTO, G , ref, ___) \ | 120 | _(STRTO, N , ref, ___) \ |
121 | \ | 121 | \ |
122 | /* Calls. */ \ | 122 | /* Calls. */ \ |
123 | _(CALLN, N , ref, lit) \ | 123 | _(CALLN, N , ref, lit) \ |
@@ -274,7 +274,7 @@ typedef enum { | |||
274 | } IRMode; | 274 | } IRMode; |
275 | #define IRM___ IRMnone | 275 | #define IRM___ IRMnone |
276 | 276 | ||
277 | /* Mode bits: Commutative, {Normal/Ref, Alloc, Load, Store}, Guard. */ | 277 | /* Mode bits: Commutative, {Normal/Ref, Alloc, Load, Store}, Non-weak guard. */ |
278 | #define IRM_C 0x10 | 278 | #define IRM_C 0x10 |
279 | 279 | ||
280 | #define IRM_N 0x00 | 280 | #define IRM_N 0x00 |
@@ -283,22 +283,17 @@ typedef enum { | |||
283 | #define IRM_L 0x40 | 283 | #define IRM_L 0x40 |
284 | #define IRM_S 0x60 | 284 | #define IRM_S 0x60 |
285 | 285 | ||
286 | #define IRM_G 0x80 | 286 | #define IRM_W 0x80 |
287 | 287 | ||
288 | #define IRM_GC (IRM_G|IRM_C) | 288 | #define IRM_AW (IRM_A|IRM_W) |
289 | #define IRM_RG (IRM_R|IRM_G) | 289 | #define IRM_LW (IRM_L|IRM_W) |
290 | #define IRM_LG (IRM_L|IRM_G) | ||
291 | #define IRM_SG (IRM_S|IRM_G) | ||
292 | 290 | ||
293 | #define irm_op1(m) (cast(IRMode, (m)&3)) | 291 | #define irm_op1(m) (cast(IRMode, (m)&3)) |
294 | #define irm_op2(m) (cast(IRMode, ((m)>>2)&3)) | 292 | #define irm_op2(m) (cast(IRMode, ((m)>>2)&3)) |
295 | #define irm_iscomm(m) ((m) & IRM_C) | 293 | #define irm_iscomm(m) ((m) & IRM_C) |
296 | #define irm_kind(m) ((m) & IRM_S) | 294 | #define irm_kind(m) ((m) & IRM_S) |
297 | #define irm_isguard(m) ((m) & IRM_G) | ||
298 | /* Stores or any other op with a guard has a side-effect. */ | ||
299 | #define irm_sideeff(m) ((m) >= IRM_S) | ||
300 | 295 | ||
301 | #define IRMODE(name, m, m1, m2) ((IRM##m1)|((IRM##m2)<<2)|(IRM_##m)), | 296 | #define IRMODE(name, m, m1, m2) (((IRM##m1)|((IRM##m2)<<2)|(IRM_##m))^IRM_W), |
302 | 297 | ||
303 | LJ_DATA const uint8_t lj_ir_mode[IR__MAX+1]; | 298 | LJ_DATA const uint8_t lj_ir_mode[IR__MAX+1]; |
304 | 299 | ||
@@ -335,8 +330,8 @@ typedef enum { | |||
335 | 330 | ||
336 | /* Additional flags. */ | 331 | /* Additional flags. */ |
337 | IRT_MARK = 0x20, /* Marker for misc. purposes. */ | 332 | IRT_MARK = 0x20, /* Marker for misc. purposes. */ |
338 | IRT_GUARD = 0x40, /* Instruction is a guard. */ | 333 | IRT_ISPHI = 0x40, /* Instruction is left or right PHI operand. */ |
339 | IRT_ISPHI = 0x80, /* Instruction is left or right PHI operand. */ | 334 | IRT_GUARD = 0x80, /* Instruction is a guard. */ |
340 | 335 | ||
341 | /* Masks. */ | 336 | /* Masks. */ |
342 | IRT_TYPE = 0x1f, | 337 | IRT_TYPE = 0x1f, |
@@ -531,4 +526,12 @@ typedef union IRIns { | |||
531 | #define ir_knum(ir) check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue)) | 526 | #define ir_knum(ir) check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue)) |
532 | #define ir_kptr(ir) check_exp((ir)->o == IR_KPTR, mref((ir)->ptr, void)) | 527 | #define ir_kptr(ir) check_exp((ir)->o == IR_KPTR, mref((ir)->ptr, void)) |
533 | 528 | ||
529 | LJ_STATIC_ASSERT((int)IRT_GUARD == (int)IRM_W); | ||
530 | |||
531 | /* A store or any other op with a non-weak guard has a side-effect. */ | ||
532 | static LJ_AINLINE int ir_sideeff(IRIns *ir) | ||
533 | { | ||
534 | return (((ir->t.irt | ~IRT_GUARD) & lj_ir_mode[ir->o]) >= IRM_S); | ||
535 | } | ||
536 | |||
534 | #endif | 537 | #endif |