| //===-- NVPTXMCExpr.cpp - NVPTX specific MC expression classes ------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "NVPTXMCExpr.h" | 
 | #include "llvm/ADT/StringExtras.h" | 
 | #include "llvm/MC/MCAssembler.h" | 
 | #include "llvm/MC/MCContext.h" | 
 | #include "llvm/Support/Format.h" | 
 | using namespace llvm; | 
 |  | 
 | #define DEBUG_TYPE "nvptx-mcexpr" | 
 |  | 
 | const NVPTXFloatMCExpr * | 
 | NVPTXFloatMCExpr::create(VariantKind Kind, const APFloat &Flt, MCContext &Ctx) { | 
 |   return new (Ctx) NVPTXFloatMCExpr(Kind, Flt); | 
 | } | 
 |  | 
 | void NVPTXFloatMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { | 
 |   bool Ignored; | 
 |   unsigned NumHex; | 
 |   APFloat APF = getAPFloat(); | 
 |  | 
 |   switch (Kind) { | 
 |   default: llvm_unreachable("Invalid kind!"); | 
 |   case VK_NVPTX_HALF_PREC_FLOAT: | 
 |     // ptxas does not have a way to specify half-precision floats. | 
 |     // Instead we have to print and load fp16 constants as .b16 | 
 |     OS << "0x"; | 
 |     NumHex = 4; | 
 |     APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored); | 
 |     break; | 
 |   case VK_NVPTX_SINGLE_PREC_FLOAT: | 
 |     OS << "0f"; | 
 |     NumHex = 8; | 
 |     APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Ignored); | 
 |     break; | 
 |   case VK_NVPTX_DOUBLE_PREC_FLOAT: | 
 |     OS << "0d"; | 
 |     NumHex = 16; | 
 |     APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &Ignored); | 
 |     break; | 
 |   } | 
 |  | 
 |   APInt API = APF.bitcastToAPInt(); | 
 |   OS << format_hex_no_prefix(API.getZExtValue(), NumHex, /*Upper=*/true); | 
 | } | 
 |  | 
 | const NVPTXGenericMCSymbolRefExpr* | 
 | NVPTXGenericMCSymbolRefExpr::create(const MCSymbolRefExpr *SymExpr, | 
 |                                     MCContext &Ctx) { | 
 |   return new (Ctx) NVPTXGenericMCSymbolRefExpr(SymExpr); | 
 | } | 
 |  | 
 | void NVPTXGenericMCSymbolRefExpr::printImpl(raw_ostream &OS, | 
 |                                             const MCAsmInfo *MAI) const { | 
 |   OS << "generic("; | 
 |   SymExpr->print(OS, MAI); | 
 |   OS << ")"; | 
 | } |