diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPC.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstrInfo.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCSchedule.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCScheduleA2.td | 570 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCSubtarget.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCSubtarget.h | 1 | ||||
| -rw-r--r-- | llvm/test/CodeGen/PowerPC/a2-fp-basic.ll | 33 | 
8 files changed, 615 insertions, 4 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC.td b/llvm/lib/Target/PowerPC/PPC.td index 724374c22b4..ca0aa331ca3 100644 --- a/llvm/lib/Target/PowerPC/PPC.td +++ b/llvm/lib/Target/PowerPC/PPC.td @@ -34,6 +34,7 @@ def Directive750 : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_750", "">;  def Directive970 : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_970", "">;  def Directive32  : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_32", "">;  def Directive64  : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_64", "">; +def DirectiveA2  : SubtargetFeature<"", "DarwinDirective", "PPC::DIR_A2", "">;  def Feature64Bit     : SubtargetFeature<"64bit","Has64BitSupport", "true",                                          "Enable 64-bit instructions">; @@ -87,6 +88,9 @@ def : Processor<"g5", G5Itineraries,                    [Directive970, FeatureAltivec,                     FeatureGPUL, FeatureFSqrt, FeatureSTFIWX,                     Feature64Bit /*, Feature64BitRegs */]>; +def : Processor<"a2",  PPCA2Itineraries, [DirectiveA2, FeatureBookE, +                                          FeatureFSqrt, FeatureSTFIWX, +                                          Feature64Bit /*, Feature64BitRegs */]>;  def : Processor<"ppc", G3Itineraries, [Directive32]>;  def : Processor<"ppc64", G5Itineraries,                    [Directive64, FeatureAltivec, diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 4abb4696234..fb7aa71d98d 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -450,6 +450,7 @@ void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {      "ppc7400",      "ppc750",      "ppc970", +    "ppcA2",      "ppc64"    }; diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp index 6f74828b21f..b45ada9db32 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -22,6 +22,7 @@  #include "llvm/CodeGen/MachineInstrBuilder.h"  #include "llvm/CodeGen/MachineMemOperand.h"  #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/PseudoSourceValue.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/ErrorHandling.h" @@ -49,7 +50,7 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetHazardRecognizer(    const TargetMachine *TM,    const ScheduleDAG *DAG) const {    unsigned Directive = TM->getSubtarget<PPCSubtarget>().getDarwinDirective(); -  if (Directive == PPC::DIR_440) { +  if (Directive == PPC::DIR_440 || Directive == PPC::DIR_A2) {      const InstrItineraryData *II = TM->getInstrItineraryData();      return new PPCScoreboardHazardRecognizer(II, DAG);    } @@ -65,14 +66,14 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(    unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective();    // Most subtargets use a PPC970 recognizer. -  if (Directive != PPC::DIR_440) { +  if (Directive != PPC::DIR_440 && Directive != PPC::DIR_A2) {      const TargetInstrInfo *TII = TM.getInstrInfo();      assert(TII && "No InstrInfo?");      return new PPCHazardRecognizer970(*TII);    } -  return TargetInstrInfoImpl::CreateTargetPostRAHazardRecognizer(II, DAG); +  return new PPCScoreboardHazardRecognizer(II, DAG);  }  unsigned PPCInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,                                             int &FrameIndex) const { diff --git a/llvm/lib/Target/PowerPC/PPCSchedule.td b/llvm/lib/Target/PowerPC/PPCSchedule.td index 237870e2409..8c0a8589052 100644 --- a/llvm/lib/Target/PowerPC/PPCSchedule.td +++ b/llvm/lib/Target/PowerPC/PPCSchedule.td @@ -108,6 +108,7 @@ include "PPCSchedule440.td"  include "PPCScheduleG4.td"  include "PPCScheduleG4Plus.td"  include "PPCScheduleG5.td" +include "PPCScheduleA2.td"  //===----------------------------------------------------------------------===//  // Instruction to itinerary class map - When add new opcodes to the supported diff --git a/llvm/lib/Target/PowerPC/PPCScheduleA2.td b/llvm/lib/Target/PowerPC/PPCScheduleA2.td new file mode 100644 index 00000000000..92b629f7fe6 --- /dev/null +++ b/llvm/lib/Target/PowerPC/PPCScheduleA2.td @@ -0,0 +1,570 @@ +//===- PPCScheduleA2.td - PPC A2 Scheduling Definitions --*- tablegen -*-===// +//  +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +//  +//===----------------------------------------------------------------------===// + +// Primary reference: +// A2 Processor User's Manual. +// IBM (as updated in) 2010. + +//===----------------------------------------------------------------------===// +// Functional units on the PowerPC A2 chip sets +// +def IU0to3_0  : FuncUnit; // Fetch unit 1 to 4 slot 1 +def IU0to3_1  : FuncUnit; // Fetch unit 1 to 4 slot 2 +def IU0to3_2  : FuncUnit; // Fetch unit 1 to 4 slot 3 +def IU0to3_3  : FuncUnit; // Fetch unit 1 to 4 slot 4 +def IU4_0  : FuncUnit; // Instruction buffer slot 1 +def IU4_1  : FuncUnit; // Instruction buffer slot 2 +def IU4_2  : FuncUnit; // Instruction buffer slot 3 +def IU4_3  : FuncUnit; // Instruction buffer slot 4 +def IU4_4  : FuncUnit; // Instruction buffer slot 5 +def IU4_5  : FuncUnit; // Instruction buffer slot 6 +def IU4_6  : FuncUnit; // Instruction buffer slot 7 +def IU4_7  : FuncUnit; // Instruction buffer slot 8 +def IU5    : FuncUnit; // Dependency resolution +def IU6    : FuncUnit; // Instruction issue +def RF0    : FuncUnit; +def XRF1   : FuncUnit; +def XEX1   : FuncUnit; // Execution stage 1 for the XU pipeline +def XEX2   : FuncUnit; // Execution stage 2 for the XU pipeline +def XEX3   : FuncUnit; // Execution stage 3 for the XU pipeline +def XEX4   : FuncUnit; // Execution stage 4 for the XU pipeline +def XEX5   : FuncUnit; // Execution stage 5 for the XU pipeline +def XEX6   : FuncUnit; // Execution stage 6 for the XU pipeline +def FRF1   : FuncUnit; +def FEX1   : FuncUnit; // Execution stage 1 for the FU pipeline +def FEX2   : FuncUnit; // Execution stage 2 for the FU pipeline +def FEX3   : FuncUnit; // Execution stage 3 for the FU pipeline +def FEX4   : FuncUnit; // Execution stage 4 for the FU pipeline +def FEX5   : FuncUnit; // Execution stage 5 for the FU pipeline +def FEX6   : FuncUnit; // Execution stage 6 for the FU pipeline + +def CR_Bypass  : Bypass; // The bypass for condition regs. +//def GPR_Bypass : Bypass; // The bypass for general-purpose regs. +//def FPR_Bypass : Bypass; // The bypass for floating-point regs. + +// +// This file defines the itinerary class data for the PPC A2 processor. +// +//===----------------------------------------------------------------------===// + + +def PPCA2Itineraries : ProcessorItineraries< +  [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3, +   IU4_0, IU4_1, IU4_2, IU4_3, IU4_4, IU4_5, IU4_6, IU4_7, +   IU5, IU6, RF0, XRF1, XEX1, XEX2, XEX3, XEX4, XEX5, XEX6, +   FRF1, FEX1, FEX2, FEX3, FEX4, FEX5, FEX6], +  [CR_Bypass, GPR_Bypass, FPR_Bypass], [ +  InstrItinData<IntGeneral  , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntCompare  , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [CR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntDivW     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<38, [XEX6]>], +                              [53, 7, 7], +                              [NoBypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntMFFS     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntMTFSB0   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7],  +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntMulHW    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntMulHWU   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntMulLI    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntRotate   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntShift    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [GPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<IntTrapW    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7],  +                              [GPR_Bypass, GPR_Bypass]>, +  InstrItinData<BrB         , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<BrCR        , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [CR_Bypass, CR_Bypass, CR_Bypass]>, +  InstrItinData<BrMCR       , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [CR_Bypass, CR_Bypass, CR_Bypass]>, +  InstrItinData<BrMCRX      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7, 7], +                              [CR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStDCBA    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [13, 11], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStDCBF    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [13, 11], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStDCBI    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [13, 11], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStLoad    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7], +                              [GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStStore   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [13, 7], +                              [GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStICBI    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStUX      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7, 7], +                              [NoBypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<LdStLFD     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7, 7], +                              [FPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStLFDU    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7, 7], +                              [FPR_Bypass, GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStLHA     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStLMW     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [14, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStLWARX   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<13, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [26, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStSTD     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [13, 7], +                              [GPR_Bypass, GPR_Bypass]>, +  InstrItinData<LdStSTDCX   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<13, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [26, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStSTWCX   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<13, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [26, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<LdStSync    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<12, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>]>, +  InstrItinData<SprISYNC    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>]>, +  InstrItinData<SprMFSR     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [GPR_Bypass, NoBypass]>, +  InstrItinData<SprMTMSR    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprMTSR     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprTLBSYNC  , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>]>, +  InstrItinData<SprMFCR     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [10, 7],  +                              [GPR_Bypass, CR_Bypass]>, +  InstrItinData<SprMFMSR    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [GPR_Bypass, NoBypass]>, +  InstrItinData<SprMFSPR    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprMFTB     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>], +                              [29, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprMTSPR    , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<1, [XEX6]>], +                              [15, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprMTSRIN   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>], +                              [29, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprRFI      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>], +                              [29, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<SprSC       , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [XRF1]>, +                               InstrStage<1, [XEX1]>, InstrStage<1, [XEX2]>, +                               InstrStage<1, [XEX3]>, InstrStage<1, [XEX4]>, +                               InstrStage<1, [XEX5]>, InstrStage<14, [XEX6]>], +                              [29, 7], +                              [NoBypass, GPR_Bypass]>, +  InstrItinData<FPGeneral   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [FRF1]>, +                               InstrStage<1, [FEX1]>, InstrStage<1, [FEX2]>, +                               InstrStage<1, [FEX3]>, InstrStage<1, [FEX4]>, +                               InstrStage<1, [FEX5]>, InstrStage<1, [FEX6]>], +                              [15, 7, 7], +                              [FPR_Bypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<FPCompare   , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [FRF1]>, +                               InstrStage<1, [FEX1]>, InstrStage<1, [FEX2]>, +                               InstrStage<1, [FEX3]>, InstrStage<1, [FEX4]>, +                               InstrStage<1, [FEX5]>, InstrStage<1, [FEX6]>], +                              [13, 7, 7], +                              [CR_Bypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<FPDivD      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<71, [FRF1], 0>, +                               InstrStage<71, [FEX1], 0>, InstrStage<71, [FEX2], 0>, +                               InstrStage<71, [FEX3], 0>, InstrStage<71, [FEX4], 0>, +                               InstrStage<71, [FEX5], 0>, InstrStage<71, [FEX6]>], +                              [86, 7, 7], +                              [NoBypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<FPDivS      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<58, [FRF1], 0>, +                               InstrStage<58, [FEX1], 0>, InstrStage<58, [FEX2], 0>, +                               InstrStage<58, [FEX3], 0>, InstrStage<58, [FEX4], 0>, +                               InstrStage<58, [FEX5], 0>, InstrStage<58, [FEX6]>], +                              [73, 7, 7], +                              [NoBypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<FPSqrt      , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<68, [FRF1], 0>, +                               InstrStage<68, [FEX1], 0>, InstrStage<68, [FEX2], 0>, +                               InstrStage<68, [FEX3], 0>, InstrStage<68, [FEX4], 0>, +                               InstrStage<68, [FEX5], 0>, InstrStage<68, [FEX6]>], +                              [86, 7], // FIXME: should be [86, 7] for double +                                       // and [82, 7] for single. Likewise, +                                       // the FEX? cycle count should be 68 +                                       // for double and 64 for single. +                              [NoBypass, FPR_Bypass]>, +  InstrItinData<FPFused     , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [FRF1]>, +                               InstrStage<1, [FEX1]>, InstrStage<1, [FEX2]>, +                               InstrStage<1, [FEX3]>, InstrStage<1, [FEX4]>, +                               InstrStage<1, [FEX5]>, InstrStage<1, [FEX6]>], +                              [15, 7, 7, 7], +                              [FPR_Bypass, FPR_Bypass, FPR_Bypass, FPR_Bypass]>, +  InstrItinData<FPRes       , [InstrStage<4, [IU0to3_0, IU0to3_1, IU0to3_2, IU0to3_3]>, +                               InstrStage<1, [IU4_0, IU4_1, IU4_2, IU4_3, +                                              IU4_4, IU4_5, IU4_6, IU4_7]>, +                               InstrStage<1, [IU5]>, InstrStage<1, [IU6]>, +                               InstrStage<1, [RF0]>, InstrStage<1, [FRF1]>, +                               InstrStage<1, [FEX1]>, InstrStage<1, [FEX2]>, +                               InstrStage<1, [FEX3]>, InstrStage<1, [FEX4]>, +                               InstrStage<1, [FEX5]>, InstrStage<1, [FEX6]>], +                              [15, 7], +                              [FPR_Bypass, FPR_Bypass]> +]>; diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.cpp b/llvm/lib/Target/PowerPC/PPCSubtarget.cpp index c89fab3356c..fa54a440294 100644 --- a/llvm/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/llvm/lib/Target/PowerPC/PPCSubtarget.cpp @@ -146,7 +146,7 @@ bool PPCSubtarget::enablePostRAScheduler(             CodeGenOpt::Level OptLevel,             TargetSubtargetInfo::AntiDepBreakMode& Mode,             RegClassVector& CriticalPathRCs) const { -  if (DarwinDirective == PPC::DIR_440) +  if (DarwinDirective == PPC::DIR_440 || DarwinDirective == PPC::DIR_A2)      return false;    Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL; diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.h b/llvm/lib/Target/PowerPC/PPCSubtarget.h index 69fe50baa9b..fbd97de16a6 100644 --- a/llvm/lib/Target/PowerPC/PPCSubtarget.h +++ b/llvm/lib/Target/PowerPC/PPCSubtarget.h @@ -40,6 +40,7 @@ namespace PPC {      DIR_7400,      DIR_750,       DIR_970,  +    DIR_A2,      DIR_64      };  } diff --git a/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll b/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll new file mode 100644 index 00000000000..932ad7a63ce --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/a2-fp-basic.ll @@ -0,0 +1,33 @@ +; RUN: llc < %s -march=ppc64 -mcpu=a2 | FileCheck %s + +%0 = type { double, double } + +define void @maybe_an_fma(%0* sret %agg.result, %0* byval %a, %0* byval %b, %0* byval %c) nounwind { +entry: +  %a.realp = getelementptr inbounds %0* %a, i32 0, i32 0 +  %a.real = load double* %a.realp +  %a.imagp = getelementptr inbounds %0* %a, i32 0, i32 1 +  %a.imag = load double* %a.imagp +  %b.realp = getelementptr inbounds %0* %b, i32 0, i32 0 +  %b.real = load double* %b.realp +  %b.imagp = getelementptr inbounds %0* %b, i32 0, i32 1 +  %b.imag = load double* %b.imagp +  %mul.rl = fmul double %a.real, %b.real +  %mul.rr = fmul double %a.imag, %b.imag +  %mul.r = fsub double %mul.rl, %mul.rr +  %mul.il = fmul double %a.imag, %b.real +  %mul.ir = fmul double %a.real, %b.imag +  %mul.i = fadd double %mul.il, %mul.ir +  %c.realp = getelementptr inbounds %0* %c, i32 0, i32 0 +  %c.real = load double* %c.realp +  %c.imagp = getelementptr inbounds %0* %c, i32 0, i32 1 +  %c.imag = load double* %c.imagp +  %add.r = fadd double %mul.r, %c.real +  %add.i = fadd double %mul.i, %c.imag +  %real = getelementptr inbounds %0* %agg.result, i32 0, i32 0 +  %imag = getelementptr inbounds %0* %agg.result, i32 0, i32 1 +  store double %add.r, double* %real +  store double %add.i, double* %imag +  ret void +; CHECK: fmadd +}  | 

