182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//===-- NVPTXMCExpr.cpp - NVPTX specific MC expression classes ------------===// 282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// 382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// The LLVM Compiler Infrastructure 482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// 582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// This file is distributed under the University of Illinois Open Source 682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// License. See LICENSE.TXT for details. 782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski// 882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski//===----------------------------------------------------------------------===// 982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski 1082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#define DEBUG_TYPE "nvptx-mcexpr" 1182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "NVPTXMCExpr.h" 1282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "llvm/ADT/StringExtras.h" 1382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "llvm/MC/MCAssembler.h" 1482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski#include "llvm/MC/MCContext.h" 1582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskiusing namespace llvm; 1682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski 1782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskiconst NVPTXFloatMCExpr* 1882767327c59ede1f8663ec9b9a64a668993d501fJustin HolewinskiNVPTXFloatMCExpr::Create(VariantKind Kind, APFloat Flt, MCContext &Ctx) { 1982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski return new (Ctx) NVPTXFloatMCExpr(Kind, Flt); 2082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski} 2182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski 2282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinskivoid NVPTXFloatMCExpr::PrintImpl(raw_ostream &OS) const { 2382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski bool Ignored; 2482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski unsigned NumHex; 2582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski APFloat APF = getAPFloat(); 2682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski 2782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski switch (Kind) { 2882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski default: llvm_unreachable("Invalid kind!"); 2982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski case VK_NVPTX_SINGLE_PREC_FLOAT: 3082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski OS << "0f"; 3182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski NumHex = 8; 3282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski APF.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &Ignored); 3382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski break; 3482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski case VK_NVPTX_DOUBLE_PREC_FLOAT: 3582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski OS << "0d"; 3682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski NumHex = 16; 3782767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &Ignored); 3882767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski break; 3982767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski } 4082767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski 4182767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski APInt API = APF.bitcastToAPInt(); 4282767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski std::string HexStr(utohexstr(API.getZExtValue())); 4382767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski if (HexStr.length() < NumHex) 4482767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski OS << std::string(NumHex - HexStr.length(), '0'); 4582767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski OS << utohexstr(API.getZExtValue()); 4682767327c59ede1f8663ec9b9a64a668993d501fJustin Holewinski} 47