Home | History | Annotate | Download | only in Hexagon
      1 //=-HexagonScheduleV4.td - HexagonV4 Scheduling Definitions --*- tablegen -*-=//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // There are four SLOTS (four parallel pipelines) in Hexagon V4 machine.
     11 // This file describes that machine information.
     12 
     13 //
     14 //    |===========|==================================================|
     15 //    | PIPELINE  |              Instruction Classes                 |
     16 //    |===========|==================================================|
     17 //    | SLOT0     |  LD       ST    ALU32     MEMOP     NV    SYSTEM |
     18 //    |-----------|--------------------------------------------------|
     19 //    | SLOT1     |  LD       ST    ALU32                            |
     20 //    |-----------|--------------------------------------------------|
     21 //    | SLOT2     |  XTYPE          ALU32     J         JR           |
     22 //    |-----------|--------------------------------------------------|
     23 //    | SLOT3     |  XTYPE          ALU32     J         CR           |
     24 //    |===========|==================================================|
     25 
     26 // Functional Units.
     27 def SLOT0       : FuncUnit;
     28 def SLOT1       : FuncUnit;
     29 def SLOT2       : FuncUnit;
     30 def SLOT3       : FuncUnit;
     31 // Endloop is a pseudo instruction that is encoded with 2 bits in a packet
     32 // rather than taking an execution slot. This special unit is needed
     33 // to schedule an ENDLOOP with 4 other instructions.
     34 def SLOT_ENDLOOP: FuncUnit;
     35 
     36 // Itinerary classes.
     37 def PSEUDO      : InstrItinClass;
     38 def PSEUDOM     : InstrItinClass;
     39 // ALU64/M/S Instruction classes of V2 are collectively knownn as XTYPE in V4.
     40 def DUPLEX      : InstrItinClass;
     41 def PREFIX      : InstrItinClass;
     42 def COMPOUND_CJ_ARCHDEPSLOT    : InstrItinClass;
     43 def COMPOUND    : InstrItinClass;
     44 
     45 def ALU32_2op_tc_1_SLOT0123  : InstrItinClass;
     46 def ALU32_2op_tc_2early_SLOT0123  : InstrItinClass;
     47 def ALU32_3op_tc_2early_SLOT0123  : InstrItinClass;
     48 def ALU32_3op_tc_1_SLOT0123  : InstrItinClass;
     49 def ALU32_3op_tc_2_SLOT0123  : InstrItinClass;
     50 def ALU32_ADDI_tc_1_SLOT0123 : InstrItinClass;
     51 def ALU64_tc_1_SLOT23        : InstrItinClass;
     52 def ALU64_tc_1or2_SLOT23     : InstrItinClass;
     53 def ALU64_tc_2_SLOT23        : InstrItinClass;
     54 def ALU64_tc_2early_SLOT23   : InstrItinClass;
     55 def ALU64_tc_3x_SLOT23       : InstrItinClass;
     56 def CR_tc_2_SLOT3            : InstrItinClass;
     57 def CR_tc_2early_SLOT23      : InstrItinClass;
     58 def CR_tc_2early_SLOT3       : InstrItinClass;
     59 def CR_tc_3x_SLOT23          : InstrItinClass;
     60 def CR_tc_3x_SLOT3           : InstrItinClass;
     61 def J_tc_2early_SLOT23       : InstrItinClass;
     62 def J_tc_2early_CJUMP_UCJUMP_ARCHDEPSLOT       : InstrItinClass;
     63 def J_tc_2early_SLOT2        : InstrItinClass;
     64 def LD_tc_ld_SLOT01          : InstrItinClass;
     65 def LD_tc_ld_SLOT0           : InstrItinClass;
     66 def LD_tc_3or4stall_SLOT0    : InstrItinClass;
     67 def M_tc_1_SLOT23            : InstrItinClass;
     68 def M_tc_1or2_SLOT23         : InstrItinClass;
     69 def M_tc_2_SLOT23            : InstrItinClass;
     70 def M_tc_3_SLOT23            : InstrItinClass;
     71 def M_tc_3x_SLOT23           : InstrItinClass;
     72 def M_tc_3or4x_SLOT23        : InstrItinClass;
     73 def ST_tc_st_SLOT01          : InstrItinClass;
     74 def ST_tc_st_SLOT0           : InstrItinClass;
     75 def ST_tc_ld_SLOT0           : InstrItinClass;
     76 def ST_tc_3stall_SLOT0       : InstrItinClass;
     77 def S_2op_tc_1_SLOT23        : InstrItinClass;
     78 def S_2op_tc_2_SLOT23        : InstrItinClass;
     79 def S_2op_tc_2early_SLOT23   : InstrItinClass;
     80 def S_2op_tc_3or4x_SLOT23    : InstrItinClass;
     81 def S_3op_tc_1_SLOT23        : InstrItinClass;
     82 def S_3op_tc_1or2_SLOT23     : InstrItinClass;
     83 def S_3op_tc_2_SLOT23        : InstrItinClass;
     84 def S_3op_tc_2early_SLOT23   : InstrItinClass;
     85 def S_3op_tc_3_SLOT23        : InstrItinClass;
     86 def S_3op_tc_3x_SLOT23       : InstrItinClass;
     87 def NCJ_tc_3or4stall_SLOT0   : InstrItinClass;
     88 def V2LDST_tc_ld_SLOT01      : InstrItinClass;
     89 def V2LDST_tc_st_SLOT0       : InstrItinClass;
     90 def V2LDST_tc_st_SLOT01      : InstrItinClass;
     91 def V4LDST_tc_ld_SLOT01      : InstrItinClass;
     92 def V4LDST_tc_st_SLOT0       : InstrItinClass;
     93 def V4LDST_tc_st_SLOT01      : InstrItinClass;
     94 def J_tc_2early_SLOT0123     : InstrItinClass;
     95 def EXTENDER_tc_1_SLOT0123   : InstrItinClass;
     96 def S_3op_tc_3stall_SLOT23   : InstrItinClass;
     97 
     98 
     99 def HexagonItinerariesV4 :
    100       ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP], [], [
    101         // ALU32
    102         InstrItinData<ALU32_2op_tc_1_SLOT0123  ,
    103                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    104         InstrItinData<ALU32_2op_tc_2early_SLOT0123,
    105                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    106         InstrItinData<ALU32_3op_tc_1_SLOT0123   ,
    107                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    108         InstrItinData<ALU32_3op_tc_2early_SLOT0123,
    109                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    110         InstrItinData<ALU32_3op_tc_2_SLOT0123   ,
    111                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    112         InstrItinData<ALU32_ADDI_tc_1_SLOT0123  ,
    113                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    114 
    115         // ALU64
    116         InstrItinData<ALU64_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    117         InstrItinData<ALU64_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
    118         InstrItinData<ALU64_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    119         InstrItinData<ALU64_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    120         InstrItinData<ALU64_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    121 
    122         // CR -> System
    123         InstrItinData<CR_tc_2_SLOT3          , [InstrStage<1, [SLOT3]>]>,
    124         InstrItinData<CR_tc_2early_SLOT3     , [InstrStage<1, [SLOT3]>]>,
    125         InstrItinData<CR_tc_3x_SLOT3         , [InstrStage<1, [SLOT3]>]>,
    126 
    127         // Jump (conditional/unconditional/return etc)
    128         // CR
    129         InstrItinData<CR_tc_2early_SLOT23    , [InstrStage<1, [SLOT2, SLOT3]>]>,
    130         InstrItinData<CR_tc_3x_SLOT23        , [InstrStage<1, [SLOT2, SLOT3]>]>,
    131         // J
    132         InstrItinData<J_tc_2early_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    133         // JR
    134         InstrItinData<J_tc_2early_SLOT2      , [InstrStage<1, [SLOT2]>]>,
    135 
    136         //Load
    137         InstrItinData<LD_tc_ld_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
    138         InstrItinData<LD_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    139         InstrItinData<LD_tc_3or4stall_SLOT0  , [InstrStage<1, [SLOT0]>]>,
    140 
    141         // M
    142         InstrItinData<M_tc_1_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    143         InstrItinData<M_tc_1or2_SLOT23       , [InstrStage<1, [SLOT2, SLOT3]>]>,
    144         InstrItinData<M_tc_2_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    145         InstrItinData<M_tc_3_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    146         InstrItinData<M_tc_3x_SLOT23         , [InstrStage<1, [SLOT2, SLOT3]>]>,
    147         InstrItinData<M_tc_3or4x_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    148 
    149         // Store
    150         // ST
    151         InstrItinData<ST_tc_st_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
    152         // ST0
    153         InstrItinData<ST_tc_st_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    154         InstrItinData<ST_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    155 
    156         // S
    157         InstrItinData<S_2op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    158         InstrItinData<S_2op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    159         InstrItinData<S_2op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    160         InstrItinData<S_2op_tc_3or4x_SLOT23  , [InstrStage<1, [SLOT2, SLOT3]>]>,
    161         InstrItinData<S_3op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    162         InstrItinData<S_3op_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
    163         InstrItinData<S_3op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    164         InstrItinData<S_3op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    165         InstrItinData<S_3op_tc_3_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    166         InstrItinData<S_3op_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    167 
    168         // SYS
    169         InstrItinData<ST_tc_3stall_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    170 
    171         // New Value Compare Jump
    172         InstrItinData<NCJ_tc_3or4stall_SLOT0 , [InstrStage<1, [SLOT0]>]>,
    173 
    174         // Mem ops - MEM_V4
    175         InstrItinData<V2LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    176         InstrItinData<V2LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    177         InstrItinData<V2LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    178         InstrItinData<V4LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    179         InstrItinData<V4LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    180         InstrItinData<V4LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    181 
    182         InstrItinData<DUPLEX , [InstrStage<1, [SLOT0]>]>,
    183 
    184         // ENDLOOP
    185         InstrItinData<J_tc_2early_SLOT0123   , [InstrStage<1, [SLOT_ENDLOOP]>]>,
    186 
    187         // Extender/PREFIX
    188         InstrItinData<EXTENDER_tc_1_SLOT0123,
    189                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    190 
    191         InstrItinData<COMPOUND , [InstrStage<1, [SLOT2, SLOT3]>]>,
    192         InstrItinData<PSEUDO , [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    193         InstrItinData<PSEUDOM, [InstrStage<1, [SLOT2, SLOT3], 0>,
    194                                 InstrStage<1, [SLOT2, SLOT3]>]>
    195       ]>;
    196 
    197 def HexagonModelV4 : SchedMachineModel {
    198   // Max issue per cycle == bundle width.
    199   let IssueWidth = 4;
    200   let Itineraries = HexagonItinerariesV4;
    201   let LoadLatency = 1;
    202 }
    203 
    204 //===----------------------------------------------------------------------===//
    205 // Hexagon V4 Resource Definitions -
    206 //===----------------------------------------------------------------------===//
    207