| //===-- Nios2MCInstLower.cpp - Convert Nios2 MachineInstr to MCInst -------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file contains code to lower Nios2 MachineInstrs to their corresponding | 
 | // MCInst records. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "MCTargetDesc/Nios2BaseInfo.h" | 
 | #include "MCTargetDesc/Nios2MCExpr.h" | 
 | #include "Nios2.h" | 
 | #include "llvm/CodeGen/AsmPrinter.h" | 
 | #include "llvm/CodeGen/MachineInstr.h" | 
 | #include "llvm/CodeGen/MachineOperand.h" | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | static MCOperand LowerSymbolOperand(const MachineOperand &MO, AsmPrinter &AP) { | 
 |   MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; | 
 |   Nios2MCExpr::Nios2ExprKind TargetKind = Nios2MCExpr::CEK_None; | 
 |   const MCSymbol *Symbol; | 
 |  | 
 |   switch (MO.getTargetFlags()) { | 
 |   default: | 
 |     llvm_unreachable("Invalid target flag!"); | 
 |   case Nios2FG::MO_NO_FLAG: | 
 |     break; | 
 |   case Nios2FG::MO_ABS_HI: | 
 |     TargetKind = Nios2MCExpr::CEK_ABS_HI; | 
 |     break; | 
 |   case Nios2FG::MO_ABS_LO: | 
 |     TargetKind = Nios2MCExpr::CEK_ABS_LO; | 
 |     break; | 
 |   } | 
 |  | 
 |   switch (MO.getType()) { | 
 |   case MachineOperand::MO_GlobalAddress: | 
 |     Symbol = AP.getSymbol(MO.getGlobal()); | 
 |     break; | 
 |  | 
 |   case MachineOperand::MO_MachineBasicBlock: | 
 |     Symbol = MO.getMBB()->getSymbol(); | 
 |     break; | 
 |  | 
 |   case MachineOperand::MO_BlockAddress: | 
 |     Symbol = AP.GetBlockAddressSymbol(MO.getBlockAddress()); | 
 |     break; | 
 |  | 
 |   case MachineOperand::MO_ExternalSymbol: | 
 |     Symbol = AP.GetExternalSymbolSymbol(MO.getSymbolName()); | 
 |     break; | 
 |  | 
 |   case MachineOperand::MO_JumpTableIndex: | 
 |     Symbol = AP.GetJTISymbol(MO.getIndex()); | 
 |     break; | 
 |  | 
 |   case MachineOperand::MO_ConstantPoolIndex: | 
 |     Symbol = AP.GetCPISymbol(MO.getIndex()); | 
 |     break; | 
 |  | 
 |   default: | 
 |     llvm_unreachable("<unknown operand type>"); | 
 |   } | 
 |  | 
 |   const MCExpr *Expr = MCSymbolRefExpr::create(Symbol, Kind, AP.OutContext); | 
 |  | 
 |   if (TargetKind != Nios2MCExpr::CEK_None) | 
 |     Expr = Nios2MCExpr::create(TargetKind, Expr, AP.OutContext); | 
 |  | 
 |   return MCOperand::createExpr(Expr); | 
 | } | 
 |  | 
 | static MCOperand LowerOperand(const MachineOperand &MO, AsmPrinter &AP) { | 
 |  | 
 |   switch (MO.getType()) { | 
 |   default: | 
 |     llvm_unreachable("unknown operand type"); | 
 |   case MachineOperand::MO_Register: | 
 |     // Ignore all implicit register operands. | 
 |     if (MO.isImplicit()) | 
 |       break; | 
 |     return MCOperand::createReg(MO.getReg()); | 
 |   case MachineOperand::MO_Immediate: | 
 |     return MCOperand::createImm(MO.getImm()); | 
 |   case MachineOperand::MO_MachineBasicBlock: | 
 |   case MachineOperand::MO_ExternalSymbol: | 
 |   case MachineOperand::MO_JumpTableIndex: | 
 |   case MachineOperand::MO_BlockAddress: | 
 |   case MachineOperand::MO_GlobalAddress: | 
 |   case MachineOperand::MO_ConstantPoolIndex: | 
 |     return LowerSymbolOperand(MO, AP); | 
 |   case MachineOperand::MO_RegisterMask: | 
 |     break; | 
 |   } | 
 |  | 
 |   return MCOperand(); | 
 | } | 
 |  | 
 | void llvm::LowerNios2MachineInstToMCInst(const MachineInstr *MI, MCInst &OutMI, | 
 |                                          AsmPrinter &AP) { | 
 |  | 
 |   OutMI.setOpcode(MI->getOpcode()); | 
 |  | 
 |   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { | 
 |     const MachineOperand &MO = MI->getOperand(i); | 
 |     MCOperand MCOp = LowerOperand(MO, AP); | 
 |  | 
 |     if (MCOp.isValid()) | 
 |       OutMI.addOperand(MCOp); | 
 |   } | 
 | } |