1*9880d681SAndroid Build Coastguard Worker //===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker // Modeled after ARMMCExpr 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H 13*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APFloat.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCExpr.h" 17*9880d681SAndroid Build Coastguard Worker #include <utility> 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker namespace llvm { 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker class NVPTXFloatMCExpr : public MCTargetExpr { 22*9880d681SAndroid Build Coastguard Worker public: 23*9880d681SAndroid Build Coastguard Worker enum VariantKind { 24*9880d681SAndroid Build Coastguard Worker VK_NVPTX_None, 25*9880d681SAndroid Build Coastguard Worker VK_NVPTX_SINGLE_PREC_FLOAT, // FP constant in single-precision 26*9880d681SAndroid Build Coastguard Worker VK_NVPTX_DOUBLE_PREC_FLOAT // FP constant in double-precision 27*9880d681SAndroid Build Coastguard Worker }; 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker private: 30*9880d681SAndroid Build Coastguard Worker const VariantKind Kind; 31*9880d681SAndroid Build Coastguard Worker const APFloat Flt; 32*9880d681SAndroid Build Coastguard Worker NVPTXFloatMCExpr(VariantKind Kind,APFloat Flt)33*9880d681SAndroid Build Coastguard Worker explicit NVPTXFloatMCExpr(VariantKind Kind, APFloat Flt) 34*9880d681SAndroid Build Coastguard Worker : Kind(Kind), Flt(std::move(Flt)) {} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker public: 37*9880d681SAndroid Build Coastguard Worker /// @name Construction 38*9880d681SAndroid Build Coastguard Worker /// @{ 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker static const NVPTXFloatMCExpr *create(VariantKind Kind, const APFloat &Flt, 41*9880d681SAndroid Build Coastguard Worker MCContext &Ctx); 42*9880d681SAndroid Build Coastguard Worker createConstantFPSingle(const APFloat & Flt,MCContext & Ctx)43*9880d681SAndroid Build Coastguard Worker static const NVPTXFloatMCExpr *createConstantFPSingle(const APFloat &Flt, 44*9880d681SAndroid Build Coastguard Worker MCContext &Ctx) { 45*9880d681SAndroid Build Coastguard Worker return create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx); 46*9880d681SAndroid Build Coastguard Worker } 47*9880d681SAndroid Build Coastguard Worker createConstantFPDouble(const APFloat & Flt,MCContext & Ctx)48*9880d681SAndroid Build Coastguard Worker static const NVPTXFloatMCExpr *createConstantFPDouble(const APFloat &Flt, 49*9880d681SAndroid Build Coastguard Worker MCContext &Ctx) { 50*9880d681SAndroid Build Coastguard Worker return create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx); 51*9880d681SAndroid Build Coastguard Worker } 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker /// @} 54*9880d681SAndroid Build Coastguard Worker /// @name Accessors 55*9880d681SAndroid Build Coastguard Worker /// @{ 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker /// getOpcode - Get the kind of this expression. getKind()58*9880d681SAndroid Build Coastguard Worker VariantKind getKind() const { return Kind; } 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker /// getSubExpr - Get the child of this expression. getAPFloat()61*9880d681SAndroid Build Coastguard Worker APFloat getAPFloat() const { return Flt; } 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker /// @} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; evaluateAsRelocatableImpl(MCValue & Res,const MCAsmLayout * Layout,const MCFixup * Fixup)66*9880d681SAndroid Build Coastguard Worker bool evaluateAsRelocatableImpl(MCValue &Res, 67*9880d681SAndroid Build Coastguard Worker const MCAsmLayout *Layout, 68*9880d681SAndroid Build Coastguard Worker const MCFixup *Fixup) const override { 69*9880d681SAndroid Build Coastguard Worker return false; 70*9880d681SAndroid Build Coastguard Worker } visitUsedExpr(MCStreamer & Streamer)71*9880d681SAndroid Build Coastguard Worker void visitUsedExpr(MCStreamer &Streamer) const override {}; findAssociatedFragment()72*9880d681SAndroid Build Coastguard Worker MCFragment *findAssociatedFragment() const override { return nullptr; } 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker // There are no TLS NVPTXMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)75*9880d681SAndroid Build Coastguard Worker void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 76*9880d681SAndroid Build Coastguard Worker classof(const MCExpr * E)77*9880d681SAndroid Build Coastguard Worker static bool classof(const MCExpr *E) { 78*9880d681SAndroid Build Coastguard Worker return E->getKind() == MCExpr::Target; 79*9880d681SAndroid Build Coastguard Worker } 80*9880d681SAndroid Build Coastguard Worker }; 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker /// A wrapper for MCSymbolRefExpr that tells the assembly printer that the 83*9880d681SAndroid Build Coastguard Worker /// symbol should be enclosed by generic(). 84*9880d681SAndroid Build Coastguard Worker class NVPTXGenericMCSymbolRefExpr : public MCTargetExpr { 85*9880d681SAndroid Build Coastguard Worker private: 86*9880d681SAndroid Build Coastguard Worker const MCSymbolRefExpr *SymExpr; 87*9880d681SAndroid Build Coastguard Worker NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr * _SymExpr)88*9880d681SAndroid Build Coastguard Worker explicit NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr *_SymExpr) 89*9880d681SAndroid Build Coastguard Worker : SymExpr(_SymExpr) {} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker public: 92*9880d681SAndroid Build Coastguard Worker /// @name Construction 93*9880d681SAndroid Build Coastguard Worker /// @{ 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker static const NVPTXGenericMCSymbolRefExpr 96*9880d681SAndroid Build Coastguard Worker *create(const MCSymbolRefExpr *SymExpr, MCContext &Ctx); 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker /// @} 99*9880d681SAndroid Build Coastguard Worker /// @name Accessors 100*9880d681SAndroid Build Coastguard Worker /// @{ 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker /// getOpcode - Get the kind of this expression. getSymbolExpr()103*9880d681SAndroid Build Coastguard Worker const MCSymbolRefExpr *getSymbolExpr() const { return SymExpr; } 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker /// @} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; evaluateAsRelocatableImpl(MCValue & Res,const MCAsmLayout * Layout,const MCFixup * Fixup)108*9880d681SAndroid Build Coastguard Worker bool evaluateAsRelocatableImpl(MCValue &Res, 109*9880d681SAndroid Build Coastguard Worker const MCAsmLayout *Layout, 110*9880d681SAndroid Build Coastguard Worker const MCFixup *Fixup) const override { 111*9880d681SAndroid Build Coastguard Worker return false; 112*9880d681SAndroid Build Coastguard Worker } visitUsedExpr(MCStreamer & Streamer)113*9880d681SAndroid Build Coastguard Worker void visitUsedExpr(MCStreamer &Streamer) const override {}; findAssociatedFragment()114*9880d681SAndroid Build Coastguard Worker MCFragment *findAssociatedFragment() const override { return nullptr; } 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker // There are no TLS NVPTXMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)117*9880d681SAndroid Build Coastguard Worker void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 118*9880d681SAndroid Build Coastguard Worker classof(const MCExpr * E)119*9880d681SAndroid Build Coastguard Worker static bool classof(const MCExpr *E) { 120*9880d681SAndroid Build Coastguard Worker return E->getKind() == MCExpr::Target; 121*9880d681SAndroid Build Coastguard Worker } 122*9880d681SAndroid Build Coastguard Worker }; 123*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker #endif 126