-
Notifications
You must be signed in to change notification settings - Fork 514
/
duk_js_bytecode.h
482 lines (464 loc) · 19.9 KB
/
duk_js_bytecode.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
/*
* ECMAScript bytecode
*/
#if !defined(DUK_JS_BYTECODE_H_INCLUDED)
#define DUK_JS_BYTECODE_H_INCLUDED
/*
* Bytecode instruction layout
* ===========================
*
* Instructions are unsigned 32-bit integers divided as follows:
*
* !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
* !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
* +-----------------------------------------------+---------------+
* ! C ! B ! A ! OP !
* +-----------------------------------------------+---------------+
*
* OP (8 bits): opcode (DUK_OP_*), access should be fastest
* consecutive opcodes allocated when opcode needs flags
* A (8 bits): typically a target register number
* B (8 bits): typically first source register/constant number
* C (8 bits): typically second source register/constant number
*
* Some instructions combine BC or ABC together for larger parameter values.
* Signed integers (e.g. jump offsets) are encoded as unsigned, with an
* opcode specific bias.
*
* Some opcodes have flags which are handled by allocating consecutive
* opcodes to make space for 1-N flags. Flags can also be e.g. in the 'A'
* field when there's room for the specific opcode.
*
* For example, if three flags were needed, they could be allocated from
* the opcode field as follows:
*
* !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
* !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
* +-----------------------------------------------+---------------+
* ! C ! B ! A ! OP !Z!Y!X!
* +-----------------------------------------------+---------------+
*
* Some opcodes accept a reg/const argument which is handled by allocating
* flags in the OP field, see DUK_BC_ISREG() and DUK_BC_ISCONST(). The
* following convention is shared by most opcodes, so that the compiler
* can handle reg/const flagging without opcode specific code paths:
*
* !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
* !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
* +-----------------------------------------------+---------------+
* ! C ! B ! A ! OP !Y!X!
* +-----------------------------------------------+---------------+
*
* X 1=B is const, 0=B is reg
* Y 1=C is const, 0=C is reg
*
* In effect OP, OP + 1, OP + 2, and OP + 3 are allocated from the
* 8-bit opcode space for a single logical opcode. The base opcode
* number should be divisible by 4. If the opcode is called 'FOO'
* the following opcode constants would be defined:
*
* DUK_OP_FOO 100 // base opcode number
* DUK_OP_FOO_RR 100 // FOO, B=reg, C=reg
* DUK_OP_FOO_CR 101 // FOO, B=const, C=reg
* DUK_OP_FOO_RC 102 // FOO, B=reg, C=const
* DUK_OP_FOO_CC 103 // FOO, B=const, C=const
*
* If only B or C is a reg/const, the unused opcode combinations can be
* used for other opcodes (which take no reg/const argument). However,
* such opcode values are initially reserved, at least while opcode space
* is available. For example, if 'BAR' uses B for a register field and
* C is a reg/const:
*
* DUK_OP_BAR 116 // base opcode number
* DUK_OP_BAR_RR 116 // BAR, B=reg, C=reg
* DUK_OP_BAR_CR_UNUSED 117 // unused, could be repurposed
* DUK_OP_BAR_RC 118 // BAR, B=reg, C=const
* DUK_OP_BAR_CC_UNUSED 119 // unused, could be repurposed
*
* Macro naming is a bit misleading, e.g. "ABC" in macro name but the
* field layout is concretely "CBA" in the register.
*/
typedef duk_uint32_t duk_instr_t;
#define DUK_BC_SHIFT_OP 0
#define DUK_BC_SHIFT_A 8
#define DUK_BC_SHIFT_B 16
#define DUK_BC_SHIFT_C 24
#define DUK_BC_SHIFT_BC DUK_BC_SHIFT_B
#define DUK_BC_SHIFT_ABC DUK_BC_SHIFT_A
#define DUK_BC_UNSHIFTED_MASK_OP 0xffUL
#define DUK_BC_UNSHIFTED_MASK_A 0xffUL
#define DUK_BC_UNSHIFTED_MASK_B 0xffUL
#define DUK_BC_UNSHIFTED_MASK_C 0xffUL
#define DUK_BC_UNSHIFTED_MASK_BC 0xffffUL
#define DUK_BC_UNSHIFTED_MASK_ABC 0xffffffUL
#define DUK_BC_SHIFTED_MASK_OP (DUK_BC_UNSHIFTED_MASK_OP << DUK_BC_SHIFT_OP)
#define DUK_BC_SHIFTED_MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK_BC_SHIFT_A)
#define DUK_BC_SHIFTED_MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK_BC_SHIFT_B)
#define DUK_BC_SHIFTED_MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK_BC_SHIFT_C)
#define DUK_BC_SHIFTED_MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK_BC_SHIFT_BC)
#define DUK_BC_SHIFTED_MASK_ABC (DUK_BC_UNSHIFTED_MASK_ABC << DUK_BC_SHIFT_ABC)
#define DUK_DEC_OP(x) ((x) & 0xffUL)
#define DUK_DEC_A(x) (((x) >> 8) & 0xffUL)
#define DUK_DEC_B(x) (((x) >> 16) & 0xffUL)
#define DUK_DEC_C(x) (((x) >> 24) & 0xffUL)
#define DUK_DEC_BC(x) (((x) >> 16) & 0xffffUL)
#define DUK_DEC_ABC(x) (((x) >> 8) & 0xffffffUL)
#define DUK_ENC_OP(op) ((duk_instr_t) (op))
#define DUK_ENC_OP_ABC(op,abc) ((duk_instr_t) ( \
(((duk_instr_t) (abc)) << 8) | \
((duk_instr_t) (op)) \
))
#define DUK_ENC_OP_A_BC(op,a,bc) ((duk_instr_t) ( \
(((duk_instr_t) (bc)) << 16) | \
(((duk_instr_t) (a)) << 8) | \
((duk_instr_t) (op)) \
))
#define DUK_ENC_OP_A_B_C(op,a,b,c) ((duk_instr_t) ( \
(((duk_instr_t) (c)) << 24) | \
(((duk_instr_t) (b)) << 16) | \
(((duk_instr_t) (a)) << 8) | \
((duk_instr_t) (op)) \
))
#define DUK_ENC_OP_A_B(op,a,b) DUK_ENC_OP_A_B_C((op),(a),(b),0)
#define DUK_ENC_OP_A(op,a) DUK_ENC_OP_A_B_C((op),(a),0,0)
#define DUK_ENC_OP_BC(op,bc) DUK_ENC_OP_A_BC((op),0,(bc))
/* Get opcode base value with B/C reg/const flags cleared. */
#define DUK_BC_NOREGCONST_OP(op) ((op) & 0xfc)
/* Constants should be signed so that signed arithmetic involving them
* won't cause values to be coerced accidentally to unsigned.
*/
#define DUK_BC_OP_MIN 0
#define DUK_BC_OP_MAX 0xffL
#define DUK_BC_A_MIN 0
#define DUK_BC_A_MAX 0xffL
#define DUK_BC_B_MIN 0
#define DUK_BC_B_MAX 0xffL
#define DUK_BC_C_MIN 0
#define DUK_BC_C_MAX 0xffL
#define DUK_BC_BC_MIN 0
#define DUK_BC_BC_MAX 0xffffL
#define DUK_BC_ABC_MIN 0
#define DUK_BC_ABC_MAX 0xffffffL
/* Masks for B/C reg/const indicator in opcode field. */
#define DUK_BC_REGCONST_B (0x01UL)
#define DUK_BC_REGCONST_C (0x02UL)
/* Misc. masks for opcode field. */
#define DUK_BC_INCDECP_FLAG_DEC (0x04UL)
#define DUK_BC_INCDECP_FLAG_POST (0x08UL)
/* Opcodes. */
#define DUK_OP_LDREG 0
#define DUK_OP_STREG 1
#define DUK_OP_JUMP 2
#define DUK_OP_LDCONST 3
#define DUK_OP_LDINT 4
#define DUK_OP_LDINTX 5
#define DUK_OP_LDTHIS 6
#define DUK_OP_LDUNDEF 7
#define DUK_OP_LDNULL 8
#define DUK_OP_LDTRUE 9
#define DUK_OP_LDFALSE 10
#define DUK_OP_GETVAR 11
#define DUK_OP_BNOT 12
#define DUK_OP_LNOT 13
#define DUK_OP_UNM 14
#define DUK_OP_UNP 15
#define DUK_OP_EQ 16
#define DUK_OP_EQ_RR 16
#define DUK_OP_EQ_CR 17
#define DUK_OP_EQ_RC 18
#define DUK_OP_EQ_CC 19
#define DUK_OP_NEQ 20
#define DUK_OP_NEQ_RR 20
#define DUK_OP_NEQ_CR 21
#define DUK_OP_NEQ_RC 22
#define DUK_OP_NEQ_CC 23
#define DUK_OP_SEQ 24
#define DUK_OP_SEQ_RR 24
#define DUK_OP_SEQ_CR 25
#define DUK_OP_SEQ_RC 26
#define DUK_OP_SEQ_CC 27
#define DUK_OP_SNEQ 28
#define DUK_OP_SNEQ_RR 28
#define DUK_OP_SNEQ_CR 29
#define DUK_OP_SNEQ_RC 30
#define DUK_OP_SNEQ_CC 31
#define DUK_OP_GT 32
#define DUK_OP_GT_RR 32
#define DUK_OP_GT_CR 33
#define DUK_OP_GT_RC 34
#define DUK_OP_GT_CC 35
#define DUK_OP_GE 36
#define DUK_OP_GE_RR 36
#define DUK_OP_GE_CR 37
#define DUK_OP_GE_RC 38
#define DUK_OP_GE_CC 39
#define DUK_OP_LT 40
#define DUK_OP_LT_RR 40
#define DUK_OP_LT_CR 41
#define DUK_OP_LT_RC 42
#define DUK_OP_LT_CC 43
#define DUK_OP_LE 44
#define DUK_OP_LE_RR 44
#define DUK_OP_LE_CR 45
#define DUK_OP_LE_RC 46
#define DUK_OP_LE_CC 47
#define DUK_OP_IFTRUE 48
#define DUK_OP_IFTRUE_R 48
#define DUK_OP_IFTRUE_C 49
#define DUK_OP_IFFALSE 50
#define DUK_OP_IFFALSE_R 50
#define DUK_OP_IFFALSE_C 51
#define DUK_OP_ADD 52
#define DUK_OP_ADD_RR 52
#define DUK_OP_ADD_CR 53
#define DUK_OP_ADD_RC 54
#define DUK_OP_ADD_CC 55
#define DUK_OP_SUB 56
#define DUK_OP_SUB_RR 56
#define DUK_OP_SUB_CR 57
#define DUK_OP_SUB_RC 58
#define DUK_OP_SUB_CC 59
#define DUK_OP_MUL 60
#define DUK_OP_MUL_RR 60
#define DUK_OP_MUL_CR 61
#define DUK_OP_MUL_RC 62
#define DUK_OP_MUL_CC 63
#define DUK_OP_DIV 64
#define DUK_OP_DIV_RR 64
#define DUK_OP_DIV_CR 65
#define DUK_OP_DIV_RC 66
#define DUK_OP_DIV_CC 67
#define DUK_OP_MOD 68
#define DUK_OP_MOD_RR 68
#define DUK_OP_MOD_CR 69
#define DUK_OP_MOD_RC 70
#define DUK_OP_MOD_CC 71
#define DUK_OP_EXP 72
#define DUK_OP_EXP_RR 72
#define DUK_OP_EXP_CR 73
#define DUK_OP_EXP_RC 74
#define DUK_OP_EXP_CC 75
#define DUK_OP_BAND 76
#define DUK_OP_BAND_RR 76
#define DUK_OP_BAND_CR 77
#define DUK_OP_BAND_RC 78
#define DUK_OP_BAND_CC 79
#define DUK_OP_BOR 80
#define DUK_OP_BOR_RR 80
#define DUK_OP_BOR_CR 81
#define DUK_OP_BOR_RC 82
#define DUK_OP_BOR_CC 83
#define DUK_OP_BXOR 84
#define DUK_OP_BXOR_RR 84
#define DUK_OP_BXOR_CR 85
#define DUK_OP_BXOR_RC 86
#define DUK_OP_BXOR_CC 87
#define DUK_OP_BASL 88
#define DUK_OP_BASL_RR 88
#define DUK_OP_BASL_CR 89
#define DUK_OP_BASL_RC 90
#define DUK_OP_BASL_CC 91
#define DUK_OP_BLSR 92
#define DUK_OP_BLSR_RR 92
#define DUK_OP_BLSR_CR 93
#define DUK_OP_BLSR_RC 94
#define DUK_OP_BLSR_CC 95
#define DUK_OP_BASR 96
#define DUK_OP_BASR_RR 96
#define DUK_OP_BASR_CR 97
#define DUK_OP_BASR_RC 98
#define DUK_OP_BASR_CC 99
#define DUK_OP_INSTOF 100
#define DUK_OP_INSTOF_RR 100
#define DUK_OP_INSTOF_CR 101
#define DUK_OP_INSTOF_RC 102
#define DUK_OP_INSTOF_CC 103
#define DUK_OP_IN 104
#define DUK_OP_IN_RR 104
#define DUK_OP_IN_CR 105
#define DUK_OP_IN_RC 106
#define DUK_OP_IN_CC 107
#define DUK_OP_GETPROP 108
#define DUK_OP_GETPROP_RR 108
#define DUK_OP_GETPROP_CR 109
#define DUK_OP_GETPROP_RC 110
#define DUK_OP_GETPROP_CC 111
#define DUK_OP_PUTPROP 112
#define DUK_OP_PUTPROP_RR 112
#define DUK_OP_PUTPROP_CR 113
#define DUK_OP_PUTPROP_RC 114
#define DUK_OP_PUTPROP_CC 115
#define DUK_OP_DELPROP 116
#define DUK_OP_DELPROP_RR 116
#define DUK_OP_DELPROP_CR_UNUSED 117 /* unused now */
#define DUK_OP_DELPROP_RC 118
#define DUK_OP_DELPROP_CC_UNUSED 119 /* unused now */
#define DUK_OP_PREINCR 120 /* pre/post opcode values have constraints, */
#define DUK_OP_PREDECR 121 /* see duk_js_executor.c and duk_js_compiler.c. */
#define DUK_OP_POSTINCR 122
#define DUK_OP_POSTDECR 123
#define DUK_OP_PREINCV 124
#define DUK_OP_PREDECV 125
#define DUK_OP_POSTINCV 126
#define DUK_OP_POSTDECV 127
#define DUK_OP_PREINCP 128 /* pre/post inc/dec prop opcodes have constraints */
#define DUK_OP_PREINCP_RR 128
#define DUK_OP_PREINCP_CR 129
#define DUK_OP_PREINCP_RC 130
#define DUK_OP_PREINCP_CC 131
#define DUK_OP_PREDECP 132
#define DUK_OP_PREDECP_RR 132
#define DUK_OP_PREDECP_CR 133
#define DUK_OP_PREDECP_RC 134
#define DUK_OP_PREDECP_CC 135
#define DUK_OP_POSTINCP 136
#define DUK_OP_POSTINCP_RR 136
#define DUK_OP_POSTINCP_CR 137
#define DUK_OP_POSTINCP_RC 138
#define DUK_OP_POSTINCP_CC 139
#define DUK_OP_POSTDECP 140
#define DUK_OP_POSTDECP_RR 140
#define DUK_OP_POSTDECP_CR 141
#define DUK_OP_POSTDECP_RC 142
#define DUK_OP_POSTDECP_CC 143
#define DUK_OP_DECLVAR 144
#define DUK_OP_DECLVAR_RR 144
#define DUK_OP_DECLVAR_CR 145
#define DUK_OP_DECLVAR_RC 146
#define DUK_OP_DECLVAR_CC 147
#define DUK_OP_REGEXP 148
#define DUK_OP_REGEXP_RR 148
#define DUK_OP_REGEXP_CR 149
#define DUK_OP_REGEXP_RC 150
#define DUK_OP_REGEXP_CC 151
#define DUK_OP_CLOSURE 152
#define DUK_OP_TYPEOF 153
#define DUK_OP_TYPEOFID 154
#define DUK_OP_PUTVAR 155
#define DUK_OP_DELVAR 156
#define DUK_OP_RETREG 157
#define DUK_OP_RETUNDEF 158
#define DUK_OP_RETCONST 159
#define DUK_OP_RETCONSTN 160 /* return const without incref (e.g. number) */
#define DUK_OP_LABEL 161
#define DUK_OP_ENDLABEL 162
#define DUK_OP_BREAK 163
#define DUK_OP_CONTINUE 164
#define DUK_OP_TRYCATCH 165
#define DUK_OP_ENDTRY 166
#define DUK_OP_ENDCATCH 167
#define DUK_OP_ENDFIN 168
#define DUK_OP_THROW 169
#define DUK_OP_INVLHS 170
#define DUK_OP_CSREG 171
#define DUK_OP_CSVAR 172
#define DUK_OP_CSVAR_RR 172
#define DUK_OP_CSVAR_CR 173
#define DUK_OP_CSVAR_RC 174
#define DUK_OP_CSVAR_CC 175
#define DUK_OP_CALL0 176 /* DUK_OP_CALL0 & 0x0F must be zero. */
#define DUK_OP_CALL1 177
#define DUK_OP_CALL2 178
#define DUK_OP_CALL3 179
#define DUK_OP_CALL4 180
#define DUK_OP_CALL5 181
#define DUK_OP_CALL6 182
#define DUK_OP_CALL7 183
#define DUK_OP_CALL8 184
#define DUK_OP_CALL9 185
#define DUK_OP_CALL10 186
#define DUK_OP_CALL11 187
#define DUK_OP_CALL12 188
#define DUK_OP_CALL13 189
#define DUK_OP_CALL14 190
#define DUK_OP_CALL15 191
#define DUK_OP_NEWOBJ 192
#define DUK_OP_NEWARR 193
#define DUK_OP_MPUTOBJ 194
#define DUK_OP_MPUTOBJI 195
#define DUK_OP_INITSET 196
#define DUK_OP_INITGET 197
#define DUK_OP_MPUTARR 198
#define DUK_OP_MPUTARRI 199
#define DUK_OP_SETALEN 200
#define DUK_OP_INITENUM 201
#define DUK_OP_NEXTENUM 202
#define DUK_OP_NEWTARGET 203
#define DUK_OP_DEBUGGER 204
#define DUK_OP_NOP 205
#define DUK_OP_INVALID 206
#define DUK_OP_UNUSED207 207
#define DUK_OP_GETPROPC 208
#define DUK_OP_GETPROPC_RR 208
#define DUK_OP_GETPROPC_CR 209
#define DUK_OP_GETPROPC_RC 210
#define DUK_OP_GETPROPC_CC 211
#define DUK_OP_UNUSED212 212
#define DUK_OP_UNUSED213 213
#define DUK_OP_UNUSED214 214
#define DUK_OP_UNUSED215 215
#define DUK_OP_UNUSED216 216
#define DUK_OP_UNUSED217 217
#define DUK_OP_UNUSED218 218
#define DUK_OP_UNUSED219 219
#define DUK_OP_UNUSED220 220
#define DUK_OP_UNUSED221 221
#define DUK_OP_UNUSED222 222
#define DUK_OP_UNUSED223 223
#define DUK_OP_UNUSED224 224
#define DUK_OP_UNUSED225 225
#define DUK_OP_UNUSED226 226
#define DUK_OP_UNUSED227 227
#define DUK_OP_UNUSED228 228
#define DUK_OP_UNUSED229 229
#define DUK_OP_UNUSED230 230
#define DUK_OP_UNUSED231 231
#define DUK_OP_UNUSED232 232
#define DUK_OP_UNUSED233 233
#define DUK_OP_UNUSED234 234
#define DUK_OP_UNUSED235 235
#define DUK_OP_UNUSED236 236
#define DUK_OP_UNUSED237 237
#define DUK_OP_UNUSED238 238
#define DUK_OP_UNUSED239 239
#define DUK_OP_UNUSED240 240
#define DUK_OP_UNUSED241 241
#define DUK_OP_UNUSED242 242
#define DUK_OP_UNUSED243 243
#define DUK_OP_UNUSED244 244
#define DUK_OP_UNUSED245 245
#define DUK_OP_UNUSED246 246
#define DUK_OP_UNUSED247 247
#define DUK_OP_UNUSED248 248
#define DUK_OP_UNUSED249 249
#define DUK_OP_UNUSED250 250
#define DUK_OP_UNUSED251 251
#define DUK_OP_UNUSED252 252
#define DUK_OP_UNUSED253 253
#define DUK_OP_UNUSED254 254
#define DUK_OP_UNUSED255 255
#define DUK_OP_NONE 256 /* dummy value used as marker (doesn't fit in 8-bit field) */
/* XXX: Allocate flags from opcode field? Would take 16 opcode slots
* but avoids shuffling in more cases. Maybe not worth it.
*/
/* DUK_OP_TRYCATCH flags in A. */
#define DUK_BC_TRYCATCH_FLAG_HAVE_CATCH (1U << 0)
#define DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY (1U << 1)
#define DUK_BC_TRYCATCH_FLAG_CATCH_BINDING (1U << 2)
#define DUK_BC_TRYCATCH_FLAG_WITH_BINDING (1U << 3)
/* DUK_OP_DECLVAR flags in A; bottom bits are reserved for propdesc flags
* (DUK_PROPDESC_FLAG_XXX).
*/
#define DUK_BC_DECLVAR_FLAG_FUNC_DECL (1U << 4) /* function declaration */
/* DUK_OP_CALLn flags, part of opcode field. Three lowest bits must match
* DUK_CALL_FLAG_xxx directly.
*/
#define DUK_BC_CALL_FLAG_TAILCALL (1U << 0)
#define DUK_BC_CALL_FLAG_CONSTRUCT (1U << 1)
#define DUK_BC_CALL_FLAG_CALLED_AS_EVAL (1U << 2)
#define DUK_BC_CALL_FLAG_INDIRECT (1U << 3)
/* Misc constants and helper macros. */
#define DUK_BC_LDINT_BIAS (1L << 15)
#define DUK_BC_LDINTX_SHIFT 16
#define DUK_BC_JUMP_BIAS (1L << 23)
#endif /* DUK_JS_BYTECODE_H_INCLUDED */