1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_INTERPRETER_BYTECODES_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_INTERPRETER_BYTECODES_H_ 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <iosfwd> 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Clients of this interface shouldn't depend on lots of interpreter internals. 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Do not include anything from src/interpreter here! 12537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch#include "src/frames.h" 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/utils.h" 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter { 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) 201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ 221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ 231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(Reg, OperandTypeInfo::kScalableSignedByte) \ 241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RegPair, OperandTypeInfo::kScalableSignedByte) 251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ 271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RegOut, OperandTypeInfo::kScalableSignedByte) \ 281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ 291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) 301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define SCALAR_OPERAND_TYPE_LIST(V) \ 321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ 3321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ 341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ 351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(Imm, OperandTypeInfo::kScalableSignedByte) \ 361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ 371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) 38342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 39342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#define REGISTER_OPERAND_TYPE_LIST(V) \ 40342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ 41342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) 42342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 43342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#define NON_REGISTER_OPERAND_TYPE_LIST(V) \ 44342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch INVALID_OPERAND_TYPE_LIST(V) \ 45342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch SCALAR_OPERAND_TYPE_LIST(V) 46342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The list of operand types used by bytecodes. 48342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#define OPERAND_TYPE_LIST(V) \ 49342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch NON_REGISTER_OPERAND_TYPE_LIST(V) \ 50342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch REGISTER_OPERAND_TYPE_LIST(V) 51342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Define one debug break bytecode for each possible size of unscaled 531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// bytecodes. Format is V(<bytecode>, <accumulator_use>, <operands>). 541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ 551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak0, AccumulatorUse::kRead) \ 561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak1, AccumulatorUse::kRead, OperandType::kReg) \ 571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak2, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg) \ 581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak3, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ 591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType::kReg) \ 601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak4, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ 611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType::kReg, OperandType::kReg) \ 621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak5, AccumulatorUse::kRead, OperandType::kRuntimeId, \ 631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType::kReg, OperandType::kReg) \ 641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreak6, AccumulatorUse::kRead, OperandType::kRuntimeId, \ 651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType::kReg, OperandType::kReg, OperandType::kReg) 661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Define one debug break for each widening prefix. 681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \ 691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreakWide, AccumulatorUse::kRead) \ 701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(DebugBreakExtraWide, AccumulatorUse::kRead) 711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define DEBUG_BREAK_BYTECODE_LIST(V) \ 731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ 741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The list of bytecodes which are interpreted by the interpreter. 7721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch#define BYTECODE_LIST(V) \ 7821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Extended width operands */ \ 7921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Wide, AccumulatorUse::kNone) \ 8021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ExtraWide, AccumulatorUse::kNone) \ 8121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 8221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Loading the accumulator */ \ 8321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaZero, AccumulatorUse::kWrite) \ 8421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaSmi, AccumulatorUse::kWrite, OperandType::kImm) \ 8521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaUndefined, AccumulatorUse::kWrite) \ 8621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaNull, AccumulatorUse::kWrite) \ 8721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaTheHole, AccumulatorUse::kWrite) \ 8821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaTrue, AccumulatorUse::kWrite) \ 8921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaFalse, AccumulatorUse::kWrite) \ 9021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaConstant, AccumulatorUse::kWrite, OperandType::kIdx) \ 9121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 9221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Loading registers */ \ 9321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdrUndefined, AccumulatorUse::kNone, OperandType::kRegOut) \ 9421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 9521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Globals */ \ 9621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaGlobal, AccumulatorUse::kWrite, OperandType::kIdx) \ 9721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdrGlobal, AccumulatorUse::kNone, OperandType::kIdx, OperandType::kRegOut) \ 9821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaGlobalInsideTypeof, AccumulatorUse::kWrite, OperandType::kIdx) \ 9921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaGlobalSloppy, AccumulatorUse::kRead, OperandType::kIdx, \ 10021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx) \ 10121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaGlobalStrict, AccumulatorUse::kRead, OperandType::kIdx, \ 10221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx) \ 10321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 10421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Context operations */ \ 10521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(PushContext, AccumulatorUse::kRead, OperandType::kRegOut) \ 10621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(PopContext, AccumulatorUse::kNone, OperandType::kReg) \ 10721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaContextSlot, AccumulatorUse::kWrite, OperandType::kReg, \ 10821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx) \ 10921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdrContextSlot, AccumulatorUse::kNone, OperandType::kReg, \ 11021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kRegOut) \ 11121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaContextSlot, AccumulatorUse::kRead, OperandType::kReg, \ 11221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx) \ 11321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 11421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Load-Store lookup slots */ \ 11521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaLookupSlot, AccumulatorUse::kWrite, OperandType::kIdx) \ 11621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaLookupSlotInsideTypeof, AccumulatorUse::kWrite, OperandType::kIdx) \ 11721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaLookupSlotSloppy, AccumulatorUse::kReadWrite, OperandType::kIdx) \ 11821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaLookupSlotStrict, AccumulatorUse::kReadWrite, OperandType::kIdx) \ 11921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 12021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Register-accumulator transfers */ \ 12121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Ldar, AccumulatorUse::kWrite, OperandType::kReg) \ 12221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Star, AccumulatorUse::kRead, OperandType::kRegOut) \ 12321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 12421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Register-register transfers */ \ 12521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Mov, AccumulatorUse::kNone, OperandType::kReg, OperandType::kRegOut) \ 12621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 12721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Property loads (LoadIC) operations */ \ 12821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaNamedProperty, AccumulatorUse::kWrite, OperandType::kReg, \ 12921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kIdx) \ 13021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdrNamedProperty, AccumulatorUse::kNone, OperandType::kReg, \ 13121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kIdx, OperandType::kRegOut) \ 13221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdaKeyedProperty, AccumulatorUse::kReadWrite, OperandType::kReg, \ 13321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx) \ 13421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LdrKeyedProperty, AccumulatorUse::kRead, OperandType::kReg, \ 13521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kRegOut) \ 13621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 13721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Propery stores (StoreIC) operations */ \ 13821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaNamedPropertySloppy, AccumulatorUse::kRead, OperandType::kReg, \ 13921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kIdx) \ 14021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaNamedPropertyStrict, AccumulatorUse::kRead, OperandType::kReg, \ 14121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kIdx) \ 14221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaKeyedPropertySloppy, AccumulatorUse::kRead, OperandType::kReg, \ 14321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kReg, OperandType::kIdx) \ 14421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StaKeyedPropertyStrict, AccumulatorUse::kRead, OperandType::kReg, \ 14521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kReg, OperandType::kIdx) \ 14621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 14721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Binary Operators */ \ 14821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Add, AccumulatorUse::kReadWrite, OperandType::kReg) \ 14921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Sub, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Mul, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Div, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Mod, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(BitwiseOr, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(BitwiseXor, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(BitwiseAnd, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ShiftLeft, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ShiftRight, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ShiftRightLogical, AccumulatorUse::kReadWrite, OperandType::kReg) \ 15921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 16021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Unary Operators */ \ 16121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Inc, AccumulatorUse::kReadWrite) \ 16221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Dec, AccumulatorUse::kReadWrite) \ 16321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ToBooleanLogicalNot, AccumulatorUse::kReadWrite) \ 16421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(LogicalNot, AccumulatorUse::kReadWrite) \ 16521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TypeOf, AccumulatorUse::kReadWrite) \ 16621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(DeletePropertyStrict, AccumulatorUse::kReadWrite, OperandType::kReg) \ 16721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(DeletePropertySloppy, AccumulatorUse::kReadWrite, OperandType::kReg) \ 16821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 16921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Call operations */ \ 17021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Call, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ 17121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kRegCount, OperandType::kIdx) \ 17221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TailCall, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ 17321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kRegCount, OperandType::kIdx) \ 17421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CallRuntime, AccumulatorUse::kWrite, OperandType::kRuntimeId, \ 17521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kMaybeReg, OperandType::kRegCount) \ 17621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CallRuntimeForPair, AccumulatorUse::kNone, OperandType::kRuntimeId, \ 17721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kMaybeReg, OperandType::kRegCount, OperandType::kRegOutPair) \ 17821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CallJSRuntime, AccumulatorUse::kWrite, OperandType::kIdx, \ 17921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kReg, OperandType::kRegCount) \ 18021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 18121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Intrinsics */ \ 18221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(InvokeIntrinsic, AccumulatorUse::kWrite, OperandType::kIntrinsicId, \ 18321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kMaybeReg, OperandType::kRegCount) \ 18421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 18521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* New operator */ \ 18621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(New, AccumulatorUse::kReadWrite, OperandType::kReg, \ 18721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kMaybeReg, OperandType::kRegCount) \ 18821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 18921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Test Operators */ \ 19021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestNotEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestEqualStrict, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestLessThan, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestGreaterThan, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestLessThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestGreaterThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestInstanceOf, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(TestIn, AccumulatorUse::kReadWrite, OperandType::kReg) \ 19921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 20021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Cast operators */ \ 20121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ToName, AccumulatorUse::kReadWrite) \ 20221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ToNumber, AccumulatorUse::kReadWrite) \ 20321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ToObject, AccumulatorUse::kReadWrite) \ 20421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 20521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Literals */ \ 20621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateRegExpLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \ 20721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kFlag8) \ 20821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateArrayLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \ 20921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kFlag8) \ 21021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateObjectLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \ 21121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kIdx, OperandType::kFlag8) \ 21221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 21321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Closure allocation */ \ 21421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateClosure, AccumulatorUse::kWrite, OperandType::kIdx, \ 21521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kFlag8) \ 21621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 21721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Arguments allocation */ \ 21821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateMappedArguments, AccumulatorUse::kWrite) \ 21921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateUnmappedArguments, AccumulatorUse::kWrite) \ 22021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(CreateRestParameter, AccumulatorUse::kWrite) \ 22121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 22221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Control Flow */ \ 22321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Jump, AccumulatorUse::kNone, OperandType::kImm) \ 22421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpConstant, AccumulatorUse::kNone, OperandType::kIdx) \ 22521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfTrue, AccumulatorUse::kRead, OperandType::kImm) \ 22621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfTrueConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 22721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfFalse, AccumulatorUse::kRead, OperandType::kImm) \ 22821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfFalseConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 22921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfToBooleanTrue, AccumulatorUse::kRead, OperandType::kImm) \ 23021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfToBooleanTrueConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 23121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfToBooleanFalse, AccumulatorUse::kRead, OperandType::kImm) \ 23221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfToBooleanFalseConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 23321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfNull, AccumulatorUse::kRead, OperandType::kImm) \ 23421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfNullConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 23521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfUndefined, AccumulatorUse::kRead, OperandType::kImm) \ 23621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfUndefinedConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 23721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfNotHole, AccumulatorUse::kRead, OperandType::kImm) \ 23821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(JumpIfNotHoleConstant, AccumulatorUse::kRead, OperandType::kIdx) \ 23921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 24021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Complex flow control For..in */ \ 24121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ForInPrepare, AccumulatorUse::kRead, OperandType::kRegOutTriple) \ 24221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ForInDone, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg) \ 24321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ForInNext, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ 24421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandType::kRegPair, OperandType::kIdx) \ 24521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ForInStep, AccumulatorUse::kWrite, OperandType::kReg) \ 24621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 24721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Perform a stack guard check */ \ 24821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(StackCheck, AccumulatorUse::kNone) \ 24921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 25021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Non-local flow control */ \ 25121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Throw, AccumulatorUse::kRead) \ 25221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ReThrow, AccumulatorUse::kRead) \ 25321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Return, AccumulatorUse::kRead) \ 25421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 25521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Generators */ \ 25621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(SuspendGenerator, AccumulatorUse::kRead, OperandType::kReg) \ 25721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(ResumeGenerator, AccumulatorUse::kWrite, OperandType::kReg) \ 25821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 25921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Debugger */ \ 26021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Debugger, AccumulatorUse::kNone) \ 26121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DEBUG_BREAK_BYTECODE_LIST(V) \ 26221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 26321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* Illegal bytecode (terminates execution) */ \ 26421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch V(Illegal, AccumulatorUse::kNone) \ 26521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch \ 26621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* No operation (used to maintain source positions for peephole */ \ 26721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch /* eliminated bytecodes). */ \ 268537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch V(Nop, AccumulatorUse::kNone) 2691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2701b268ca467c924004286c97bac133db489cf43d0Ben Murdochenum class AccumulatorUse : uint8_t { 2711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kNone = 0, 2721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kRead = 1 << 0, 2731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kWrite = 1 << 1, 2741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kReadWrite = kRead | kWrite 2751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 2761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2771b268ca467c924004286c97bac133db489cf43d0Ben MurdochV8_INLINE AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { 2781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch int result = static_cast<int>(lhs) & static_cast<int>(rhs); 2791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return static_cast<AccumulatorUse>(result); 2801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 2811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2821b268ca467c924004286c97bac133db489cf43d0Ben MurdochV8_INLINE AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { 2831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch int result = static_cast<int>(lhs) | static_cast<int>(rhs); 2841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return static_cast<AccumulatorUse>(result); 2851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 2861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Enumeration of scaling factors applicable to scalable operands. Code 2881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// relies on being able to cast values to integer scaling values. 289537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch#define OPERAND_SCALE_LIST(V) \ 290537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch V(Single, 1) \ 291537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch V(Double, 2) \ 292537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch V(Quadruple, 4) 293537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 2941b268ca467c924004286c97bac133db489cf43d0Ben Murdochenum class OperandScale : uint8_t { 295537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch#define DECLARE_OPERAND_SCALE(Name, Scale) k##Name = Scale, 296537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch OPERAND_SCALE_LIST(DECLARE_OPERAND_SCALE) 297537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch#undef DECLARE_OPERAND_SCALE 298537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch kLast = kQuadruple 2991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 3001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 3011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Enumeration of the size classes of operand types used by 3021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// bytecodes. Code relies on being able to cast values to integer 3031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// types to get the size in bytes. 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class OperandSize : uint8_t { 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone = 0, 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kByte = 1, 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kShort = 2, 3081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kQuad = 4, 3091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch kLast = kQuad 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Primitive operand info used that summarize properties of operands. 3131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Columns are Name, IsScalable, IsUnsigned, UnscaledSize. 3141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define OPERAND_TYPE_INFO_LIST(V) \ 3151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(None, false, false, OperandSize::kNone) \ 3161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(ScalableSignedByte, true, false, OperandSize::kByte) \ 3171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(ScalableUnsignedByte, true, true, OperandSize::kByte) \ 3181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(FixedUnsignedByte, false, true, OperandSize::kByte) \ 3191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch V(FixedUnsignedShort, false, true, OperandSize::kShort) 3201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 3211b268ca467c924004286c97bac133db489cf43d0Ben Murdochenum class OperandTypeInfo : uint8_t { 3221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define DECLARE_OPERAND_TYPE_INFO(Name, ...) k##Name, 3231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) 3241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#undef DECLARE_OPERAND_TYPE_INFO 3251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Enumeration of operand types used by bytecodes. 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class OperandType : uint8_t { 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_OPERAND_TYPE(Name, _) k##Name, 330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE) 331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_OPERAND_TYPE 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define COUNT_OPERAND_TYPES(x, _) +1 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The COUNT_OPERAND macro will turn this into kLast = -1 +1 +1... which will 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // evaluate to the same value as the last operand. 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kLast = -1 OPERAND_TYPE_LIST(COUNT_OPERAND_TYPES) 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef COUNT_OPERAND_TYPES 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Enumeration of interpreter bytecodes. 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class Bytecode : uint8_t { 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_BYTECODE(Name, ...) k##Name, 343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BYTECODE_LIST(DECLARE_BYTECODE) 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_BYTECODE 345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define COUNT_BYTECODE(x, ...) +1 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The COUNT_BYTECODE macro will turn this into kLast = -1 +1 +1... which will 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // evaluate to the same value as the last real bytecode. 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kLast = -1 BYTECODE_LIST(COUNT_BYTECODE) 349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef COUNT_BYTECODE 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// An interpreter Register which is located in the function's Register file 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// in its stack-frame. Register hold parameters, this, and expression values. 355537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdochclass Register final { 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 357342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch explicit Register(int index = kInvalidIndex) : index_(index) {} 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 359342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch int index() const { return index_; } 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_parameter() const { return index() < 0; } 361342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch bool is_valid() const { return index_ != kInvalidIndex; } 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Register FromParameterIndex(int index, int parameter_count); 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int ToParameterIndex(int parameter_count) const; 365342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 366342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns an invalid register. 367342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static Register invalid_value() { return Register(); } 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the register for the function's closure object. 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Register function_closure(); 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_function_closure() const; 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 373342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns the register which holds the current context object. 374342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static Register current_context(); 375342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch bool is_current_context() const; 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the register for the incoming new target value. 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Register new_target(); 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_new_target() const; 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 381537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns the register for the bytecode array. 382537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static Register bytecode_array(); 383537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch bool is_bytecode_array() const; 384537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 385537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns the register for the saved bytecode offset. 386537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static Register bytecode_offset(); 387537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch bool is_bytecode_offset() const; 388537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 38921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Returns a register that can be used to represent the accumulator 39021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // within code in the interpreter, but should never be emitted in 39121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // bytecode. 39221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static Register virtual_accumulator(); 39321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 394537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch OperandSize SizeOfOperand() const; 395537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 396537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch int32_t ToOperand() const { return kRegisterFileStartOffset - index_; } 397537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static Register FromOperand(int32_t operand) { 398537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch return Register(kRegisterFileStartOffset - operand); 399537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } 400342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AreContiguous(Register reg1, Register reg2, 402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg3 = Register(), 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg4 = Register(), 404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg5 = Register()); 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 406342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch std::string ToString(int parameter_count); 407342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator==(const Register& other) const { 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return index() == other.index(); 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator!=(const Register& other) const { 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return index() != other.index(); 413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator<(const Register& other) const { 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return index() < other.index(); 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator<=(const Register& other) const { 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return index() <= other.index(); 419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 420342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch bool operator>(const Register& other) const { 421342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch return index() > other.index(); 422342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch } 423342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch bool operator>=(const Register& other) const { 424342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch return index() >= other.index(); 425342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch } 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 428342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static const int kInvalidIndex = kMaxInt; 429537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static const int kRegisterFileStartOffset = 430537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch InterpreterFrameConstants::kRegisterFileFromFp / kPointerSize; 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* operator new(size_t size); 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void operator delete(void* p); 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int index_; 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Bytecodes { 440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns string representation of |bytecode|. 442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const char* ToString(Bytecode bytecode); 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns string representation of |bytecode|. 4451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static std::string ToString(Bytecode bytecode, OperandScale operand_scale); 4461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns string representation of |accumulator_use|. 4481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static const char* AccumulatorUseToString(AccumulatorUse accumulator_use); 4491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns string representation of |operand_type|. 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const char* OperandTypeToString(OperandType operand_type); 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns string representation of |operand_scale|. 4541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static const char* OperandScaleToString(OperandScale operand_scale); 4551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns string representation of |operand_size|. 457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const char* OperandSizeToString(OperandSize operand_size); 458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns byte value of bytecode. 46021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static uint8_t ToByte(Bytecode bytecode) { 46121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK_LE(bytecode, Bytecode::kLast); 46221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return static_cast<uint8_t>(bytecode); 46321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns bytecode for |value|. 466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Bytecode FromByte(uint8_t value); 467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the number of operands expected by |bytecode|. 469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int NumberOfOperands(Bytecode bytecode); 470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 471342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns the number of register operands expected by |bytecode|. 472342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static int NumberOfRegisterOperands(Bytecode bytecode); 473342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 4741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns the prefix bytecode representing an operand scale to be 4751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // applied to a a bytecode. 4761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale); 4771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if the operand scale requires a prefix bytecode. 4791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale); 4801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns the scaling applied to scalable operands if bytecode is 4821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // is a scaling prefix. 4831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode); 4841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns how accumulator is used by |bytecode|. 4861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static AccumulatorUse GetAccumulatorUse(Bytecode bytecode); 4871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if |bytecode| reads the accumulator. 4891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool ReadsAccumulator(Bytecode bytecode); 4901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if |bytecode| writes the accumulator. 4921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool WritesAccumulator(Bytecode bytecode); 4931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 494537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Return true if |bytecode| writes the accumulator with a boolean value. 495537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static bool WritesBooleanToAccumulator(Bytecode bytecode); 496537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 49721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Return true if |bytecode| is an accumulator load without effects, 498537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // e.g. LdaConstant, LdaTrue, Ldar. 499537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static bool IsAccumulatorLoadWithoutEffects(Bytecode bytecode); 500537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 50121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Return true if |bytecode| is a jump without effects, 50221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // e.g. any jump excluding those that include type coercion like 50321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // JumpIfTrueToBoolean. 50421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static bool IsJumpWithoutEffects(Bytecode bytecode); 50521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 50621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Return true if |bytecode| is a register load without effects, 50721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // e.g. Mov, Star, LdrUndefined. 50821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static bool IsRegisterLoadWithoutEffects(Bytecode bytecode); 50921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 51021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Returns true if |bytecode| has no effects. 51121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static bool IsWithoutExternalSideEffects(Bytecode bytecode); 51221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 513342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns the i-th operand of |bytecode|. 514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static OperandType GetOperandType(Bytecode bytecode, int i); 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 516537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns a pointer to an array of operand types terminated in 517537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // OperandType::kNone. 518537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static const OperandType* GetOperandTypes(Bytecode bytecode); 519537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 52021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Returns a pointer to an array of operand type info terminated in 52121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // OperandTypeInfo::kNone. 52221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static const OperandTypeInfo* GetOperandTypeInfos(Bytecode bytecode); 52321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 524342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns the size of the i-th operand of |bytecode|. 5251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static OperandSize GetOperandSize(Bytecode bytecode, int i, 5261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandScale operand_scale); 527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 52821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Returns a pointer to an array of the operand sizes for |bytecode|. 52921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static const OperandSize* GetOperandSizes(Bytecode bytecode, 53021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch OperandScale operand_scale); 53121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the offset of the i-th operand of |bytecode| relative to the start 533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of the bytecode. 5341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static int GetOperandOffset(Bytecode bytecode, int i, 5351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandScale operand_scale); 536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 537342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns a zero-based bitmap of the register operand positions of 538342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // |bytecode|. 539342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static int GetRegisterOperandBitmap(Bytecode bytecode); 540342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 5411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns a debug break bytecode to replace |bytecode|. 542342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static Bytecode GetDebugBreak(Bytecode bytecode); 543342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 5441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns the size of the bytecode including its operands for the 5451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // given |operand_scale|. 5461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static int Size(Bytecode bytecode, OperandScale operand_scale); 547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the size of |operand|. 5491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static OperandSize SizeOfOperand(OperandType operand, OperandScale scale); 550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 551537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns the number of values which |bytecode| returns. 552537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static size_t ReturnCount(Bytecode bytecode); 553537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 554342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a conditional jump taking 5551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // an immediate byte operand (OperandType::kImm). 556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsConditionalJumpImmediate(Bytecode bytecode); 557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 558342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a conditional jump taking 5591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // a constant pool entry (OperandType::kIdx). 560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsConditionalJumpConstant(Bytecode bytecode); 561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 562342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a conditional jump taking 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // any kind of operand. 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsConditionalJump(Bytecode bytecode); 565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 566342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a jump or a conditional jump taking 5671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // an immediate byte operand (OperandType::kImm). 568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsJumpImmediate(Bytecode bytecode); 569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 570342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a jump or conditional jump taking a 5711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // constant pool entry (OperandType::kIdx). 572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsJumpConstant(Bytecode bytecode); 573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 574342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a jump or conditional jump taking 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // any kind of operand. 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsJump(Bytecode bytecode); 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 578537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns true if the bytecode is a jump that internally coerces the 579537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // accumulator to a boolean. 580537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static bool IsJumpIfToBoolean(Bytecode bytecode); 581537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 582537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns the equivalent jump bytecode without the accumulator coercion. 583537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static Bytecode GetJumpWithoutToBoolean(Bytecode bytecode); 584537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 585342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a conditional jump, a jump, or a return. 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsJumpOrReturn(Bytecode bytecode); 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 588342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a call or a constructor call. 589342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsCallOrNew(Bytecode bytecode); 590342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 5911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if the bytecode is a call to the runtime. 5921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool IsCallRuntime(Bytecode bytecode); 5931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 594342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if the bytecode is a debug break. 595342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsDebugBreak(Bytecode bytecode); 596342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 597537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns true if the bytecode is Ldar or Star. 598537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static bool IsLdarOrStar(Bytecode bytecode); 599537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 6001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if the bytecode has wider operand forms. 6011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool IsBytecodeWithScalableOperands(Bytecode bytecode); 602342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 6031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if the bytecode is a scaling prefix bytecode. 6041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool IsPrefixScalingBytecode(Bytecode bytecode); 605342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 606342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if |operand_type| is any type of register operand. 607342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsRegisterOperandType(OperandType operand_type); 608342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 609342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if |operand_type| represents a register used as an input. 610342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsRegisterInputOperandType(OperandType operand_type); 611342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 612342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if |operand_type| represents a register used as an output. 613342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsRegisterOutputOperandType(OperandType operand_type); 614342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 615537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Returns the number of registers represented by a register operand. For 616537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // instance, a RegPair represents two registers. 617537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static int GetNumberOfRegistersRepresentedBy(OperandType operand_type); 618537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 619342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // Returns true if |operand_type| is a maybe register operand 6201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // (kMaybeReg). 621342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch static bool IsMaybeRegisterOperandType(OperandType operand_type); 622342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 6231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if |operand_type| is a runtime-id operand (kRuntimeId). 6241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool IsRuntimeIdOperandType(OperandType operand_type); 6251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if |operand_type| is unsigned, false if signed. 6271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool IsUnsignedOperandType(OperandType operand_type); 6281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Decodes a register operand in a byte array. 6301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static Register DecodeRegisterOperand(const uint8_t* operand_start, 6311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType operand_type, 6321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandScale operand_scale); 6331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Decodes a signed operand in a byte array. 6351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static int32_t DecodeSignedOperand(const uint8_t* operand_start, 6361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType operand_type, 6371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandScale operand_scale); 6381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Decodes an unsigned operand in a byte array. 6401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static uint32_t DecodeUnsignedOperand(const uint8_t* operand_start, 6411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandType operand_type, 6421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch OperandScale operand_scale); 6431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Decode a single bytecode and operands to |os|. 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static std::ostream& Decode(std::ostream& os, const uint8_t* bytecode_start, 646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int number_of_parameters); 647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Returns true if a handler is generated for a bytecode at a given 6491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // operand scale. All bytecodes have handlers at OperandScale::kSingle, 6501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // but only bytecodes with scalable operands have handlers with larger 6511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // OperandScale values. 6521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch static bool BytecodeHasHandler(Bytecode bytecode, OperandScale operand_scale); 6531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 654537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Return the operand size required to hold a signed operand. 655537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch static OperandSize SizeForSignedOperand(int value); 656537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 657537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // Return the operand size required to hold an unsigned operand. 65821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch static OperandSize SizeForUnsignedOperand(uint32_t value); 6591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes); 662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 664537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdochclass CreateObjectLiteralFlags { 665537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch public: 666537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch class FlagsBits : public BitField8<int, 0, 3> {}; 667537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch class FastClonePropertiesCountBits 668537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch : public BitField8<int, FlagsBits::kNext, 3> {}; 669537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch STATIC_ASSERT((FlagsBits::kMask & FastClonePropertiesCountBits::kMask) == 0); 670537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch}; 671537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); 6731b268ca467c924004286c97bac133db489cf43d0Ben Murdochstd::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); 6741b268ca467c924004286c97bac133db489cf43d0Ben Murdochstd::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); 6751b268ca467c924004286c97bac133db489cf43d0Ben Murdochstd::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); 676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, const OperandType& operand_type); 677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace interpreter 679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_INTERPRETER_BYTECODES_H_ 683