1259698Sdim//===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===//
2259698Sdim//
3259698Sdim//                     The LLVM Compiler Infrastructure
4259698Sdim//
5259698Sdim// This file is distributed under the University of Illinois Open Source
6259698Sdim// License. See LICENSE.TXT for details.
7259698Sdim//
8259698Sdim//===----------------------------------------------------------------------===//
9259698Sdim
10259698Sdim// Modeled after ARMMCExpr
11259698Sdim
12259698Sdim#ifndef NVPTXMCEXPR_H
13259698Sdim#define NVPTXMCEXPR_H
14259698Sdim
15259698Sdim#include "llvm/ADT/APFloat.h"
16259698Sdim#include "llvm/MC/MCExpr.h"
17259698Sdim
18259698Sdimnamespace llvm {
19259698Sdim
20259698Sdimclass NVPTXFloatMCExpr : public MCTargetExpr {
21259698Sdimpublic:
22259698Sdim  enum VariantKind {
23259698Sdim    VK_NVPTX_None,
24259698Sdim    VK_NVPTX_SINGLE_PREC_FLOAT,   // FP constant in single-precision
25259698Sdim    VK_NVPTX_DOUBLE_PREC_FLOAT    // FP constant in double-precision
26259698Sdim  };
27259698Sdim
28259698Sdimprivate:
29259698Sdim  const VariantKind Kind;
30259698Sdim  const APFloat Flt;
31259698Sdim
32259698Sdim  explicit NVPTXFloatMCExpr(VariantKind _Kind, APFloat _Flt)
33259698Sdim    : Kind(_Kind), Flt(_Flt) {}
34259698Sdim
35259698Sdimpublic:
36259698Sdim  /// @name Construction
37259698Sdim  /// @{
38259698Sdim
39259698Sdim  static const NVPTXFloatMCExpr *Create(VariantKind Kind, APFloat Flt,
40259698Sdim                                        MCContext &Ctx);
41259698Sdim
42259698Sdim  static const NVPTXFloatMCExpr *CreateConstantFPSingle(APFloat Flt,
43259698Sdim                                                        MCContext &Ctx) {
44259698Sdim    return Create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx);
45259698Sdim  }
46259698Sdim
47259698Sdim  static const NVPTXFloatMCExpr *CreateConstantFPDouble(APFloat Flt,
48259698Sdim                                                        MCContext &Ctx) {
49259698Sdim    return Create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx);
50259698Sdim  }
51259698Sdim
52259698Sdim  /// @}
53259698Sdim  /// @name Accessors
54259698Sdim  /// @{
55259698Sdim
56259698Sdim  /// getOpcode - Get the kind of this expression.
57259698Sdim  VariantKind getKind() const { return Kind; }
58259698Sdim
59259698Sdim  /// getSubExpr - Get the child of this expression.
60259698Sdim  APFloat getAPFloat() const { return Flt; }
61259698Sdim
62259698Sdim/// @}
63259698Sdim
64259698Sdim  void PrintImpl(raw_ostream &OS) const;
65259698Sdim  bool EvaluateAsRelocatableImpl(MCValue &Res,
66259698Sdim                                 const MCAsmLayout *Layout) const {
67259698Sdim    return false;
68259698Sdim  }
69259698Sdim  void AddValueSymbols(MCAssembler *) const {};
70259698Sdim  const MCSection *FindAssociatedSection() const {
71259698Sdim    return NULL;
72259698Sdim  }
73259698Sdim
74259698Sdim  // There are no TLS NVPTXMCExprs at the moment.
75259698Sdim  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {}
76259698Sdim
77259698Sdim  static bool classof(const MCExpr *E) {
78259698Sdim    return E->getKind() == MCExpr::Target;
79259698Sdim  }
80259698Sdim};
81259698Sdim} // end namespace llvm
82259698Sdim
83259698Sdim#endif
84