// Copyright (c) 2019, 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. #define RUNTIME_VM_CONSTANTS_H_ // To work around include guard. #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 }; #define DECLARE_INSTRUCTIONS(name, fmt, kind, fmta, fmtb, fmtc) \ static const KBCInstr k##name##Instructions[] = { \ KernelBytecode::k##name, \ KernelBytecode::kReturnTOS, \ }; INTERNAL_KERNEL_BYTECODES_LIST(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(); } } static const KBCInstr kNativeCallToGrowableListReturnTrampoline[] = { KernelBytecode::kDirectCall, 0, // target (doesn't matter) KernelBytecode::kNativeCallToGrowableListArgc, // number of arguments KernelBytecode::kReturnTOS, }; const KBCInstr* KernelBytecode::GetNativeCallToGrowableListReturnTrampoline() { return KernelBytecode::Next(&kNativeCallToGrowableListReturnTrampoline[0]); } } // namespace dart