| // 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_ | |
| #include <iosfwd> | |
| #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_MIPS | |
| #include "src/compiler/mips/instruction-codes-mips.h" | |
| #elif V8_TARGET_ARCH_MIPS64 | |
| #include "src/compiler/mips64/instruction-codes-mips64.h" | |
| #elif V8_TARGET_ARCH_X64 | |
| #include "src/compiler/x64/instruction-codes-x64.h" | |
| #elif V8_TARGET_ARCH_PPC | |
| #include "src/compiler/ppc/instruction-codes-ppc.h" | |
| #elif V8_TARGET_ARCH_S390 | |
| #include "src/compiler/s390/instruction-codes-s390.h" | |
| #else | |
| #define TARGET_ARCH_OPCODE_LIST(V) | |
| #define TARGET_ADDRESSING_MODE_LIST(V) | |
| #endif | |
| #include "src/globals.h" | |
| #include "src/utils.h" | |
| namespace v8 { | |
| namespace internal { | |
| namespace compiler { | |
| // Modes for ArchStoreWithWriteBarrier below. | |
| enum class RecordWriteMode { kValueIsMap, kValueIsPointer, kValueIsAny }; | |
| // Target-specific opcodes that specify which assembly sequence to emit. | |
| // Most opcodes specify a single instruction. | |
| #define COMMON_ARCH_OPCODE_LIST(V) \ | |
| V(ArchCallCodeObject) \ | |
| V(ArchTailCallCodeObjectFromJSFunction) \ | |
| V(ArchTailCallCodeObject) \ | |
| V(ArchCallJSFunction) \ | |
| V(ArchTailCallAddress) \ | |
| V(ArchPrepareCallCFunction) \ | |
| V(ArchSaveCallerRegisters) \ | |
| V(ArchRestoreCallerRegisters) \ | |
| V(ArchCallCFunction) \ | |
| V(ArchPrepareTailCall) \ | |
| V(ArchCallWasmFunction) \ | |
| V(ArchTailCallWasm) \ | |
| V(ArchJmp) \ | |
| V(ArchBinarySearchSwitch) \ | |
| V(ArchLookupSwitch) \ | |
| V(ArchTableSwitch) \ | |
| V(ArchNop) \ | |
| V(ArchDebugAbort) \ | |
| V(ArchDebugBreak) \ | |
| V(ArchComment) \ | |
| V(ArchThrowTerminator) \ | |
| V(ArchDeoptimize) \ | |
| V(ArchRet) \ | |
| V(ArchStackPointer) \ | |
| V(ArchFramePointer) \ | |
| V(ArchParentFramePointer) \ | |
| V(ArchTruncateDoubleToI) \ | |
| V(ArchStoreWithWriteBarrier) \ | |
| V(ArchStackSlot) \ | |
| V(ArchWordPoisonOnSpeculation) \ | |
| V(Word32AtomicLoadInt8) \ | |
| V(Word32AtomicLoadUint8) \ | |
| V(Word32AtomicLoadInt16) \ | |
| V(Word32AtomicLoadUint16) \ | |
| V(Word32AtomicLoadWord32) \ | |
| V(Word32AtomicStoreWord8) \ | |
| V(Word32AtomicStoreWord16) \ | |
| V(Word32AtomicStoreWord32) \ | |
| V(Word32AtomicExchangeInt8) \ | |
| V(Word32AtomicExchangeUint8) \ | |
| V(Word32AtomicExchangeInt16) \ | |
| V(Word32AtomicExchangeUint16) \ | |
| V(Word32AtomicExchangeWord32) \ | |
| V(Word32AtomicCompareExchangeInt8) \ | |
| V(Word32AtomicCompareExchangeUint8) \ | |
| V(Word32AtomicCompareExchangeInt16) \ | |
| V(Word32AtomicCompareExchangeUint16) \ | |
| V(Word32AtomicCompareExchangeWord32) \ | |
| V(Word32AtomicAddInt8) \ | |
| V(Word32AtomicAddUint8) \ | |
| V(Word32AtomicAddInt16) \ | |
| V(Word32AtomicAddUint16) \ | |
| V(Word32AtomicAddWord32) \ | |
| V(Word32AtomicSubInt8) \ | |
| V(Word32AtomicSubUint8) \ | |
| V(Word32AtomicSubInt16) \ | |
| V(Word32AtomicSubUint16) \ | |
| V(Word32AtomicSubWord32) \ | |
| V(Word32AtomicAndInt8) \ | |
| V(Word32AtomicAndUint8) \ | |
| V(Word32AtomicAndInt16) \ | |
| V(Word32AtomicAndUint16) \ | |
| V(Word32AtomicAndWord32) \ | |
| V(Word32AtomicOrInt8) \ | |
| V(Word32AtomicOrUint8) \ | |
| V(Word32AtomicOrInt16) \ | |
| V(Word32AtomicOrUint16) \ | |
| V(Word32AtomicOrWord32) \ | |
| V(Word32AtomicXorInt8) \ | |
| V(Word32AtomicXorUint8) \ | |
| V(Word32AtomicXorInt16) \ | |
| V(Word32AtomicXorUint16) \ | |
| V(Word32AtomicXorWord32) \ | |
| V(Ieee754Float64Acos) \ | |
| V(Ieee754Float64Acosh) \ | |
| V(Ieee754Float64Asin) \ | |
| V(Ieee754Float64Asinh) \ | |
| V(Ieee754Float64Atan) \ | |
| V(Ieee754Float64Atanh) \ | |
| V(Ieee754Float64Atan2) \ | |
| V(Ieee754Float64Cbrt) \ | |
| V(Ieee754Float64Cos) \ | |
| V(Ieee754Float64Cosh) \ | |
| V(Ieee754Float64Exp) \ | |
| V(Ieee754Float64Expm1) \ | |
| V(Ieee754Float64Log) \ | |
| V(Ieee754Float64Log1p) \ | |
| V(Ieee754Float64Log10) \ | |
| V(Ieee754Float64Log2) \ | |
| V(Ieee754Float64Pow) \ | |
| V(Ieee754Float64Sin) \ | |
| V(Ieee754Float64Sinh) \ | |
| V(Ieee754Float64Tan) \ | |
| V(Ieee754Float64Tanh) | |
| #define ARCH_OPCODE_LIST(V) \ | |
| COMMON_ARCH_OPCODE_LIST(V) \ | |
| 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 | |
| }; | |
| V8_EXPORT_PRIVATE std::ostream& operator<<(std::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 | |
| }; | |
| V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | |
| const AddressingMode& am); | |
| // The mode of the flags continuation (see below). | |
| enum FlagsMode { | |
| kFlags_none = 0, | |
| kFlags_branch = 1, | |
| kFlags_branch_and_poison = 2, | |
| kFlags_deoptimize = 3, | |
| kFlags_deoptimize_and_poison = 4, | |
| kFlags_set = 5, | |
| kFlags_trap = 6 | |
| }; | |
| V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | |
| const FlagsMode& fm); | |
| // The condition of flags continuation (see below). | |
| enum FlagsCondition { | |
| kEqual, | |
| kNotEqual, | |
| kSignedLessThan, | |
| kSignedGreaterThanOrEqual, | |
| kSignedLessThanOrEqual, | |
| kSignedGreaterThan, | |
| kUnsignedLessThan, | |
| kUnsignedGreaterThanOrEqual, | |
| kUnsignedLessThanOrEqual, | |
| kUnsignedGreaterThan, | |
| kFloatLessThanOrUnordered, | |
| kFloatGreaterThanOrEqual, | |
| kFloatLessThanOrEqual, | |
| kFloatGreaterThanOrUnordered, | |
| kFloatLessThan, | |
| kFloatGreaterThanOrEqualOrUnordered, | |
| kFloatLessThanOrEqualOrUnordered, | |
| kFloatGreaterThan, | |
| kUnorderedEqual, | |
| kUnorderedNotEqual, | |
| kOverflow, | |
| kNotOverflow, | |
| kPositiveOrZero, | |
| kNegative | |
| }; | |
| inline FlagsCondition NegateFlagsCondition(FlagsCondition condition) { | |
| return static_cast<FlagsCondition>(condition ^ 1); | |
| } | |
| FlagsCondition CommuteFlagsCondition(FlagsCondition condition); | |
| V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | |
| const FlagsCondition& fc); | |
| enum MemoryAccessMode { | |
| kMemoryAccessDirect = 0, | |
| kMemoryAccessProtected = 1, | |
| kMemoryAccessPoisoned = 2 | |
| }; | |
| // 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, 9> ArchOpcodeField; | |
| typedef BitField<AddressingMode, 9, 5> AddressingModeField; | |
| typedef BitField<FlagsMode, 14, 3> FlagsModeField; | |
| typedef BitField<FlagsCondition, 17, 5> FlagsConditionField; | |
| typedef BitField<int, 22, 10> MiscField; | |
| } // namespace compiler | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_COMPILER_INSTRUCTION_CODES_H_ |