xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVInlineAsmLowering.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===--- SPIRVInlineAsmLowering.cpp - Inline Asm lowering -------*- C++ -*-===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric //
9*0fca6ea1SDimitry Andric // This file implements the lowering of LLVM inline asm calls to machine code
10*0fca6ea1SDimitry Andric // calls for GlobalISel.
11*0fca6ea1SDimitry Andric //
12*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
13*0fca6ea1SDimitry Andric 
14*0fca6ea1SDimitry Andric #include "SPIRVInlineAsmLowering.h"
15*0fca6ea1SDimitry Andric #include "SPIRVSubtarget.h"
16*0fca6ea1SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
17*0fca6ea1SDimitry Andric #include "llvm/IR/IntrinsicsSPIRV.h"
18*0fca6ea1SDimitry Andric 
19*0fca6ea1SDimitry Andric using namespace llvm;
20*0fca6ea1SDimitry Andric 
21*0fca6ea1SDimitry Andric SPIRVInlineAsmLowering::SPIRVInlineAsmLowering(const SPIRVTargetLowering &TLI)
22*0fca6ea1SDimitry Andric     : InlineAsmLowering(&TLI) {}
23*0fca6ea1SDimitry Andric 
24*0fca6ea1SDimitry Andric bool SPIRVInlineAsmLowering::lowerAsmOperandForConstraint(
25*0fca6ea1SDimitry Andric     Value *Val, StringRef Constraint, std::vector<MachineOperand> &Ops,
26*0fca6ea1SDimitry Andric     MachineIRBuilder &MIRBuilder) const {
27*0fca6ea1SDimitry Andric   Value *ValOp = nullptr;
28*0fca6ea1SDimitry Andric   if (isa<ConstantInt>(Val)) {
29*0fca6ea1SDimitry Andric     ValOp = Val;
30*0fca6ea1SDimitry Andric   } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(Val)) {
31*0fca6ea1SDimitry Andric     Ops.push_back(MachineOperand::CreateFPImm(CFP));
32*0fca6ea1SDimitry Andric     return true;
33*0fca6ea1SDimitry Andric   } else if (auto *II = dyn_cast<IntrinsicInst>(Val)) {
34*0fca6ea1SDimitry Andric     if (II->getIntrinsicID() == Intrinsic::spv_track_constant) {
35*0fca6ea1SDimitry Andric       if (isa<ConstantInt>(II->getOperand(0))) {
36*0fca6ea1SDimitry Andric         ValOp = II->getOperand(0);
37*0fca6ea1SDimitry Andric       } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(II->getOperand(0))) {
38*0fca6ea1SDimitry Andric         Ops.push_back(MachineOperand::CreateFPImm(CFP));
39*0fca6ea1SDimitry Andric         return true;
40*0fca6ea1SDimitry Andric       }
41*0fca6ea1SDimitry Andric     }
42*0fca6ea1SDimitry Andric   }
43*0fca6ea1SDimitry Andric   return ValOp ? InlineAsmLowering::lowerAsmOperandForConstraint(
44*0fca6ea1SDimitry Andric                      ValOp, Constraint, Ops, MIRBuilder)
45*0fca6ea1SDimitry Andric                : false;
46*0fca6ea1SDimitry Andric }
47