brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 8cde087 Raw
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