diff --git a/llvm/lib/Target/ARM/ARM.td b/llvm/lib/Target/ARM/ARM.td index 8d9c62253cdd..b4dec0cfd126 100644 --- a/llvm/lib/Target/ARM/ARM.td +++ b/llvm/lib/Target/ARM/ARM.td @@ -124,7 +124,8 @@ def : Processor<"arm1156t2f-s", ARMV6Itineraries, def : Processor<"cortex-a8", CortexA8Itineraries, [ArchV7A, FeatureThumb2, FeatureNEON, FeatureHasSlowVMLx, FeatureNEONForFP]>; -def : ProcNoItin<"cortex-a9", [ArchV7A, FeatureThumb2, FeatureNEON]>; +def : Processor<"cortex-a9", CortexA9Itineraries, + [ArchV7A, FeatureThumb2, FeatureNEON]>; //===----------------------------------------------------------------------===// // Register File Description diff --git a/llvm/lib/Target/ARM/ARMScheduleV7.td b/llvm/lib/Target/ARM/ARMScheduleV7.td index bbbf41397566..b121045dd5b0 100644 --- a/llvm/lib/Target/ARM/ARMScheduleV7.td +++ b/llvm/lib/Target/ARM/ARMScheduleV7.td @@ -585,3 +585,103 @@ def CortexA8Itineraries : ProcessorItineraries<[ InstrStage<1, [FU_NPipe], 0>, InstrStage<2, [FU_NLSPipe]>], [4, 1, 2, 2, 3, 3, 1]> ]>; + +// +// Ad-hoc scheduling information derived from pretty vague "Cortex-A9 Technical +// Reference Manual". +// +// Dual issue pipeline represented by FU_Pipe0 | FU_Pipe1 +// +def CortexA9Itineraries : ProcessorItineraries<[ + + // VFP + // Issue through integer pipeline, and execute in NEON unit. + // + + // FP Special Register to Integer Register File Move + InstrItinData, + InstrStage<1, [FU_NPipe]>]>, + // + // Single-precision FP Unary + InstrItinData, + InstrStage<1, [FU_NPipe]>], [1, 1]>, + // + // Double-precision FP Unary + InstrItinData, + InstrStage<1, [FU_NPipe]>], [1, 1]>, + + // + // Single-precision FP Compare + InstrItinData, + InstrStage<1, [FU_NPipe]>], [1, 1]>, + // + // Double-precision FP Compare + InstrItinData, + InstrStage<1, [FU_NPipe]>], [1, 1]>, + // + // Single to Double FP Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Double to Single FP Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Single-Precision FP to Integer Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Double-Precision FP to Integer Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Integer to Single-Precision FP Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Integer to Double-Precision FP Convert + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1]>, + // + // Single-precision FP ALU + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1, 1]>, + // + // Double-precision FP ALU + InstrItinData, + InstrStage<1, [FU_NPipe]>], [4, 1, 1]>, + // + // Single-precision FP Multiply + InstrItinData, + InstrStage<1, [FU_NPipe]>], [5, 1, 1]>, + // + // Double-precision FP Multiply + InstrItinData, + InstrStage<2, [FU_NPipe]>], [6, 1, 1]>, + // + // Single-precision FP MAC + InstrItinData, + InstrStage<1, [FU_NPipe]>], [8, 0, 1, 1]>, + // + // Double-precision FP MAC + InstrItinData, + InstrStage<2, [FU_NPipe]>], [9, 0, 1, 1]>, + // + // Single-precision FP DIV + InstrItinData, + InstrStage<10, [FU_NPipe]>], [15, 1, 1]>, + // + // Double-precision FP DIV + InstrItinData, + InstrStage<20, [FU_NPipe]>], [25, 1, 1]>, + // + // Single-precision FP SQRT + InstrItinData, + InstrStage<13, [FU_NPipe]>], [17, 1]>, + // + // Double-precision FP SQRT + InstrItinData, + InstrStage<28, [FU_NPipe]>], [32, 1]> +]>; + +