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