131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonSplitTFRCondSets.cpp - split TFR condsets into xfers -------===//
2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                     The LLVM Compiler Infrastructure
4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source
6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details.
7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
931d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===----------------------------------------------------------------------===//
10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This pass tries to provide opportunities for better optimization of muxes.
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The default code generated for something like: flag = (a == b) ? 1 : 3;
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// would be:
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//   {p0 = cmp.eq(r0,r1)}
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//   {r3 = mux(p0,#1,#3)}
16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
177517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande// This requires two packets.  If we use .new predicated immediate transfers,
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// then we can do this in a single packet, e.g.:
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//   {p0 = cmp.eq(r0,r1)
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//    if (p0.new) r3 = #1
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//    if (!p0.new) r3 = #3}
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// Note that the conditional assignments are not generated in .new form here.
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// We assume opptimisically that they will be formed later.
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "Hexagon.h"
30f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "HexagonMachineFunctionInfo.h"
31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "HexagonSubtarget.h"
32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "HexagonTargetMachine.h"
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/LatencyPriorityQueue.h"
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineDominators.h"
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineFunctionPass.h"
36f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/MachineInstrBuilder.h"
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineLoopInfo.h"
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineRegisterInfo.h"
39d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h"
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
41f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/SchedulerRegistry.h"
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/Compiler.h"
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/Debug.h"
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/MathExtras.h"
45d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
46d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
47d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm;
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "xfer"
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
53942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszeknamespace llvm {
54942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek  void initializeHexagonSplitTFRCondSetsPass(PassRegistry&);
55942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek}
56942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek
57942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace {
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonSplitTFRCondSets : public MachineFunctionPass {
61ed6fe299cf411ca315bc90aa6dfc095d28689ae2Krzysztof Parzyszek    const HexagonTargetMachine &QTM;
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    const HexagonSubtarget &QST;
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum public:
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    static char ID;
66ed6fe299cf411ca315bc90aa6dfc095d28689ae2Krzysztof Parzyszek    HexagonSplitTFRCondSets(const HexagonTargetMachine& TM) :
67942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek      MachineFunctionPass(ID), QTM(TM), QST(*TM.getSubtargetImpl()) {
68942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek      initializeHexagonSplitTFRCondSetsPass(*PassRegistry::getPassRegistry());
69942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek    }
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const char *getPassName() const override {
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      return "Hexagon Split TFRCondSets";
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool runOnMachineFunction(MachineFunction &Fn) override;
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum};
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumchar HexagonSplitTFRCondSets::ID = 0;
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumbool HexagonSplitTFRCondSets::runOnMachineFunction(MachineFunction &Fn) {
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const TargetInstrInfo *TII = QTM.getInstrInfo();
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Loop over all of the basic blocks.
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  for (MachineFunction::iterator MBBb = Fn.begin(), MBBe = Fn.end();
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum       MBBb != MBBe; ++MBBb) {
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    MachineBasicBlock* MBB = MBBb;
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    // Traverse the basic block.
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    for (MachineBasicBlock::iterator MII = MBB->begin(); MII != MBB->end();
91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum         ++MII) {
92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      MachineInstr *MI = MII;
937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      int Opc1, Opc2;
947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      switch(MI->getOpcode()) {
957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr:
967517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr_f:
977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr64_f: {
987517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
997517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(2).getReg();
1007517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg2 = MI->getOperand(3).getReg();
1017517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1027517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() == Hexagon::TFR_condset_rr ||
1037517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              MI->getOpcode() == Hexagon::TFR_condset_rr_f) {
1047517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc1 = Hexagon::TFR_cPt;
1057517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc2 = Hexagon::TFR_cNotPt;
1067517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1077517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          else if (MI->getOpcode() == Hexagon::TFR_condset_rr64_f) {
1087517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc1 = Hexagon::TFR64_cPt;
1097517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc2 = Hexagon::TFR64_cNotPt;
1107517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1117517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1127517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // Minor optimization: do not emit the predicated copy if the source
1137517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // and the destination is the same register.
1147517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg1) {
1157517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(), TII->get(Opc1),
1167517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(MI->getOperand(1).getReg()).addReg(SrcReg1);
1177517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1187517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg2) {
1197517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(), TII->get(Opc2),
1207517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(MI->getOperand(1).getReg()).addReg(SrcReg2);
1217517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1227517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1237517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1247517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        }
1267517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ri:
1277517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ri_f: {
1287517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1297517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(2).getReg();
1307517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1317517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          //  Do not emit the predicated copy if the source and the destination
1327517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // is the same register.
1337517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg1) {
1347517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1357517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFR_cPt), DestReg).
1367517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).addReg(SrcReg1);
1377517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1387517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ri ) {
1397517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1407517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cNotPt), DestReg).
1417517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addImm(MI->getOperand(3).getImm());
1437517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ri_f ) {
1447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cNotPt_f), DestReg).
1467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addFPImm(MI->getOperand(3).getFPImm());
1487517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1497517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1507517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1517517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1527517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
1537517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        }
1547517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ir:
1557517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ir_f: {
1567517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1577517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg2 = MI->getOperand(3).getReg();
1587517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1597517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ir ) {
1607517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1617517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cPt), DestReg).
1627517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1637517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addImm(MI->getOperand(2).getImm());
1647517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ir_f ) {
1657517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1667517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cPt_f), DestReg).
1677517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1687517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addFPImm(MI->getOperand(2).getFPImm());
1697517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1707517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1717517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // Do not emit the predicated copy if the source and
1727517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // the destination is the same register.
1737517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg2) {
1747517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1757517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFR_cNotPt), DestReg).
1767517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).addReg(SrcReg2);
1777517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1787517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1797517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1807517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
1817517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        }
1827517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ii:
1837517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ii_f: {
1847517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(1).getReg();
1867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1877517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ii ) {
1887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            int Immed1 = MI->getOperand(2).getImm();
1897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            int Immed2 = MI->getOperand(3).getImm();
1907517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1917517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cPt),
1927517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(SrcReg1).addImm(Immed1);
1937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cNotPt),
1957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(SrcReg1).addImm(Immed2);
1967517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ii_f ) {
1977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1987517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cPt_f), DestReg).
1997517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addReg(SrcReg1).
2007517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addFPImm(MI->getOperand(2).getFPImm());
2017517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
2027517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cNotPt_f), DestReg).
2037517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addReg(SrcReg1).
2047517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addFPImm(MI->getOperand(3).getFPImm());
2057517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
2067517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
2077517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
2087517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
209b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        }
210b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      }
211b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
212b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
213b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return true;
214b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
215b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
216b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
217b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
218b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
219b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                         Public Constructor Functions
220b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
221b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
222942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszekstatic void initializePassOnce(PassRegistry &Registry) {
223942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek  const char *Name = "Hexagon Split TFRCondSets";
224942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek  PassInfo *PI = new PassInfo(Name, "hexagon-split-tfr",
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              &HexagonSplitTFRCondSets::ID, nullptr, false,
226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              false);
227942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek  Registry.registerPass(*PI, true);
228942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek}
229942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek
230942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszekvoid llvm::initializeHexagonSplitTFRCondSetsPass(PassRegistry &Registry) {
231942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek  CALL_ONCE_INITIALIZATION(initializePassOnce)
232942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek}
233942940a3262242ac55efea88f818959f28d18bbaKrzysztof Parzyszek
234ed6fe299cf411ca315bc90aa6dfc095d28689ae2Krzysztof ParzyszekFunctionPass*
235ed6fe299cf411ca315bc90aa6dfc095d28689ae2Krzysztof Parzyszekllvm::createHexagonSplitTFRCondSets(const HexagonTargetMachine &TM) {
236b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return new HexagonSplitTFRCondSets(TM);
237b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
238