131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonBaseInfo.h - Top level definitions for Hexagon --*- C++ -*--===//
2c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//
3c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//                     The LLVM Compiler Infrastructure
4c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//
5c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// This file is distributed under the University of Illinois Open Source
6c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// License. See LICENSE.TXT for details.
7c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//
8c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//===----------------------------------------------------------------------===//
9c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//
10c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// This file contains small standalone helper functions and enum definitions for
11c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// the Hexagon target useful for the compiler back-end and the MC libraries.
12c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// As such, it deliberately does not include references to LLVM core
13c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon// code gen types, passes, etc..
14c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//
15c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon//===----------------------------------------------------------------------===//
16c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
17c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon#ifndef HEXAGONBASEINFO_H
18c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon#define HEXAGONBASEINFO_H
19c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
20383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma#include "HexagonMCTargetDesc.h"
21383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma#include "llvm/Support/ErrorHandling.h"
22383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma
23c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoonnamespace llvm {
24c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
25c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon/// HexagonII - This namespace holds all of the target specific flags that
26c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon/// instruction info tracks.
27c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon///
28c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoonnamespace HexagonII {
29d410eaba04211d53a523a518a5e315eb24c1072fChandler Carruth  // *** The code below must match HexagonInstrFormat*.td *** //
300dac3919e52e28308deba555bbcb6286674d5495Sirish Pande
3126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande  // Insn types.
3226f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande  // *** Must match HexagonInstrFormat*.td ***
3326f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande  enum Type {
34383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypePSEUDO  = 0,
35383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeALU32   = 1,
36383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeCR      = 2,
37383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeJR      = 3,
38383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeJ       = 4,
39383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeLD      = 5,
40383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeST      = 6,
41383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeSYSTEM  = 7,
42383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeXTYPE   = 8,
43383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeMEMOP   = 9,
44383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeNV      = 10,
45383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypePREFIX  = 30, // Such as extenders.
46383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    TypeENDLOOP = 31  // Such as end of a HW loop.
4726f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande  };
4826f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande
49cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma  enum SubTarget {
50cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV2SubT     = 0xf,
51cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV2SubTOnly = 0x1,
52cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NoV2SubT      = 0x0,
53cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV3SubT     = 0xe,
54cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV3SubTOnly = 0x2,
55cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NoV3SubT      = 0x1,
56cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV4SubT     = 0xc,
57cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NoV4SubT      = 0x3,
58cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    HasV5SubT     = 0x8,
59cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NoV5SubT      = 0x7
60cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma  };
6126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande
62cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma  enum AddrMode {
63cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NoAddrMode     = 0,  // No addressing mode
64cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    Absolute       = 1,  // Absolute addressing mode
65cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    AbsoluteSet    = 2,  // Absolute set addressing mode
66cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    BaseImmOffset  = 3,  // Indirect with offset
67cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    BaseLongOffset = 4,  // Indirect with long offset
688cc93593cdfaa02f661c2bed96b7893c4f250b1eJyotsna Verma    BaseRegOffset  = 5,  // Indirect with register offset
698cc93593cdfaa02f661c2bed96b7893c4f250b1eJyotsna Verma    PostInc        = 6   // Post increment addressing mode
70cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma  };
7126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande
72383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma  enum MemAccessSize {
73383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    NoMemAccess = 0,            // Not a memory acces instruction.
74383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    ByteAccess = 1,             // Byte access instruction (memb).
75383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    HalfWordAccess = 2,         // Half word access instruction (memh).
763f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm    WordAccess = 3,             // Word access instruction (memw).
77383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    DoubleWordAccess = 4        // Double word access instruction (memd)
78383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma  };
79383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma
80c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon  // MCInstrDesc TSFlags
8126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande  // *** Must match HexagonInstrFormat*.td ***
82c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon  enum {
8326f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    // This 5-bit field describes the insn type.
8426f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    TypePos  = 0,
8526f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    TypeMask = 0x1f,
8626f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande
8726f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    // Solo instructions.
8826f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    SoloPos  = 5,
8926f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    SoloMask = 0x1,
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Packed only with A or X-type instructions.
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SoloAXPos  = 6,
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SoloAXMask = 0x1,
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Only A-type instruction in first slot or nothing.
94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SoloAin1Pos  = 7,
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SoloAin1Mask = 0x1,
96c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
97c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon    // Predicated instructions.
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PredicatedPos  = 8,
99cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    PredicatedMask = 0x1,
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PredicatedFalsePos  = 9,
101383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    PredicatedFalseMask = 0x1,
102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PredicatedNewPos  = 10,
103cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    PredicatedNewMask = 0x1,
104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PredicateLatePos  = 11,
105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PredicateLateMask = 0x1,
106cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma
107383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // New-Value consumer instructions.
108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    NewValuePos  = 12,
109383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    NewValueMask = 0x1,
110383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // New-Value producer instructions.
111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    hasNewValuePos  = 13,
112383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    hasNewValueMask = 0x1,
113383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // Which operand consumes or produces a new value.
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    NewValueOpPos  = 14,
115383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    NewValueOpMask = 0x7,
116383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // Stores that can become new-value stores.
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    mayNVStorePos  = 17,
118cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    mayNVStoreMask = 0x1,
119383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // New-value store instructions.
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    NVStorePos  = 18,
121cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    NVStoreMask = 0x1,
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Loads that can become current-value loads.
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    mayCVLoadPos  = 19,
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    mayCVLoadMask = 0x1,
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Current-value load instructions.
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CVLoadPos  = 20,
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CVLoadMask = 0x1,
128cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma
129cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Extendable insns.
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtendablePos  = 21,
131cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    ExtendableMask = 0x1,
132cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Insns must be extended.
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtendedPos  = 22,
134cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    ExtendedMask = 0x1,
135cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Which operand may be extended.
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtendableOpPos  = 23,
137cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    ExtendableOpMask = 0x7,
138cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Signed or unsigned range.
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtentSignedPos  = 26,
140cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    ExtentSignedMask = 0x1,
141cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Number of bits of range before extending operand.
142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtentBitsPos  = 27,
143cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    ExtentBitsMask = 0x1f,
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Alignment power-of-two before extending operand.
145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtentAlignPos  = 32,
146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ExtentAlignMask = 0x3,
147cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma
148cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    // Valid subtargets
149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    validSubTargetPos  = 34,
150cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma    validSubTargetMask = 0xf,
151cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma
152383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    // Addressing mode for load/store instructions.
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    AddrModePos  = 40,
154383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma    AddrModeMask = 0x7,
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Access size for load/store instructions.
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MemAccessSizePos = 43,
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MemAccesSizeMask = 0x7,
158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Branch predicted taken.
160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TakenPos = 47,
161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TakenMask = 0x1,
162cb02fa9d7f9058ec2efae39335cf559f1607893eJyotsna Verma
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Floating-point instructions.
164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    FPPos  = 48,
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    FPMask = 0x1
166383c6fc458ebd2bb7748483de56a97b68f3a9f2dJyotsna Verma  };
167c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
168b9f69a41fcb2b38a8aa104b24108acccc657bc38Sirish Pande  // *** The code above must match HexagonInstrFormat*.td *** //
169c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
170ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma  // Hexagon specific MO operand flag mask.
171ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma  enum HexagonMOTargetFlagVal {
172ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    //===------------------------------------------------------------------===//
173ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    // Hexagon Specific MachineOperand flags.
174ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    MO_NO_FLAG,
175ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
176ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    HMOTF_ConstExtended = 1,
177ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
178ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    /// MO_PCREL - On a symbol operand, indicates a PC-relative relocation
179ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    /// Used for computing a global address for PIC compilations
180ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    MO_PCREL,
181ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
182ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    /// MO_GOT - Indicates a GOT-relative relocation
183ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    MO_GOT,
184ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
185ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    // Low or high part of a symbol.
186ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    MO_LO16, MO_HI16,
187ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
188ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    // Offset from the base of the SDA.
189ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma    MO_GPREL
190ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma  };
191ef94c6c85eed42d16fde51ee4415d27bb281a2caJyotsna Verma
192c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon} // End namespace HexagonII.
193c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
194c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon} // End namespace llvm.
195c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon
196c635ebdb1a366060fe71ef3028ae888fa5e4130dBrendon Cahoon#endif
197