blob: a43895745f98629d1a2298ba7cc0d630e0a700ed [file] [log] [blame]
Chris Lattner9cf0eb52009-10-19 20:21:05 +00001//===-- ARMMCInstLower.cpp - Convert ARM 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 ARM MachineInstrs to their corresponding
11// MCInst records.
12//
13//===----------------------------------------------------------------------===//
14
Chris Lattner112f2392010-11-14 20:31:06 +000015#include "ARM.h"
Chris Lattner96bc2172009-10-20 00:52:47 +000016#include "llvm/CodeGen/AsmPrinter.h"
Jim Grosbach26edbcb2010-09-15 18:47:08 +000017#include "llvm/Constants.h"
Chris Lattner96bc2172009-10-20 00:52:47 +000018#include "llvm/CodeGen/MachineBasicBlock.h"
Chris Lattner6f997762009-10-19 21:53:00 +000019#include "llvm/MC/MCAsmInfo.h"
20#include "llvm/MC/MCContext.h"
21#include "llvm/MC/MCExpr.h"
Chris Lattner9cf0eb52009-10-19 20:21:05 +000022#include "llvm/MC/MCInst.h"
Chris Lattnerd62f1b42010-03-12 21:19:23 +000023#include "llvm/Target/Mangler.h"
Chris Lattner6f997762009-10-19 21:53:00 +000024#include "llvm/Support/raw_ostream.h"
Chris Lattner6f997762009-10-19 21:53:00 +000025#include "llvm/ADT/SmallString.h"
Chris Lattner9cf0eb52009-10-19 20:21:05 +000026using namespace llvm;
27
Chris Lattner1612a612010-11-14 20:58:38 +000028
29static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
30 AsmPrinter &Printer) {
31 MCContext &Ctx = Printer.OutContext;
Chris Lattnerde36af42010-11-14 20:40:08 +000032 const MCExpr *Expr;
33 switch (MO.getTargetFlags()) {
34 default: assert(0 && "Unknown target flag on symbol operand");
35 case 0:
36 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
37 break;
38 case ARMII::MO_LO16:
39 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_LO16, Ctx);
40 break;
41 case ARMII::MO_HI16:
42 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_HI16, Ctx);
43 break;
44 case ARMII::MO_PLT:
45 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT, Ctx);
46 break;
47 }
48
Jim Grosbachc686e332010-09-17 18:25:25 +000049 if (!MO.isJTI() && MO.getOffset())
50 Expr = MCBinaryExpr::CreateAdd(Expr,
51 MCConstantExpr::Create(MO.getOffset(), Ctx),
52 Ctx);
53 return MCOperand::CreateExpr(Expr);
Chris Lattnerde36af42010-11-14 20:40:08 +000054
Jim Grosbachc686e332010-09-17 18:25:25 +000055}
56
Chris Lattner30e2cc22010-11-14 21:00:02 +000057void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
58 AsmPrinter &AP){
Chris Lattner9cf0eb52009-10-19 20:21:05 +000059 OutMI.setOpcode(MI->getOpcode());
Jim Grosbachfc16a892010-09-13 18:25:42 +000060
Chris Lattner9cf0eb52009-10-19 20:21:05 +000061 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
62 const MachineOperand &MO = MI->getOperand(i);
Jim Grosbachfc16a892010-09-13 18:25:42 +000063
Chris Lattner9cf0eb52009-10-19 20:21:05 +000064 MCOperand MCOp;
65 switch (MO.getType()) {
66 default:
67 MI->dump();
68 assert(0 && "unknown operand type");
69 case MachineOperand::MO_Register:
Jim Grosbach1685caf2010-09-14 20:41:27 +000070 // Ignore all non-CPSR implicit register operands.
71 if (MO.isImplicit() && MO.getReg() != ARM::CPSR) continue;
Anton Korobeynikove8ea0112009-11-07 15:20:32 +000072 assert(!MO.getSubReg() && "Subregs should be eliminated!");
Chris Lattner9cf0eb52009-10-19 20:21:05 +000073 MCOp = MCOperand::CreateReg(MO.getReg());
74 break;
75 case MachineOperand::MO_Immediate:
76 MCOp = MCOperand::CreateImm(MO.getImm());
77 break;
Chris Lattner9cf0eb52009-10-19 20:21:05 +000078 case MachineOperand::MO_MachineBasicBlock:
79 MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
Chris Lattner1612a612010-11-14 20:58:38 +000080 MO.getMBB()->getSymbol(), AP.OutContext));
Chris Lattner9cf0eb52009-10-19 20:21:05 +000081 break;
82 case MachineOperand::MO_GlobalAddress:
Chris Lattner1612a612010-11-14 20:58:38 +000083 MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000084 break;
85 case MachineOperand::MO_ExternalSymbol:
Chris Lattnerde36af42010-11-14 20:40:08 +000086 MCOp = GetSymbolRef(MO,
Chris Lattner1612a612010-11-14 20:58:38 +000087 AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000088 break;
89 case MachineOperand::MO_JumpTableIndex:
Chris Lattner1612a612010-11-14 20:58:38 +000090 MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000091 break;
92 case MachineOperand::MO_ConstantPoolIndex:
Chris Lattner1612a612010-11-14 20:58:38 +000093 MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000094 break;
Bob Wilsonddb16df2009-10-30 05:45:42 +000095 case MachineOperand::MO_BlockAddress:
Chris Lattner1612a612010-11-14 20:58:38 +000096 MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
Bob Wilsonddb16df2009-10-30 05:45:42 +000097 break;
Jim Grosbach26edbcb2010-09-15 18:47:08 +000098 case MachineOperand::MO_FPImmediate:
Jim Grosbach1d51c412010-09-16 17:37:30 +000099 APFloat Val = MO.getFPImm()->getValueAPF();
100 bool ignored;
101 Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
102 MCOp = MCOperand::CreateFPImm(Val.convertToDouble());
Jim Grosbach26edbcb2010-09-15 18:47:08 +0000103 break;
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000104 }
Jim Grosbachfc16a892010-09-13 18:25:42 +0000105
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000106 OutMI.addOperand(MCOp);
107 }
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000108}