1*81ad6265SDimitry Andric //===-- SPIRVSubtarget.cpp - SPIR-V Subtarget Information ------*- 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 implements the SPIR-V specific subclass of TargetSubtargetInfo. 10*81ad6265SDimitry Andric // 11*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 12*81ad6265SDimitry Andric 13*81ad6265SDimitry Andric #include "SPIRVSubtarget.h" 14*81ad6265SDimitry Andric #include "SPIRV.h" 15*81ad6265SDimitry Andric #include "SPIRVGlobalRegistry.h" 16*81ad6265SDimitry Andric #include "SPIRVLegalizerInfo.h" 17*81ad6265SDimitry Andric #include "SPIRVRegisterBankInfo.h" 18*81ad6265SDimitry Andric #include "SPIRVTargetMachine.h" 19*81ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h" 20*81ad6265SDimitry Andric #include "llvm/Support/Host.h" 21*81ad6265SDimitry Andric 22*81ad6265SDimitry Andric using namespace llvm; 23*81ad6265SDimitry Andric 24*81ad6265SDimitry Andric #define DEBUG_TYPE "spirv-subtarget" 25*81ad6265SDimitry Andric 26*81ad6265SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC 27*81ad6265SDimitry Andric #define GET_SUBTARGETINFO_CTOR 28*81ad6265SDimitry Andric #include "SPIRVGenSubtargetInfo.inc" 29*81ad6265SDimitry Andric 30*81ad6265SDimitry Andric // Compare version numbers, but allow 0 to mean unspecified. 31*81ad6265SDimitry Andric static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) { 32*81ad6265SDimitry Andric return Target == 0 || Target >= VerToCompareTo; 33*81ad6265SDimitry Andric } 34*81ad6265SDimitry Andric 35*81ad6265SDimitry Andric static unsigned computePointerSize(const Triple &TT) { 36*81ad6265SDimitry Andric const auto Arch = TT.getArch(); 37*81ad6265SDimitry Andric // TODO: unify this with pointers legalization. 38*81ad6265SDimitry Andric assert(TT.isSPIRV()); 39*81ad6265SDimitry Andric return Arch == Triple::spirv32 ? 32 : 64; 40*81ad6265SDimitry Andric } 41*81ad6265SDimitry Andric 42*81ad6265SDimitry Andric SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, 43*81ad6265SDimitry Andric const std::string &FS, 44*81ad6265SDimitry Andric const SPIRVTargetMachine &TM) 45*81ad6265SDimitry Andric : SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS), 46*81ad6265SDimitry Andric PointerSize(computePointerSize(TT)), SPIRVVersion(0), InstrInfo(), 47*81ad6265SDimitry Andric FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { 48*81ad6265SDimitry Andric GR = std::make_unique<SPIRVGlobalRegistry>(PointerSize); 49*81ad6265SDimitry Andric CallLoweringInfo = 50*81ad6265SDimitry Andric std::make_unique<SPIRVCallLowering>(TLInfo, *this, GR.get()); 51*81ad6265SDimitry Andric Legalizer = std::make_unique<SPIRVLegalizerInfo>(*this); 52*81ad6265SDimitry Andric RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>(); 53*81ad6265SDimitry Andric InstSelector.reset( 54*81ad6265SDimitry Andric createSPIRVInstructionSelector(TM, *this, *RegBankInfo.get())); 55*81ad6265SDimitry Andric } 56*81ad6265SDimitry Andric 57*81ad6265SDimitry Andric SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU, 58*81ad6265SDimitry Andric StringRef FS) { 59*81ad6265SDimitry Andric ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS); 60*81ad6265SDimitry Andric if (SPIRVVersion == 0) 61*81ad6265SDimitry Andric SPIRVVersion = 14; 62*81ad6265SDimitry Andric return *this; 63*81ad6265SDimitry Andric } 64*81ad6265SDimitry Andric 65*81ad6265SDimitry Andric // If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual. 66*81ad6265SDimitry Andric bool SPIRVSubtarget::canDirectlyComparePointers() const { 67*81ad6265SDimitry Andric return isAtLeastVer(SPIRVVersion, 14); 68*81ad6265SDimitry Andric } 69