//===- ARMScheduleV7.td - ARM v7 Scheduling Definitions ----*- tablegen -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the itinerary class data for the ARM v7 processors. // //===----------------------------------------------------------------------===// // // Scheduling information derived from "Cortex-A8 Technical Reference Manual". // // Dual issue pipeline so every itinerary starts with FU_Pipe0 | FU_Pipe1 // def CortexA8Itineraries : ProcessorItineraries<[ // Two fully-pipelined integer ALU pipelines // // No operand cycles InstrItinData]>, // // Binary Instructions that produce a result InstrItinData], [2, 2]>, InstrItinData], [2, 2, 2]>, InstrItinData], [2, 2, 1]>, InstrItinData], [2, 2, 1, 1]>, // // Unary Instructions that produce a result InstrItinData], [2, 2]>, InstrItinData], [2, 1]>, InstrItinData], [2, 1, 1]>, // // Compare instructions InstrItinData], [2]>, InstrItinData], [2, 2]>, InstrItinData], [2, 1]>, InstrItinData], [2, 1, 1]>, // // Move instructions, unconditional InstrItinData], [1]>, InstrItinData], [1, 1]>, InstrItinData], [1, 1]>, InstrItinData], [1, 1, 1]>, // // Move instructions, conditional InstrItinData], [2]>, InstrItinData], [2, 1]>, InstrItinData], [2, 1]>, InstrItinData], [2, 1, 1]>, // Integer multiply pipeline // Result written in E5, but that is relative to the last cycle of multicycle, // so we use 6 for those cases // InstrItinData], [5, 1, 1]>, InstrItinData, InstrStage<2, [FU_Pipe0]>], [6, 1, 1, 4]>, InstrItinData, InstrStage<2, [FU_Pipe0]>], [6, 1, 1]>, InstrItinData, InstrStage<2, [FU_Pipe0]>], [6, 1, 1, 4]>, InstrItinData, InstrStage<3, [FU_Pipe0]>], [6, 6, 1, 1]>, InstrItinData, InstrStage<3, [FU_Pipe0]>], [6, 6, 1, 1]>, // Integer load pipeline // // loads have an extra cycle of latency, but are fully pipelined // use FU_Issue to enforce the 1 load/store per cycle limit // // Immediate offset InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 1]>, // // Register offset InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 1, 1]>, // // Scaled register offset, issues over 2 cycles InstrItinData, InstrStage<1, [FU_Pipe0], 0>, InstrStage<1, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [4, 1, 1]>, // // Immediate offset with update InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 2, 1]>, // // Register offset with update InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 2, 1, 1]>, // // Scaled register offset with update, issues over 2 cycles InstrItinData, InstrStage<1, [FU_Pipe0], 0>, InstrStage<1, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [4, 3, 1, 1]>, // // Load multiple InstrItinData, InstrStage<2, [FU_Pipe0], 0>, InstrStage<2, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>]>, // Integer store pipeline // // use FU_Issue to enforce the 1 load/store per cycle limit // // Immediate offset InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>], [3, 1]>, // // Register offset InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>], [3, 1, 1]>, // // Scaled register offset, issues over 2 cycles InstrItinData, InstrStage<1, [FU_Pipe0], 0>, InstrStage<1, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 1, 1]>, // // Immediate offset with update InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [2, 3, 1]>, // // Register offset with update InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [2, 3, 1, 1]>, // // Scaled register offset with update, issues over 2 cycles InstrItinData, InstrStage<1, [FU_Pipe0], 0>, InstrStage<1, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>], [3, 3, 1, 1]>, // // Store multiple InstrItinData, InstrStage<2, [FU_Pipe0], 0>, InstrStage<2, [FU_Pipe1], 0>, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>]>, // Branch // // no delay slots, so the latency of a branch is unimportant InstrItinData]>, // NFP ALU is not pipelined so stall all issues InstrItinData, InstrStage<7, [FU_Pipe1], 0>]>, // VFP MPY is not pipelined so stall all issues InstrItinData, InstrStage<7, [FU_Pipe1], 0>]>, // loads have an extra cycle of latency, but are fully pipelined // use FU_Issue to enforce the 1 load/store per cycle limit InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>, InstrStage<1, [FU_LdSt0]>]>, // use FU_Issue to enforce the 1 load/store per cycle limit InstrItinData, InstrStage<1, [FU_Pipe0, FU_Pipe1]>]> ]>; // FIXME def CortexA9Itineraries : ProcessorItineraries<[ InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData, InstrStage<2, [FU_LdSt0]>]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData]>, InstrItinData, InstrStage<1, [FU_LdSt0]>]>, InstrItinData]> ]>;