instruction-codes.h 5.15 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_INSTRUCTION_CODES_H_
#define V8_COMPILER_INSTRUCTION_CODES_H_

8 9
#include <iosfwd>

10 11 12 13 14 15
#if V8_TARGET_ARCH_ARM
#include "src/compiler/arm/instruction-codes-arm.h"
#elif V8_TARGET_ARCH_ARM64
#include "src/compiler/arm64/instruction-codes-arm64.h"
#elif V8_TARGET_ARCH_IA32
#include "src/compiler/ia32/instruction-codes-ia32.h"
16 17
#elif V8_TARGET_ARCH_MIPS
#include "src/compiler/mips/instruction-codes-mips.h"
18 19
#elif V8_TARGET_ARCH_MIPS64
#include "src/compiler/mips64/instruction-codes-mips64.h"
20 21
#elif V8_TARGET_ARCH_X64
#include "src/compiler/x64/instruction-codes-x64.h"
22 23
#elif V8_TARGET_ARCH_PPC
#include "src/compiler/ppc/instruction-codes-ppc.h"
24 25
#elif V8_TARGET_ARCH_X87
#include "src/compiler/x87/instruction-codes-x87.h"
26
#else
27 28
#define TARGET_ARCH_OPCODE_LIST(V)
#define TARGET_ADDRESSING_MODE_LIST(V)
29 30 31 32 33 34 35 36 37
#endif
#include "src/utils.h"

namespace v8 {
namespace internal {
namespace compiler {

// Target-specific opcodes that specify which assembly sequence to emit.
// Most opcodes specify a single instruction.
38 39 40 41 42 43 44
#define ARCH_OPCODE_LIST(V)   \
  V(ArchCallCodeObject)       \
  V(ArchTailCallCodeObject)   \
  V(ArchCallJSFunction)       \
  V(ArchTailCallJSFunction)   \
  V(ArchPrepareCallCFunction) \
  V(ArchCallCFunction)        \
45
  V(ArchLazyBailout)          \
46 47 48 49 50 51 52 53 54 55 56 57 58 59
  V(ArchJmp)                  \
  V(ArchLookupSwitch)         \
  V(ArchTableSwitch)          \
  V(ArchNop)                  \
  V(ArchDeoptimize)           \
  V(ArchRet)                  \
  V(ArchStackPointer)         \
  V(ArchFramePointer)         \
  V(ArchTruncateDoubleToI)    \
  V(CheckedLoadInt8)          \
  V(CheckedLoadUint8)         \
  V(CheckedLoadInt16)         \
  V(CheckedLoadUint16)        \
  V(CheckedLoadWord32)        \
60
  V(CheckedLoadWord64)        \
61 62 63 64 65
  V(CheckedLoadFloat32)       \
  V(CheckedLoadFloat64)       \
  V(CheckedStoreWord8)        \
  V(CheckedStoreWord16)       \
  V(CheckedStoreWord32)       \
66
  V(CheckedStoreWord64)       \
67 68
  V(CheckedStoreFloat32)      \
  V(CheckedStoreFloat64)      \
69 70 71 72 73 74 75 76 77 78 79
  TARGET_ARCH_OPCODE_LIST(V)

enum ArchOpcode {
#define DECLARE_ARCH_OPCODE(Name) k##Name,
  ARCH_OPCODE_LIST(DECLARE_ARCH_OPCODE)
#undef DECLARE_ARCH_OPCODE
#define COUNT_ARCH_OPCODE(Name) +1
  kLastArchOpcode = -1 ARCH_OPCODE_LIST(COUNT_ARCH_OPCODE)
#undef COUNT_ARCH_OPCODE
};

80
std::ostream& operator<<(std::ostream& os, const ArchOpcode& ao);
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98

// Addressing modes represent the "shape" of inputs to an instruction.
// Many instructions support multiple addressing modes. Addressing modes
// are encoded into the InstructionCode of the instruction and tell the
// code generator after register allocation which assembler method to call.
#define ADDRESSING_MODE_LIST(V) \
  V(None)                       \
  TARGET_ADDRESSING_MODE_LIST(V)

enum AddressingMode {
#define DECLARE_ADDRESSING_MODE(Name) kMode_##Name,
  ADDRESSING_MODE_LIST(DECLARE_ADDRESSING_MODE)
#undef DECLARE_ADDRESSING_MODE
#define COUNT_ADDRESSING_MODE(Name) +1
  kLastAddressingMode = -1 ADDRESSING_MODE_LIST(COUNT_ADDRESSING_MODE)
#undef COUNT_ADDRESSING_MODE
};

99
std::ostream& operator<<(std::ostream& os, const AddressingMode& am);
100 101 102 103

// The mode of the flags continuation (see below).
enum FlagsMode { kFlags_none = 0, kFlags_branch = 1, kFlags_set = 2 };

104
std::ostream& operator<<(std::ostream& os, const FlagsMode& fm);
105 106 107 108 109 110 111 112 113 114 115 116 117

// The condition of flags continuation (see below).
enum FlagsCondition {
  kEqual,
  kNotEqual,
  kSignedLessThan,
  kSignedGreaterThanOrEqual,
  kSignedLessThanOrEqual,
  kSignedGreaterThan,
  kUnsignedLessThan,
  kUnsignedGreaterThanOrEqual,
  kUnsignedLessThanOrEqual,
  kUnsignedGreaterThan,
118 119 120 121 122 123 124 125
  kFloatLessThanOrUnordered,
  kFloatGreaterThanOrEqual,
  kFloatLessThanOrEqual,
  kFloatGreaterThanOrUnordered,
  kFloatLessThan,
  kFloatGreaterThanOrEqualOrUnordered,
  kFloatLessThanOrEqualOrUnordered,
  kFloatGreaterThan,
126 127
  kUnorderedEqual,
  kUnorderedNotEqual,
128 129
  kOverflow,
  kNotOverflow
130 131
};

132 133 134 135
inline FlagsCondition NegateFlagsCondition(FlagsCondition condition) {
  return static_cast<FlagsCondition>(condition ^ 1);
}

136 137
FlagsCondition CommuteFlagsCondition(FlagsCondition condition);

138
std::ostream& operator<<(std::ostream& os, const FlagsCondition& fc);
139 140 141 142 143 144 145 146 147 148 149

// The InstructionCode is an opaque, target-specific integer that encodes
// what code to emit for an instruction in the code generator. It is not
// interesting to the register allocator, as the inputs and flags on the
// instructions specify everything of interest.
typedef int32_t InstructionCode;

// Helpers for encoding / decoding InstructionCode into the fields needed
// for code generation. We encode the instruction, addressing mode, and flags
// continuation into a single InstructionCode which is stored as part of
// the instruction.
150 151 152
typedef BitField<ArchOpcode, 0, 8> ArchOpcodeField;
typedef BitField<AddressingMode, 8, 5> AddressingModeField;
typedef BitField<FlagsMode, 13, 2> FlagsModeField;
153 154
typedef BitField<FlagsCondition, 15, 5> FlagsConditionField;
typedef BitField<int, 20, 12> MiscField;
155 156 157 158 159 160

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_INSTRUCTION_CODES_H_