| // Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/constants_kbc.h" |
| |
| namespace dart { |
| |
| static const intptr_t kInstructionSize0 = 1; |
| static const intptr_t kInstructionSizeA = 2; |
| static const intptr_t kInstructionSizeD = 2; |
| static const intptr_t kInstructionSizeWideD = 5; |
| static const intptr_t kInstructionSizeX = 2; |
| static const intptr_t kInstructionSizeWideX = 5; |
| static const intptr_t kInstructionSizeT = 2; |
| static const intptr_t kInstructionSizeWideT = 4; |
| static const intptr_t kInstructionSizeA_E = 3; |
| static const intptr_t kInstructionSizeWideA_E = 6; |
| static const intptr_t kInstructionSizeA_Y = 3; |
| static const intptr_t kInstructionSizeWideA_Y = 6; |
| static const intptr_t kInstructionSizeD_F = 3; |
| static const intptr_t kInstructionSizeWideD_F = 6; |
| static const intptr_t kInstructionSizeA_B_C = 4; |
| |
| const intptr_t KernelBytecode::kInstructionSize[] = { |
| #define SIZE_ORDN(encoding) kInstructionSize##encoding |
| #define SIZE_WIDE(encoding) kInstructionSizeWide##encoding |
| #define SIZE_RESV(encoding) SIZE_ORDN(encoding) |
| #define SIZE(name, encoding, kind, op1, op2, op3) SIZE_##kind(encoding), |
| KERNEL_BYTECODES_LIST(SIZE) |
| #undef SIZE_ORDN |
| #undef SIZE_WIDE |
| #undef SIZE_RESV |
| #undef SIZE |
| }; |
| |
| static const KBCInstr kVMInternal_ImplicitConstructorClosureInstructions[] = { |
| KernelBytecode::kVMInternal_ImplicitConstructorClosure, |
| 0, |
| 0, |
| KernelBytecode::kPush, |
| 0, |
| KernelBytecode::kReturnTOS, |
| }; |
| |
| static const KBCInstr |
| kVMInternal_ImplicitConstructorClosure_WideInstructions[] = { |
| KernelBytecode::kTrap, |
| }; |
| |
| #define DECLARE_INSTRUCTIONS(name, fmt, kind, fmta, fmtb, fmtc) \ |
| static const KBCInstr k##name##Instructions[] = { \ |
| KernelBytecode::k##name, \ |
| KernelBytecode::kReturnTOS, \ |
| }; |
| INTERNAL_KERNEL_BYTECODES_WITH_DEFAULT_CODE(DECLARE_INSTRUCTIONS) |
| #undef DECLARE_INSTRUCTIONS |
| |
| void KernelBytecode::GetVMInternalBytecodeInstructions( |
| Opcode opcode, |
| const KBCInstr** instructions, |
| intptr_t* instructions_size) { |
| switch (opcode) { |
| #define CASE(name, fmt, kind, fmta, fmtb, fmtc) \ |
| case k##name: \ |
| *instructions = k##name##Instructions; \ |
| *instructions_size = sizeof(k##name##Instructions); \ |
| return; |
| |
| INTERNAL_KERNEL_BYTECODES_LIST(CASE) |
| #undef CASE |
| |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| } // namespace dart |