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
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define DEBUG_TYPE "xfer"
30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "Hexagon.h"
31f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "HexagonMachineFunctionInfo.h"
32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "HexagonSubtarget.h"
33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "HexagonTargetMachine.h"
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/LatencyPriorityQueue.h"
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineDominators.h"
36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineFunctionPass.h"
37f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/MachineInstrBuilder.h"
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineLoopInfo.h"
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineRegisterInfo.h"
40d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h"
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
42f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/SchedulerRegistry.h"
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/Compiler.h"
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/Debug.h"
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/MathExtras.h"
46d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
47d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
48d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm;
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace {
53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonSplitTFRCondSets : public MachineFunctionPass {
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    HexagonTargetMachine& QTM;
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    const HexagonSubtarget &QST;
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum public:
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    static char ID;
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    HexagonSplitTFRCondSets(HexagonTargetMachine& TM) :
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      MachineFunctionPass(ID), QTM(TM), QST(*TM.getSubtargetImpl()) {}
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    const char *getPassName() const {
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      return "Hexagon Split TFRCondSets";
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    bool runOnMachineFunction(MachineFunction &Fn);
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum};
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumchar HexagonSplitTFRCondSets::ID = 0;
71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumbool HexagonSplitTFRCondSets::runOnMachineFunction(MachineFunction &Fn) {
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const TargetInstrInfo *TII = QTM.getInstrInfo();
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // Loop over all of the basic blocks.
78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  for (MachineFunction::iterator MBBb = Fn.begin(), MBBe = Fn.end();
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum       MBBb != MBBe; ++MBBb) {
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    MachineBasicBlock* MBB = MBBb;
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    // Traverse the basic block.
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    for (MachineBasicBlock::iterator MII = MBB->begin(); MII != MBB->end();
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum         ++MII) {
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      MachineInstr *MI = MII;
857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      int Opc1, Opc2;
867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      switch(MI->getOpcode()) {
877517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr:
887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr_f:
897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_rr64_f: {
907517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
917517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(2).getReg();
927517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg2 = MI->getOperand(3).getReg();
937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() == Hexagon::TFR_condset_rr ||
957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              MI->getOpcode() == Hexagon::TFR_condset_rr_f) {
967517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc1 = Hexagon::TFR_cPt;
977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc2 = Hexagon::TFR_cNotPt;
987517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
997517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          else if (MI->getOpcode() == Hexagon::TFR_condset_rr64_f) {
1007517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc1 = Hexagon::TFR64_cPt;
1017517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            Opc2 = Hexagon::TFR64_cNotPt;
1027517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1037517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1047517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // Minor optimization: do not emit the predicated copy if the source
1057517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // and the destination is the same register.
1067517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg1) {
1077517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(), TII->get(Opc1),
1087517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(MI->getOperand(1).getReg()).addReg(SrcReg1);
1097517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1107517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg2) {
1117517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(), TII->get(Opc2),
1127517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(MI->getOperand(1).getReg()).addReg(SrcReg2);
1137517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1147517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1157517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1167517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
117b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        }
1187517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ri:
1197517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ri_f: {
1207517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1217517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(2).getReg();
1227517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1237517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          //  Do not emit the predicated copy if the source and the destination
1247517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // is the same register.
1257517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg1) {
1267517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1277517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFR_cPt), DestReg).
1287517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).addReg(SrcReg1);
1297517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1307517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ri ) {
1317517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1327517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cNotPt), DestReg).
1337517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1347517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addImm(MI->getOperand(3).getImm());
1357517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ri_f ) {
1367517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1377517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cNotPt_f), DestReg).
1387517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1397517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addFPImm(MI->getOperand(3).getFPImm());
1407517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1417517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1437517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
1457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        }
1467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ir:
1477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ir_f: {
1487517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1497517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg2 = MI->getOperand(3).getReg();
1507517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1517517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ir ) {
1527517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1537517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cPt), DestReg).
1547517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1557517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addImm(MI->getOperand(2).getImm());
1567517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ir_f ) {
1577517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1587517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFRI_cPt_f), DestReg).
1597517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).
1607517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addFPImm(MI->getOperand(2).getFPImm());
1617517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1627517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1637517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // Do not emit the predicated copy if the source and
1647517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          // the destination is the same register.
1657517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (DestReg != SrcReg2) {
1667517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1677517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              TII->get(Hexagon::TFR_cNotPt), DestReg).
1687517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande              addReg(MI->getOperand(1).getReg()).addReg(SrcReg2);
1697517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1707517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1717517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
1727517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
1737517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        }
1747517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ii:
1757517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande        case Hexagon::TFR_condset_ii_f: {
1767517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int DestReg = MI->getOperand(0).getReg();
1777517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          int SrcReg1 = MI->getOperand(1).getReg();
1787517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande
1797517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          if (MI->getOpcode() ==  Hexagon::TFR_condset_ii ) {
1807517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            int Immed1 = MI->getOperand(2).getImm();
1817517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            int Immed2 = MI->getOperand(3).getImm();
1827517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1837517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cPt),
1847517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(SrcReg1).addImm(Immed1);
1857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cNotPt),
1877517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    DestReg).addReg(SrcReg1).addImm(Immed2);
1887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          } else if (MI->getOpcode() ==  Hexagon::TFR_condset_ii_f ) {
1897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1907517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cPt_f), DestReg).
1917517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addReg(SrcReg1).
1927517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addFPImm(MI->getOperand(2).getFPImm());
1937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande            BuildMI(*MBB, MII, MI->getDebugLoc(),
1947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    TII->get(Hexagon::TFRI_cNotPt_f), DestReg).
1957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addReg(SrcReg1).
1967517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande                    addFPImm(MI->getOperand(3).getFPImm());
1977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          }
1987517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          MII = MBB->erase(MI);
1997517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          --MII;
2007517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande          break;
201b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        }
202b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      }
203b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
204b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
205b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return true;
206b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
207b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
208b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
209b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
210b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
211b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                         Public Constructor Functions
212b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
213b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
214b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumFunctionPass *llvm::createHexagonSplitTFRCondSets(HexagonTargetMachine &TM) {
215b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return new HexagonSplitTFRCondSets(TM);
216b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
217