PPCMCInstLower.cpp revision 1520fd60950c1c347457b225dbbd72224d4fcd19
1//===-- PPCMCInstLower.cpp - Convert PPC 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 PPC MachineInstrs to their corresponding
11// MCInst records.
12//
13//===----------------------------------------------------------------------===//
14
15#include "PPC.h"
16#include "llvm/CodeGen/AsmPrinter.h"
17#include "llvm/CodeGen/MachineBasicBlock.h"
18#include "llvm/MC/MCExpr.h"
19#include "llvm/MC/MCInst.h"
20#include "llvm/Target/Mangler.h"
21using namespace llvm;
22
23static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
24                              AsmPrinter &Printer) {
25  MCContext &Ctx = Printer.OutContext;
26  const MCExpr *Expr;
27  switch (MO.getTargetFlags()) {
28  default: assert(0 && "Unknown target flag on symbol operand");
29  case 0:
30    Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx);
31    break;
32#if 0
33  case ARMII::MO_LO16:
34    Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_LO16, Ctx);
35    break;
36#endif
37  }
38
39  if (!MO.isJTI() && MO.getOffset())
40    Expr = MCBinaryExpr::CreateAdd(Expr,
41                                   MCConstantExpr::Create(MO.getOffset(), Ctx),
42                                   Ctx);
43  return MCOperand::CreateExpr(Expr);
44
45}
46
47void llvm::LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
48                                        AsmPrinter &AP) {
49  OutMI.setOpcode(MI->getOpcode());
50
51  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
52    const MachineOperand &MO = MI->getOperand(i);
53
54    MCOperand MCOp;
55    switch (MO.getType()) {
56    default:
57      MI->dump();
58      assert(0 && "unknown operand type");
59    case MachineOperand::MO_Register:
60      assert(!MO.getSubReg() && "Subregs should be eliminated!");
61      MCOp = MCOperand::CreateReg(MO.getReg());
62      break;
63    case MachineOperand::MO_Immediate:
64      MCOp = MCOperand::CreateImm(MO.getImm());
65      break;
66    case MachineOperand::MO_MachineBasicBlock:
67      MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
68                                      MO.getMBB()->getSymbol(), AP.OutContext));
69      break;
70    case MachineOperand::MO_GlobalAddress:
71      MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP);
72      break;
73    case MachineOperand::MO_ExternalSymbol:
74      MCOp = GetSymbolRef(MO,
75                          AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
76      break;
77    case MachineOperand::MO_JumpTableIndex:
78      MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP);
79      break;
80    case MachineOperand::MO_ConstantPoolIndex:
81      MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP);
82      break;
83    case MachineOperand::MO_BlockAddress:
84      MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP);
85      break;
86    }
87
88    OutMI.addOperand(MCOp);
89  }
90}
91