xref: /llvm-project/llvm/lib/Target/VE/VEMCInstLower.cpp (revision bf039a8620f1779d02280cb0a33c4d818073623b)
1064859bdSKazushi (Jam) Marukawa //===-- VEMCInstLower.cpp - Convert VE MachineInstr to MCInst -------------===//
2064859bdSKazushi (Jam) Marukawa //
3064859bdSKazushi (Jam) Marukawa // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4064859bdSKazushi (Jam) Marukawa // See https://llvm.org/LICENSE.txt for license information.
5064859bdSKazushi (Jam) Marukawa // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6064859bdSKazushi (Jam) Marukawa //
7064859bdSKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
8064859bdSKazushi (Jam) Marukawa //
9064859bdSKazushi (Jam) Marukawa // This file contains code to lower VE MachineInstrs to their corresponding
10064859bdSKazushi (Jam) Marukawa // MCInst records.
11064859bdSKazushi (Jam) Marukawa //
12064859bdSKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
13064859bdSKazushi (Jam) Marukawa 
140fca35c6SKazushi (Jam) Marukawa #include "MCTargetDesc/VEMCExpr.h"
15064859bdSKazushi (Jam) Marukawa #include "VE.h"
16064859bdSKazushi (Jam) Marukawa #include "llvm/CodeGen/AsmPrinter.h"
17064859bdSKazushi (Jam) Marukawa #include "llvm/CodeGen/MachineFunction.h"
18064859bdSKazushi (Jam) Marukawa #include "llvm/CodeGen/MachineInstr.h"
19064859bdSKazushi (Jam) Marukawa #include "llvm/CodeGen/MachineOperand.h"
20064859bdSKazushi (Jam) Marukawa #include "llvm/IR/Mangler.h"
21064859bdSKazushi (Jam) Marukawa #include "llvm/MC/MCAsmInfo.h"
22064859bdSKazushi (Jam) Marukawa #include "llvm/MC/MCContext.h"
23064859bdSKazushi (Jam) Marukawa #include "llvm/MC/MCExpr.h"
24064859bdSKazushi (Jam) Marukawa #include "llvm/MC/MCInst.h"
25064859bdSKazushi (Jam) Marukawa 
26064859bdSKazushi (Jam) Marukawa using namespace llvm;
27064859bdSKazushi (Jam) Marukawa 
LowerSymbolOperand(const MachineInstr * MI,const MachineOperand & MO,const MCSymbol * Symbol,AsmPrinter & AP)28064859bdSKazushi (Jam) Marukawa static MCOperand LowerSymbolOperand(const MachineInstr *MI,
29064859bdSKazushi (Jam) Marukawa                                     const MachineOperand &MO,
30064859bdSKazushi (Jam) Marukawa                                     const MCSymbol *Symbol, AsmPrinter &AP) {
310fca35c6SKazushi (Jam) Marukawa   VEMCExpr::VariantKind Kind = (VEMCExpr::VariantKind)MO.getTargetFlags();
32064859bdSKazushi (Jam) Marukawa 
3319520558SKazushi (Jam) Marukawa   const MCExpr *Expr = MCSymbolRefExpr::create(Symbol, AP.OutContext);
3419520558SKazushi (Jam) Marukawa   // Add offset iff MO is not jump table info or machine basic block.
3519520558SKazushi (Jam) Marukawa   if (!MO.isJTI() && !MO.isMBB() && MO.getOffset())
3619520558SKazushi (Jam) Marukawa     Expr = MCBinaryExpr::createAdd(
3719520558SKazushi (Jam) Marukawa         Expr, MCConstantExpr::create(MO.getOffset(), AP.OutContext),
3819520558SKazushi (Jam) Marukawa         AP.OutContext);
3919520558SKazushi (Jam) Marukawa   Expr = VEMCExpr::create(Kind, Expr, AP.OutContext);
4019520558SKazushi (Jam) Marukawa   return MCOperand::createExpr(Expr);
41064859bdSKazushi (Jam) Marukawa }
42064859bdSKazushi (Jam) Marukawa 
LowerOperand(const MachineInstr * MI,const MachineOperand & MO,AsmPrinter & AP)43064859bdSKazushi (Jam) Marukawa static MCOperand LowerOperand(const MachineInstr *MI, const MachineOperand &MO,
44064859bdSKazushi (Jam) Marukawa                               AsmPrinter &AP) {
45064859bdSKazushi (Jam) Marukawa   switch (MO.getType()) {
46064859bdSKazushi (Jam) Marukawa   default:
47064859bdSKazushi (Jam) Marukawa     report_fatal_error("unsupported operand type");
48064859bdSKazushi (Jam) Marukawa 
49064859bdSKazushi (Jam) Marukawa   case MachineOperand::MO_Register:
50064859bdSKazushi (Jam) Marukawa     if (MO.isImplicit())
51064859bdSKazushi (Jam) Marukawa       break;
52064859bdSKazushi (Jam) Marukawa     return MCOperand::createReg(MO.getReg());
53064859bdSKazushi (Jam) Marukawa 
541034262eSKazushi (Jam) Marukawa   case MachineOperand::MO_BlockAddress:
551034262eSKazushi (Jam) Marukawa     return LowerSymbolOperand(
561034262eSKazushi (Jam) Marukawa         MI, MO, AP.GetBlockAddressSymbol(MO.getBlockAddress()), AP);
5740f1e7e8SKazushi (Jam) Marukawa   case MachineOperand::MO_ConstantPoolIndex:
5840f1e7e8SKazushi (Jam) Marukawa     return LowerSymbolOperand(MI, MO, AP.GetCPISymbol(MO.getIndex()), AP);
593ed12232SKazushi (Jam) Marukawa   case MachineOperand::MO_ExternalSymbol:
603ed12232SKazushi (Jam) Marukawa     return LowerSymbolOperand(
613ed12232SKazushi (Jam) Marukawa         MI, MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);
620fca35c6SKazushi (Jam) Marukawa   case MachineOperand::MO_GlobalAddress:
630fca35c6SKazushi (Jam) Marukawa     return LowerSymbolOperand(MI, MO, AP.getSymbol(MO.getGlobal()), AP);
64064859bdSKazushi (Jam) Marukawa   case MachineOperand::MO_Immediate:
65064859bdSKazushi (Jam) Marukawa     return MCOperand::createImm(MO.getImm());
66f4517bbdSKazushi (Jam) Marukawa   case MachineOperand::MO_JumpTableIndex:
67f4517bbdSKazushi (Jam) Marukawa     return LowerSymbolOperand(MI, MO, AP.GetJTISymbol(MO.getIndex()), AP);
68064859bdSKazushi (Jam) Marukawa   case MachineOperand::MO_MachineBasicBlock:
69064859bdSKazushi (Jam) Marukawa     return LowerSymbolOperand(MI, MO, MO.getMBB()->getSymbol(), AP);
70064859bdSKazushi (Jam) Marukawa 
71064859bdSKazushi (Jam) Marukawa   case MachineOperand::MO_RegisterMask:
72064859bdSKazushi (Jam) Marukawa     break;
73064859bdSKazushi (Jam) Marukawa   }
74064859bdSKazushi (Jam) Marukawa   return MCOperand();
75064859bdSKazushi (Jam) Marukawa }
76064859bdSKazushi (Jam) Marukawa 
LowerVEMachineInstrToMCInst(const MachineInstr * MI,MCInst & OutMI,AsmPrinter & AP)77064859bdSKazushi (Jam) Marukawa void llvm::LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
78064859bdSKazushi (Jam) Marukawa                                        AsmPrinter &AP) {
79064859bdSKazushi (Jam) Marukawa   OutMI.setOpcode(MI->getOpcode());
80064859bdSKazushi (Jam) Marukawa 
81*bf039a86SKazu Hirata   for (const MachineOperand &MO : MI->operands()) {
82064859bdSKazushi (Jam) Marukawa     MCOperand MCOp = LowerOperand(MI, MO, AP);
83064859bdSKazushi (Jam) Marukawa 
84064859bdSKazushi (Jam) Marukawa     if (MCOp.isValid())
85064859bdSKazushi (Jam) Marukawa       OutMI.addOperand(MCOp);
86064859bdSKazushi (Jam) Marukawa   }
87064859bdSKazushi (Jam) Marukawa }
88