Path: blob/main/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp
35266 views
//=- LoongArchMCInstLower.cpp - Convert LoongArch MachineInstr to an MCInst -=//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains code to lower LoongArch MachineInstrs to their9// corresponding MCInst records.10//11//===----------------------------------------------------------------------===//1213#include "LoongArch.h"14#include "LoongArchSubtarget.h"15#include "MCTargetDesc/LoongArchBaseInfo.h"16#include "MCTargetDesc/LoongArchMCExpr.h"17#include "llvm/CodeGen/AsmPrinter.h"18#include "llvm/CodeGen/MachineBasicBlock.h"19#include "llvm/CodeGen/MachineInstr.h"20#include "llvm/MC/MCAsmInfo.h"21#include "llvm/MC/MCContext.h"22#include "llvm/Support/raw_ostream.h"2324using namespace llvm;2526static MCOperand lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,27const AsmPrinter &AP) {28MCContext &Ctx = AP.OutContext;29LoongArchMCExpr::VariantKind Kind;3031switch (MO.getTargetFlags()) {32default:33llvm_unreachable("Unknown target flag on GV operand");34case LoongArchII::MO_None:35Kind = LoongArchMCExpr::VK_LoongArch_None;36break;37case LoongArchII::MO_CALL:38Kind = LoongArchMCExpr::VK_LoongArch_CALL;39break;40case LoongArchII::MO_CALL_PLT:41Kind = LoongArchMCExpr::VK_LoongArch_CALL_PLT;42break;43case LoongArchII::MO_PCREL_HI:44Kind = LoongArchMCExpr::VK_LoongArch_PCALA_HI20;45break;46case LoongArchII::MO_PCREL_LO:47Kind = LoongArchMCExpr::VK_LoongArch_PCALA_LO12;48break;49case LoongArchII::MO_PCREL64_LO:50Kind = LoongArchMCExpr::VK_LoongArch_PCALA64_LO20;51break;52case LoongArchII::MO_PCREL64_HI:53Kind = LoongArchMCExpr::VK_LoongArch_PCALA64_HI12;54break;55case LoongArchII::MO_GOT_PC_HI:56Kind = LoongArchMCExpr::VK_LoongArch_GOT_PC_HI20;57break;58case LoongArchII::MO_GOT_PC_LO:59Kind = LoongArchMCExpr::VK_LoongArch_GOT_PC_LO12;60break;61case LoongArchII::MO_GOT_PC64_LO:62Kind = LoongArchMCExpr::VK_LoongArch_GOT64_PC_LO20;63break;64case LoongArchII::MO_GOT_PC64_HI:65Kind = LoongArchMCExpr::VK_LoongArch_GOT64_PC_HI12;66break;67case LoongArchII::MO_LE_HI:68Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE_HI20;69break;70case LoongArchII::MO_LE_LO:71Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE_LO12;72break;73case LoongArchII::MO_LE64_LO:74Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE64_LO20;75break;76case LoongArchII::MO_LE64_HI:77Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE64_HI12;78break;79case LoongArchII::MO_IE_PC_HI:80Kind = LoongArchMCExpr::VK_LoongArch_TLS_IE_PC_HI20;81break;82case LoongArchII::MO_IE_PC_LO:83Kind = LoongArchMCExpr::VK_LoongArch_TLS_IE_PC_LO12;84break;85case LoongArchII::MO_IE_PC64_LO:86Kind = LoongArchMCExpr::VK_LoongArch_TLS_IE64_PC_LO20;87break;88case LoongArchII::MO_IE_PC64_HI:89Kind = LoongArchMCExpr::VK_LoongArch_TLS_IE64_PC_HI12;90break;91case LoongArchII::MO_LD_PC_HI:92Kind = LoongArchMCExpr::VK_LoongArch_TLS_LD_PC_HI20;93break;94case LoongArchII::MO_GD_PC_HI:95Kind = LoongArchMCExpr::VK_LoongArch_TLS_GD_PC_HI20;96break;97case LoongArchII::MO_CALL36:98Kind = LoongArchMCExpr::VK_LoongArch_CALL36;99break;100case LoongArchII::MO_DESC_PC_HI:101Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC_PC_HI20;102break;103case LoongArchII::MO_DESC_PC_LO:104Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC_PC_LO12;105break;106case LoongArchII::MO_DESC64_PC_LO:107Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC64_PC_LO20;108break;109case LoongArchII::MO_DESC64_PC_HI:110Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC64_PC_HI12;111break;112case LoongArchII::MO_DESC_LD:113Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC_LD;114break;115case LoongArchII::MO_DESC_CALL:116Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC_CALL;117break;118// TODO: Handle more target-flags.119}120121const MCExpr *ME =122MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, Ctx);123124if (!MO.isJTI() && !MO.isMBB() && MO.getOffset())125ME = MCBinaryExpr::createAdd(126ME, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx);127128if (Kind != LoongArchMCExpr::VK_LoongArch_None)129ME = LoongArchMCExpr::create(ME, Kind, Ctx);130return MCOperand::createExpr(ME);131}132133bool llvm::lowerLoongArchMachineOperandToMCOperand(const MachineOperand &MO,134MCOperand &MCOp,135const AsmPrinter &AP) {136switch (MO.getType()) {137default:138report_fatal_error(139"lowerLoongArchMachineOperandToMCOperand: unknown operand type");140case MachineOperand::MO_Register:141// Ignore all implicit register operands.142if (MO.isImplicit())143return false;144MCOp = MCOperand::createReg(MO.getReg());145break;146case MachineOperand::MO_RegisterMask:147// Regmasks are like implicit defs.148return false;149case MachineOperand::MO_Immediate:150MCOp = MCOperand::createImm(MO.getImm());151break;152case MachineOperand::MO_ConstantPoolIndex:153MCOp = lowerSymbolOperand(MO, AP.GetCPISymbol(MO.getIndex()), AP);154break;155case MachineOperand::MO_GlobalAddress:156MCOp = lowerSymbolOperand(MO, AP.getSymbolPreferLocal(*MO.getGlobal()), AP);157break;158case MachineOperand::MO_MachineBasicBlock:159MCOp = lowerSymbolOperand(MO, MO.getMBB()->getSymbol(), AP);160break;161case MachineOperand::MO_ExternalSymbol:162MCOp = lowerSymbolOperand(163MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP);164break;165case MachineOperand::MO_BlockAddress:166MCOp = lowerSymbolOperand(167MO, AP.GetBlockAddressSymbol(MO.getBlockAddress()), AP);168break;169case MachineOperand::MO_JumpTableIndex:170MCOp = lowerSymbolOperand(MO, AP.GetJTISymbol(MO.getIndex()), AP);171break;172}173return true;174}175176bool llvm::lowerLoongArchMachineInstrToMCInst(const MachineInstr *MI,177MCInst &OutMI, AsmPrinter &AP) {178OutMI.setOpcode(MI->getOpcode());179180for (const MachineOperand &MO : MI->operands()) {181MCOperand MCOp;182if (lowerLoongArchMachineOperandToMCOperand(MO, MCOp, AP))183OutMI.addOperand(MCOp);184}185return false;186}187188189