File: duk_js_bytecode.h

package info (click to toggle)
duktape 2.7.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 21,160 kB
  • sloc: ansic: 215,359; python: 5,961; javascript: 4,555; makefile: 477; cpp: 205
file content (473 lines) | stat: -rw-r--r-- 18,616 bytes parent folder | download | duplicates (2)
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
/*
 *  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 */