1 //===- HexagonMCInstLower.cpp - Convert Hexagon MachineInstr to an MCInst -===// 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 Hexagon MachineInstrs to their corresponding 11 // MCInst records. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "Hexagon.h" 16 #include "HexagonAsmPrinter.h" 17 #include "HexagonMachineFunctionInfo.h" 18 #include "MCTargetDesc/HexagonMCInst.h" 19 #include "llvm/CodeGen/MachineBasicBlock.h" 20 #include "llvm/IR/Constants.h" 21 #include "llvm/MC/MCExpr.h" 22 #include "llvm/MC/MCInst.h" 23 #include "llvm/Target/Mangler.h" 24 25 using namespace llvm; 26 27 static MCOperand GetSymbolRef(const MachineOperand& MO, const MCSymbol* Symbol, 28 HexagonAsmPrinter& Printer) { 29 MCContext &MC = Printer.OutContext; 30 const MCExpr *ME; 31 32 ME = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, MC); 33 34 if (!MO.isJTI() && MO.getOffset()) 35 ME = MCBinaryExpr::CreateAdd(ME, MCConstantExpr::Create(MO.getOffset(), MC), 36 MC); 37 38 return (MCOperand::CreateExpr(ME)); 39 } 40 41 // Create an MCInst from a MachineInstr 42 void llvm::HexagonLowerToMC(const MachineInstr* MI, HexagonMCInst& MCI, 43 HexagonAsmPrinter& AP) { 44 MCI.setOpcode(MI->getOpcode()); 45 MCI.setDesc(MI->getDesc()); 46 47 for (unsigned i = 0, e = MI->getNumOperands(); i < e; i++) { 48 const MachineOperand &MO = MI->getOperand(i); 49 MCOperand MCO; 50 51 switch (MO.getType()) { 52 default: 53 MI->dump(); 54 llvm_unreachable("unknown operand type"); 55 case MachineOperand::MO_Register: 56 // Ignore all implicit register operands. 57 if (MO.isImplicit()) continue; 58 MCO = MCOperand::CreateReg(MO.getReg()); 59 break; 60 case MachineOperand::MO_FPImmediate: { 61 APFloat Val = MO.getFPImm()->getValueAPF(); 62 // FP immediates are used only when setting GPRs, so they may be dealt 63 // with like regular immediates from this point on. 64 MCO = MCOperand::CreateImm(*Val.bitcastToAPInt().getRawData()); 65 break; 66 } 67 case MachineOperand::MO_Immediate: 68 MCO = MCOperand::CreateImm(MO.getImm()); 69 break; 70 case MachineOperand::MO_MachineBasicBlock: 71 MCO = MCOperand::CreateExpr 72 (MCSymbolRefExpr::Create(MO.getMBB()->getSymbol(), 73 AP.OutContext)); 74 break; 75 case MachineOperand::MO_GlobalAddress: 76 MCO = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP); 77 break; 78 case MachineOperand::MO_ExternalSymbol: 79 MCO = GetSymbolRef(MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()), 80 AP); 81 break; 82 case MachineOperand::MO_JumpTableIndex: 83 MCO = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP); 84 break; 85 case MachineOperand::MO_ConstantPoolIndex: 86 MCO = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP); 87 break; 88 case MachineOperand::MO_BlockAddress: 89 MCO = GetSymbolRef(MO, AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP); 90 break; 91 } 92 93 MCI.addOperand(MCO); 94 } 95 } 96