9cd3c2327df064cf037ffe2184b666aad19e618a
[oota-llvm.git] / lib / Target / CellSPU / SPUSchedule.td
1 //===- SPUSchedule.td - Cell 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 //===----------------------------------------------------------------------===//
11 // Even pipeline:
12
13 def EVEN_UNIT : FuncUnit;       // Even execution unit: (PC & 0x7 == 000)
14 def ODD_UNIT  : FuncUnit;       // Odd execution unit:  (PC & 0x7 == 100)
15
16 //===----------------------------------------------------------------------===//
17 // Instruction Itinerary classes used for Cell SPU
18 //===----------------------------------------------------------------------===//
19
20 def LoadStore    : InstrItinClass;              // ODD_UNIT
21 def BranchHints  : InstrItinClass;              // ODD_UNIT
22 def BranchResolv : InstrItinClass;              // ODD_UNIT
23 def ChanOpSPR    : InstrItinClass;              // ODD_UNIT
24 def ShuffleOp    : InstrItinClass;              // ODD_UNIT
25 def SelectOp     : InstrItinClass;              // ODD_UNIT
26 def GatherOp     : InstrItinClass;              // ODD_UNIT
27 def LoadNOP      : InstrItinClass;              // ODD_UNIT
28 def ExecNOP      : InstrItinClass;              // EVEN_UNIT
29 def SPrecFP      : InstrItinClass;              // EVEN_UNIT
30 def DPrecFP      : InstrItinClass;              // EVEN_UNIT
31 def FPInt        : InstrItinClass;              // EVEN_UNIT (FP<->integer)
32 def ByteOp       : InstrItinClass;              // EVEN_UNIT
33 def IntegerOp    : InstrItinClass;              // EVEN_UNIT
34 def IntegerMulDiv: InstrItinClass;              // EVEN_UNIT
35 def RotShiftVec  : InstrItinClass;              // EVEN_UNIT Inter vector
36 def RotShiftQuad : InstrItinClass;              // ODD_UNIT Entire quad
37 def ImmLoad      : InstrItinClass;              // EVEN_UNIT
38
39 /* Note: The itinerary for the Cell SPU is somewhat contrived... */
40 def SPUItineraries : ProcessorItineraries<[ODD_UNIT, EVEN_UNIT], [], [
41   InstrItinData<LoadStore   , [InstrStage<6,  [ODD_UNIT]>]>,
42   InstrItinData<BranchHints , [InstrStage<6,  [ODD_UNIT]>]>,
43   InstrItinData<BranchResolv, [InstrStage<4,  [ODD_UNIT]>]>,
44   InstrItinData<ChanOpSPR   , [InstrStage<6,  [ODD_UNIT]>]>,
45   InstrItinData<ShuffleOp   , [InstrStage<4,  [ODD_UNIT]>]>,
46   InstrItinData<SelectOp    , [InstrStage<4,  [ODD_UNIT]>]>,
47   InstrItinData<GatherOp    , [InstrStage<4,  [ODD_UNIT]>]>,
48   InstrItinData<LoadNOP     , [InstrStage<1,  [ODD_UNIT]>]>,
49   InstrItinData<ExecNOP     , [InstrStage<1,  [EVEN_UNIT]>]>,
50   InstrItinData<SPrecFP     , [InstrStage<6,  [EVEN_UNIT]>]>,
51   InstrItinData<DPrecFP     , [InstrStage<13, [EVEN_UNIT]>]>,
52   InstrItinData<FPInt       , [InstrStage<2,  [EVEN_UNIT]>]>,
53   InstrItinData<ByteOp      , [InstrStage<4,  [EVEN_UNIT]>]>,
54   InstrItinData<IntegerOp   , [InstrStage<2,  [EVEN_UNIT]>]>,
55   InstrItinData<RotShiftVec , [InstrStage<4,  [EVEN_UNIT]>]>, 
56   InstrItinData<RotShiftQuad, [InstrStage<4,  [ODD_UNIT]>]>,
57   InstrItinData<IntegerMulDiv,[InstrStage<7,  [EVEN_UNIT]>]>,
58   InstrItinData<ImmLoad     , [InstrStage<2,  [EVEN_UNIT]>]>
59   ]>;