111730Sar4jc@virginia.edu/* 211730Sar4jc@virginia.edu * Copyright (c) 2016 The University of Virginia 311730Sar4jc@virginia.edu * All rights reserved. 411730Sar4jc@virginia.edu * 511730Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without 611730Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are 711730Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright 811730Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer; 911730Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright 1011730Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the 1111730Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution; 1211730Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its 1311730Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from 1411730Sar4jc@virginia.edu * this software without specific prior written permission. 1511730Sar4jc@virginia.edu * 1611730Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711730Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811730Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911730Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011730Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111730Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211730Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311730Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411730Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511730Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611730Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711730Sar4jc@virginia.edu * 2811730Sar4jc@virginia.edu * Authors: Alec Roelke 2911730Sar4jc@virginia.edu */ 3011730Sar4jc@virginia.edu 3111730Sar4jc@virginia.edu#pragma once 3211730Sar4jc@virginia.edu 3311730Sar4jc@virginia.edu#include <cstdint> 3411730Sar4jc@virginia.edu#include <limits> 3511730Sar4jc@virginia.edu 3611730Sar4jc@virginia.edu#include "insttest.h" 3711730Sar4jc@virginia.edu 3811730Sar4jc@virginia.edunamespace D 3911730Sar4jc@virginia.edu{ 4011730Sar4jc@virginia.edu 4111730Sar4jc@virginia.educonstexpr inline uint64_t 4211730Sar4jc@virginia.edubits(double d) 4311730Sar4jc@virginia.edu{ 4411730Sar4jc@virginia.edu return reinterpret_cast<uint64_t&>(d); 4511730Sar4jc@virginia.edu} 4611730Sar4jc@virginia.edu 4711730Sar4jc@virginia.educonstexpr inline double 4811730Sar4jc@virginia.edunumber(uint64_t b) 4911730Sar4jc@virginia.edu{ 5011730Sar4jc@virginia.edu return reinterpret_cast<double&>(b); 5111730Sar4jc@virginia.edu} 5211730Sar4jc@virginia.edu 5311730Sar4jc@virginia.eduinline bool 5411730Sar4jc@virginia.eduisquietnan(double f) 5511730Sar4jc@virginia.edu{ 5611730Sar4jc@virginia.edu return std::isnan(f) && (bits(f)&0x0008000000000000ULL) != 0; 5711730Sar4jc@virginia.edu} 5811730Sar4jc@virginia.edu 5911730Sar4jc@virginia.eduinline bool 6011730Sar4jc@virginia.eduissignalingnan(double f) 6111730Sar4jc@virginia.edu{ 6211730Sar4jc@virginia.edu return std::isnan(f) && (bits(f)&0x0008000000000000ULL) == 0; 6311730Sar4jc@virginia.edu} 6411730Sar4jc@virginia.edu 6511730Sar4jc@virginia.eduinline double 6611730Sar4jc@virginia.eduload(double mem) 6711730Sar4jc@virginia.edu{ 6811730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 6911730Sar4jc@virginia.edu asm volatile("fld %0,%1" 7011730Sar4jc@virginia.edu : "=f" (fd) 7111730Sar4jc@virginia.edu : "m" (mem)); 7211730Sar4jc@virginia.edu return fd; 7311730Sar4jc@virginia.edu} 7411730Sar4jc@virginia.edu 7511730Sar4jc@virginia.eduinline double 7611730Sar4jc@virginia.edustore(double fs) 7711730Sar4jc@virginia.edu{ 7811730Sar4jc@virginia.edu double mem = std::numeric_limits<double>::signaling_NaN(); 7911730Sar4jc@virginia.edu asm volatile("fsd %1,%0" : "=m" (mem) : "f" (fs)); 8011730Sar4jc@virginia.edu return mem; 8111730Sar4jc@virginia.edu} 8211730Sar4jc@virginia.edu 8311730Sar4jc@virginia.eduinline double 8411730Sar4jc@virginia.edufmadd_d(double fs1, double fs2, double fs3) 8511730Sar4jc@virginia.edu{ 8611730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 8711730Sar4jc@virginia.edu FR4OP("fmadd.d", fd, fs1, fs2, fs3); 8811730Sar4jc@virginia.edu return fd; 8911730Sar4jc@virginia.edu} 9011730Sar4jc@virginia.edu 9111730Sar4jc@virginia.eduinline double 9211730Sar4jc@virginia.edufmsub_d(double fs1, double fs2, double fs3) 9311730Sar4jc@virginia.edu{ 9411730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 9511730Sar4jc@virginia.edu FR4OP("fmsub.d", fd, fs1, fs2, fs3); 9611730Sar4jc@virginia.edu return fd; 9711730Sar4jc@virginia.edu} 9811730Sar4jc@virginia.edu 9911730Sar4jc@virginia.eduinline double 10011730Sar4jc@virginia.edufnmsub_d(double fs1, double fs2, double fs3) 10111730Sar4jc@virginia.edu{ 10211730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 10311730Sar4jc@virginia.edu FR4OP("fnmsub.d", fd, fs1, fs2, fs3); 10411730Sar4jc@virginia.edu return fd; 10511730Sar4jc@virginia.edu} 10611730Sar4jc@virginia.edu 10711730Sar4jc@virginia.eduinline double 10811730Sar4jc@virginia.edufnmadd_d(double fs1, double fs2, double fs3) 10911730Sar4jc@virginia.edu{ 11011730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 11111730Sar4jc@virginia.edu FR4OP("fnmadd.d", fd, fs1, fs2, fs3); 11211730Sar4jc@virginia.edu return fd; 11311730Sar4jc@virginia.edu} 11411730Sar4jc@virginia.edu 11511730Sar4jc@virginia.eduinline double 11611730Sar4jc@virginia.edufadd_d(double fs1, double fs2) 11711730Sar4jc@virginia.edu{ 11811730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 11911730Sar4jc@virginia.edu FROP("fadd.d", fd, fs1, fs2); 12011730Sar4jc@virginia.edu return fd; 12111730Sar4jc@virginia.edu} 12211730Sar4jc@virginia.edu 12311730Sar4jc@virginia.eduinline double 12411730Sar4jc@virginia.edufsub_d(double fs1, double fs2) 12511730Sar4jc@virginia.edu{ 12611730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 12711730Sar4jc@virginia.edu FROP("fsub.d", fd, fs1, fs2); 12811730Sar4jc@virginia.edu return fd; 12911730Sar4jc@virginia.edu} 13011730Sar4jc@virginia.edu 13111730Sar4jc@virginia.eduinline double 13211730Sar4jc@virginia.edufmul_d(double fs1, double fs2) 13311730Sar4jc@virginia.edu{ 13411730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 13511730Sar4jc@virginia.edu FROP("fmul.d", fd, fs1, fs2); 13611730Sar4jc@virginia.edu return fd; 13711730Sar4jc@virginia.edu} 13811730Sar4jc@virginia.edu 13911730Sar4jc@virginia.eduinline double 14011730Sar4jc@virginia.edufdiv_d(double fs1, double fs2) 14111730Sar4jc@virginia.edu{ 14211730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 14311730Sar4jc@virginia.edu FROP("fdiv.d", fd, fs1, fs2); 14411730Sar4jc@virginia.edu return fd; 14511730Sar4jc@virginia.edu} 14611730Sar4jc@virginia.edu 14711730Sar4jc@virginia.eduinline double 14811730Sar4jc@virginia.edufsqrt_d(double fs1) 14911730Sar4jc@virginia.edu{ 15011730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 15111730Sar4jc@virginia.edu asm volatile("fsqrt.d %0,%1" : "=f" (fd) : "f" (fs1)); 15211730Sar4jc@virginia.edu return fd; 15311730Sar4jc@virginia.edu} 15411730Sar4jc@virginia.edu 15511730Sar4jc@virginia.eduinline double 15611730Sar4jc@virginia.edufsgnj_d(double fs1, double fs2) 15711730Sar4jc@virginia.edu{ 15811730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 15911730Sar4jc@virginia.edu FROP("fsgnj.d", fd, fs1, fs2); 16011730Sar4jc@virginia.edu return fd; 16111730Sar4jc@virginia.edu} 16211730Sar4jc@virginia.edu 16311730Sar4jc@virginia.eduinline double 16411730Sar4jc@virginia.edufsgnjn_d(double fs1, double fs2) 16511730Sar4jc@virginia.edu{ 16611730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 16711730Sar4jc@virginia.edu FROP("fsgnjn.d", fd, fs1, fs2); 16811730Sar4jc@virginia.edu return fd; 16911730Sar4jc@virginia.edu} 17011730Sar4jc@virginia.edu 17111730Sar4jc@virginia.eduinline double 17211730Sar4jc@virginia.edufsgnjx_d(double fs1, double fs2) 17311730Sar4jc@virginia.edu{ 17411730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 17511730Sar4jc@virginia.edu FROP("fsgnjx.d", fd, fs1, fs2); 17611730Sar4jc@virginia.edu return fd; 17711730Sar4jc@virginia.edu} 17811730Sar4jc@virginia.edu 17911730Sar4jc@virginia.eduinline double 18011730Sar4jc@virginia.edufmin_d(double fs1, double fs2) 18111730Sar4jc@virginia.edu{ 18211730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 18311730Sar4jc@virginia.edu FROP("fmin.d", fd, fs1, fs2); 18411730Sar4jc@virginia.edu return fd; 18511730Sar4jc@virginia.edu} 18611730Sar4jc@virginia.edu 18711730Sar4jc@virginia.eduinline double 18811730Sar4jc@virginia.edufmax_d(double fs1, double fs2) 18911730Sar4jc@virginia.edu{ 19011730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 19111730Sar4jc@virginia.edu FROP("fmax.d", fd, fs1, fs2); 19211730Sar4jc@virginia.edu return fd; 19311730Sar4jc@virginia.edu} 19411730Sar4jc@virginia.edu 19511730Sar4jc@virginia.eduinline float 19611730Sar4jc@virginia.edufcvt_s_d(double fs1) 19711730Sar4jc@virginia.edu{ 19811730Sar4jc@virginia.edu float fd = std::numeric_limits<float>::signaling_NaN(); 19911730Sar4jc@virginia.edu asm volatile("fcvt.s.d %0,%1" : "=f" (fd) : "f" (fs1)); 20011730Sar4jc@virginia.edu return fd; 20111730Sar4jc@virginia.edu} 20211730Sar4jc@virginia.edu 20311730Sar4jc@virginia.eduinline double 20411730Sar4jc@virginia.edufcvt_d_s(float fs1) 20511730Sar4jc@virginia.edu{ 20611730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 20711730Sar4jc@virginia.edu asm volatile("fcvt.d.s %0,%1" : "=f" (fd) : "f" (fs1)); 20811730Sar4jc@virginia.edu return fd; 20911730Sar4jc@virginia.edu} 21011730Sar4jc@virginia.edu 21111730Sar4jc@virginia.eduinline bool 21211730Sar4jc@virginia.edufeq_d(double fs1, double fs2) 21311730Sar4jc@virginia.edu{ 21411730Sar4jc@virginia.edu bool rd = false; 21511730Sar4jc@virginia.edu asm volatile("feq.d %0,%1,%2" : "=r" (rd) : "f" (fs1), "f" (fs2)); 21611730Sar4jc@virginia.edu return rd; 21711730Sar4jc@virginia.edu} 21811730Sar4jc@virginia.edu 21911730Sar4jc@virginia.eduinline bool 22011730Sar4jc@virginia.eduflt_d(double fs1, double fs2) 22111730Sar4jc@virginia.edu{ 22211730Sar4jc@virginia.edu bool rd = false; 22311730Sar4jc@virginia.edu asm volatile("flt.d %0,%1,%2" : "=r" (rd) : "f" (fs1), "f" (fs2)); 22411730Sar4jc@virginia.edu return rd; 22511730Sar4jc@virginia.edu} 22611730Sar4jc@virginia.edu 22711730Sar4jc@virginia.eduinline bool 22811730Sar4jc@virginia.edufle_d(double fs1, double fs2) 22911730Sar4jc@virginia.edu{ 23011730Sar4jc@virginia.edu bool rd = false; 23111730Sar4jc@virginia.edu asm volatile("fle.d %0,%1,%2" : "=r" (rd) : "f" (fs1), "f" (fs2)); 23211730Sar4jc@virginia.edu return rd; 23311730Sar4jc@virginia.edu} 23411730Sar4jc@virginia.edu 23511730Sar4jc@virginia.eduinline uint64_t 23611730Sar4jc@virginia.edufclass_d(double fs1) 23711730Sar4jc@virginia.edu{ 23811730Sar4jc@virginia.edu uint64_t rd = -1; 23911730Sar4jc@virginia.edu asm volatile("fclass.d %0,%1" : "=r" (rd) : "f" (fs1)); 24011730Sar4jc@virginia.edu return rd; 24111730Sar4jc@virginia.edu} 24211730Sar4jc@virginia.edu 24311730Sar4jc@virginia.eduinline int64_t 24411730Sar4jc@virginia.edufcvt_w_d(double fs1) 24511730Sar4jc@virginia.edu{ 24611730Sar4jc@virginia.edu int64_t rd = 0; 24711730Sar4jc@virginia.edu asm volatile("fcvt.w.d %0,%1" : "=r" (rd) : "f" (fs1)); 24811730Sar4jc@virginia.edu return rd; 24911730Sar4jc@virginia.edu} 25011730Sar4jc@virginia.edu 25111730Sar4jc@virginia.eduinline uint64_t 25211730Sar4jc@virginia.edufcvt_wu_d(double fs1) 25311730Sar4jc@virginia.edu{ 25411730Sar4jc@virginia.edu uint64_t rd = 0; 25511730Sar4jc@virginia.edu asm volatile("fcvt.wu.d %0,%1" : "=r" (rd) : "f" (fs1)); 25611730Sar4jc@virginia.edu return rd; 25711730Sar4jc@virginia.edu} 25811730Sar4jc@virginia.edu 25911730Sar4jc@virginia.eduinline float 26011730Sar4jc@virginia.edufcvt_d_w(int64_t rs1) 26111730Sar4jc@virginia.edu{ 26211730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 26311730Sar4jc@virginia.edu asm volatile("fcvt.d.w %0,%1" : "=f" (fd) : "r" (rs1)); 26411730Sar4jc@virginia.edu return fd; 26511730Sar4jc@virginia.edu} 26611730Sar4jc@virginia.edu 26711730Sar4jc@virginia.eduinline double 26811730Sar4jc@virginia.edufcvt_d_wu(uint64_t rs1) 26911730Sar4jc@virginia.edu{ 27011730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 27111730Sar4jc@virginia.edu asm volatile("fcvt.d.wu %0,%1" : "=f" (fd) : "r" (rs1)); 27211730Sar4jc@virginia.edu return fd; 27311730Sar4jc@virginia.edu} 27411730Sar4jc@virginia.edu 27511730Sar4jc@virginia.eduinline int64_t 27611730Sar4jc@virginia.edufcvt_l_d(double fs1) 27711730Sar4jc@virginia.edu{ 27811730Sar4jc@virginia.edu int64_t rd = 0; 27911730Sar4jc@virginia.edu asm volatile("fcvt.l.d %0,%1" : "=r" (rd) : "f" (fs1)); 28011730Sar4jc@virginia.edu return rd; 28111730Sar4jc@virginia.edu} 28211730Sar4jc@virginia.edu 28311730Sar4jc@virginia.eduinline uint64_t 28411730Sar4jc@virginia.edufcvt_lu_d(double fs1) 28511730Sar4jc@virginia.edu{ 28611730Sar4jc@virginia.edu uint64_t rd = 0; 28711730Sar4jc@virginia.edu asm volatile("fcvt.lu.d %0,%1" : "=r" (rd) : "f" (fs1)); 28811730Sar4jc@virginia.edu return rd; 28911730Sar4jc@virginia.edu} 29011730Sar4jc@virginia.edu 29111730Sar4jc@virginia.eduinline uint64_t 29211730Sar4jc@virginia.edufmv_x_d(double fs1) 29311730Sar4jc@virginia.edu{ 29411730Sar4jc@virginia.edu uint64_t rd = 0; 29511730Sar4jc@virginia.edu asm volatile("fmv.x.d %0,%1" : "=r" (rd) : "f" (fs1)); 29611730Sar4jc@virginia.edu return rd; 29711730Sar4jc@virginia.edu} 29811730Sar4jc@virginia.edu 29911730Sar4jc@virginia.eduinline double 30011730Sar4jc@virginia.edufcvt_d_l(int64_t rs1) 30111730Sar4jc@virginia.edu{ 30211730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 30311730Sar4jc@virginia.edu asm volatile("fcvt.d.l %0,%1" : "=f" (fd) : "r" (rs1)); 30411730Sar4jc@virginia.edu return fd; 30511730Sar4jc@virginia.edu} 30611730Sar4jc@virginia.edu 30711730Sar4jc@virginia.eduinline double 30811730Sar4jc@virginia.edufcvt_d_lu(uint64_t rs1) 30911730Sar4jc@virginia.edu{ 31011730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 31111730Sar4jc@virginia.edu asm volatile("fcvt.d.lu %0,%1" : "=f" (fd) : "r" (rs1)); 31211730Sar4jc@virginia.edu return fd; 31311730Sar4jc@virginia.edu} 31411730Sar4jc@virginia.edu 31511730Sar4jc@virginia.eduinline double 31611730Sar4jc@virginia.edufmv_d_x(uint64_t rs1) 31711730Sar4jc@virginia.edu{ 31811730Sar4jc@virginia.edu double fd = std::numeric_limits<double>::signaling_NaN(); 31911730Sar4jc@virginia.edu asm volatile("fmv.d.x %0,%1" : "=f" (fd) : "r" (rs1)); 32011730Sar4jc@virginia.edu return fd; 32111730Sar4jc@virginia.edu} 32211730Sar4jc@virginia.edu 32311730Sar4jc@virginia.edu} // namespace D 324