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
18namespace llvm {
19
20class NVPTXFloatMCExpr : public MCTargetExpr {
21public:
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
28private:
29  const VariantKind Kind;
30  const APFloat Flt;
31
32  explicit NVPTXFloatMCExpr(VariantKind Kind, APFloat Flt)
33      : Kind(Kind), Flt(Flt) {}
34
35public:
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().
83class NVPTXGenericMCSymbolRefExpr : public MCTargetExpr {
84private:
85  const MCSymbolRefExpr *SymExpr;
86
87  explicit NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr *_SymExpr)
88      : SymExpr(_SymExpr) {}
89
90public:
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