182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===//
282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//
382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//                     The LLVM Compiler Infrastructure
482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//
582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// This file is distributed under the University of Illinois Open Source
682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// License. See LICENSE.TXT for details.
782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//
882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//===----------------------------------------------------------------------===//
982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
1082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// Modeled after ARMMCExpr
1182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
1282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#ifndef NVPTXMCEXPR_H
1382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#define NVPTXMCEXPR_H
1482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
1582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "llvm/ADT/APFloat.h"
1682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "llvm/MC/MCExpr.h"
1782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
1882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskinamespace llvm {
1982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
2082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskiclass NVPTXFloatMCExpr : public MCTargetExpr {
2182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskipublic:
2282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  enum VariantKind {
2382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    VK_NVPTX_None,
2482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    VK_NVPTX_SINGLE_PREC_FLOAT,   // FP constant in single-precision
2582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    VK_NVPTX_DOUBLE_PREC_FLOAT    // FP constant in double-precision
2682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  };
2782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
2882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskiprivate:
2982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  const VariantKind Kind;
3082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  const APFloat Flt;
3182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
3282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  explicit NVPTXFloatMCExpr(VariantKind _Kind, APFloat _Flt)
3382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    : Kind(_Kind), Flt(_Flt) {}
3482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
3582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskipublic:
3682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// @name Construction
3782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// @{
3882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
3982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  static const NVPTXFloatMCExpr *Create(VariantKind Kind, APFloat Flt,
4082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski                                        MCContext &Ctx);
4182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
4282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  static const NVPTXFloatMCExpr *CreateConstantFPSingle(APFloat Flt,
4382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski                                                        MCContext &Ctx) {
4482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    return Create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx);
4582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  }
4682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
4782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  static const NVPTXFloatMCExpr *CreateConstantFPDouble(APFloat Flt,
4882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski                                                        MCContext &Ctx) {
4982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    return Create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx);
5082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  }
5182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
5282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// @}
5382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// @name Accessors
5482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// @{
5582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
5682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// getOpcode - Get the kind of this expression.
5782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  VariantKind getKind() const { return Kind; }
5882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
5982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  /// getSubExpr - Get the child of this expression.
6082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  APFloat getAPFloat() const { return Flt; }
6182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
6282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski/// @}
6382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
6482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  void PrintImpl(raw_ostream &OS) const;
6582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  bool EvaluateAsRelocatableImpl(MCValue &Res,
6682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski                                 const MCAsmLayout *Layout) const {
6782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    return false;
6882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  }
6982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  void AddValueSymbols(MCAssembler *) const {};
7082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  const MCSection *FindAssociatedSection() const {
7182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    return NULL;
7282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  }
7382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
7482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  // There are no TLS NVPTXMCExprs at the moment.
7582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {}
7682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
7782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  static bool classof(const MCExpr *E) {
7882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski    return E->getKind() == MCExpr::Target;
7982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski  }
8082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski};
8182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski} // end namespace llvm
8282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski
8382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#endif
84