summaryrefslogtreecommitdiff
path: root/lib/Target/CellSPU/SPUSchedule.td
blob: 9cd3c2327df064cf037ffe2184b666aad19e618a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//===- SPUSchedule.td - Cell Scheduling Definitions --------*- tablegen -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// Even pipeline:

def EVEN_UNIT : FuncUnit;       // Even execution unit: (PC & 0x7 == 000)
def ODD_UNIT  : FuncUnit;       // Odd execution unit:  (PC & 0x7 == 100)

//===----------------------------------------------------------------------===//
// Instruction Itinerary classes used for Cell SPU
//===----------------------------------------------------------------------===//

def LoadStore    : InstrItinClass;              // ODD_UNIT
def BranchHints  : InstrItinClass;              // ODD_UNIT
def BranchResolv : InstrItinClass;              // ODD_UNIT
def ChanOpSPR    : InstrItinClass;              // ODD_UNIT
def ShuffleOp    : InstrItinClass;              // ODD_UNIT
def SelectOp     : InstrItinClass;              // ODD_UNIT
def GatherOp     : InstrItinClass;              // ODD_UNIT
def LoadNOP      : InstrItinClass;              // ODD_UNIT
def ExecNOP      : InstrItinClass;              // EVEN_UNIT
def SPrecFP      : InstrItinClass;              // EVEN_UNIT
def DPrecFP      : InstrItinClass;              // EVEN_UNIT
def FPInt        : InstrItinClass;              // EVEN_UNIT (FP<->integer)
def ByteOp       : InstrItinClass;              // EVEN_UNIT
def IntegerOp    : InstrItinClass;              // EVEN_UNIT
def IntegerMulDiv: InstrItinClass;              // EVEN_UNIT
def RotShiftVec  : InstrItinClass;              // EVEN_UNIT Inter vector
def RotShiftQuad : InstrItinClass;              // ODD_UNIT Entire quad
def ImmLoad      : InstrItinClass;              // EVEN_UNIT

/* Note: The itinerary for the Cell SPU is somewhat contrived... */
def SPUItineraries : ProcessorItineraries<[ODD_UNIT, EVEN_UNIT], [], [
  InstrItinData<LoadStore   , [InstrStage<6,  [ODD_UNIT]>]>,
  InstrItinData<BranchHints , [InstrStage<6,  [ODD_UNIT]>]>,
  InstrItinData<BranchResolv, [InstrStage<4,  [ODD_UNIT]>]>,
  InstrItinData<ChanOpSPR   , [InstrStage<6,  [ODD_UNIT]>]>,
  InstrItinData<ShuffleOp   , [InstrStage<4,  [ODD_UNIT]>]>,
  InstrItinData<SelectOp    , [InstrStage<4,  [ODD_UNIT]>]>,
  InstrItinData<GatherOp    , [InstrStage<4,  [ODD_UNIT]>]>,
  InstrItinData<LoadNOP     , [InstrStage<1,  [ODD_UNIT]>]>,
  InstrItinData<ExecNOP     , [InstrStage<1,  [EVEN_UNIT]>]>,
  InstrItinData<SPrecFP     , [InstrStage<6,  [EVEN_UNIT]>]>,
  InstrItinData<DPrecFP     , [InstrStage<13, [EVEN_UNIT]>]>,
  InstrItinData<FPInt       , [InstrStage<2,  [EVEN_UNIT]>]>,
  InstrItinData<ByteOp      , [InstrStage<4,  [EVEN_UNIT]>]>,
  InstrItinData<IntegerOp   , [InstrStage<2,  [EVEN_UNIT]>]>,
  InstrItinData<RotShiftVec , [InstrStage<4,  [EVEN_UNIT]>]>, 
  InstrItinData<RotShiftQuad, [InstrStage<4,  [ODD_UNIT]>]>,
  InstrItinData<IntegerMulDiv,[InstrStage<7,  [EVEN_UNIT]>]>,
  InstrItinData<ImmLoad     , [InstrStage<2,  [EVEN_UNIT]>]>
  ]>;