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