1 //===-- NVPTXMCExpr.cpp - NVPTX specific MC expression classes ------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "NVPTXMCExpr.h" 11 #include "llvm/ADT/StringExtras.h" 12 #include "llvm/MC/MCAssembler.h" 13 #include "llvm/MC/MCContext.h" 14 #include "llvm/Support/Format.h" 15 using namespace llvm; 16 17 #define DEBUG_TYPE "nvptx-mcexpr" 18 19 const NVPTXFloatMCExpr * 20 NVPTXFloatMCExpr::create(VariantKind Kind, const APFloat &Flt, MCContext &Ctx) { 21 return new (Ctx) NVPTXFloatMCExpr(Kind, Flt); 22 } 23 24 void NVPTXFloatMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { 25 bool Ignored; 26 unsigned NumHex; 27 APFloat APF = getAPFloat(); 28 29 switch (Kind) { 30 default: llvm_unreachable("Invalid kind!"); 31 case VK_NVPTX_HALF_PREC_FLOAT: 32 // ptxas does not have a way to specify half-precision floats. 33 // Instead we have to print and load fp16 constants as .b16 34 OS << "0x"; 35 NumHex = 4; 36 APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored); 37 break; 38 case VK_NVPTX_SINGLE_PREC_FLOAT: 39 OS << "0f"; 40 NumHex = 8; 41 APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Ignored); 42 break; 43 case VK_NVPTX_DOUBLE_PREC_FLOAT: 44 OS << "0d"; 45 NumHex = 16; 46 APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &Ignored); 47 break; 48 } 49 50 APInt API = APF.bitcastToAPInt(); 51 OS << format_hex_no_prefix(API.getZExtValue(), NumHex, /*Upper=*/true); 52 } 53 54 const NVPTXGenericMCSymbolRefExpr* 55 NVPTXGenericMCSymbolRefExpr::create(const MCSymbolRefExpr *SymExpr, 56 MCContext &Ctx) { 57 return new (Ctx) NVPTXGenericMCSymbolRefExpr(SymExpr); 58 } 59 60 void NVPTXGenericMCSymbolRefExpr::printImpl(raw_ostream &OS, 61 const MCAsmInfo *MAI) const { 62 OS << "generic("; 63 SymExpr->print(OS, MAI); 64 OS << ")"; 65 } 66