Path: blob/main/contrib/llvm-project/llvm/lib/Target/NVPTX/NVPTXMCExpr.h
35271 views
//===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78// Modeled after ARMMCExpr910#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H11#define LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H1213#include "llvm/ADT/APFloat.h"14#include "llvm/MC/MCExpr.h"15#include <utility>1617namespace llvm {1819class NVPTXFloatMCExpr : public MCTargetExpr {20public:21enum VariantKind {22VK_NVPTX_None,23VK_NVPTX_BFLOAT_PREC_FLOAT, // FP constant in bfloat-precision24VK_NVPTX_HALF_PREC_FLOAT, // FP constant in half-precision25VK_NVPTX_SINGLE_PREC_FLOAT, // FP constant in single-precision26VK_NVPTX_DOUBLE_PREC_FLOAT // FP constant in double-precision27};2829private:30const VariantKind Kind;31const APFloat Flt;3233explicit NVPTXFloatMCExpr(VariantKind Kind, APFloat Flt)34: Kind(Kind), Flt(std::move(Flt)) {}3536public:37/// @name Construction38/// @{3940static const NVPTXFloatMCExpr *create(VariantKind Kind, const APFloat &Flt,41MCContext &Ctx);4243static const NVPTXFloatMCExpr *createConstantBFPHalf(const APFloat &Flt,44MCContext &Ctx) {45return create(VK_NVPTX_BFLOAT_PREC_FLOAT, Flt, Ctx);46}4748static const NVPTXFloatMCExpr *createConstantFPHalf(const APFloat &Flt,49MCContext &Ctx) {50return create(VK_NVPTX_HALF_PREC_FLOAT, Flt, Ctx);51}5253static const NVPTXFloatMCExpr *createConstantFPSingle(const APFloat &Flt,54MCContext &Ctx) {55return create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx);56}5758static const NVPTXFloatMCExpr *createConstantFPDouble(const APFloat &Flt,59MCContext &Ctx) {60return create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx);61}6263/// @}64/// @name Accessors65/// @{6667/// getOpcode - Get the kind of this expression.68VariantKind getKind() const { return Kind; }6970/// getSubExpr - Get the child of this expression.71APFloat getAPFloat() const { return Flt; }7273/// @}7475void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;76bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,77const MCFixup *Fixup) const override {78return false;79}80void visitUsedExpr(MCStreamer &Streamer) const override {};81MCFragment *findAssociatedFragment() const override { return nullptr; }8283// There are no TLS NVPTXMCExprs at the moment.84void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}8586static bool classof(const MCExpr *E) {87return E->getKind() == MCExpr::Target;88}89};9091/// A wrapper for MCSymbolRefExpr that tells the assembly printer that the92/// symbol should be enclosed by generic().93class NVPTXGenericMCSymbolRefExpr : public MCTargetExpr {94private:95const MCSymbolRefExpr *SymExpr;9697explicit NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr *_SymExpr)98: SymExpr(_SymExpr) {}99100public:101/// @name Construction102/// @{103104static const NVPTXGenericMCSymbolRefExpr105*create(const MCSymbolRefExpr *SymExpr, MCContext &Ctx);106107/// @}108/// @name Accessors109/// @{110111/// getOpcode - Get the kind of this expression.112const MCSymbolRefExpr *getSymbolExpr() const { return SymExpr; }113114/// @}115116void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;117bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,118const MCFixup *Fixup) const override {119return false;120}121void visitUsedExpr(MCStreamer &Streamer) const override {};122MCFragment *findAssociatedFragment() const override { return nullptr; }123124// There are no TLS NVPTXMCExprs at the moment.125void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}126127static bool classof(const MCExpr *E) {128return E->getKind() == MCExpr::Target;129}130};131} // end namespace llvm132133#endif134135136