71 lines · cpp
1//===-- NVPTXMCExpr.cpp - NVPTX specific MC expression classes ------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "NVPTXMCExpr.h"10#include "llvm/ADT/StringExtras.h"11#include "llvm/MC/MCAsmInfo.h"12#include "llvm/MC/MCAssembler.h"13#include "llvm/MC/MCContext.h"14#include "llvm/Support/Format.h"15using namespace llvm;16 17#define DEBUG_TYPE "nvptx-mcexpr"18 19const NVPTXFloatMCExpr *20NVPTXFloatMCExpr::create(VariantKind Kind, const APFloat &Flt, MCContext &Ctx) {21 return new (Ctx) NVPTXFloatMCExpr(Kind, Flt);22}23 24void 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 .b1634 OS << "0x";35 NumHex = 4;36 APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);37 break;38 case VK_NVPTX_BFLOAT_PREC_FLOAT:39 OS << "0x";40 NumHex = 4;41 APF.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven, &Ignored);42 break;43 case VK_NVPTX_SINGLE_PREC_FLOAT:44 OS << "0f";45 NumHex = 8;46 APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Ignored);47 break;48 case VK_NVPTX_DOUBLE_PREC_FLOAT:49 OS << "0d";50 NumHex = 16;51 APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &Ignored);52 break;53 }54 55 APInt API = APF.bitcastToAPInt();56 OS << format_hex_no_prefix(API.getZExtValue(), NumHex, /*Upper=*/true);57}58 59const NVPTXGenericMCSymbolRefExpr*60NVPTXGenericMCSymbolRefExpr::create(const MCSymbolRefExpr *SymExpr,61 MCContext &Ctx) {62 return new (Ctx) NVPTXGenericMCSymbolRefExpr(SymExpr);63}64 65void NVPTXGenericMCSymbolRefExpr::printImpl(raw_ostream &OS,66 const MCAsmInfo *MAI) const {67 OS << "generic(";68 MAI->printExpr(OS, *SymExpr);69 OS << ")";70}71