mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
7401b2a1db
'rotq*' and 'shlq*' instructions go to the odd pipeline, wheras the inter-vector equivalents 'rot*', 'shl*' go to the even. llvm-svn: 123622
60 lines
3.1 KiB
TableGen
60 lines
3.1 KiB
TableGen
//===- 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]>]>
|
|
]>;
|