LLVM  10.0.0svn
NVPTXMCExpr.cpp
Go to the documentation of this file.
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "NVPTXMCExpr.h"
10 #include "llvm/ADT/StringExtras.h"
11 #include "llvm/MC/MCAssembler.h"
12 #include "llvm/MC/MCContext.h"
13 #include "llvm/Support/Format.h"
14 using namespace llvm;
15 
16 #define DEBUG_TYPE "nvptx-mcexpr"
17 
18 const NVPTXFloatMCExpr *
20  return new (Ctx) NVPTXFloatMCExpr(Kind, Flt);
21 }
22 
23 void NVPTXFloatMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
24  bool Ignored;
25  unsigned NumHex;
26  APFloat APF = getAPFloat();
27 
28  switch (Kind) {
29  default: llvm_unreachable("Invalid kind!");
31  // ptxas does not have a way to specify half-precision floats.
32  // Instead we have to print and load fp16 constants as .b16
33  OS << "0x";
34  NumHex = 4;
36  break;
38  OS << "0f";
39  NumHex = 8;
41  break;
43  OS << "0d";
44  NumHex = 16;
46  break;
47  }
48 
49  APInt API = APF.bitcastToAPInt();
50  OS << format_hex_no_prefix(API.getZExtValue(), NumHex, /*Upper=*/true);
51 }
52 
55  MCContext &Ctx) {
56  return new (Ctx) NVPTXGenericMCSymbolRefExpr(SymExpr);
57 }
58 
60  const MCAsmInfo *MAI) const {
61  OS << "generic(";
62  SymExpr->print(OS, MAI);
63  OS << ")";
64 }
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1562
This class represents lattice values for constants.
Definition: AllocatorList.h:23
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:173
Context object for machine code objects.
Definition: MCContext.h:64
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:4483
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:158
static const NVPTXGenericMCSymbolRefExpr * create(const MCSymbolRefExpr *SymExpr, MCContext &Ctx)
Definition: NVPTXMCExpr.cpp:54
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
static const NVPTXFloatMCExpr * create(VariantKind Kind, const APFloat &Flt, MCContext &Ctx)
Definition: NVPTXMCExpr.cpp:19
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:155
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:152
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override
Definition: NVPTXMCExpr.cpp:59
Class for arbitrary precision integers.
Definition: APInt.h:69
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override
Definition: NVPTXMCExpr.cpp:23
APFloat getAPFloat() const
getSubExpr - Get the child of this expression.
Definition: NVPTXMCExpr.h:66
FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, bool Upper=false)
format_hex_no_prefix - Output N as a fixed width hexadecimal.
Definition: Format.h:198
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
A wrapper for MCSymbolRefExpr that tells the assembly printer that the symbol should be enclosed by g...
Definition: NVPTXMCExpr.h:89
APInt bitcastToAPInt() const
Definition: APFloat.h:1104