| Jia Liu | 9f61011 | 2012-02-17 08:55:11 +0000 | [diff] [blame] | 1 | //===-- MipsMCInstLower.cpp - Convert Mips MachineInstr to MCInst ---------===// | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file contains code to lower Mips MachineInstrs to their corresponding | 
|  | 11 | // MCInst records. | 
|  | 12 | // | 
|  | 13 | //===----------------------------------------------------------------------===// | 
| Craig Topper | b25fda9 | 2012-03-17 18:46:09 +0000 | [diff] [blame] | 14 | #include "MipsMCInstLower.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 15 | #include "MCTargetDesc/MipsBaseInfo.h" | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 16 | #include "MipsAsmPrinter.h" | 
|  | 17 | #include "MipsInstrInfo.h" | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/MachineFunction.h" | 
|  | 19 | #include "llvm/CodeGen/MachineInstr.h" | 
|  | 20 | #include "llvm/CodeGen/MachineOperand.h" | 
| Rafael Espindola | 894843c | 2014-01-07 21:19:40 +0000 | [diff] [blame] | 21 | #include "llvm/IR/Mangler.h" | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 22 | #include "llvm/MC/MCContext.h" | 
| Bruno Cardoso Lopes | d5edb38 | 2011-11-08 22:26:47 +0000 | [diff] [blame] | 23 | #include "llvm/MC/MCExpr.h" | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 24 | #include "llvm/MC/MCInst.h" | 
| Pete Cooper | ef21bd4 | 2015-03-04 01:24:11 +0000 | [diff] [blame] | 25 | #include "llvm/MC/MCStreamer.h" | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 26 |  | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 27 | using namespace llvm; | 
|  | 28 |  | 
| Akira Hatanaka | 34ee3ff | 2012-03-28 00:22:50 +0000 | [diff] [blame] | 29 | MipsMCInstLower::MipsMCInstLower(MipsAsmPrinter &asmprinter) | 
|  | 30 | : AsmPrinter(asmprinter) {} | 
|  | 31 |  | 
| Rafael Espindola | 7d78b2a | 2013-10-29 16:24:21 +0000 | [diff] [blame] | 32 | void MipsMCInstLower::Initialize(MCContext *C) { | 
| Akira Hatanaka | 34ee3ff | 2012-03-28 00:22:50 +0000 | [diff] [blame] | 33 | Ctx = C; | 
|  | 34 | } | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 35 |  | 
|  | 36 | MCOperand MipsMCInstLower::LowerSymbolOperand(const MachineOperand &MO, | 
| Akira Hatanaka | 6520b98 | 2011-08-16 02:15:03 +0000 | [diff] [blame] | 37 | MachineOperandType MOTy, | 
|  | 38 | unsigned Offset) const { | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 39 | MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; | 
|  | 40 | MipsMCExpr::MipsExprKind TargetKind = MipsMCExpr::MEK_None; | 
|  | 41 | bool IsGpOff = false; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 42 | const MCSymbol *Symbol; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 43 |  | 
|  | 44 | switch(MO.getTargetFlags()) { | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 45 | default: | 
|  | 46 | llvm_unreachable("Invalid target flag!"); | 
|  | 47 | case MipsII::MO_NO_FLAG: | 
|  | 48 | break; | 
|  | 49 | case MipsII::MO_GPREL: | 
|  | 50 | TargetKind = MipsMCExpr::MEK_GPREL; | 
|  | 51 | break; | 
|  | 52 | case MipsII::MO_GOT_CALL: | 
|  | 53 | TargetKind = MipsMCExpr::MEK_GOT_CALL; | 
|  | 54 | break; | 
|  | 55 | case MipsII::MO_GOT: | 
|  | 56 | TargetKind = MipsMCExpr::MEK_GOT; | 
|  | 57 | break; | 
|  | 58 | case MipsII::MO_ABS_HI: | 
|  | 59 | TargetKind = MipsMCExpr::MEK_HI; | 
|  | 60 | break; | 
|  | 61 | case MipsII::MO_ABS_LO: | 
|  | 62 | TargetKind = MipsMCExpr::MEK_LO; | 
|  | 63 | break; | 
|  | 64 | case MipsII::MO_TLSGD: | 
|  | 65 | TargetKind = MipsMCExpr::MEK_TLSGD; | 
|  | 66 | break; | 
|  | 67 | case MipsII::MO_TLSLDM: | 
|  | 68 | TargetKind = MipsMCExpr::MEK_TLSLDM; | 
|  | 69 | break; | 
|  | 70 | case MipsII::MO_DTPREL_HI: | 
|  | 71 | TargetKind = MipsMCExpr::MEK_DTPREL_HI; | 
|  | 72 | break; | 
|  | 73 | case MipsII::MO_DTPREL_LO: | 
|  | 74 | TargetKind = MipsMCExpr::MEK_DTPREL_LO; | 
|  | 75 | break; | 
|  | 76 | case MipsII::MO_GOTTPREL: | 
|  | 77 | TargetKind = MipsMCExpr::MEK_GOTTPREL; | 
|  | 78 | break; | 
|  | 79 | case MipsII::MO_TPREL_HI: | 
|  | 80 | TargetKind = MipsMCExpr::MEK_TPREL_HI; | 
|  | 81 | break; | 
|  | 82 | case MipsII::MO_TPREL_LO: | 
|  | 83 | TargetKind = MipsMCExpr::MEK_TPREL_LO; | 
|  | 84 | break; | 
|  | 85 | case MipsII::MO_GPOFF_HI: | 
|  | 86 | TargetKind = MipsMCExpr::MEK_HI; | 
|  | 87 | IsGpOff = true; | 
|  | 88 | break; | 
|  | 89 | case MipsII::MO_GPOFF_LO: | 
|  | 90 | TargetKind = MipsMCExpr::MEK_LO; | 
|  | 91 | IsGpOff = true; | 
|  | 92 | break; | 
|  | 93 | case MipsII::MO_GOT_DISP: | 
|  | 94 | TargetKind = MipsMCExpr::MEK_GOT_DISP; | 
|  | 95 | break; | 
|  | 96 | case MipsII::MO_GOT_HI16: | 
|  | 97 | TargetKind = MipsMCExpr::MEK_GOT_HI16; | 
|  | 98 | break; | 
|  | 99 | case MipsII::MO_GOT_LO16: | 
|  | 100 | TargetKind = MipsMCExpr::MEK_GOT_LO16; | 
|  | 101 | break; | 
|  | 102 | case MipsII::MO_GOT_PAGE: | 
|  | 103 | TargetKind = MipsMCExpr::MEK_GOT_PAGE; | 
|  | 104 | break; | 
|  | 105 | case MipsII::MO_GOT_OFST: | 
|  | 106 | TargetKind = MipsMCExpr::MEK_GOT_OFST; | 
|  | 107 | break; | 
|  | 108 | case MipsII::MO_HIGHER: | 
|  | 109 | TargetKind = MipsMCExpr::MEK_HIGHER; | 
|  | 110 | break; | 
|  | 111 | case MipsII::MO_HIGHEST: | 
|  | 112 | TargetKind = MipsMCExpr::MEK_HIGHEST; | 
|  | 113 | break; | 
|  | 114 | case MipsII::MO_CALL_HI16: | 
|  | 115 | TargetKind = MipsMCExpr::MEK_CALL_HI16; | 
|  | 116 | break; | 
|  | 117 | case MipsII::MO_CALL_LO16: | 
|  | 118 | TargetKind = MipsMCExpr::MEK_CALL_LO16; | 
|  | 119 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 120 | } | 
|  | 121 |  | 
|  | 122 | switch (MOTy) { | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 123 | case MachineOperand::MO_MachineBasicBlock: | 
|  | 124 | Symbol = MO.getMBB()->getSymbol(); | 
|  | 125 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 126 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 127 | case MachineOperand::MO_GlobalAddress: | 
| Rafael Espindola | 79858aa | 2013-10-29 17:07:16 +0000 | [diff] [blame] | 128 | Symbol = AsmPrinter.getSymbol(MO.getGlobal()); | 
| Akira Hatanaka | 56bf023 | 2012-06-02 00:02:11 +0000 | [diff] [blame] | 129 | Offset += MO.getOffset(); | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 130 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 131 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 132 | case MachineOperand::MO_BlockAddress: | 
|  | 133 | Symbol = AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress()); | 
| Akira Hatanaka | 56bf023 | 2012-06-02 00:02:11 +0000 | [diff] [blame] | 134 | Offset += MO.getOffset(); | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 135 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 136 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 137 | case MachineOperand::MO_ExternalSymbol: | 
|  | 138 | Symbol = AsmPrinter.GetExternalSymbolSymbol(MO.getSymbolName()); | 
| Akira Hatanaka | 56bf023 | 2012-06-02 00:02:11 +0000 | [diff] [blame] | 139 | Offset += MO.getOffset(); | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 140 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 141 |  | 
| Rafael Espindola | ce4c2bc | 2015-06-23 12:21:54 +0000 | [diff] [blame] | 142 | case MachineOperand::MO_MCSymbol: | 
|  | 143 | Symbol = MO.getMCSymbol(); | 
|  | 144 | Offset += MO.getOffset(); | 
|  | 145 | break; | 
|  | 146 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 147 | case MachineOperand::MO_JumpTableIndex: | 
|  | 148 | Symbol = AsmPrinter.GetJTISymbol(MO.getIndex()); | 
|  | 149 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 150 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 151 | case MachineOperand::MO_ConstantPoolIndex: | 
|  | 152 | Symbol = AsmPrinter.GetCPISymbol(MO.getIndex()); | 
| Akira Hatanaka | 56bf023 | 2012-06-02 00:02:11 +0000 | [diff] [blame] | 153 | Offset += MO.getOffset(); | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 154 | break; | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 155 |  | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 156 | default: | 
|  | 157 | llvm_unreachable("<unknown operand type>"); | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 158 | } | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 159 |  | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 160 | const MCExpr *Expr = MCSymbolRefExpr::create(Symbol, Kind, *Ctx); | 
| Bruno Cardoso Lopes | d5edb38 | 2011-11-08 22:26:47 +0000 | [diff] [blame] | 161 |  | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 162 | if (Offset) { | 
|  | 163 | // Assume offset is never negative. | 
|  | 164 | assert(Offset > 0); | 
| Bruno Cardoso Lopes | d5edb38 | 2011-11-08 22:26:47 +0000 | [diff] [blame] | 165 |  | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 166 | Expr = MCBinaryExpr::createAdd(Expr, MCConstantExpr::create(Offset, *Ctx), | 
|  | 167 | *Ctx); | 
|  | 168 | } | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 169 |  | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 170 | if (IsGpOff) | 
|  | 171 | Expr = MipsMCExpr::createGpOff(TargetKind, Expr, *Ctx); | 
|  | 172 | else if (TargetKind != MipsMCExpr::MEK_None) | 
|  | 173 | Expr = MipsMCExpr::create(TargetKind, Expr, *Ctx); | 
|  | 174 |  | 
|  | 175 | return MCOperand::createExpr(Expr); | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 176 | } | 
|  | 177 |  | 
| Akira Hatanaka | 5fd2248 | 2012-06-14 21:10:56 +0000 | [diff] [blame] | 178 | MCOperand MipsMCInstLower::LowerOperand(const MachineOperand &MO, | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 179 | unsigned offset) const { | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 180 | MachineOperandType MOTy = MO.getType(); | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 181 |  | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 182 | switch (MOTy) { | 
| Craig Topper | e55c556 | 2012-02-07 02:50:20 +0000 | [diff] [blame] | 183 | default: llvm_unreachable("unknown operand type"); | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 184 | case MachineOperand::MO_Register: | 
|  | 185 | // Ignore all implicit register operands. | 
|  | 186 | if (MO.isImplicit()) break; | 
| Jim Grosbach | e9119e4 | 2015-05-13 18:37:00 +0000 | [diff] [blame] | 187 | return MCOperand::createReg(MO.getReg()); | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 188 | case MachineOperand::MO_Immediate: | 
| Jim Grosbach | e9119e4 | 2015-05-13 18:37:00 +0000 | [diff] [blame] | 189 | return MCOperand::createImm(MO.getImm() + offset); | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 190 | case MachineOperand::MO_MachineBasicBlock: | 
|  | 191 | case MachineOperand::MO_GlobalAddress: | 
|  | 192 | case MachineOperand::MO_ExternalSymbol: | 
| Rafael Espindola | ce4c2bc | 2015-06-23 12:21:54 +0000 | [diff] [blame] | 193 | case MachineOperand::MO_MCSymbol: | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 194 | case MachineOperand::MO_JumpTableIndex: | 
|  | 195 | case MachineOperand::MO_ConstantPoolIndex: | 
|  | 196 | case MachineOperand::MO_BlockAddress: | 
| Akira Hatanaka | 049e9e4 | 2011-11-23 22:19:28 +0000 | [diff] [blame] | 197 | return LowerSymbolOperand(MO, MOTy, offset); | 
| Jakob Stoklund Olesen | f1fb1d2 | 2012-01-18 23:52:19 +0000 | [diff] [blame] | 198 | case MachineOperand::MO_RegisterMask: | 
|  | 199 | break; | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 200 | } | 
|  | 201 |  | 
|  | 202 | return MCOperand(); | 
|  | 203 | } | 
|  | 204 |  | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 205 | MCOperand MipsMCInstLower::createSub(MachineBasicBlock *BB1, | 
|  | 206 | MachineBasicBlock *BB2, | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 207 | MipsMCExpr::MipsExprKind Kind) const { | 
| Jim Grosbach | 13760bd | 2015-05-30 01:25:56 +0000 | [diff] [blame] | 208 | const MCSymbolRefExpr *Sym1 = MCSymbolRefExpr::create(BB1->getSymbol(), *Ctx); | 
|  | 209 | const MCSymbolRefExpr *Sym2 = MCSymbolRefExpr::create(BB2->getSymbol(), *Ctx); | 
|  | 210 | const MCBinaryExpr *Sub = MCBinaryExpr::createSub(Sym1, Sym2, *Ctx); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 211 |  | 
| Jim Grosbach | 13760bd | 2015-05-30 01:25:56 +0000 | [diff] [blame] | 212 | return MCOperand::createExpr(MipsMCExpr::create(Kind, Sub, *Ctx)); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 213 | } | 
|  | 214 |  | 
|  | 215 | void MipsMCInstLower:: | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 216 | lowerLongBranchLUi(const MachineInstr *MI, MCInst &OutMI) const { | 
|  | 217 | OutMI.setOpcode(Mips::LUi); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 218 |  | 
|  | 219 | // Lower register operand. | 
|  | 220 | OutMI.addOperand(LowerOperand(MI->getOperand(0))); | 
|  | 221 |  | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 222 | // Create %hi($tgt-$baltgt). | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 223 | OutMI.addOperand(createSub(MI->getOperand(1).getMBB(), | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 224 | MI->getOperand(2).getMBB(), | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 225 | MipsMCExpr::MEK_HI)); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 226 | } | 
|  | 227 |  | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 228 | void MipsMCInstLower::lowerLongBranchADDiu( | 
|  | 229 | const MachineInstr *MI, MCInst &OutMI, int Opcode, | 
|  | 230 | MipsMCExpr::MipsExprKind Kind) const { | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 231 | OutMI.setOpcode(Opcode); | 
|  | 232 |  | 
|  | 233 | // Lower two register operands. | 
|  | 234 | for (unsigned I = 0, E = 2; I != E; ++I) { | 
|  | 235 | const MachineOperand &MO = MI->getOperand(I); | 
|  | 236 | OutMI.addOperand(LowerOperand(MO)); | 
|  | 237 | } | 
|  | 238 |  | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 239 | // Create %lo($tgt-$baltgt) or %hi($tgt-$baltgt). | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 240 | OutMI.addOperand(createSub(MI->getOperand(2).getMBB(), | 
|  | 241 | MI->getOperand(3).getMBB(), Kind)); | 
|  | 242 | } | 
|  | 243 |  | 
|  | 244 | bool MipsMCInstLower::lowerLongBranch(const MachineInstr *MI, | 
|  | 245 | MCInst &OutMI) const { | 
|  | 246 | switch (MI->getOpcode()) { | 
|  | 247 | default: | 
|  | 248 | return false; | 
|  | 249 | case Mips::LONG_BRANCH_LUi: | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 250 | lowerLongBranchLUi(MI, OutMI); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 251 | return true; | 
|  | 252 | case Mips::LONG_BRANCH_ADDiu: | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 253 | lowerLongBranchADDiu(MI, OutMI, Mips::ADDiu, MipsMCExpr::MEK_LO); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 254 | return true; | 
|  | 255 | case Mips::LONG_BRANCH_DADDiu: | 
|  | 256 | unsigned TargetFlags = MI->getOperand(2).getTargetFlags(); | 
| Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 257 | if (TargetFlags == MipsII::MO_ABS_HI) | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 258 | lowerLongBranchADDiu(MI, OutMI, Mips::DADDiu, MipsMCExpr::MEK_HI); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 259 | else if (TargetFlags == MipsII::MO_ABS_LO) | 
| Daniel Sanders | fe98b2f | 2016-05-03 13:35:44 +0000 | [diff] [blame] | 260 | lowerLongBranchADDiu(MI, OutMI, Mips::DADDiu, MipsMCExpr::MEK_LO); | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 261 | else | 
|  | 262 | report_fatal_error("Unexpected flags for LONG_BRANCH_DADDiu"); | 
|  | 263 | return true; | 
|  | 264 | } | 
|  | 265 | } | 
|  | 266 |  | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 267 | void MipsMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 268 | if (lowerLongBranch(MI, OutMI)) | 
|  | 269 | return; | 
|  | 270 |  | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 271 | OutMI.setOpcode(MI->getOpcode()); | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 272 |  | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 273 | for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { | 
|  | 274 | const MachineOperand &MO = MI->getOperand(i); | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 275 | MCOperand MCOp = LowerOperand(MO); | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 276 |  | 
| Akira Hatanaka | 77f1fd5 | 2011-08-16 02:21:03 +0000 | [diff] [blame] | 277 | if (MCOp.isValid()) | 
|  | 278 | OutMI.addOperand(MCOp); | 
| Akira Hatanaka | 77a9e6e | 2011-07-07 20:24:54 +0000 | [diff] [blame] | 279 | } | 
|  | 280 | } | 
| Jack Carter | f649043 | 2012-07-16 15:14:51 +0000 | [diff] [blame] | 281 |  |