NVPTXMCExpr.h revision 259698
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