1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/snapshot/builtin-snapshot-utils.h" 6 7 namespace v8 { 8 namespace internal { 9 10 // static 11 bool BuiltinSnapshotUtils::IsBuiltinIndex(int maybe_index) { 12 return (kFirstBuiltinIndex <= maybe_index && 13 maybe_index < kFirstBuiltinIndex + kNumberOfBuiltins); 14 } 15 16 // static 17 bool BuiltinSnapshotUtils::IsHandlerIndex(int maybe_index) { 18 return (kFirstHandlerIndex <= maybe_index && 19 maybe_index < kFirstHandlerIndex + kNumberOfHandlers); 20 } 21 22 // static 23 int BuiltinSnapshotUtils::BytecodeToIndex(Bytecode bytecode, 24 OperandScale operand_scale) { 25 int index = 26 BuiltinSnapshotUtils::kNumberOfBuiltins + static_cast<int>(bytecode); 27 switch (operand_scale) { // clang-format off 28 case OperandScale::kSingle: return index; 29 case OperandScale::kDouble: return index + Bytecodes::kBytecodeCount; 30 case OperandScale::kQuadruple: return index + 2 * Bytecodes::kBytecodeCount; 31 } // clang-format on 32 UNREACHABLE(); 33 } 34 35 // static 36 std::pair<interpreter::Bytecode, interpreter::OperandScale> 37 BuiltinSnapshotUtils::BytecodeFromIndex(int index) { 38 DCHECK(IsHandlerIndex(index)); 39 40 const int x = index - BuiltinSnapshotUtils::kNumberOfBuiltins; 41 Bytecode bytecode = Bytecodes::FromByte(x % Bytecodes::kBytecodeCount); 42 switch (x / Bytecodes::kBytecodeCount) { // clang-format off 43 case 0: return {bytecode, OperandScale::kSingle}; 44 case 1: return {bytecode, OperandScale::kDouble}; 45 case 2: return {bytecode, OperandScale::kQuadruple}; 46 default: UNREACHABLE(); 47 } // clang-format on 48 } 49 50 // static 51 void BuiltinSnapshotUtils::ForEachBytecode( 52 std::function<void(Bytecode, OperandScale)> f) { 53 static const OperandScale kOperandScales[] = { 54 #define VALUE(Name, _) OperandScale::k##Name, 55 OPERAND_SCALE_LIST(VALUE) 56 #undef VALUE 57 }; 58 59 for (OperandScale operand_scale : kOperandScales) { 60 for (int i = 0; i < Bytecodes::kBytecodeCount; i++) { 61 f(Bytecodes::FromByte(i), operand_scale); 62 } 63 } 64 } 65 66 } // namespace internal 67 } // namespace v8 68