1 //===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // Modeled after ARMMCExpr 11 12 #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H 13 #define LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H 14 15 #include "llvm/ADT/APFloat.h" 16 #include "llvm/MC/MCExpr.h" 17 18 namespace llvm { 19 20 class NVPTXFloatMCExpr : public MCTargetExpr { 21 public: 22 enum VariantKind { 23 VK_NVPTX_None, 24 VK_NVPTX_SINGLE_PREC_FLOAT, // FP constant in single-precision 25 VK_NVPTX_DOUBLE_PREC_FLOAT // FP constant in double-precision 26 }; 27 28 private: 29 const VariantKind Kind; 30 const APFloat Flt; 31 32 explicit NVPTXFloatMCExpr(VariantKind Kind, APFloat Flt) 33 : Kind(Kind), Flt(Flt) {} 34 35 public: 36 /// @name Construction 37 /// @{ 38 39 static const NVPTXFloatMCExpr *create(VariantKind Kind, APFloat Flt, 40 MCContext &Ctx); 41 42 static const NVPTXFloatMCExpr *createConstantFPSingle(APFloat Flt, 43 MCContext &Ctx) { 44 return create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx); 45 } 46 47 static const NVPTXFloatMCExpr *createConstantFPDouble(APFloat Flt, 48 MCContext &Ctx) { 49 return create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx); 50 } 51 52 /// @} 53 /// @name Accessors 54 /// @{ 55 56 /// getOpcode - Get the kind of this expression. 57 VariantKind getKind() const { return Kind; } 58 59 /// getSubExpr - Get the child of this expression. 60 APFloat getAPFloat() const { return Flt; } 61 62 /// @} 63 64 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 65 bool evaluateAsRelocatableImpl(MCValue &Res, 66 const MCAsmLayout *Layout, 67 const MCFixup *Fixup) const override { 68 return false; 69 } 70 void visitUsedExpr(MCStreamer &Streamer) const override {}; 71 MCFragment *findAssociatedFragment() const override { return nullptr; } 72 73 // There are no TLS NVPTXMCExprs at the moment. 74 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 75 76 static bool classof(const MCExpr *E) { 77 return E->getKind() == MCExpr::Target; 78 } 79 }; 80 81 /// A wrapper for MCSymbolRefExpr that tells the assembly printer that the 82 /// symbol should be enclosed by generic(). 83 class NVPTXGenericMCSymbolRefExpr : public MCTargetExpr { 84 private: 85 const MCSymbolRefExpr *SymExpr; 86 87 explicit NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr *_SymExpr) 88 : SymExpr(_SymExpr) {} 89 90 public: 91 /// @name Construction 92 /// @{ 93 94 static const NVPTXGenericMCSymbolRefExpr 95 *create(const MCSymbolRefExpr *SymExpr, MCContext &Ctx); 96 97 /// @} 98 /// @name Accessors 99 /// @{ 100 101 /// getOpcode - Get the kind of this expression. 102 const MCSymbolRefExpr *getSymbolExpr() const { return SymExpr; } 103 104 /// @} 105 106 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 107 bool evaluateAsRelocatableImpl(MCValue &Res, 108 const MCAsmLayout *Layout, 109 const MCFixup *Fixup) const override { 110 return false; 111 } 112 void visitUsedExpr(MCStreamer &Streamer) const override {}; 113 MCFragment *findAssociatedFragment() const override { return nullptr; } 114 115 // There are no TLS NVPTXMCExprs at the moment. 116 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 117 118 static bool classof(const MCExpr *E) { 119 return E->getKind() == MCExpr::Target; 120 } 121 }; 122 } // end namespace llvm 123 124 #endif 125