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