blob: 4f5b952695631cca5bf69f2a81a2d7275bb124be [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"
Jim Grosbachbaf120f2010-12-01 03:45:07 +000016#include "ARMAsmPrinter.h"
Evan Cheng75972122011-01-13 07:58:56 +000017#include "ARMMCExpr.h"
Jim Grosbach26edbcb2010-09-15 18:47:08 +000018#include "llvm/Constants.h"
Chris Lattner96bc2172009-10-20 00:52:47 +000019#include "llvm/CodeGen/MachineBasicBlock.h"
Chris Lattner6f997762009-10-19 21:53:00 +000020#include "llvm/MC/MCExpr.h"
Chris Lattner9cf0eb52009-10-19 20:21:05 +000021#include "llvm/MC/MCInst.h"
Chris Lattnerd62f1b42010-03-12 21:19:23 +000022#include "llvm/Target/Mangler.h"
Chris Lattner9cf0eb52009-10-19 20:21:05 +000023using namespace llvm;
24
Chris Lattner1612a612010-11-14 20:58:38 +000025
26static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
Jim Grosbachbaf120f2010-12-01 03:45:07 +000027 ARMAsmPrinter &Printer) {
Chris Lattner1612a612010-11-14 20:58:38 +000028 MCContext &Ctx = Printer.OutContext;
Chris Lattnerde36af42010-11-14 20:40:08 +000029 const MCExpr *Expr;
30 switch (MO.getTargetFlags()) {
Evan Cheng75972122011-01-13 07:58:56 +000031 default: {
Chris Lattnerde36af42010-11-14 20:40:08 +000032 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
Evan Cheng75972122011-01-13 07:58:56 +000033 switch (MO.getTargetFlags()) {
34 default:
35 assert(0 && "Unknown target flag on symbol operand");
36 case 0:
37 break;
38 case ARMII::MO_LO16:
39 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
40 Expr = ARMMCExpr::CreateLower16(Expr, Ctx);
41 break;
42 case ARMII::MO_HI16:
43 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
44 Expr = ARMMCExpr::CreateUpper16(Expr, Ctx);
45 break;
46 }
Chris Lattnerde36af42010-11-14 20:40:08 +000047 break;
Evan Cheng75972122011-01-13 07:58:56 +000048 }
49
Chris Lattnerde36af42010-11-14 20:40:08 +000050 case ARMII::MO_PLT:
51 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT, Ctx);
52 break;
53 }
Jim Grosbachd309b412010-11-30 23:29:24 +000054
Jim Grosbachc686e332010-09-17 18:25:25 +000055 if (!MO.isJTI() && MO.getOffset())
56 Expr = MCBinaryExpr::CreateAdd(Expr,
57 MCConstantExpr::Create(MO.getOffset(), Ctx),
58 Ctx);
59 return MCOperand::CreateExpr(Expr);
Jim Grosbachd309b412010-11-30 23:29:24 +000060
Jim Grosbachc686e332010-09-17 18:25:25 +000061}
62
Chris Lattner30e2cc22010-11-14 21:00:02 +000063void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
Jim Grosbachbaf120f2010-12-01 03:45:07 +000064 ARMAsmPrinter &AP) {
Chris Lattner9cf0eb52009-10-19 20:21:05 +000065 OutMI.setOpcode(MI->getOpcode());
Jim Grosbachfc16a892010-09-13 18:25:42 +000066
Chris Lattner9cf0eb52009-10-19 20:21:05 +000067 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
68 const MachineOperand &MO = MI->getOperand(i);
Jim Grosbachfc16a892010-09-13 18:25:42 +000069
Chris Lattner9cf0eb52009-10-19 20:21:05 +000070 MCOperand MCOp;
71 switch (MO.getType()) {
72 default:
73 MI->dump();
74 assert(0 && "unknown operand type");
75 case MachineOperand::MO_Register:
Jim Grosbach1685caf2010-09-14 20:41:27 +000076 // Ignore all non-CPSR implicit register operands.
77 if (MO.isImplicit() && MO.getReg() != ARM::CPSR) continue;
Anton Korobeynikove8ea0112009-11-07 15:20:32 +000078 assert(!MO.getSubReg() && "Subregs should be eliminated!");
Chris Lattner9cf0eb52009-10-19 20:21:05 +000079 MCOp = MCOperand::CreateReg(MO.getReg());
80 break;
81 case MachineOperand::MO_Immediate:
82 MCOp = MCOperand::CreateImm(MO.getImm());
83 break;
Chris Lattner9cf0eb52009-10-19 20:21:05 +000084 case MachineOperand::MO_MachineBasicBlock:
85 MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
Chris Lattner1612a612010-11-14 20:58:38 +000086 MO.getMBB()->getSymbol(), AP.OutContext));
Chris Lattner9cf0eb52009-10-19 20:21:05 +000087 break;
88 case MachineOperand::MO_GlobalAddress:
Chris Lattner1612a612010-11-14 20:58:38 +000089 MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000090 break;
91 case MachineOperand::MO_ExternalSymbol:
Jim Grosbachd309b412010-11-30 23:29:24 +000092 MCOp = GetSymbolRef(MO,
Chris Lattner1612a612010-11-14 20:58:38 +000093 AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000094 break;
95 case MachineOperand::MO_JumpTableIndex:
Chris Lattner1612a612010-11-14 20:58:38 +000096 MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +000097 break;
98 case MachineOperand::MO_ConstantPoolIndex:
Chris Lattner1612a612010-11-14 20:58:38 +000099 MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000100 break;
Bob Wilsonddb16df2009-10-30 05:45:42 +0000101 case MachineOperand::MO_BlockAddress:
Chris Lattner1612a612010-11-14 20:58:38 +0000102 MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
Bob Wilsonddb16df2009-10-30 05:45:42 +0000103 break;
Jim Grosbach26edbcb2010-09-15 18:47:08 +0000104 case MachineOperand::MO_FPImmediate:
Jim Grosbach1d51c412010-09-16 17:37:30 +0000105 APFloat Val = MO.getFPImm()->getValueAPF();
106 bool ignored;
107 Val.convert(APFloat::IEEEdouble, APFloat::rmTowardZero, &ignored);
108 MCOp = MCOperand::CreateFPImm(Val.convertToDouble());
Jim Grosbach26edbcb2010-09-15 18:47:08 +0000109 break;
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000110 }
Jim Grosbachfc16a892010-09-13 18:25:42 +0000111
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000112 OutMI.addOperand(MCOp);
113 }
Chris Lattner9cf0eb52009-10-19 20:21:05 +0000114}