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