1/*
2 * This file is part of the MicroPython project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
26#ifndef MICROPY_INCLUDED_PY_BC0_H
27#define MICROPY_INCLUDED_PY_BC0_H
28
29// MicroPython bytecode opcodes, grouped based on the format of the opcode
30
31#define MP_BC_MASK_FORMAT (0xf0)
32#define MP_BC_MASK_EXTRA_BYTE (0x9e)
33
34#define MP_BC_FORMAT_BYTE (0)
35#define MP_BC_FORMAT_QSTR (1)
36#define MP_BC_FORMAT_VAR_UINT (2)
37#define MP_BC_FORMAT_OFFSET (3)
38
39// Nibbles in magic number are: BB BB BB BB BB BO VV QU
40#define MP_BC_FORMAT(op) ((0x000003a4 >> (2 * ((op) >> 4))) & 3)
41
42// Load, Store, Delete, Import, Make, Build, Unpack, Call, Jump, Exception, For, sTack, Return, Yield, Op
43#define MP_BC_BASE_RESERVED (0x00) // ----------------
44#define MP_BC_BASE_QSTR_O (0x10) // LLLLLLSSSDDII---
45#define MP_BC_BASE_VINT_E (0x20) // MMLLLLSSDDBBBBBB
46#define MP_BC_BASE_VINT_O (0x30) // UUMMCCCC--------
47#define MP_BC_BASE_JUMP_E (0x40) // J-JJJJJEEEEF----
48#define MP_BC_BASE_BYTE_O (0x50) // LLLLSSDTTTTTEEFF
49#define MP_BC_BASE_BYTE_E (0x60) // --BREEEYYI------
50#define MP_BC_LOAD_CONST_SMALL_INT_MULTI (0x70) // LLLLLLLLLLLLLLLL
51// (0x80) // LLLLLLLLLLLLLLLL
52// (0x90) // LLLLLLLLLLLLLLLL
53// (0xa0) // LLLLLLLLLLLLLLLL
54#define MP_BC_LOAD_FAST_MULTI (0xb0) // LLLLLLLLLLLLLLLL
55#define MP_BC_STORE_FAST_MULTI (0xc0) // SSSSSSSSSSSSSSSS
56#define MP_BC_UNARY_OP_MULTI (0xd0) // OOOOOOO
57#define MP_BC_BINARY_OP_MULTI (0xd7) // OOOOOOOOO
58// (0xe0) // OOOOOOOOOOOOOOOO
59// (0xf0) // OOOOOOOOOO------
60
61#define MP_BC_LOAD_CONST_SMALL_INT_MULTI_NUM (64)
62#define MP_BC_LOAD_CONST_SMALL_INT_MULTI_EXCESS (16)
63#define MP_BC_LOAD_FAST_MULTI_NUM (16)
64#define MP_BC_STORE_FAST_MULTI_NUM (16)
65#define MP_BC_UNARY_OP_MULTI_NUM (MP_UNARY_OP_NUM_BYTECODE)
66#define MP_BC_BINARY_OP_MULTI_NUM (MP_BINARY_OP_NUM_BYTECODE)
67
68#define MP_BC_LOAD_CONST_FALSE (MP_BC_BASE_BYTE_O + 0x00)
69#define MP_BC_LOAD_CONST_NONE (MP_BC_BASE_BYTE_O + 0x01)
70#define MP_BC_LOAD_CONST_TRUE (MP_BC_BASE_BYTE_O + 0x02)
71#define MP_BC_LOAD_CONST_SMALL_INT (MP_BC_BASE_VINT_E + 0x02) // signed var-int
72#define MP_BC_LOAD_CONST_STRING (MP_BC_BASE_QSTR_O + 0x00) // qstr
73#define MP_BC_LOAD_CONST_OBJ (MP_BC_BASE_VINT_E + 0x03) // ptr
74#define MP_BC_LOAD_NULL (MP_BC_BASE_BYTE_O + 0x03)
75
76#define MP_BC_LOAD_FAST_N (MP_BC_BASE_VINT_E + 0x04) // uint
77#define MP_BC_LOAD_DEREF (MP_BC_BASE_VINT_E + 0x05) // uint
78#define MP_BC_LOAD_NAME (MP_BC_BASE_QSTR_O + 0x01) // qstr
79#define MP_BC_LOAD_GLOBAL (MP_BC_BASE_QSTR_O + 0x02) // qstr
80#define MP_BC_LOAD_ATTR (MP_BC_BASE_QSTR_O + 0x03) // qstr
81#define MP_BC_LOAD_METHOD (MP_BC_BASE_QSTR_O + 0x04) // qstr
82#define MP_BC_LOAD_SUPER_METHOD (MP_BC_BASE_QSTR_O + 0x05) // qstr
83#define MP_BC_LOAD_BUILD_CLASS (MP_BC_BASE_BYTE_O + 0x04)
84#define MP_BC_LOAD_SUBSCR (MP_BC_BASE_BYTE_O + 0x05)
85
86#define MP_BC_STORE_FAST_N (MP_BC_BASE_VINT_E + 0x06) // uint
87#define MP_BC_STORE_DEREF (MP_BC_BASE_VINT_E + 0x07) // uint
88#define MP_BC_STORE_NAME (MP_BC_BASE_QSTR_O + 0x06) // qstr
89#define MP_BC_STORE_GLOBAL (MP_BC_BASE_QSTR_O + 0x07) // qstr
90#define MP_BC_STORE_ATTR (MP_BC_BASE_QSTR_O + 0x08) // qstr
91#define MP_BC_STORE_SUBSCR (MP_BC_BASE_BYTE_O + 0x06)
92
93#define MP_BC_DELETE_FAST (MP_BC_BASE_VINT_E + 0x08) // uint
94#define MP_BC_DELETE_DEREF (MP_BC_BASE_VINT_E + 0x09) // uint
95#define MP_BC_DELETE_NAME (MP_BC_BASE_QSTR_O + 0x09) // qstr
96#define MP_BC_DELETE_GLOBAL (MP_BC_BASE_QSTR_O + 0x0a) // qstr
97
98#define MP_BC_DUP_TOP (MP_BC_BASE_BYTE_O + 0x07)
99#define MP_BC_DUP_TOP_TWO (MP_BC_BASE_BYTE_O + 0x08)
100#define MP_BC_POP_TOP (MP_BC_BASE_BYTE_O + 0x09)
101#define MP_BC_ROT_TWO (MP_BC_BASE_BYTE_O + 0x0a)
102#define MP_BC_ROT_THREE (MP_BC_BASE_BYTE_O + 0x0b)
103
104#define MP_BC_JUMP (MP_BC_BASE_JUMP_E + 0x02) // rel byte code offset, 16-bit signed, in excess
105#define MP_BC_POP_JUMP_IF_TRUE (MP_BC_BASE_JUMP_E + 0x03) // rel byte code offset, 16-bit signed, in excess
106#define MP_BC_POP_JUMP_IF_FALSE (MP_BC_BASE_JUMP_E + 0x04) // rel byte code offset, 16-bit signed, in excess
107#define MP_BC_JUMP_IF_TRUE_OR_POP (MP_BC_BASE_JUMP_E + 0x05) // rel byte code offset, 16-bit signed, in excess
108#define MP_BC_JUMP_IF_FALSE_OR_POP (MP_BC_BASE_JUMP_E + 0x06) // rel byte code offset, 16-bit signed, in excess
109#define MP_BC_UNWIND_JUMP (MP_BC_BASE_JUMP_E + 0x00) // rel byte code offset, 16-bit signed, in excess; then a byte
110#define MP_BC_SETUP_WITH (MP_BC_BASE_JUMP_E + 0x07) // rel byte code offset, 16-bit unsigned
111#define MP_BC_SETUP_EXCEPT (MP_BC_BASE_JUMP_E + 0x08) // rel byte code offset, 16-bit unsigned
112#define MP_BC_SETUP_FINALLY (MP_BC_BASE_JUMP_E + 0x09) // rel byte code offset, 16-bit unsigned
113#define MP_BC_POP_EXCEPT_JUMP (MP_BC_BASE_JUMP_E + 0x0a) // rel byte code offset, 16-bit unsigned
114#define MP_BC_FOR_ITER (MP_BC_BASE_JUMP_E + 0x0b) // rel byte code offset, 16-bit unsigned
115#define MP_BC_WITH_CLEANUP (MP_BC_BASE_BYTE_O + 0x0c)
116#define MP_BC_END_FINALLY (MP_BC_BASE_BYTE_O + 0x0d)
117#define MP_BC_GET_ITER (MP_BC_BASE_BYTE_O + 0x0e)
118#define MP_BC_GET_ITER_STACK (MP_BC_BASE_BYTE_O + 0x0f)
119
120#define MP_BC_BUILD_TUPLE (MP_BC_BASE_VINT_E + 0x0a) // uint
121#define MP_BC_BUILD_LIST (MP_BC_BASE_VINT_E + 0x0b) // uint
122#define MP_BC_BUILD_MAP (MP_BC_BASE_VINT_E + 0x0c) // uint
123#define MP_BC_STORE_MAP (MP_BC_BASE_BYTE_E + 0x02)
124#define MP_BC_BUILD_SET (MP_BC_BASE_VINT_E + 0x0d) // uint
125#define MP_BC_BUILD_SLICE (MP_BC_BASE_VINT_E + 0x0e) // uint
126#define MP_BC_STORE_COMP (MP_BC_BASE_VINT_E + 0x0f) // uint
127#define MP_BC_UNPACK_SEQUENCE (MP_BC_BASE_VINT_O + 0x00) // uint
128#define MP_BC_UNPACK_EX (MP_BC_BASE_VINT_O + 0x01) // uint
129
130#define MP_BC_RETURN_VALUE (MP_BC_BASE_BYTE_E + 0x03)
131#define MP_BC_RAISE_LAST (MP_BC_BASE_BYTE_E + 0x04)
132#define MP_BC_RAISE_OBJ (MP_BC_BASE_BYTE_E + 0x05)
133#define MP_BC_RAISE_FROM (MP_BC_BASE_BYTE_E + 0x06)
134#define MP_BC_YIELD_VALUE (MP_BC_BASE_BYTE_E + 0x07)
135#define MP_BC_YIELD_FROM (MP_BC_BASE_BYTE_E + 0x08)
136
137#define MP_BC_MAKE_FUNCTION (MP_BC_BASE_VINT_O + 0x02) // uint
138#define MP_BC_MAKE_FUNCTION_DEFARGS (MP_BC_BASE_VINT_O + 0x03) // uint
139#define MP_BC_MAKE_CLOSURE (MP_BC_BASE_VINT_E + 0x00) // uint; extra byte
140#define MP_BC_MAKE_CLOSURE_DEFARGS (MP_BC_BASE_VINT_E + 0x01) // uint; extra byte
141#define MP_BC_CALL_FUNCTION (MP_BC_BASE_VINT_O + 0x04) // uint
142#define MP_BC_CALL_FUNCTION_VAR_KW (MP_BC_BASE_VINT_O + 0x05) // uint
143#define MP_BC_CALL_METHOD (MP_BC_BASE_VINT_O + 0x06) // uint
144#define MP_BC_CALL_METHOD_VAR_KW (MP_BC_BASE_VINT_O + 0x07) // uint
145
146#define MP_BC_IMPORT_NAME (MP_BC_BASE_QSTR_O + 0x0b) // qstr
147#define MP_BC_IMPORT_FROM (MP_BC_BASE_QSTR_O + 0x0c) // qstr
148#define MP_BC_IMPORT_STAR (MP_BC_BASE_BYTE_E + 0x09)
149
150#endif // MICROPY_INCLUDED_PY_BC0_H
151