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