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    : InstrItinClass;
     43 
     44 def ALU32_2op_tc_1_SLOT0123  : InstrItinClass;
     45 def ALU32_2op_tc_2early_SLOT0123  : InstrItinClass;
     46 def ALU32_3op_tc_2early_SLOT0123  : InstrItinClass;
     47 def ALU32_3op_tc_1_SLOT0123  : InstrItinClass;
     48 def ALU32_3op_tc_2_SLOT0123  : InstrItinClass;
     49 def ALU32_ADDI_tc_1_SLOT0123 : InstrItinClass;
     50 def ALU64_tc_1_SLOT23        : InstrItinClass;
     51 def ALU64_tc_1or2_SLOT23     : InstrItinClass;
     52 def ALU64_tc_2_SLOT23        : InstrItinClass;
     53 def ALU64_tc_2early_SLOT23   : InstrItinClass;
     54 def ALU64_tc_3x_SLOT23       : InstrItinClass;
     55 def CR_tc_2_SLOT3            : InstrItinClass;
     56 def CR_tc_2early_SLOT23      : InstrItinClass;
     57 def CR_tc_2early_SLOT3       : InstrItinClass;
     58 def CR_tc_3x_SLOT23          : InstrItinClass;
     59 def CR_tc_3x_SLOT3           : InstrItinClass;
     60 def J_tc_2early_SLOT23       : InstrItinClass;
     61 def J_tc_2early_SLOT2        : InstrItinClass;
     62 def LD_tc_ld_SLOT01          : InstrItinClass;
     63 def LD_tc_ld_SLOT0           : InstrItinClass;
     64 def LD_tc_3or4stall_SLOT0    : InstrItinClass;
     65 def M_tc_1_SLOT23            : InstrItinClass;
     66 def M_tc_1or2_SLOT23         : InstrItinClass;
     67 def M_tc_2_SLOT23            : InstrItinClass;
     68 def M_tc_3_SLOT23            : InstrItinClass;
     69 def M_tc_3x_SLOT23           : InstrItinClass;
     70 def M_tc_3or4x_SLOT23        : InstrItinClass;
     71 def ST_tc_st_SLOT01          : InstrItinClass;
     72 def ST_tc_st_SLOT0           : InstrItinClass;
     73 def ST_tc_ld_SLOT0           : InstrItinClass;
     74 def ST_tc_3stall_SLOT0       : InstrItinClass;
     75 def S_2op_tc_1_SLOT23        : InstrItinClass;
     76 def S_2op_tc_2_SLOT23        : InstrItinClass;
     77 def S_2op_tc_2early_SLOT23   : InstrItinClass;
     78 def S_2op_tc_3or4x_SLOT23    : InstrItinClass;
     79 def S_3op_tc_1_SLOT23        : InstrItinClass;
     80 def S_3op_tc_1or2_SLOT23     : InstrItinClass;
     81 def S_3op_tc_2_SLOT23        : InstrItinClass;
     82 def S_3op_tc_2early_SLOT23   : InstrItinClass;
     83 def S_3op_tc_3_SLOT23        : InstrItinClass;
     84 def S_3op_tc_3x_SLOT23       : InstrItinClass;
     85 def NCJ_tc_3or4stall_SLOT0   : InstrItinClass;
     86 def V2LDST_tc_ld_SLOT01      : InstrItinClass;
     87 def V2LDST_tc_st_SLOT0       : InstrItinClass;
     88 def V2LDST_tc_st_SLOT01      : InstrItinClass;
     89 def V4LDST_tc_ld_SLOT01      : InstrItinClass;
     90 def V4LDST_tc_st_SLOT0       : InstrItinClass;
     91 def V4LDST_tc_st_SLOT01      : InstrItinClass;
     92 def J_tc_2early_SLOT0123     : InstrItinClass;
     93 def EXTENDER_tc_1_SLOT0123   : InstrItinClass;
     94 
     95 
     96 def HexagonItinerariesV4 :
     97       ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP], [], [
     98         // ALU32
     99         InstrItinData<ALU32_2op_tc_1_SLOT0123  ,
    100                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    101         InstrItinData<ALU32_2op_tc_2early_SLOT0123,
    102                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    103         InstrItinData<ALU32_3op_tc_1_SLOT0123   ,
    104                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    105         InstrItinData<ALU32_3op_tc_2early_SLOT0123,
    106                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    107         InstrItinData<ALU32_3op_tc_2_SLOT0123   ,
    108                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    109         InstrItinData<ALU32_ADDI_tc_1_SLOT0123  ,
    110                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    111 
    112         // ALU64
    113         InstrItinData<ALU64_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    114         InstrItinData<ALU64_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
    115         InstrItinData<ALU64_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    116         InstrItinData<ALU64_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    117         InstrItinData<ALU64_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    118 
    119         // CR -> System
    120         InstrItinData<CR_tc_2_SLOT3          , [InstrStage<1, [SLOT3]>]>,
    121         InstrItinData<CR_tc_2early_SLOT3     , [InstrStage<1, [SLOT3]>]>,
    122         InstrItinData<CR_tc_3x_SLOT3         , [InstrStage<1, [SLOT3]>]>,
    123 
    124         // Jump (conditional/unconditional/return etc)
    125         // CR
    126         InstrItinData<CR_tc_2early_SLOT23    , [InstrStage<1, [SLOT2, SLOT3]>]>,
    127         InstrItinData<CR_tc_3x_SLOT23        , [InstrStage<1, [SLOT2, SLOT3]>]>,
    128         // J
    129         InstrItinData<J_tc_2early_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    130         // JR
    131         InstrItinData<J_tc_2early_SLOT2      , [InstrStage<1, [SLOT2]>]>,
    132 
    133         //Load
    134         InstrItinData<LD_tc_ld_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
    135         InstrItinData<LD_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    136         InstrItinData<LD_tc_3or4stall_SLOT0  , [InstrStage<1, [SLOT0]>]>,
    137 
    138         // M
    139         InstrItinData<M_tc_1_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    140         InstrItinData<M_tc_1or2_SLOT23       , [InstrStage<1, [SLOT2, SLOT3]>]>,
    141         InstrItinData<M_tc_2_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    142         InstrItinData<M_tc_3_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
    143         InstrItinData<M_tc_3x_SLOT23         , [InstrStage<1, [SLOT2, SLOT3]>]>,
    144         InstrItinData<M_tc_3or4x_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    145 
    146         // Store
    147         // ST
    148         InstrItinData<ST_tc_st_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
    149         // ST0
    150         InstrItinData<ST_tc_st_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    151         InstrItinData<ST_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
    152 
    153         // S
    154         InstrItinData<S_2op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    155         InstrItinData<S_2op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    156         InstrItinData<S_2op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    157         InstrItinData<S_2op_tc_3or4x_SLOT23  , [InstrStage<1, [SLOT2, SLOT3]>]>,
    158         InstrItinData<S_3op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    159         InstrItinData<S_3op_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
    160         InstrItinData<S_3op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
    161         InstrItinData<S_3op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    162         InstrItinData<S_3op_tc_3_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
    163         InstrItinData<S_3op_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
    164 
    165         // SYS
    166         InstrItinData<ST_tc_3stall_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    167 
    168         // New Value Compare Jump
    169         InstrItinData<NCJ_tc_3or4stall_SLOT0 , [InstrStage<1, [SLOT0]>]>,
    170 
    171         // Mem ops - MEM_V4
    172         InstrItinData<V2LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    173         InstrItinData<V2LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    174         InstrItinData<V2LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    175         InstrItinData<V4LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
    176         InstrItinData<V4LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    177         InstrItinData<V4LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
    178 
    179         InstrItinData<DUPLEX , [InstrStage<1, [SLOT0]>]>,
    180 
    181         // ENDLOOP
    182         InstrItinData<J_tc_2early_SLOT0123   , [InstrStage<1, [SLOT_ENDLOOP]>]>,
    183 
    184         // Extender/PREFIX
    185         InstrItinData<EXTENDER_tc_1_SLOT0123,
    186                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    187 
    188         InstrItinData<COMPOUND , [InstrStage<1, [SLOT2, SLOT3]>]>,
    189         InstrItinData<PSEUDO , [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
    190         InstrItinData<PSEUDOM, [InstrStage<1, [SLOT2, SLOT3], 0>,
    191                                 InstrStage<1, [SLOT2, SLOT3]>]>
    192       ]>;
    193 
    194 def HexagonModelV4 : SchedMachineModel {
    195   // Max issue per cycle == bundle width.
    196   let IssueWidth = 4;
    197   let Itineraries = HexagonItinerariesV4;
    198   let LoadLatency = 1;
    199 }
    200 
    201 //===----------------------------------------------------------------------===//
    202 // Hexagon V4 Resource Definitions -
    203 //===----------------------------------------------------------------------===//
    204