diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
| commit | 145449b1e420787bb99721a429341fa6be3adfb6 (patch) | |
| tree | 1d56ae694a6de602e348dd80165cf881a36600ed /llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | |
| parent | ecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff) | |
Diffstat (limited to 'llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp')
| -rw-r--r-- | llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp new file mode 100644 index 000000000000..cdf3a160f373 --- /dev/null +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -0,0 +1,68 @@ +//===-- SPIRVSubtarget.cpp - SPIR-V Subtarget Information ------*- C++ -*--===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the SPIR-V specific subclass of TargetSubtargetInfo. +// +//===----------------------------------------------------------------------===// + +#include "SPIRVSubtarget.h" +#include "SPIRV.h" +#include "SPIRVGlobalRegistry.h" +#include "SPIRVLegalizerInfo.h" +#include "SPIRVRegisterBankInfo.h" +#include "SPIRVTargetMachine.h" +#include "llvm/MC/TargetRegistry.h" +#include "llvm/Support/Host.h" + +using namespace llvm; + +#define DEBUG_TYPE "spirv-subtarget" + +#define GET_SUBTARGETINFO_TARGET_DESC +#define GET_SUBTARGETINFO_CTOR +#include "SPIRVGenSubtargetInfo.inc" + +// Compare version numbers, but allow 0 to mean unspecified. +static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) { + return Target == 0 || Target >= VerToCompareTo; +} + +static unsigned computePointerSize(const Triple &TT) { + const auto Arch = TT.getArch(); + // TODO: unify this with pointers legalization. + assert(TT.isSPIRV()); + return Arch == Triple::spirv32 ? 32 : 64; +} + +SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, + const std::string &FS, + const SPIRVTargetMachine &TM) + : SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS), + PointerSize(computePointerSize(TT)), SPIRVVersion(0), InstrInfo(), + FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { + GR = std::make_unique<SPIRVGlobalRegistry>(PointerSize); + CallLoweringInfo = + std::make_unique<SPIRVCallLowering>(TLInfo, *this, GR.get()); + Legalizer = std::make_unique<SPIRVLegalizerInfo>(*this); + RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>(); + InstSelector.reset( + createSPIRVInstructionSelector(TM, *this, *RegBankInfo.get())); +} + +SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU, + StringRef FS) { + ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS); + if (SPIRVVersion == 0) + SPIRVVersion = 14; + return *this; +} + +// If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual. +bool SPIRVSubtarget::canDirectlyComparePointers() const { + return isAtLeastVer(SPIRVVersion, 14); +} |
