|  | //===- 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 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, | 
|  |  | 
|  | HasHvxTmpPos = 60, | 
|  | HasHvxTmpMask = 0x1, | 
|  |  | 
|  | CVINewPos = 62, | 
|  | CVINewMask = 0x1, | 
|  |  | 
|  | isCVIPos = 63, | 
|  | isCVIMask = 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 |