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