xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonBaseInfo.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===- HexagonBaseInfo.h - Top level definitions for Hexagon ----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file contains small standalone helper functions and enum definitions for
100b57cec5SDimitry Andric // the Hexagon target useful for the compiler back-end and the MC libraries.
110b57cec5SDimitry Andric // As such, it deliberately does not include references to LLVM core
120b57cec5SDimitry Andric // code gen types, passes, etc..
130b57cec5SDimitry Andric //
140b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H
170b57cec5SDimitry Andric #define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include "HexagonDepITypes.h"
200b57cec5SDimitry Andric #include "MCTargetDesc/HexagonMCTargetDesc.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric namespace llvm {
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric /// HexagonII - This namespace holds all of the target specific flags that
250b57cec5SDimitry Andric /// instruction info tracks.
260b57cec5SDimitry Andric namespace HexagonII {
270b57cec5SDimitry Andric   unsigned const TypeCVI_FIRST = TypeCVI_4SLOT_MPY;
280b57cec5SDimitry Andric   unsigned const TypeCVI_LAST = TypeCVI_ZW;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric   enum AddrMode {
310b57cec5SDimitry Andric     NoAddrMode     = 0,  // No addressing mode
320b57cec5SDimitry Andric     Absolute       = 1,  // Absolute addressing mode
330b57cec5SDimitry Andric     AbsoluteSet    = 2,  // Absolute set addressing mode
340b57cec5SDimitry Andric     BaseImmOffset  = 3,  // Indirect with offset
350b57cec5SDimitry Andric     BaseLongOffset = 4,  // Indirect with long offset
360b57cec5SDimitry Andric     BaseRegOffset  = 5,  // Indirect with register offset
370b57cec5SDimitry Andric     PostInc        = 6   // Post increment addressing mode
380b57cec5SDimitry Andric   };
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric   enum MemAccessSize {
410b57cec5SDimitry Andric     NoMemAccess = 0,
420b57cec5SDimitry Andric     ByteAccess,
430b57cec5SDimitry Andric     HalfWordAccess,
440b57cec5SDimitry Andric     WordAccess,
450b57cec5SDimitry Andric     DoubleWordAccess,
460b57cec5SDimitry Andric     HVXVectorAccess
470b57cec5SDimitry Andric   };
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   // MCInstrDesc TSFlags
500b57cec5SDimitry Andric   // *** Must match HexagonInstrFormat*.td ***
510b57cec5SDimitry Andric   enum {
520b57cec5SDimitry Andric     // This 7-bit field describes the insn type.
530b57cec5SDimitry Andric     TypePos = 0,
540b57cec5SDimitry Andric     TypeMask = 0x7f,
550b57cec5SDimitry Andric 
560b57cec5SDimitry Andric     // Solo instructions.
570b57cec5SDimitry Andric     SoloPos = 7,
580b57cec5SDimitry Andric     SoloMask = 0x1,
590b57cec5SDimitry Andric     // Packed only with A or X-type instructions.
600b57cec5SDimitry Andric     SoloAXPos = 8,
610b57cec5SDimitry Andric     SoloAXMask = 0x1,
620b57cec5SDimitry Andric     // Only A-type instruction in first slot or nothing.
630b57cec5SDimitry Andric     RestrictSlot1AOKPos = 9,
640b57cec5SDimitry Andric     RestrictSlot1AOKMask = 0x1,
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric     // Predicated instructions.
670b57cec5SDimitry Andric     PredicatedPos = 10,
680b57cec5SDimitry Andric     PredicatedMask = 0x1,
690b57cec5SDimitry Andric     PredicatedFalsePos = 11,
700b57cec5SDimitry Andric     PredicatedFalseMask = 0x1,
710b57cec5SDimitry Andric     PredicatedNewPos = 12,
720b57cec5SDimitry Andric     PredicatedNewMask = 0x1,
730b57cec5SDimitry Andric     PredicateLatePos = 13,
740b57cec5SDimitry Andric     PredicateLateMask = 0x1,
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric     // New-Value consumer instructions.
770b57cec5SDimitry Andric     NewValuePos = 14,
780b57cec5SDimitry Andric     NewValueMask = 0x1,
790b57cec5SDimitry Andric     // New-Value producer instructions.
800b57cec5SDimitry Andric     hasNewValuePos = 15,
810b57cec5SDimitry Andric     hasNewValueMask = 0x1,
820b57cec5SDimitry Andric     // Which operand consumes or produces a new value.
830b57cec5SDimitry Andric     NewValueOpPos = 16,
840b57cec5SDimitry Andric     NewValueOpMask = 0x7,
850b57cec5SDimitry Andric     // Stores that can become new-value stores.
860b57cec5SDimitry Andric     mayNVStorePos = 19,
870b57cec5SDimitry Andric     mayNVStoreMask = 0x1,
880b57cec5SDimitry Andric     // New-value store instructions.
890b57cec5SDimitry Andric     NVStorePos = 20,
900b57cec5SDimitry Andric     NVStoreMask = 0x1,
910b57cec5SDimitry Andric     // Loads that can become current-value loads.
920b57cec5SDimitry Andric     mayCVLoadPos = 21,
930b57cec5SDimitry Andric     mayCVLoadMask = 0x1,
940b57cec5SDimitry Andric     // Current-value load instructions.
950b57cec5SDimitry Andric     CVLoadPos = 22,
960b57cec5SDimitry Andric     CVLoadMask = 0x1,
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric     // Extendable insns.
990b57cec5SDimitry Andric     ExtendablePos = 23,
1000b57cec5SDimitry Andric     ExtendableMask = 0x1,
1010b57cec5SDimitry Andric     // Insns must be extended.
1020b57cec5SDimitry Andric     ExtendedPos = 24,
1030b57cec5SDimitry Andric     ExtendedMask = 0x1,
1040b57cec5SDimitry Andric     // Which operand may be extended.
1050b57cec5SDimitry Andric     ExtendableOpPos = 25,
1060b57cec5SDimitry Andric     ExtendableOpMask = 0x7,
1070b57cec5SDimitry Andric     // Signed or unsigned range.
1080b57cec5SDimitry Andric     ExtentSignedPos = 28,
1090b57cec5SDimitry Andric     ExtentSignedMask = 0x1,
1100b57cec5SDimitry Andric     // Number of bits of range before extending operand.
1110b57cec5SDimitry Andric     ExtentBitsPos = 29,
1120b57cec5SDimitry Andric     ExtentBitsMask = 0x1f,
1130b57cec5SDimitry Andric     // Alignment power-of-two before extending operand.
1140b57cec5SDimitry Andric     ExtentAlignPos = 34,
1150b57cec5SDimitry Andric     ExtentAlignMask = 0x3,
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric     CofMax1Pos = 36,
1180b57cec5SDimitry Andric     CofMax1Mask = 0x1,
1190b57cec5SDimitry Andric     CofRelax1Pos = 37,
1200b57cec5SDimitry Andric     CofRelax1Mask = 0x1,
1210b57cec5SDimitry Andric     CofRelax2Pos = 38,
1220b57cec5SDimitry Andric     CofRelax2Mask = 0x1,
1230b57cec5SDimitry Andric 
1240b57cec5SDimitry Andric     RestrictNoSlot1StorePos = 39,
1250b57cec5SDimitry Andric     RestrictNoSlot1StoreMask = 0x1,
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric     // Addressing mode for load/store instructions.
128*bdd1243dSDimitry Andric     AddrModePos = 40,
1290b57cec5SDimitry Andric     AddrModeMask = 0x7,
1300b57cec5SDimitry Andric     // Access size for load/store instructions.
131*bdd1243dSDimitry Andric     MemAccessSizePos = 43,
1320b57cec5SDimitry Andric     MemAccesSizeMask = 0xf,
1330b57cec5SDimitry Andric 
1340b57cec5SDimitry Andric     // Branch predicted taken.
135*bdd1243dSDimitry Andric     TakenPos = 47,
1360b57cec5SDimitry Andric     TakenMask = 0x1,
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric     // Floating-point instructions.
139*bdd1243dSDimitry Andric     FPPos = 48,
1400b57cec5SDimitry Andric     FPMask = 0x1,
1410b57cec5SDimitry Andric 
1420b57cec5SDimitry Andric     // New-Value producer-2 instructions.
143*bdd1243dSDimitry Andric     hasNewValuePos2 = 50,
1440b57cec5SDimitry Andric     hasNewValueMask2 = 0x1,
1450b57cec5SDimitry Andric     // Which operand consumes or produces a new value.
146*bdd1243dSDimitry Andric     NewValueOpPos2 = 51,
1470b57cec5SDimitry Andric     NewValueOpMask2 = 0x7,
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric     // Accumulator instructions.
150*bdd1243dSDimitry Andric     AccumulatorPos = 54,
1510b57cec5SDimitry Andric     AccumulatorMask = 0x1,
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric     // Complex XU, prevent xu competition by preferring slot3
154*bdd1243dSDimitry Andric     PrefersSlot3Pos = 55,
1550b57cec5SDimitry Andric     PrefersSlot3Mask = 0x1,
1560b57cec5SDimitry Andric 
157*bdd1243dSDimitry Andric     HasHvxTmpPos = 56,
1580eae32dcSDimitry Andric     HasHvxTmpMask = 0x1,
1590b57cec5SDimitry Andric 
160*bdd1243dSDimitry Andric     CVINewPos = 58,
1610b57cec5SDimitry Andric     CVINewMask = 0x1,
1625ffd83dbSDimitry Andric 
163*bdd1243dSDimitry Andric     isCVIPos = 59,
1645ffd83dbSDimitry Andric     isCVIMask = 0x1,
165*bdd1243dSDimitry Andric 
166*bdd1243dSDimitry Andric     isHVXALUPos = 60,
167*bdd1243dSDimitry Andric     isHVXALUMask = 0x1,
168*bdd1243dSDimitry Andric 
169*bdd1243dSDimitry Andric     isHVXALU2SRCPos = 61,
170*bdd1243dSDimitry Andric     isHVXALU2SRCMask = 0x1,
171*bdd1243dSDimitry Andric 
172*bdd1243dSDimitry Andric     hasUnaryRestrictionPos = 62,
173*bdd1243dSDimitry Andric     hasUnaryRestrictionMask = 0x1,
1740b57cec5SDimitry Andric   };
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric   // *** The code above must match HexagonInstrFormat*.td *** //
1770b57cec5SDimitry Andric 
1780b57cec5SDimitry Andric   // Hexagon specific MO operand flag mask.
1790b57cec5SDimitry Andric   enum HexagonMOTargetFlagVal {
1800b57cec5SDimitry Andric     // Hexagon-specific MachineOperand target flags.
1810b57cec5SDimitry Andric     //
1820b57cec5SDimitry Andric     // When changing these, make sure to update
1830b57cec5SDimitry Andric     // getSerializableDirectMachineOperandTargetFlags and
1840b57cec5SDimitry Andric     // getSerializableBitmaskMachineOperandTargetFlags if needed.
1850b57cec5SDimitry Andric     MO_NO_FLAG,
1860b57cec5SDimitry Andric 
1870b57cec5SDimitry Andric     /// MO_PCREL - On a symbol operand, indicates a PC-relative relocation
1880b57cec5SDimitry Andric     /// Used for computing a global address for PIC compilations
1890b57cec5SDimitry Andric     MO_PCREL,
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric     /// MO_GOT - Indicates a GOT-relative relocation
1920b57cec5SDimitry Andric     MO_GOT,
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric     // Low or high part of a symbol.
1950b57cec5SDimitry Andric     MO_LO16,
1960b57cec5SDimitry Andric     MO_HI16,
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric     // Offset from the base of the SDA.
1990b57cec5SDimitry Andric     MO_GPREL,
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric     // MO_GDGOT - indicates GOT relative relocation for TLS
2020b57cec5SDimitry Andric     // GeneralDynamic method
2030b57cec5SDimitry Andric     MO_GDGOT,
2040b57cec5SDimitry Andric 
2050b57cec5SDimitry Andric     // MO_GDPLT - indicates PLT relative relocation for TLS
2060b57cec5SDimitry Andric     // GeneralDynamic method
2070b57cec5SDimitry Andric     MO_GDPLT,
2080b57cec5SDimitry Andric 
2090b57cec5SDimitry Andric     // MO_IE - indicates non PIC relocation for TLS
2100b57cec5SDimitry Andric     // Initial Executable method
2110b57cec5SDimitry Andric     MO_IE,
2120b57cec5SDimitry Andric 
2130b57cec5SDimitry Andric     // MO_IEGOT - indicates PIC relocation for TLS
2140b57cec5SDimitry Andric     // Initial Executable method
2150b57cec5SDimitry Andric     MO_IEGOT,
2160b57cec5SDimitry Andric 
2170b57cec5SDimitry Andric     // MO_TPREL - indicates relocation for TLS
2180b57cec5SDimitry Andric     // local Executable method
2190b57cec5SDimitry Andric     MO_TPREL,
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric     // HMOTF_ConstExtended
2220b57cec5SDimitry Andric     // Addendum to above, indicates a const extended op
2230b57cec5SDimitry Andric     // Can be used as a mask.
2240b57cec5SDimitry Andric     HMOTF_ConstExtended = 0x80,
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric     // Union of all bitmasks (currently only HMOTF_ConstExtended).
2270b57cec5SDimitry Andric     MO_Bitmasks = HMOTF_ConstExtended
2280b57cec5SDimitry Andric   };
2290b57cec5SDimitry Andric 
2300b57cec5SDimitry Andric   // Hexagon Sub-instruction classes.
2310b57cec5SDimitry Andric   enum SubInstructionGroup {
2320b57cec5SDimitry Andric     HSIG_None = 0,
2330b57cec5SDimitry Andric     HSIG_L1,
2340b57cec5SDimitry Andric     HSIG_L2,
2350b57cec5SDimitry Andric     HSIG_S1,
2360b57cec5SDimitry Andric     HSIG_S2,
2370b57cec5SDimitry Andric     HSIG_A,
2380b57cec5SDimitry Andric     HSIG_Compound
2390b57cec5SDimitry Andric   };
2400b57cec5SDimitry Andric 
2410b57cec5SDimitry Andric   // Hexagon Compound classes.
2420b57cec5SDimitry Andric   enum CompoundGroup {
2430b57cec5SDimitry Andric     HCG_None = 0,
2440b57cec5SDimitry Andric     HCG_A,
2450b57cec5SDimitry Andric     HCG_B,
2460b57cec5SDimitry Andric     HCG_C
2470b57cec5SDimitry Andric   };
2480b57cec5SDimitry Andric 
2490b57cec5SDimitry Andric   enum InstParseBits {
2500b57cec5SDimitry Andric     INST_PARSE_MASK       = 0x0000c000,
2510b57cec5SDimitry Andric     INST_PARSE_PACKET_END = 0x0000c000,
2520b57cec5SDimitry Andric     INST_PARSE_LOOP_END   = 0x00008000,
2530b57cec5SDimitry Andric     INST_PARSE_NOT_END    = 0x00004000,
2540b57cec5SDimitry Andric     INST_PARSE_DUPLEX     = 0x00000000,
2550b57cec5SDimitry Andric     INST_PARSE_EXTENDER   = 0x00000000
2560b57cec5SDimitry Andric   };
2570b57cec5SDimitry Andric 
2580b57cec5SDimitry Andric   enum InstIClassBits : unsigned {
2590b57cec5SDimitry Andric     INST_ICLASS_MASK      = 0xf0000000,
2600b57cec5SDimitry Andric     INST_ICLASS_EXTENDER  = 0x00000000,
2610b57cec5SDimitry Andric     INST_ICLASS_J_1       = 0x10000000,
2620b57cec5SDimitry Andric     INST_ICLASS_J_2       = 0x20000000,
2630b57cec5SDimitry Andric     INST_ICLASS_LD_ST_1   = 0x30000000,
2640b57cec5SDimitry Andric     INST_ICLASS_LD_ST_2   = 0x40000000,
2650b57cec5SDimitry Andric     INST_ICLASS_J_3       = 0x50000000,
2660b57cec5SDimitry Andric     INST_ICLASS_CR        = 0x60000000,
2670b57cec5SDimitry Andric     INST_ICLASS_ALU32_1   = 0x70000000,
2680b57cec5SDimitry Andric     INST_ICLASS_XTYPE_1   = 0x80000000,
2690b57cec5SDimitry Andric     INST_ICLASS_LD        = 0x90000000,
2700b57cec5SDimitry Andric     INST_ICLASS_ST        = 0xa0000000,
2710b57cec5SDimitry Andric     INST_ICLASS_ALU32_2   = 0xb0000000,
2720b57cec5SDimitry Andric     INST_ICLASS_XTYPE_2   = 0xc0000000,
2730b57cec5SDimitry Andric     INST_ICLASS_XTYPE_3   = 0xd0000000,
2740b57cec5SDimitry Andric     INST_ICLASS_XTYPE_4   = 0xe0000000,
2750b57cec5SDimitry Andric     INST_ICLASS_ALU32_3   = 0xf0000000
2760b57cec5SDimitry Andric   };
2770b57cec5SDimitry Andric 
2780b57cec5SDimitry Andric   LLVM_ATTRIBUTE_UNUSED
getMemAccessSizeInBytes(MemAccessSize S)2790b57cec5SDimitry Andric   static unsigned getMemAccessSizeInBytes(MemAccessSize S) {
2800b57cec5SDimitry Andric     switch (S) {
2810b57cec5SDimitry Andric       case ByteAccess:        return 1;
2820b57cec5SDimitry Andric       case HalfWordAccess:    return 2;
2830b57cec5SDimitry Andric       case WordAccess:        return 4;
2840b57cec5SDimitry Andric       case DoubleWordAccess:  return 8;
2850b57cec5SDimitry Andric       default:                return 0;
2860b57cec5SDimitry Andric     }
2870b57cec5SDimitry Andric   }
2880b57cec5SDimitry Andric } // end namespace HexagonII
2890b57cec5SDimitry Andric 
2900b57cec5SDimitry Andric } // end namespace llvm
2910b57cec5SDimitry Andric 
2920b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONBASEINFO_H
293