| //===- HexagonBaseInfo.h - Top level definitions for Hexagon ----*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains small standalone helper functions and enum definitions for |
| // the Hexagon target useful for the compiler back-end and the MC libraries. |
| // As such, it deliberately does not include references to LLVM core |
| // code gen types, passes, etc.. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H |
| #define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H |
| |
| #include "HexagonDepITypes.h" |
| #include "MCTargetDesc/HexagonMCTargetDesc.h" |
| |
| namespace llvm { |
| |
| /// HexagonII - This namespace holds all of the target specific flags that |
| /// instruction info tracks. |
| namespace HexagonII { |
| unsigned const TypeCVI_FIRST = TypeCVI_4SLOT_MPY; |
| unsigned const TypeCVI_LAST = TypeCVI_ZW; |
| |
| enum SubTarget { |
| HasV55SubT = 0x3c, |
| HasV60SubT = 0x38, |
| }; |
| |
| enum AddrMode { |
| NoAddrMode = 0, // No addressing mode |
| Absolute = 1, // Absolute addressing mode |
| AbsoluteSet = 2, // Absolute set addressing mode |
| BaseImmOffset = 3, // Indirect with offset |
| BaseLongOffset = 4, // Indirect with long offset |
| BaseRegOffset = 5, // Indirect with register offset |
| PostInc = 6 // Post increment addressing mode |
| }; |
| |
| enum MemAccessSize { |
| NoMemAccess = 0, |
| ByteAccess, |
| HalfWordAccess, |
| WordAccess, |
| DoubleWordAccess, |
| HVXVectorAccess |
| }; |
| |
| // MCInstrDesc TSFlags |
| // *** Must match HexagonInstrFormat*.td *** |
| enum { |
| // This 7-bit field describes the insn type. |
| TypePos = 0, |
| TypeMask = 0x7f, |
| |
| // Solo instructions. |
| SoloPos = 7, |
| SoloMask = 0x1, |
| // Packed only with A or X-type instructions. |
| SoloAXPos = 8, |
| SoloAXMask = 0x1, |
| // Only A-type instruction in first slot or nothing. |
| RestrictSlot1AOKPos = 9, |
| RestrictSlot1AOKMask = 0x1, |
| |
| // Predicated instructions. |
| PredicatedPos = 10, |
| PredicatedMask = 0x1, |
| PredicatedFalsePos = 11, |
| PredicatedFalseMask = 0x1, |
| PredicatedNewPos = 12, |
| PredicatedNewMask = 0x1, |
| PredicateLatePos = 13, |
| PredicateLateMask = 0x1, |
| |
| // New-Value consumer instructions. |
| NewValuePos = 14, |
| NewValueMask = 0x1, |
| // New-Value producer instructions. |
| hasNewValuePos = 15, |
| hasNewValueMask = 0x1, |
| // Which operand consumes or produces a new value. |
| NewValueOpPos = 16, |
| NewValueOpMask = 0x7, |
| // Stores that can become new-value stores. |
| mayNVStorePos = 19, |
| mayNVStoreMask = 0x1, |
| // New-value store instructions. |
| NVStorePos = 20, |
| NVStoreMask = 0x1, |
| // Loads that can become current-value loads. |
| mayCVLoadPos = 21, |
| mayCVLoadMask = 0x1, |
| // Current-value load instructions. |
| CVLoadPos = 22, |
| CVLoadMask = 0x1, |
| |
| // Extendable insns. |
| ExtendablePos = 23, |
| ExtendableMask = 0x1, |
| // Insns must be extended. |
| ExtendedPos = 24, |
| ExtendedMask = 0x1, |
| // Which operand may be extended. |
| ExtendableOpPos = 25, |
| ExtendableOpMask = 0x7, |
| // Signed or unsigned range. |
| ExtentSignedPos = 28, |
| ExtentSignedMask = 0x1, |
| // Number of bits of range before extending operand. |
| ExtentBitsPos = 29, |
| ExtentBitsMask = 0x1f, |
| // Alignment power-of-two before extending operand. |
| ExtentAlignPos = 34, |
| ExtentAlignMask = 0x3, |
| |
| CofMax1Pos = 36, |
| CofMax1Mask = 0x1, |
| CofRelax1Pos = 37, |
| CofRelax1Mask = 0x1, |
| CofRelax2Pos = 38, |
| CofRelax2Mask = 0x1, |
| |
| RestrictNoSlot1StorePos = 39, |
| RestrictNoSlot1StoreMask = 0x1, |
| |
| // Addressing mode for load/store instructions. |
| AddrModePos = 42, |
| AddrModeMask = 0x7, |
| // Access size for load/store instructions. |
| MemAccessSizePos = 45, |
| MemAccesSizeMask = 0xf, |
| |
| // Branch predicted taken. |
| TakenPos = 49, |
| TakenMask = 0x1, |
| |
| // Floating-point instructions. |
| FPPos = 50, |
| FPMask = 0x1, |
| |
| // New-Value producer-2 instructions. |
| hasNewValuePos2 = 52, |
| hasNewValueMask2 = 0x1, |
| // Which operand consumes or produces a new value. |
| NewValueOpPos2 = 53, |
| NewValueOpMask2 = 0x7, |
| |
| // Accumulator instructions. |
| AccumulatorPos = 56, |
| AccumulatorMask = 0x1, |
| |
| // Complex XU, prevent xu competition by preferring slot3 |
| PrefersSlot3Pos = 57, |
| PrefersSlot3Mask = 0x1, |
| |
| // v65 |
| HasTmpDstPos = 60, |
| HasTmpDstMask = 0x1, |
| |
| CVINewPos = 62, |
| CVINewMask = 0x1, |
| }; |
| |
| // *** The code above must match HexagonInstrFormat*.td *** // |
| |
| // Hexagon specific MO operand flag mask. |
| enum HexagonMOTargetFlagVal { |
| // Hexagon-specific MachineOperand target flags. |
| // |
| // When changing these, make sure to update |
| // getSerializableDirectMachineOperandTargetFlags and |
| // getSerializableBitmaskMachineOperandTargetFlags if needed. |
| MO_NO_FLAG, |
| |
| /// MO_PCREL - On a symbol operand, indicates a PC-relative relocation |
| /// Used for computing a global address for PIC compilations |
| MO_PCREL, |
| |
| /// MO_GOT - Indicates a GOT-relative relocation |
| MO_GOT, |
| |
| // Low or high part of a symbol. |
| MO_LO16, |
| MO_HI16, |
| |
| // Offset from the base of the SDA. |
| MO_GPREL, |
| |
| // MO_GDGOT - indicates GOT relative relocation for TLS |
| // GeneralDynamic method |
| MO_GDGOT, |
| |
| // MO_GDPLT - indicates PLT relative relocation for TLS |
| // GeneralDynamic method |
| MO_GDPLT, |
| |
| // MO_IE - indicates non PIC relocation for TLS |
| // Initial Executable method |
| MO_IE, |
| |
| // MO_IEGOT - indicates PIC relocation for TLS |
| // Initial Executable method |
| MO_IEGOT, |
| |
| // MO_TPREL - indicates relocation for TLS |
| // local Executable method |
| MO_TPREL, |
| |
| // HMOTF_ConstExtended |
| // Addendum to above, indicates a const extended op |
| // Can be used as a mask. |
| HMOTF_ConstExtended = 0x80, |
| |
| // Union of all bitmasks (currently only HMOTF_ConstExtended). |
| MO_Bitmasks = HMOTF_ConstExtended |
| }; |
| |
| // Hexagon Sub-instruction classes. |
| enum SubInstructionGroup { |
| HSIG_None = 0, |
| HSIG_L1, |
| HSIG_L2, |
| HSIG_S1, |
| HSIG_S2, |
| HSIG_A, |
| HSIG_Compound |
| }; |
| |
| // Hexagon Compound classes. |
| enum CompoundGroup { |
| HCG_None = 0, |
| HCG_A, |
| HCG_B, |
| HCG_C |
| }; |
| |
| enum InstParseBits { |
| INST_PARSE_MASK = 0x0000c000, |
| INST_PARSE_PACKET_END = 0x0000c000, |
| INST_PARSE_LOOP_END = 0x00008000, |
| INST_PARSE_NOT_END = 0x00004000, |
| INST_PARSE_DUPLEX = 0x00000000, |
| INST_PARSE_EXTENDER = 0x00000000 |
| }; |
| |
| enum InstIClassBits : unsigned { |
| INST_ICLASS_MASK = 0xf0000000, |
| INST_ICLASS_EXTENDER = 0x00000000, |
| INST_ICLASS_J_1 = 0x10000000, |
| INST_ICLASS_J_2 = 0x20000000, |
| INST_ICLASS_LD_ST_1 = 0x30000000, |
| INST_ICLASS_LD_ST_2 = 0x40000000, |
| INST_ICLASS_J_3 = 0x50000000, |
| INST_ICLASS_CR = 0x60000000, |
| INST_ICLASS_ALU32_1 = 0x70000000, |
| INST_ICLASS_XTYPE_1 = 0x80000000, |
| INST_ICLASS_LD = 0x90000000, |
| INST_ICLASS_ST = 0xa0000000, |
| INST_ICLASS_ALU32_2 = 0xb0000000, |
| INST_ICLASS_XTYPE_2 = 0xc0000000, |
| INST_ICLASS_XTYPE_3 = 0xd0000000, |
| INST_ICLASS_XTYPE_4 = 0xe0000000, |
| INST_ICLASS_ALU32_3 = 0xf0000000 |
| }; |
| |
| LLVM_ATTRIBUTE_UNUSED |
| static unsigned getMemAccessSizeInBytes(MemAccessSize S) { |
| switch (S) { |
| case ByteAccess: return 1; |
| case HalfWordAccess: return 2; |
| case WordAccess: return 4; |
| case DoubleWordAccess: return 8; |
| default: return 0; |
| } |
| } |
| } // end namespace HexagonII |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H |