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 MCAsmInfo *MAI) 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 {};
findAssociatedFragment()71   MCFragment *findAssociatedFragment() const override { return nullptr; }
72 
73   // There are no TLS NVPTXMCExprs at the moment.
fixELFSymbolsInTLSFixups(MCAssembler & Asm)74   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}
75 
classof(const MCExpr * E)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 
NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr * _SymExpr)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.
getSymbolExpr()102   const MCSymbolRefExpr *getSymbolExpr() const { return SymExpr; }
103 
104   /// @}
105 
106   void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
evaluateAsRelocatableImpl(MCValue & Res,const MCAsmLayout * Layout,const MCFixup * Fixup)107   bool evaluateAsRelocatableImpl(MCValue &Res,
108                                  const MCAsmLayout *Layout,
109                                  const MCFixup *Fixup) const override {
110     return false;
111   }
visitUsedExpr(MCStreamer & Streamer)112   void visitUsedExpr(MCStreamer &Streamer) const override {};
findAssociatedFragment()113   MCFragment *findAssociatedFragment() const override { return nullptr; }
114 
115   // There are no TLS NVPTXMCExprs at the moment.
fixELFSymbolsInTLSFixups(MCAssembler & Asm)116   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}
117 
classof(const MCExpr * E)118   static bool classof(const MCExpr *E) {
119     return E->getKind() == MCExpr::Target;
120   }
121   };
122 } // end namespace llvm
123 
124 #endif
125