diff options
Diffstat (limited to 'llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp')
| -rw-r--r-- | llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp b/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp new file mode 100644 index 000000000000..7416c93b4d05 --- /dev/null +++ b/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp @@ -0,0 +1,66 @@ +//=- LoongArchMCInstLower.cpp - Convert LoongArch MachineInstr to an MCInst -=// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains code to lower LoongArch MachineInstrs to their +// corresponding MCInst records. +// +//===----------------------------------------------------------------------===// + +#include "LoongArch.h" +#include "LoongArchSubtarget.h" +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +bool llvm::lowerLoongArchMachineOperandToMCOperand(const MachineOperand &MO, + MCOperand &MCOp, + const AsmPrinter &AP) { + switch (MO.getType()) { + default: + report_fatal_error( + "lowerLoongArchMachineOperandToMCOperand: unknown operand type"); + case MachineOperand::MO_Register: + // Ignore all implicit register operands. + if (MO.isImplicit()) + return false; + MCOp = MCOperand::createReg(MO.getReg()); + break; + case MachineOperand::MO_RegisterMask: + // Regmasks are like implicit defs. + return false; + case MachineOperand::MO_Immediate: + MCOp = MCOperand::createImm(MO.getImm()); + break; + // TODO: lower special operands + case MachineOperand::MO_MachineBasicBlock: + case MachineOperand::MO_GlobalAddress: + case MachineOperand::MO_BlockAddress: + case MachineOperand::MO_ExternalSymbol: + case MachineOperand::MO_ConstantPoolIndex: + case MachineOperand::MO_JumpTableIndex: + break; + } + return true; +} + +bool llvm::lowerLoongArchMachineInstrToMCInst(const MachineInstr *MI, + MCInst &OutMI, AsmPrinter &AP) { + OutMI.setOpcode(MI->getOpcode()); + + for (const MachineOperand &MO : MI->operands()) { + MCOperand MCOp; + if (lowerLoongArchMachineOperandToMCOperand(MO, MCOp, AP)) + OutMI.addOperand(MCOp); + } + return false; +} |
