Index: llvm/trunk/lib/Target/PowerPC/PPC.td =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPC.td +++ llvm/trunk/lib/Target/PowerPC/PPC.td @@ -35,6 +35,8 @@ def Directive32 : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_32", "">; def Directive64 : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_64", "">; def DirectiveA2 : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_A2", "">; +def DirectiveE500 : SubtargetFeature<"", "DarwinDirective", + "PPC::DIR_E500", "">; def DirectiveE500mc : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_E500mc", "">; def DirectiveE5500 : SubtargetFeature<"", "DarwinDirective", @@ -358,6 +360,10 @@ FeatureFRES, FeatureFRSQRTE, Feature64Bit /*, Feature64BitRegs */, FeatureMFTB, DeprecatedDST]>; +def : ProcessorModel<"e500", PPCE500Model, + [DirectiveE500, + FeatureICBT, FeatureBookE, + FeatureISEL, FeatureMFTB]>; def : ProcessorModel<"e500mc", PPCE500mcModel, [DirectiveE500mc, FeatureSTFIWX, FeatureICBT, FeatureBookE, Index: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1486,6 +1486,7 @@ "ppc750", "ppc970", "ppcA2", + "ppce500", "ppce500mc", "ppce5500", "power3", Index: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp @@ -1104,6 +1104,7 @@ default: break; case PPC::DIR_970: case PPC::DIR_A2: + case PPC::DIR_E500: case PPC::DIR_E500mc: case PPC::DIR_E5500: case PPC::DIR_PWR4: @@ -10822,6 +10823,7 @@ return 3; case PPC::DIR_440: case PPC::DIR_A2: + case PPC::DIR_E500: case PPC::DIR_E500mc: case PPC::DIR_E5500: return 2; Index: llvm/trunk/lib/Target/PowerPC/PPCSchedule.td =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCSchedule.td +++ llvm/trunk/lib/Target/PowerPC/PPCSchedule.td @@ -133,5 +133,6 @@ include "PPCScheduleP8.td" include "PPCScheduleP9.td" include "PPCScheduleA2.td" +include "PPCScheduleE500.td" include "PPCScheduleE500mc.td" include "PPCScheduleE5500.td" Index: llvm/trunk/lib/Target/PowerPC/PPCScheduleE500.td =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCScheduleE500.td +++ llvm/trunk/lib/Target/PowerPC/PPCScheduleE500.td @@ -0,0 +1,266 @@ +//===-- PPCScheduleE500.td - e500 Scheduling Defs ------*- 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 Freescale e500 32-bit +// Power processor. +// +// All information is derived from the "e500 Core Reference Manual", +// Freescale Document Number E500MCRM, Rev. 1, 03/2012. +// +//===----------------------------------------------------------------------===// +// Relevant functional units in the Freescale e500 core: +// +// * Decode & Dispatch +// Can dispatch up to 2 instructions per clock cycle to either the GPR Issue +// queues (GIQx) or Branch issue queue (BIQ). +def E500_DIS0 : FuncUnit; // Dispatch stage - insn 1 +def E500_DIS1 : FuncUnit; // Dispatch stage - insn 2 + +// * Execute +// 6 pipelined execution units: SU0, SU1, BU, LSU, MU. +// Some instructions can only execute in SU0 but not SU1. +def E500_SU0 : FuncUnit; // Simple unit 0 +def E500_SU1 : FuncUnit; // Simple unit 1 +def E500_BU : FuncUnit; // Branch unit +def E500_MU : FuncUnit; // MU pipeline +def E500_LSU_0 : FuncUnit; // LSU pipeline + +def E500_GPR_Bypass : Bypass; +def E500_CR_Bypass : Bypass; +def E500_DivBypass : Bypass; + +def PPCE500Itineraries : ProcessorItineraries< + [E500_DIS0, E500_DIS1, E500_SU0, E500_SU1, E500_BU, + E500_MU, E500_LSU_0], + [E500_CR_Bypass, E500_GPR_Bypass, E500_DivBypass], [ + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1], // Latency = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1], // Latency = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1, 1], // Latency = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass, + E500_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [5, 1, 1], // Latency = 1 or 2 + [E500_CR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_MU], 0>, + InstrStage<14, [E500_MU]>], + [17, 1, 1], // Latency=4..35, Repeat= 4..35 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_MU]>], + [7, 1, 1], // Latency = 4, Repeat rate = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_MU]>], + [7, 1, 1], // Latency = 4, Repeat rate = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_MU]>], + [7, 1, 1], // Latency = 4, Repeat rate = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1], // Latency = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1], // Latency = 1 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500_SU0]>], + [5, 1], // Latency = 2, Repeat rate = 2 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_BU]>], + [4, 1], // Latency = 1 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_BU]>], + [4, 1, 1], // Latency = 1 + [E500_CR_Bypass, + E500_CR_Bypass, E500_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_BU]>], + [4, 1], // Latency = 1 + [E500_CR_Bypass, E500_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1, 1], // Latency = 1 + [E500_CR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3, Repeat rate = 1 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1], 0>, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass], + 2>, // 2 micro-ops + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1], 0>, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass], + 2>, // 2 micro-ops + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1], 0>, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [NoBypass, E500_GPR_Bypass], + 2>, // 2 micro-ops + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1], 0>, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1], 0>, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [7, 1], // Latency = r+3 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<3, [E500_LSU_0]>], + [6, 1, 1], // Latency = 3, Repeat rate = 3 + [E500_GPR_Bypass, + E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>], + [6, 1], // Latency = 3 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0]>]>, + InstrItinData, + InstrStage<4, [E500_SU0]>], + [7, 1], + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500_SU0, E500_SU1]>], + [5, 1], // Latency = 2, Repeat rate = 4 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0]>], + [5, 1], + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_LSU_0], 0>]>, + InstrItinData, + InstrStage<5, [E500_SU0]>], + [8, 1], + [E500_GPR_Bypass, E500_CR_Bypass]>, + InstrItinData, + InstrStage<5, [E500_SU0]>], + [8, 1], + [E500_GPR_Bypass, E500_CR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_SU0]>], + [7, 1], // Latency = 4, Repeat rate = 4 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_SU0]>], + [7, 1], // Latency = 4, Repeat rate = 4 + [E500_GPR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1], // Latency = 1, Repeat rate = 1 + [E500_GPR_Bypass, E500_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0]>], + [4, 1], // Latency = 1, Repeat rate = 1 + [E500_CR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500_SU0]>], + [7, 1], // Latency = 4, Repeat rate = 4 + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0, E500_SU1]>], + [4, 1], // Latency = 1, Repeat rate = 1 + [E500_CR_Bypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500_SU0]>], + [4, 1], + [NoBypass, E500_GPR_Bypass]>, + InstrItinData, + InstrStage<32, [E500_MU]>], + [35, 1, 1], // Latency = 32, Repeat rate = 32 + [E500_DivBypass]>, + InstrItinData, + InstrStage<29, [E500_MU]>], + [32, 1, 1], // Latency = 29, Repeat rate = 29 + [E500_DivBypass]>, + InstrItinData, + InstrStage<1, [E500_SU0]>], + [4, 1, 1], // Latency = 1, Repeat rate = 1 + [NoBypass]>, + InstrItinData, + InstrStage<4, [E500_MU]>], + [7, 1, 1], // Latency = 4, Repeat rate = 1 + [NoBypass]> +]>; + +// ===---------------------------------------------------------------------===// +// e500 machine model for scheduling and other instruction cost heuristics. + +def PPCE500Model : SchedMachineModel { + let IssueWidth = 2; // 2 micro-ops are dispatched per cycle. + let LoadLatency = 5; // Optimistic load latency assuming bypass. + // This is overriden by OperandCycles if the + // Itineraries are queried instead. + + let CompleteModel = 0; + + let Itineraries = PPCE500Itineraries; +} Index: llvm/trunk/lib/Target/PowerPC/PPCScheduleE500mc.td =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCScheduleE500mc.td +++ llvm/trunk/lib/Target/PowerPC/PPCScheduleE500mc.td @@ -19,299 +19,299 @@ // * Decode & Dispatch // Can dispatch up to 2 instructions per clock cycle to either the GPR Issue // queues (GIQx), FP Issue Queue (FIQ), or Branch issue queue (BIQ). -def E500_DIS0 : FuncUnit; // Dispatch stage - insn 1 -def E500_DIS1 : FuncUnit; // Dispatch stage - insn 2 +def E500mc_DIS0 : FuncUnit; // Dispatch stage - insn 1 +def E500mc_DIS1 : FuncUnit; // Dispatch stage - insn 2 // * Execute // 6 pipelined execution units: SFX0, SFX1, BU, FPU, LSU, CFX. // Some instructions can only execute in SFX0 but not SFX1. // The CFX has a bypass path, allowing non-divide instructions to execute // while a divide instruction is executed. -def E500_SFX0 : FuncUnit; // Simple unit 0 -def E500_SFX1 : FuncUnit; // Simple unit 1 -def E500_BU : FuncUnit; // Branch unit -def E500_CFX_DivBypass +def E500mc_SFX0 : FuncUnit; // Simple unit 0 +def E500mc_SFX1 : FuncUnit; // Simple unit 1 +def E500mc_BU : FuncUnit; // Branch unit +def E500mc_CFX_DivBypass : FuncUnit; // CFX divide bypass path -def E500_CFX_0 : FuncUnit; // CFX pipeline -def E500_LSU_0 : FuncUnit; // LSU pipeline -def E500_FPU_0 : FuncUnit; // FPU pipeline +def E500mc_CFX_0 : FuncUnit; // CFX pipeline +def E500mc_LSU_0 : FuncUnit; // LSU pipeline +def E500mc_FPU_0 : FuncUnit; // FPU pipeline -def E500_GPR_Bypass : Bypass; -def E500_FPR_Bypass : Bypass; -def E500_CR_Bypass : Bypass; +def E500mc_GPR_Bypass : Bypass; +def E500mc_FPR_Bypass : Bypass; +def E500mc_CR_Bypass : Bypass; def PPCE500mcItineraries : ProcessorItineraries< - [E500_DIS0, E500_DIS1, E500_SFX0, E500_SFX1, E500_BU, E500_CFX_DivBypass, - E500_CFX_0, E500_LSU_0, E500_FPU_0], - [E500_CR_Bypass, E500_GPR_Bypass, E500_FPR_Bypass], [ - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_DIS0, E500mc_DIS1, E500mc_SFX0, E500mc_SFX1, E500mc_BU, E500mc_CFX_DivBypass, + E500mc_CFX_0, E500mc_LSU_0, E500mc_FPU_0], + [E500mc_CR_Bypass, E500mc_GPR_Bypass, E500mc_FPR_Bypass], [ + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1], // Latency = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1], // Latency = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1, 1], // Latency = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass, - E500_CR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass, + E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [5, 1, 1], // Latency = 1 or 2 - [E500_CR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_CFX_0], 0>, - InstrStage<14, [E500_CFX_DivBypass]>], + [E500mc_CR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_CFX_0], 0>, + InstrStage<14, [E500mc_CFX_DivBypass]>], [17, 1, 1], // Latency=4..35, Repeat= 4..35 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<8, [E500_FPU_0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<8, [E500mc_FPU_0]>], [11], // Latency = 8 - [E500_FPR_Bypass]>, - InstrItinData, - InstrStage<8, [E500_FPU_0]>], + [E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<8, [E500mc_FPU_0]>], [11, 1, 1], // Latency = 8 [NoBypass, NoBypass, NoBypass]>, - InstrItinData, - InstrStage<1, [E500_CFX_0]>], + InstrItinData, + InstrStage<1, [E500mc_CFX_0]>], [7, 1, 1], // Latency = 4, Repeat rate = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_CFX_0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_CFX_0]>], [7, 1, 1], // Latency = 4, Repeat rate = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_CFX_0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_CFX_0]>], [7, 1, 1], // Latency = 4, Repeat rate = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1], // Latency = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1], // Latency = 1 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<2, [E500_SFX0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500mc_SFX0]>], [5, 1], // Latency = 2, Repeat rate = 2 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_BU]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_BU]>], [4, 1], // Latency = 1 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_BU]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_BU]>], [4, 1, 1], // Latency = 1 - [E500_CR_Bypass, - E500_CR_Bypass, E500_CR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_BU]>], + [E500mc_CR_Bypass, + E500mc_CR_Bypass, E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_BU]>], [4, 1], // Latency = 1 - [E500_CR_Bypass, E500_CR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_CR_Bypass, E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1, 1], // Latency = 1 - [E500_CR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + [E500mc_CR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3, Repeat rate = 1 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [NoBypass, E500_GPR_Bypass], + [NoBypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [6, 1, 1], // Latency = 3 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [6, 1, 1], // Latency = 3 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [7, 1, 1], // Latency = 4 - [E500_FPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + [E500mc_FPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [7, 1, 1], // Latency = 4 - [E500_FPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass], + [E500mc_FPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], [7, 1, 1], // Latency = 4 - [E500_FPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass], + [E500mc_FPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass], 2>, // 2 micro-ops - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1], 0>, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1], 0>, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], [7, 1], // Latency = r+3 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<3, [E500_LSU_0]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<3, [E500mc_LSU_0]>], [6, 1, 1], // Latency = 3, Repeat rate = 3 - [E500_GPR_Bypass, - E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>], - [6, 1], // Latency = 3 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0]>]>, - InstrItinData, - InstrStage<4, [E500_SFX0]>], + [E500mc_GPR_Bypass, + E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>], + [6, 1], // Latency = 3 + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0]>]>, + InstrItinData, + InstrStage<4, [E500mc_SFX0]>], [7, 1], - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<2, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500mc_SFX0, E500mc_SFX1]>], [5, 1], // Latency = 2, Repeat rate = 4 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0]>], [5, 1], - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_LSU_0], 0>]>, - InstrItinData, - InstrStage<5, [E500_SFX0]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_LSU_0], 0>]>, + InstrItinData, + InstrStage<5, [E500mc_SFX0]>], [8, 1], - [E500_GPR_Bypass, E500_CR_Bypass]>, - InstrItinData, - InstrStage<5, [E500_SFX0]>], + [E500mc_GPR_Bypass, E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<5, [E500mc_SFX0]>], [8, 1], - [E500_GPR_Bypass, E500_CR_Bypass]>, - InstrItinData, - InstrStage<4, [E500_SFX0]>], + [E500mc_GPR_Bypass, E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<4, [E500mc_SFX0]>], [7, 1], // Latency = 4, Repeat rate = 4 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<4, [E500_SFX0]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500mc_SFX0]>], [7, 1], // Latency = 4, Repeat rate = 4 - [E500_GPR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [E500mc_GPR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1], // Latency = 1, Repeat rate = 1 - [E500_GPR_Bypass, E500_CR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0]>], + [E500mc_GPR_Bypass, E500mc_CR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0]>], [4, 1], // Latency = 1, Repeat rate = 1 - [E500_CR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<4, [E500_SFX0]>], + [E500mc_CR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500mc_SFX0]>], [7, 1], // Latency = 4, Repeat rate = 4 - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0, E500_SFX1]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0, E500mc_SFX1]>], [4, 1], // Latency = 1, Repeat rate = 1 - [E500_CR_Bypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<1, [E500_SFX0]>], + [E500mc_CR_Bypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<1, [E500mc_SFX0]>], [4, 1], - [NoBypass, E500_GPR_Bypass]>, - InstrItinData, - InstrStage<2, [E500_FPU_0]>], + [NoBypass, E500mc_GPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500mc_FPU_0]>], [11, 1, 1], // Latency = 8, Repeat rate = 2 - [E500_FPR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass]>, - InstrItinData, - InstrStage<4, [E500_FPU_0]>], + [E500mc_FPR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500mc_FPU_0]>], [13, 1, 1], // Latency = 10, Repeat rate = 4 - [E500_FPR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass]>, - InstrItinData, - InstrStage<2, [E500_FPU_0]>], + [E500mc_FPR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<2, [E500mc_FPU_0]>], [11, 1, 1], // Latency = 8, Repeat rate = 2 - [E500_CR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass]>, - InstrItinData, - InstrStage<68, [E500_FPU_0]>], + [E500mc_CR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<68, [E500mc_FPU_0]>], [71, 1, 1], // Latency = 68, Repeat rate = 68 - [E500_FPR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass]>, - InstrItinData, - InstrStage<38, [E500_FPU_0]>], + [E500mc_FPR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<38, [E500mc_FPU_0]>], [41, 1, 1], // Latency = 38, Repeat rate = 38 - [E500_FPR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass]>, - InstrItinData, - InstrStage<4, [E500_FPU_0]>], + [E500mc_FPR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<4, [E500mc_FPU_0]>], [13, 1, 1, 1], // Latency = 10, Repeat rate = 4 - [E500_FPR_Bypass, - E500_FPR_Bypass, E500_FPR_Bypass, - E500_FPR_Bypass]>, - InstrItinData, - InstrStage<38, [E500_FPU_0]>], + [E500mc_FPR_Bypass, + E500mc_FPR_Bypass, E500mc_FPR_Bypass, + E500mc_FPR_Bypass]>, + InstrItinData, + InstrStage<38, [E500mc_FPU_0]>], [41, 1], // Latency = 38, Repeat rate = 38 - [E500_FPR_Bypass, E500_FPR_Bypass]> + [E500mc_FPR_Bypass, E500mc_FPR_Bypass]> ]>; // ===---------------------------------------------------------------------===// Index: llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h +++ llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h @@ -46,6 +46,7 @@ DIR_750, DIR_970, DIR_A2, + DIR_E500, DIR_E500mc, DIR_E5500, DIR_PWR3,