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