blob: cc967708510488841e72aa39c310fd97f89a6830 [file] [log] [blame]
Evandro Menezes5cee6212012-04-12 17:55:53 +00001//===- 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"
Colin LeMahieu68d967d2015-05-29 14:44:13 +000018#include "MCTargetDesc/HexagonMCInstrInfo.h"
19
Evandro Menezes5cee6212012-04-12 17:55:53 +000020#include "llvm/CodeGen/MachineBasicBlock.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
Rafael Espindola894843c2014-01-07 21:19:40 +000022#include "llvm/IR/Mangler.h"
Colin LeMahieu68d967d2015-05-29 14:44:13 +000023#include "llvm/MC/MCContext.h"
Evandro Menezes5cee6212012-04-12 17:55:53 +000024#include "llvm/MC/MCExpr.h"
25#include "llvm/MC/MCInst.h"
Evandro Menezes5cee6212012-04-12 17:55:53 +000026
27using namespace llvm;
28
Colin LeMahieu52418812014-11-04 00:14:36 +000029static MCOperand GetSymbolRef(const MachineOperand& MO, const MCSymbol* Symbol,
30 HexagonAsmPrinter& Printer) {
Evandro Menezes5cee6212012-04-12 17:55:53 +000031 MCContext &MC = Printer.OutContext;
32 const MCExpr *ME;
33
34 ME = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, MC);
35
36 if (!MO.isJTI() && MO.getOffset())
37 ME = MCBinaryExpr::CreateAdd(ME, MCConstantExpr::Create(MO.getOffset(), MC),
38 MC);
39
Jim Grosbache9119e42015-05-13 18:37:00 +000040 return (MCOperand::createExpr(ME));
Evandro Menezes5cee6212012-04-12 17:55:53 +000041}
42
43// Create an MCInst from a MachineInstr
Colin LeMahieu68d967d2015-05-29 14:44:13 +000044void llvm::HexagonLowerToMC(MachineInstr const* MI, MCInst& MCB,
Colin LeMahieu52418812014-11-04 00:14:36 +000045 HexagonAsmPrinter& AP) {
Colin LeMahieu68d967d2015-05-29 14:44:13 +000046 if(MI->getOpcode() == Hexagon::ENDLOOP0){
47 HexagonMCInstrInfo::setInnerLoop(MCB);
48 return;
49 }
50 if(MI->getOpcode() == Hexagon::ENDLOOP1){
51 HexagonMCInstrInfo::setOuterLoop(MCB);
52 return;
53 }
54 MCInst* MCI = new (AP.OutContext) MCInst;
55 MCI->setOpcode(MI->getOpcode());
56 assert(MCI->getOpcode() == static_cast<unsigned>(MI->getOpcode()) &&
57 "MCI opcode should have been set on construction");
Evandro Menezes5cee6212012-04-12 17:55:53 +000058
59 for (unsigned i = 0, e = MI->getNumOperands(); i < e; i++) {
60 const MachineOperand &MO = MI->getOperand(i);
61 MCOperand MCO;
62
63 switch (MO.getType()) {
64 default:
65 MI->dump();
Sirish Pandef8e5e3c2012-05-03 21:52:53 +000066 llvm_unreachable("unknown operand type");
Evandro Menezes5cee6212012-04-12 17:55:53 +000067 case MachineOperand::MO_Register:
68 // Ignore all implicit register operands.
Colin LeMahieu52418812014-11-04 00:14:36 +000069 if (MO.isImplicit()) continue;
Jim Grosbache9119e42015-05-13 18:37:00 +000070 MCO = MCOperand::createReg(MO.getReg());
Evandro Menezes5cee6212012-04-12 17:55:53 +000071 break;
72 case MachineOperand::MO_FPImmediate: {
73 APFloat Val = MO.getFPImm()->getValueAPF();
74 // FP immediates are used only when setting GPRs, so they may be dealt
75 // with like regular immediates from this point on.
Jim Grosbache9119e42015-05-13 18:37:00 +000076 MCO = MCOperand::createImm(*Val.bitcastToAPInt().getRawData());
Evandro Menezes5cee6212012-04-12 17:55:53 +000077 break;
78 }
79 case MachineOperand::MO_Immediate:
Jim Grosbache9119e42015-05-13 18:37:00 +000080 MCO = MCOperand::createImm(MO.getImm());
Evandro Menezes5cee6212012-04-12 17:55:53 +000081 break;
82 case MachineOperand::MO_MachineBasicBlock:
Jim Grosbache9119e42015-05-13 18:37:00 +000083 MCO = MCOperand::createExpr
Colin LeMahieu52418812014-11-04 00:14:36 +000084 (MCSymbolRefExpr::Create(MO.getMBB()->getSymbol(),
85 AP.OutContext));
Evandro Menezes5cee6212012-04-12 17:55:53 +000086 break;
87 case MachineOperand::MO_GlobalAddress:
Rafael Espindola79858aa2013-10-29 17:07:16 +000088 MCO = GetSymbolRef(MO, AP.getSymbol(MO.getGlobal()), AP);
Evandro Menezes5cee6212012-04-12 17:55:53 +000089 break;
90 case MachineOperand::MO_ExternalSymbol:
Colin LeMahieu52418812014-11-04 00:14:36 +000091 MCO = GetSymbolRef(MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()),
92 AP);
Evandro Menezes5cee6212012-04-12 17:55:53 +000093 break;
94 case MachineOperand::MO_JumpTableIndex:
95 MCO = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
96 break;
97 case MachineOperand::MO_ConstantPoolIndex:
98 MCO = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
99 break;
100 case MachineOperand::MO_BlockAddress:
Colin LeMahieu52418812014-11-04 00:14:36 +0000101 MCO = GetSymbolRef(MO, AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
Evandro Menezes5cee6212012-04-12 17:55:53 +0000102 break;
103 }
104
Colin LeMahieu68d967d2015-05-29 14:44:13 +0000105 MCI->addOperand(MCO);
Evandro Menezes5cee6212012-04-12 17:55:53 +0000106 }
Colin LeMahieu68d967d2015-05-29 14:44:13 +0000107 MCB.addOperand(MCOperand::createInst(MCI));
Evandro Menezes5cee6212012-04-12 17:55:53 +0000108}