Index: src/compiler/instruction-codes.h |
diff --git a/src/compiler/instruction-codes.h b/src/compiler/instruction-codes.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6e59f9cde81630d15ff8f0ec56a329f05f29be10 |
--- /dev/null |
+++ b/src/compiler/instruction-codes.h |
@@ -0,0 +1,114 @@ |
+// 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_ |
+ |
+#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" |
+#elif V8_TARGET_ARCH_X64 |
+#include "src/compiler/x64/instruction-codes-x64.h" |
+#else |
+#error "Unsupported target architecture." |
+#endif |
+#include "src/utils.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+class OStream; |
+ |
+namespace compiler { |
+ |
+// Target-specific opcodes that specify which assembly sequence to emit. |
+// Most opcodes specify a single instruction. |
+#define ARCH_OPCODE_LIST(V) \ |
+ V(ArchDeoptimize) \ |
+ V(ArchJmp) \ |
+ V(ArchNop) \ |
+ V(ArchRet) \ |
+ 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 |
+}; |
+ |
+OStream& operator<<(OStream& os, const ArchOpcode& ao); |
+ |
+// 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 |
+}; |
+ |
+OStream& operator<<(OStream& os, const AddressingMode& am); |
+ |
+// The mode of the flags continuation (see below). |
+enum FlagsMode { kFlags_none = 0, kFlags_branch = 1, kFlags_set = 2 }; |
+ |
+OStream& operator<<(OStream& os, const FlagsMode& fm); |
+ |
+// The condition of flags continuation (see below). |
+enum FlagsCondition { |
+ kEqual, |
+ kNotEqual, |
+ kSignedLessThan, |
+ kSignedGreaterThanOrEqual, |
+ kSignedLessThanOrEqual, |
+ kSignedGreaterThan, |
+ kUnsignedLessThan, |
+ kUnsignedGreaterThanOrEqual, |
+ kUnsignedLessThanOrEqual, |
+ kUnsignedGreaterThan, |
+ kUnorderedEqual, |
+ kUnorderedNotEqual, |
+ kUnorderedLessThan, |
+ kUnorderedGreaterThanOrEqual, |
+ kUnorderedLessThanOrEqual, |
+ kUnorderedGreaterThan |
+}; |
+ |
+OStream& operator<<(OStream& os, const FlagsCondition& fc); |
+ |
+// 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. |
+typedef BitField<ArchOpcode, 0, 7> ArchOpcodeField; |
+typedef BitField<AddressingMode, 7, 4> AddressingModeField; |
+typedef BitField<FlagsMode, 11, 2> FlagsModeField; |
+typedef BitField<FlagsCondition, 13, 4> FlagsConditionField; |
+typedef BitField<int, 13, 19> MiscField; |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_COMPILER_INSTRUCTION_CODES_H_ |