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
SPIRVInlineAsmLowering(const SPIRVTargetLowering & TLI)21*0fca6ea1SDimitry Andric SPIRVInlineAsmLowering::SPIRVInlineAsmLowering(const SPIRVTargetLowering &TLI)
22*0fca6ea1SDimitry Andric : InlineAsmLowering(&TLI) {}
23*0fca6ea1SDimitry Andric
lowerAsmOperandForConstraint(Value * Val,StringRef Constraint,std::vector<MachineOperand> & Ops,MachineIRBuilder & MIRBuilder) const24*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