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