xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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