29 #define DEBUG_TYPE "xfer"
70 const char *getPassName()
const {
71 return "Hexagon Split TFRCondSets";
80 bool HexagonSplitTFRCondSets::runOnMachineFunction(
MachineFunction &Fn) {
86 MBBb != MBBe; ++MBBb) {
94 case Hexagon::TFR_condset_rr:
95 case Hexagon::TFR_condset_rr_f:
96 case Hexagon::TFR_condset_rr64_f: {
101 if (MI->
getOpcode() == Hexagon::TFR_condset_rr ||
102 MI->
getOpcode() == Hexagon::TFR_condset_rr_f) {
103 Opc1 = Hexagon::TFR_cPt;
104 Opc2 = Hexagon::TFR_cNotPt;
106 else if (MI->
getOpcode() == Hexagon::TFR_condset_rr64_f) {
107 Opc1 = Hexagon::TFR64_cPt;
108 Opc2 = Hexagon::TFR64_cNotPt;
113 if (DestReg != SrcReg1) {
117 if (DestReg != SrcReg2) {
125 case Hexagon::TFR_condset_ri:
126 case Hexagon::TFR_condset_ri_f: {
132 if (DestReg != SrcReg1) {
134 TII->
get(Hexagon::TFR_cPt), DestReg).
137 if (MI->
getOpcode() == Hexagon::TFR_condset_ri ) {
139 TII->
get(Hexagon::TFRI_cNotPt), DestReg).
142 }
else if (MI->
getOpcode() == Hexagon::TFR_condset_ri_f ) {
144 TII->
get(Hexagon::TFRI_cNotPt_f), DestReg).
153 case Hexagon::TFR_condset_ir:
154 case Hexagon::TFR_condset_ir_f: {
158 if (MI->
getOpcode() == Hexagon::TFR_condset_ir ) {
160 TII->
get(Hexagon::TFRI_cPt), DestReg).
163 }
else if (MI->
getOpcode() == Hexagon::TFR_condset_ir_f ) {
165 TII->
get(Hexagon::TFRI_cPt_f), DestReg).
172 if (DestReg != SrcReg2) {
174 TII->
get(Hexagon::TFR_cNotPt), DestReg).
181 case Hexagon::TFR_condset_ii:
182 case Hexagon::TFR_condset_ii_f: {
186 if (MI->
getOpcode() == Hexagon::TFR_condset_ii ) {
190 TII->
get(Hexagon::TFRI_cPt),
191 DestReg).addReg(SrcReg1).
addImm(Immed1);
193 TII->
get(Hexagon::TFRI_cNotPt),
194 DestReg).addReg(SrcReg1).
addImm(Immed2);
195 }
else if (MI->
getOpcode() == Hexagon::TFR_condset_ii_f ) {
197 TII->
get(Hexagon::TFRI_cPt_f), DestReg).
201 TII->
get(Hexagon::TFRI_cNotPt_f), DestReg).
222 const char *
Name =
"Hexagon Split TFRCondSets";
224 &HexagonSplitTFRCondSets::ID, 0,
false,
false);
234 return new HexagonSplitTFRCondSets(TM);
instr_iterator erase(instr_iterator I)
static PassRegistry * getPassRegistry()
const ConstantFP * getFPImm() const
const HexagonInstrInfo * TII
void initializeHexagonSplitTFRCondSetsPass(PassRegistry &)
ID
LLVM Calling Convention Representation.
const MachineInstrBuilder & addImm(int64_t Val) const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
static void initializePassOnce(PassRegistry &Registry)
const MCInstrDesc & get(unsigned Opcode) const
FunctionPass * createHexagonSplitTFRCondSets(const HexagonTargetMachine &TM)
unsigned getReg() const
getReg - Returns the register number.
#define CALL_ONCE_INITIALIZATION(function)
BasicBlockListType::iterator iterator
void registerPass(const PassInfo &PI, bool ShouldFree=false)
DebugLoc getDebugLoc() const