blob: 4f5b952695631cca5bf69f2a81a2d7275bb124be [file] [log] [blame]
Chris Lattner78393d72009-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 Lattnerb28e6912010-11-14 20:31:06 +000015#include "ARM.h"
Jim Grosbachd0d13292010-12-01 03:45:07 +000016#include "ARMAsmPrinter.h"
Evan Cheng965b3c72011-01-13 07:58:56 +000017#include "ARMMCExpr.h"
Jim Grosbach7bbf3fd2010-09-15 18:47:08 +000018#include "llvm/Constants.h"
Chris Lattner1b06acb2009-10-20 00:52:47 +000019#include "llvm/CodeGen/MachineBasicBlock.h"
Chris Lattner889a6212009-10-19 21:53:00 +000020#include "llvm/MC/MCExpr.h"
Chris Lattner78393d72009-10-19 20:21:05 +000021#include "llvm/MC/MCInst.h"
Chris Lattner0b822ab2010-03-12 21:19:23 +000022#include "llvm/Target/Mangler.h"
Chris Lattner78393d72009-10-19 20:21:05 +000023using namespace llvm;
24
Chris Lattnerc5afd122010-11-14 20:58:38 +000025
26static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
Jim Grosbachd0d13292010-12-01 03:45:07 +000027 ARMAsmPrinter &Printer) {
Chris Lattnerc5afd122010-11-14 20:58:38 +000028 MCContext &Ctx = Printer.OutContext;
Chris Lattner3040e8c2010-11-14 20:40:08 +000029 const MCExpr *Expr;
30 switch (MO.getTargetFlags()) {
Evan Cheng965b3c72011-01-13 07:58:56 +000031 default: {
Chris Lattner3040e8c2010-11-14 20:40:08 +000032 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
Evan Cheng965b3c72011-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 Lattner3040e8c2010-11-14 20:40:08 +000047 break;
Evan Cheng965b3c72011-01-13 07:58:56 +000048 }
49
Chris Lattner3040e8c2010-11-14 20:40:08 +000050 case ARMII::MO_PLT:
51 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT, Ctx);
52 break;
53 }
Jim Grosbach38d90de2010-11-30 23:29:24 +000054
Jim Grosbach0d35df12010-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 Grosbach38d90de2010-11-30 23:29:24 +000060
Jim Grosbach0d35df12010-09-17 18:25:25 +000061}
62
Chris Lattnerde16ca82010-11-14 21:00:02 +000063void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
Jim Grosbachd0d13292010-12-01 03:45:07 +000064 ARMAsmPrinter &AP) {
Chris Lattner78393d72009-10-19 20:21:05 +000065 OutMI.setOpcode(MI->getOpcode());
Jim Grosbach7aeff132010-09-13 18:25:42 +000066
Chris Lattner78393d72009-10-19 20:21:05 +000067 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
68 const MachineOperand &MO = MI->getOperand(i);
Jim Grosbach7aeff132010-09-13 18:25:42 +000069
Chris Lattner78393d72009-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 Grosbachcf98cba2010-09-14 20:41:27 +000076 // Ignore all non-CPSR implicit register operands.
77 if (MO.isImplicit() && MO.getReg() != ARM::CPSR) continue;
Anton Korobeynikov226467d2009-11-07 15:20:32 +000078 assert(!MO.getSubReg() && "Subregs should be eliminated!");
Chris Lattner78393d72009-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 Lattner78393d72009-10-19 20:21:05 +000084 case MachineOperand::MO_MachineBasicBlock:
85 MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
Chris Lattnerc5afd122010-11-14 20:58:38 +000086 MO.getMBB()->getSymbol(), AP.OutContext));
Chris Lattner78393d72009-10-19 20:21:05 +000087 break;
88 case MachineOperand::MO_GlobalAddress:
Chris Lattnerc5afd122010-11-14 20:58:38 +000089 MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP);
Chris Lattner78393d72009-10-19 20:21:05 +000090 break;
91 case MachineOperand::MO_ExternalSymbol:
Jim Grosbach38d90de2010-11-30 23:29:24 +000092 MCOp = GetSymbolRef(MO,
Chris Lattnerc5afd122010-11-14 20:58:38 +000093 AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
Chris Lattner78393d72009-10-19 20:21:05 +000094 break;
95 case MachineOperand::MO_JumpTableIndex:
Chris Lattnerc5afd122010-11-14 20:58:38 +000096 MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
Chris Lattner78393d72009-10-19 20:21:05 +000097 break;
98 case MachineOperand::MO_ConstantPoolIndex:
Chris Lattnerc5afd122010-11-14 20:58:38 +000099 MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
Chris Lattner78393d72009-10-19 20:21:05 +0000100 break;
Bob Wilson1cf0b032009-10-30 05:45:42 +0000101 case MachineOperand::MO_BlockAddress:
Chris Lattnerc5afd122010-11-14 20:58:38 +0000102 MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
Bob Wilson1cf0b032009-10-30 05:45:42 +0000103 break;
Jim Grosbach7bbf3fd2010-09-15 18:47:08 +0000104 case MachineOperand::MO_FPImmediate:
Jim Grosbachee1934a2010-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 Grosbach7bbf3fd2010-09-15 18:47:08 +0000109 break;
Chris Lattner78393d72009-10-19 20:21:05 +0000110 }
Jim Grosbach7aeff132010-09-13 18:25:42 +0000111
Chris Lattner78393d72009-10-19 20:21:05 +0000112 OutMI.addOperand(MCOp);
113 }
Chris Lattner78393d72009-10-19 20:21:05 +0000114}