Path: blob/main/contrib/llvm-project/llvm/lib/Target/AVR/AVRMCInstLower.cpp
35269 views
//===-- AVRMCInstLower.cpp - Convert AVR 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 AVR MachineInstrs to their corresponding9// MCInst records.10//11//===----------------------------------------------------------------------===//1213#include "AVRMCInstLower.h"14#include "AVRInstrInfo.h"15#include "MCTargetDesc/AVRMCExpr.h"1617#include "llvm/CodeGen/AsmPrinter.h"18#include "llvm/IR/Mangler.h"19#include "llvm/MC/MCInst.h"20#include "llvm/Support/ErrorHandling.h"2122namespace llvm {2324MCOperand25AVRMCInstLower::lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,26const AVRSubtarget &Subtarget) const {27unsigned char TF = MO.getTargetFlags();28const MCExpr *Expr = MCSymbolRefExpr::create(Sym, Ctx);2930bool IsNegated = false;31if (TF & AVRII::MO_NEG) {32IsNegated = true;33}3435if (!MO.isJTI() && MO.getOffset()) {36Expr = MCBinaryExpr::createAdd(37Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx);38}3940bool IsFunction = MO.isGlobal() && isa<Function>(MO.getGlobal());4142if (TF & AVRII::MO_LO) {43if (IsFunction) {44Expr =45AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVRMCExpr::VK_AVR_LO8_GS46: AVRMCExpr::VK_AVR_PM_LO8,47Expr, IsNegated, Ctx);48} else {49Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_LO8, Expr, IsNegated, Ctx);50}51} else if (TF & AVRII::MO_HI) {52if (IsFunction) {53Expr =54AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVRMCExpr::VK_AVR_HI8_GS55: AVRMCExpr::VK_AVR_PM_HI8,56Expr, IsNegated, Ctx);57} else {58Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_HI8, Expr, IsNegated, Ctx);59}60} else if (TF != 0) {61llvm_unreachable("Unknown target flag on symbol operand");62}6364return MCOperand::createExpr(Expr);65}6667void AVRMCInstLower::lowerInstruction(const MachineInstr &MI,68MCInst &OutMI) const {69auto &Subtarget = MI.getParent()->getParent()->getSubtarget<AVRSubtarget>();70OutMI.setOpcode(MI.getOpcode());7172for (MachineOperand const &MO : MI.operands()) {73MCOperand MCOp;7475switch (MO.getType()) {76default:77MI.print(errs());78llvm_unreachable("unknown operand type");79case MachineOperand::MO_Register:80// Ignore all implicit register operands.81if (MO.isImplicit())82continue;83MCOp = MCOperand::createReg(MO.getReg());84break;85case MachineOperand::MO_Immediate:86MCOp = MCOperand::createImm(MO.getImm());87break;88case MachineOperand::MO_GlobalAddress:89MCOp =90lowerSymbolOperand(MO, Printer.getSymbol(MO.getGlobal()), Subtarget);91break;92case MachineOperand::MO_ExternalSymbol:93MCOp = lowerSymbolOperand(94MO, Printer.GetExternalSymbolSymbol(MO.getSymbolName()), Subtarget);95break;96case MachineOperand::MO_MachineBasicBlock:97MCOp = MCOperand::createExpr(98MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx));99break;100case MachineOperand::MO_RegisterMask:101continue;102case MachineOperand::MO_BlockAddress:103MCOp = lowerSymbolOperand(104MO, Printer.GetBlockAddressSymbol(MO.getBlockAddress()), Subtarget);105break;106case MachineOperand::MO_JumpTableIndex:107MCOp = lowerSymbolOperand(MO, Printer.GetJTISymbol(MO.getIndex()),108Subtarget);109break;110case MachineOperand::MO_ConstantPoolIndex:111MCOp = lowerSymbolOperand(MO, Printer.GetCPISymbol(MO.getIndex()),112Subtarget);113break;114}115116OutMI.addOperand(MCOp);117}118}119120} // end of namespace llvm121122123