xref: /llvm-project/llvm/lib/Target/CSKY/CSKYMCInstLower.cpp (revision d2377f24e13549f08bbddfe9af8e8b61e9528581)
1*cf78715cSZi Xuan Wu //===-- CSKYMCInstLower.cpp - Convert CSKY MachineInstr to an MCInst --------=//
2*cf78715cSZi Xuan Wu //
3*cf78715cSZi Xuan Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*cf78715cSZi Xuan Wu // See https://llvm.org/LICENSE.txt for license information.
5*cf78715cSZi Xuan Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*cf78715cSZi Xuan Wu //
7*cf78715cSZi Xuan Wu //===----------------------------------------------------------------------===//
8*cf78715cSZi Xuan Wu //
9*cf78715cSZi Xuan Wu // This file contains code to lower CSKY MachineInstrs to their corresponding
10*cf78715cSZi Xuan Wu // MCInst records.
11*cf78715cSZi Xuan Wu //
12*cf78715cSZi Xuan Wu //===----------------------------------------------------------------------===//
13*cf78715cSZi Xuan Wu 
14*cf78715cSZi Xuan Wu #include "CSKYMCInstLower.h"
15*cf78715cSZi Xuan Wu #include "MCTargetDesc/CSKYBaseInfo.h"
16*cf78715cSZi Xuan Wu #include "MCTargetDesc/CSKYMCExpr.h"
17*cf78715cSZi Xuan Wu #include "llvm/CodeGen/AsmPrinter.h"
18*cf78715cSZi Xuan Wu #include "llvm/MC/MCExpr.h"
19*cf78715cSZi Xuan Wu 
20*cf78715cSZi Xuan Wu #define DEBUG_TYPE "csky-mcinst-lower"
21*cf78715cSZi Xuan Wu 
22*cf78715cSZi Xuan Wu using namespace llvm;
23*cf78715cSZi Xuan Wu 
CSKYMCInstLower(MCContext & Ctx,AsmPrinter & Printer)24*cf78715cSZi Xuan Wu CSKYMCInstLower::CSKYMCInstLower(MCContext &Ctx, AsmPrinter &Printer)
25*cf78715cSZi Xuan Wu     : Ctx(Ctx), Printer(Printer) {}
26*cf78715cSZi Xuan Wu 
Lower(const MachineInstr * MI,MCInst & OutMI) const27*cf78715cSZi Xuan Wu void CSKYMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
28*cf78715cSZi Xuan Wu   OutMI.setOpcode(MI->getOpcode());
29*cf78715cSZi Xuan Wu 
30*cf78715cSZi Xuan Wu   for (const MachineOperand &MO : MI->operands()) {
31*cf78715cSZi Xuan Wu     MCOperand MCOp;
32*cf78715cSZi Xuan Wu     if (lowerOperand(MO, MCOp))
33*cf78715cSZi Xuan Wu       OutMI.addOperand(MCOp);
34*cf78715cSZi Xuan Wu   }
35*cf78715cSZi Xuan Wu }
36*cf78715cSZi Xuan Wu 
lowerSymbolOperand(const MachineOperand & MO,MCSymbol * Sym) const37*cf78715cSZi Xuan Wu MCOperand CSKYMCInstLower::lowerSymbolOperand(const MachineOperand &MO,
38*cf78715cSZi Xuan Wu                                               MCSymbol *Sym) const {
39*cf78715cSZi Xuan Wu   CSKYMCExpr::VariantKind Kind;
40*cf78715cSZi Xuan Wu   MCContext &Ctx = Printer.OutContext;
41*cf78715cSZi Xuan Wu 
42*cf78715cSZi Xuan Wu   switch (MO.getTargetFlags()) {
43*cf78715cSZi Xuan Wu   default:
44*cf78715cSZi Xuan Wu     llvm_unreachable("Unknown target flag.");
45*cf78715cSZi Xuan Wu   case CSKYII::MO_None:
46*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_None;
47*cf78715cSZi Xuan Wu     break;
48*cf78715cSZi Xuan Wu   case CSKYII::MO_GOT32:
49*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_GOT;
50*cf78715cSZi Xuan Wu     break;
51*cf78715cSZi Xuan Wu   case CSKYII::MO_GOTOFF:
52*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_GOTOFF;
53*cf78715cSZi Xuan Wu     break;
54*cf78715cSZi Xuan Wu   case CSKYII::MO_ADDR32:
55*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_ADDR;
56*cf78715cSZi Xuan Wu     break;
57*cf78715cSZi Xuan Wu   case CSKYII::MO_PLT32:
58*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_PLT;
59*cf78715cSZi Xuan Wu     break;
60*cf78715cSZi Xuan Wu   case CSKYII::MO_ADDR_HI16:
61*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_ADDR_HI16;
62*cf78715cSZi Xuan Wu     break;
63*cf78715cSZi Xuan Wu   case CSKYII::MO_ADDR_LO16:
64*cf78715cSZi Xuan Wu     Kind = CSKYMCExpr::VK_CSKY_ADDR_LO16;
65*cf78715cSZi Xuan Wu     break;
66*cf78715cSZi Xuan Wu   }
67*cf78715cSZi Xuan Wu   const MCExpr *ME =
68*cf78715cSZi Xuan Wu       MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, Ctx);
69*cf78715cSZi Xuan Wu 
70*cf78715cSZi Xuan Wu   if (Kind != CSKYMCExpr::VK_CSKY_None)
71*cf78715cSZi Xuan Wu     ME = CSKYMCExpr::create(ME, Kind, Ctx);
72*cf78715cSZi Xuan Wu 
73*cf78715cSZi Xuan Wu   return MCOperand::createExpr(ME);
74*cf78715cSZi Xuan Wu }
75*cf78715cSZi Xuan Wu 
lowerOperand(const MachineOperand & MO,MCOperand & MCOp) const76*cf78715cSZi Xuan Wu bool CSKYMCInstLower::lowerOperand(const MachineOperand &MO,
77*cf78715cSZi Xuan Wu                                    MCOperand &MCOp) const {
78*cf78715cSZi Xuan Wu   switch (MO.getType()) {
79*cf78715cSZi Xuan Wu   default:
80*cf78715cSZi Xuan Wu     llvm_unreachable("unknown operand type");
81*cf78715cSZi Xuan Wu   case MachineOperand::MO_RegisterMask:
82*cf78715cSZi Xuan Wu     break;
83*cf78715cSZi Xuan Wu   case MachineOperand::MO_Immediate:
84*cf78715cSZi Xuan Wu     MCOp = MCOperand::createImm(MO.getImm());
85*cf78715cSZi Xuan Wu     break;
86*cf78715cSZi Xuan Wu   case MachineOperand::MO_Register:
87*cf78715cSZi Xuan Wu     if (MO.isImplicit())
88*cf78715cSZi Xuan Wu       return false;
89*cf78715cSZi Xuan Wu     MCOp = MCOperand::createReg(MO.getReg());
90*cf78715cSZi Xuan Wu     break;
91*cf78715cSZi Xuan Wu   case MachineOperand::MO_MachineBasicBlock:
92*cf78715cSZi Xuan Wu     MCOp = MCOperand::createExpr(
93*cf78715cSZi Xuan Wu         MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx));
94*cf78715cSZi Xuan Wu     break;
95*cf78715cSZi Xuan Wu   case MachineOperand::MO_GlobalAddress:
96*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(MO, Printer.getSymbol(MO.getGlobal()));
97*cf78715cSZi Xuan Wu     break;
98*cf78715cSZi Xuan Wu   case MachineOperand::MO_BlockAddress:
99*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(
100*cf78715cSZi Xuan Wu         MO, Printer.GetBlockAddressSymbol(MO.getBlockAddress()));
101*cf78715cSZi Xuan Wu     break;
102*cf78715cSZi Xuan Wu   case MachineOperand::MO_ExternalSymbol:
103*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(
104*cf78715cSZi Xuan Wu         MO, Printer.GetExternalSymbolSymbol(MO.getSymbolName()));
105*cf78715cSZi Xuan Wu     break;
106*cf78715cSZi Xuan Wu   case MachineOperand::MO_ConstantPoolIndex:
107*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(MO, Printer.GetCPISymbol(MO.getIndex()));
108*cf78715cSZi Xuan Wu     break;
109*cf78715cSZi Xuan Wu   case MachineOperand::MO_JumpTableIndex:
110*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(MO, Printer.GetJTISymbol(MO.getIndex()));
111*cf78715cSZi Xuan Wu     break;
112*cf78715cSZi Xuan Wu   case MachineOperand::MO_MCSymbol:
113*cf78715cSZi Xuan Wu     MCOp = lowerSymbolOperand(MO, MO.getMCSymbol());
114*cf78715cSZi Xuan Wu     break;
115*cf78715cSZi Xuan Wu   }
116*cf78715cSZi Xuan Wu   return true;
117*cf78715cSZi Xuan Wu }
118