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 NVPTXFloatMCExpr(VariantKind Kind,APFloat Flt)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 CreateConstantFPSingle(APFloat Flt,MCContext & Ctx)42 static const NVPTXFloatMCExpr *CreateConstantFPSingle(APFloat Flt, 43 MCContext &Ctx) { 44 return Create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx); 45 } 46 CreateConstantFPDouble(APFloat Flt,MCContext & Ctx)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. getKind()57 VariantKind getKind() const { return Kind; } 58 59 /// getSubExpr - Get the child of this expression. getAPFloat()60 APFloat getAPFloat() const { return Flt; } 61 62 /// @} 63 64 void PrintImpl(raw_ostream &OS) const override; EvaluateAsRelocatableImpl(MCValue & Res,const MCAsmLayout * Layout,const MCFixup * Fixup)65 bool EvaluateAsRelocatableImpl(MCValue &Res, 66 const MCAsmLayout *Layout, 67 const MCFixup *Fixup) const override { 68 return false; 69 } visitUsedExpr(MCStreamer & Streamer)70 void visitUsedExpr(MCStreamer &Streamer) const override {}; FindAssociatedSection()71 const MCSection *FindAssociatedSection() const override { 72 return nullptr; 73 } 74 75 // There are no TLS NVPTXMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)76 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 77 classof(const MCExpr * E)78 static bool classof(const MCExpr *E) { 79 return E->getKind() == MCExpr::Target; 80 } 81 }; 82 } // end namespace llvm 83 84 #endif 85