NVPTXMCExpr.h revision 263508
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 NVPTXMCEXPR_H
13#define 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;
65  bool EvaluateAsRelocatableImpl(MCValue &Res,
66                                 const MCAsmLayout *Layout) const {
67    return false;
68  }
69  void AddValueSymbols(MCAssembler *) const {};
70  const MCSection *FindAssociatedSection() const {
71    return NULL;
72  }
73
74  // There are no TLS NVPTXMCExprs at the moment.
75  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {}
76
77  static bool classof(const MCExpr *E) {
78    return E->getKind() == MCExpr::Target;
79  }
80};
81} // end namespace llvm
82
83#endif
84