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