| 1 | // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| 2 | // for details. All rights reserved. Use of this source code is governed by a |
| 3 | // BSD-style license that can be found in the LICENSE file. |
| 4 | |
| 5 | #define RUNTIME_VM_CONSTANTS_H_ // To work around include guard. |
| 6 | #include "vm/constants_kbc.h" |
| 7 | |
| 8 | namespace dart { |
| 9 | |
| 10 | static const intptr_t kInstructionSize0 = 1; |
| 11 | static const intptr_t kInstructionSizeA = 2; |
| 12 | static const intptr_t kInstructionSizeD = 2; |
| 13 | static const intptr_t kInstructionSizeWideD = 5; |
| 14 | static const intptr_t kInstructionSizeX = 2; |
| 15 | static const intptr_t kInstructionSizeWideX = 5; |
| 16 | static const intptr_t kInstructionSizeT = 2; |
| 17 | static const intptr_t kInstructionSizeWideT = 4; |
| 18 | static const intptr_t kInstructionSizeA_E = 3; |
| 19 | static const intptr_t kInstructionSizeWideA_E = 6; |
| 20 | static const intptr_t kInstructionSizeA_Y = 3; |
| 21 | static const intptr_t kInstructionSizeWideA_Y = 6; |
| 22 | static const intptr_t kInstructionSizeD_F = 3; |
| 23 | static const intptr_t kInstructionSizeWideD_F = 6; |
| 24 | static const intptr_t kInstructionSizeA_B_C = 4; |
| 25 | |
| 26 | const intptr_t KernelBytecode::kInstructionSize[] = { |
| 27 | #define SIZE_ORDN(encoding) kInstructionSize##encoding |
| 28 | #define SIZE_WIDE(encoding) kInstructionSizeWide##encoding |
| 29 | #define SIZE_RESV(encoding) SIZE_ORDN(encoding) |
| 30 | #define SIZE(name, encoding, kind, op1, op2, op3) SIZE_##kind(encoding), |
| 31 | KERNEL_BYTECODES_LIST(SIZE) |
| 32 | #undef SIZE_ORDN |
| 33 | #undef SIZE_WIDE |
| 34 | #undef SIZE_RESV |
| 35 | #undef SIZE |
| 36 | }; |
| 37 | |
| 38 | #define DECLARE_INSTRUCTIONS(name, fmt, kind, fmta, fmtb, fmtc) \ |
| 39 | static const KBCInstr k##name##Instructions[] = { \ |
| 40 | KernelBytecode::k##name, \ |
| 41 | KernelBytecode::kReturnTOS, \ |
| 42 | }; |
| 43 | INTERNAL_KERNEL_BYTECODES_LIST(DECLARE_INSTRUCTIONS) |
| 44 | #undef DECLARE_INSTRUCTIONS |
| 45 | |
| 46 | void KernelBytecode::GetVMInternalBytecodeInstructions( |
| 47 | Opcode opcode, |
| 48 | const KBCInstr** instructions, |
| 49 | intptr_t* instructions_size) { |
| 50 | switch (opcode) { |
| 51 | #define CASE(name, fmt, kind, fmta, fmtb, fmtc) \ |
| 52 | case k##name: \ |
| 53 | *instructions = k##name##Instructions; \ |
| 54 | *instructions_size = sizeof(k##name##Instructions); \ |
| 55 | return; |
| 56 | |
| 57 | INTERNAL_KERNEL_BYTECODES_LIST(CASE) |
| 58 | #undef CASE |
| 59 | |
| 60 | default: |
| 61 | UNREACHABLE(); |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | static const KBCInstr kNativeCallToGrowableListReturnTrampoline[] = { |
| 66 | KernelBytecode::kDirectCall, |
| 67 | 0, // target (doesn't matter) |
| 68 | KernelBytecode::kNativeCallToGrowableListArgc, // number of arguments |
| 69 | KernelBytecode::kReturnTOS, |
| 70 | }; |
| 71 | |
| 72 | const KBCInstr* KernelBytecode::GetNativeCallToGrowableListReturnTrampoline() { |
| 73 | return KernelBytecode::Next(&kNativeCallToGrowableListReturnTrampoline[0]); |
| 74 | } |
| 75 | |
| 76 | } // namespace dart |
| 77 | |