1*ec259036SIlia Diachkov //===-- SPIRVSubtarget.cpp - SPIR-V Subtarget Information ------*- C++ -*--===// 2*ec259036SIlia Diachkov // 3*ec259036SIlia Diachkov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ec259036SIlia Diachkov // See https://llvm.org/LICENSE.txt for license information. 5*ec259036SIlia Diachkov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ec259036SIlia Diachkov // 7*ec259036SIlia Diachkov //===----------------------------------------------------------------------===// 8*ec259036SIlia Diachkov // 9*ec259036SIlia Diachkov // This file implements the SPIR-V specific subclass of TargetSubtargetInfo. 10*ec259036SIlia Diachkov // 11*ec259036SIlia Diachkov //===----------------------------------------------------------------------===// 12*ec259036SIlia Diachkov 13*ec259036SIlia Diachkov #include "SPIRVSubtarget.h" 14*ec259036SIlia Diachkov #include "SPIRV.h" 15*ec259036SIlia Diachkov #include "SPIRVRegisterBankInfo.h" 16*ec259036SIlia Diachkov #include "SPIRVTargetMachine.h" 17*ec259036SIlia Diachkov #include "llvm/MC/TargetRegistry.h" 18*ec259036SIlia Diachkov #include "llvm/Support/Host.h" 19*ec259036SIlia Diachkov 20*ec259036SIlia Diachkov using namespace llvm; 21*ec259036SIlia Diachkov 22*ec259036SIlia Diachkov #define DEBUG_TYPE "spirv-subtarget" 23*ec259036SIlia Diachkov 24*ec259036SIlia Diachkov #define GET_SUBTARGETINFO_TARGET_DESC 25*ec259036SIlia Diachkov #define GET_SUBTARGETINFO_CTOR 26*ec259036SIlia Diachkov #include "SPIRVGenSubtargetInfo.inc" 27*ec259036SIlia Diachkov 28*ec259036SIlia Diachkov // Compare version numbers, but allow 0 to mean unspecified. 29*ec259036SIlia Diachkov static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) { 30*ec259036SIlia Diachkov return Target == 0 || Target >= VerToCompareTo; 31*ec259036SIlia Diachkov } 32*ec259036SIlia Diachkov 33*ec259036SIlia Diachkov static unsigned computePointerSize(const Triple &TT) { 34*ec259036SIlia Diachkov const auto Arch = TT.getArch(); 35*ec259036SIlia Diachkov // TODO: unify this with pointers legalization. 36*ec259036SIlia Diachkov assert(TT.isSPIRV()); 37*ec259036SIlia Diachkov return Arch == Triple::spirv32 ? 32 : 64; 38*ec259036SIlia Diachkov } 39*ec259036SIlia Diachkov 40*ec259036SIlia Diachkov SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, 41*ec259036SIlia Diachkov const std::string &FS, 42*ec259036SIlia Diachkov const SPIRVTargetMachine &TM) 43*ec259036SIlia Diachkov : SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS), 44*ec259036SIlia Diachkov PointerSize(computePointerSize(TT)), SPIRVVersion(0), InstrInfo(), 45*ec259036SIlia Diachkov FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { 46*ec259036SIlia Diachkov CallLoweringInfo = std::make_unique<SPIRVCallLowering>(TLInfo); 47*ec259036SIlia Diachkov RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>(); 48*ec259036SIlia Diachkov } 49*ec259036SIlia Diachkov 50*ec259036SIlia Diachkov SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU, 51*ec259036SIlia Diachkov StringRef FS) { 52*ec259036SIlia Diachkov ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS); 53*ec259036SIlia Diachkov if (SPIRVVersion == 0) 54*ec259036SIlia Diachkov SPIRVVersion = 14; 55*ec259036SIlia Diachkov return *this; 56*ec259036SIlia Diachkov } 57*ec259036SIlia Diachkov 58*ec259036SIlia Diachkov // If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual. 59*ec259036SIlia Diachkov bool SPIRVSubtarget::canDirectlyComparePointers() const { 60*ec259036SIlia Diachkov return isAtLeastVer(SPIRVVersion, 14); 61*ec259036SIlia Diachkov } 62