xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVMCInstLower.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric //=- SPIRVMCInstLower.cpp - Convert SPIR-V MachineInstr to MCInst -*- C++ -*-=//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric //
9*81ad6265SDimitry Andric // This file contains code to lower SPIR-V MachineInstrs to their corresponding
10*81ad6265SDimitry Andric // MCInst records.
11*81ad6265SDimitry Andric //
12*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
13*81ad6265SDimitry Andric 
14*81ad6265SDimitry Andric #include "SPIRVMCInstLower.h"
15*81ad6265SDimitry Andric #include "SPIRV.h"
16*81ad6265SDimitry Andric #include "SPIRVModuleAnalysis.h"
17*81ad6265SDimitry Andric #include "SPIRVUtils.h"
18*81ad6265SDimitry Andric #include "llvm/CodeGen/MachineInstr.h"
19*81ad6265SDimitry Andric #include "llvm/IR/Constants.h"
20*81ad6265SDimitry Andric 
21*81ad6265SDimitry Andric using namespace llvm;
22*81ad6265SDimitry Andric 
23*81ad6265SDimitry Andric void SPIRVMCInstLower::lower(const MachineInstr *MI, MCInst &OutMI,
24*81ad6265SDimitry Andric                              SPIRV::ModuleAnalysisInfo *MAI) const {
25*81ad6265SDimitry Andric   OutMI.setOpcode(MI->getOpcode());
26*81ad6265SDimitry Andric   const MachineFunction *MF = MI->getMF();
27*81ad6265SDimitry Andric   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
28*81ad6265SDimitry Andric     const MachineOperand &MO = MI->getOperand(i);
29*81ad6265SDimitry Andric     MCOperand MCOp;
30*81ad6265SDimitry Andric     switch (MO.getType()) {
31*81ad6265SDimitry Andric     default:
32*81ad6265SDimitry Andric       llvm_unreachable("unknown operand type");
33*81ad6265SDimitry Andric     case MachineOperand::MO_GlobalAddress: {
34*81ad6265SDimitry Andric       Register FuncReg = MAI->getFuncReg(MO.getGlobal()->getGlobalIdentifier());
35*81ad6265SDimitry Andric       assert(FuncReg.isValid() && "Cannot find function Id");
36*81ad6265SDimitry Andric       MCOp = MCOperand::createReg(FuncReg);
37*81ad6265SDimitry Andric       break;
38*81ad6265SDimitry Andric     }
39*81ad6265SDimitry Andric     case MachineOperand::MO_MachineBasicBlock:
40*81ad6265SDimitry Andric       MCOp = MCOperand::createReg(MAI->getOrCreateMBBRegister(*MO.getMBB()));
41*81ad6265SDimitry Andric       break;
42*81ad6265SDimitry Andric     case MachineOperand::MO_Register: {
43*81ad6265SDimitry Andric       Register NewReg = MAI->getRegisterAlias(MF, MO.getReg());
44*81ad6265SDimitry Andric       MCOp = MCOperand::createReg(NewReg.isValid() ? NewReg : MO.getReg());
45*81ad6265SDimitry Andric       break;
46*81ad6265SDimitry Andric     }
47*81ad6265SDimitry Andric     case MachineOperand::MO_Immediate:
48*81ad6265SDimitry Andric       MCOp = MCOperand::createImm(MO.getImm());
49*81ad6265SDimitry Andric       break;
50*81ad6265SDimitry Andric     case MachineOperand::MO_FPImmediate:
51*81ad6265SDimitry Andric       MCOp = MCOperand::createDFPImm(
52*81ad6265SDimitry Andric           MO.getFPImm()->getValueAPF().convertToFloat());
53*81ad6265SDimitry Andric       break;
54*81ad6265SDimitry Andric     }
55*81ad6265SDimitry Andric 
56*81ad6265SDimitry Andric     OutMI.addOperand(MCOp);
57*81ad6265SDimitry Andric   }
58*81ad6265SDimitry Andric }
59