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