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#include <cstdint> 3211730Sar4jc@virginia.edu#include <limits> 3311730Sar4jc@virginia.edu 3411730Sar4jc@virginia.edu#include "insttest.h" 3511730Sar4jc@virginia.edu#include "rv64d.h" 3611730Sar4jc@virginia.edu#include "rv64f.h" 3711730Sar4jc@virginia.edu 3811730Sar4jc@virginia.eduint main() 3911730Sar4jc@virginia.edu{ 4011730Sar4jc@virginia.edu using namespace std; 4111730Sar4jc@virginia.edu using namespace insttest; 4211730Sar4jc@virginia.edu 4311730Sar4jc@virginia.edu // Memory (FLD, FSD) 4411730Sar4jc@virginia.edu expect<double>(3.1415926, []{return D::load(3.1415926);}, "fld"); 4511730Sar4jc@virginia.edu expect<double>(1.61803398875, []{return D::store(1.61803398875);}, "fsd"); 4611730Sar4jc@virginia.edu 4711730Sar4jc@virginia.edu // FMADD.D 4811730Sar4jc@virginia.edu expect<double>(D::number(0x4019FD5AED13B1CEULL), 4911730Sar4jc@virginia.edu []{return D::fmadd_d(3.1415926, 1.61803398875,1.41421356237);}, 5011730Sar4jc@virginia.edu "fmadd.d"); 5111730Sar4jc@virginia.edu expect<bool>(true, []{ 5211730Sar4jc@virginia.edu double fd = D::fmadd_d(numeric_limits<double>::quiet_NaN(), 3.14, 5311730Sar4jc@virginia.edu 1.816); 5411730Sar4jc@virginia.edu return D::isquietnan(fd); 5511730Sar4jc@virginia.edu }, "fmadd.d, quiet NaN"); 5611730Sar4jc@virginia.edu expect<bool>(true, []{ 5711730Sar4jc@virginia.edu double fd = D::fmadd_d(3.14, 5811730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN(), 1.816); 5911730Sar4jc@virginia.edu return D::isquietnan(fd); 6011730Sar4jc@virginia.edu }, "fmadd.d, signaling NaN"); 6111730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 6211730Sar4jc@virginia.edu []{return D::fmadd_d(3.14, numeric_limits<double>::infinity(),1.414);}, 6311730Sar4jc@virginia.edu "fmadd.d, infinity"); 6411730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 6511730Sar4jc@virginia.edu []{return D::fmadd_d(3.14,-numeric_limits<double>::infinity(),1.414);}, 6611730Sar4jc@virginia.edu "fmadd.d, -infinity"); 6711730Sar4jc@virginia.edu 6811730Sar4jc@virginia.edu // FMSUB.D 6911730Sar4jc@virginia.edu expect<double>(D::number(0x400d5A1773A85E43ULL), 7011730Sar4jc@virginia.edu []{return D::fmsub_d(3.1415926, 1.61803398875, 1.41421356237);}, 7111730Sar4jc@virginia.edu "fmsub.d"); 7211730Sar4jc@virginia.edu expect<bool>(true, []{ 7311730Sar4jc@virginia.edu double fd = D::fmsub_d(3.14, numeric_limits<double>::quiet_NaN(), 7411730Sar4jc@virginia.edu 1.414); 7511730Sar4jc@virginia.edu return D::isquietnan(fd); 7611730Sar4jc@virginia.edu }, "fmsub.d, quiet NaN"); 7711730Sar4jc@virginia.edu expect<bool>(true, []{ 7811730Sar4jc@virginia.edu double fd = D::fmsub_d(3.14, 1.816, 7911730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 8011730Sar4jc@virginia.edu return D::isquietnan(fd); 8111730Sar4jc@virginia.edu }, "fmsub.d, signaling NaN"); 8211730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 8311730Sar4jc@virginia.edu []{return D::fmsub_d(numeric_limits<double>::infinity(), 1.816, 8411730Sar4jc@virginia.edu 1.414);}, 8511730Sar4jc@virginia.edu "fmsub.d, infinity"); 8611730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 8711730Sar4jc@virginia.edu []{return D::fmsub_d(3.14, -numeric_limits<double>::infinity(), 8811730Sar4jc@virginia.edu 1.414);}, 8911730Sar4jc@virginia.edu "fmsub.d, -infinity"); 9011730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 9111730Sar4jc@virginia.edu []{return D::fmsub_d(3.14, 1.816, 9211730Sar4jc@virginia.edu numeric_limits<double>::infinity());}, 9311730Sar4jc@virginia.edu "fmsub.d, subtract infinity"); 9411730Sar4jc@virginia.edu 9511730Sar4jc@virginia.edu // FNMSUB.D 9611730Sar4jc@virginia.edu expect<double>(D::number(0xC00D5A1773A85E43ULL), 9711730Sar4jc@virginia.edu []{return D::fnmsub_d(3.1415926, 1.61803398875, 1.41421356237);}, 9811730Sar4jc@virginia.edu "fnmsub.d"); 9911730Sar4jc@virginia.edu expect<bool>(true, []{ 10011730Sar4jc@virginia.edu double fd = D::fnmsub_d(3.14, 1.816, 10111730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN()); 10211730Sar4jc@virginia.edu return D::isquietnan(fd); 10311730Sar4jc@virginia.edu }, "fnmsub.d, quiet NaN"); 10411730Sar4jc@virginia.edu expect<bool>(true, []{ 10511730Sar4jc@virginia.edu double fd = D::fnmsub_d(numeric_limits<double>::signaling_NaN(), 10611730Sar4jc@virginia.edu 1.816, 1.414); 10711730Sar4jc@virginia.edu return D::isquietnan(fd); 10811730Sar4jc@virginia.edu }, "fnmsub.d, signaling NaN"); 10911730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 11011730Sar4jc@virginia.edu []{return D::fnmsub_d(numeric_limits<double>::infinity(), 1.816, 11111730Sar4jc@virginia.edu 1.414);}, 11211730Sar4jc@virginia.edu "fnmsub.d, infinity"); 11311730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 11411730Sar4jc@virginia.edu []{return D::fnmsub_d(3.14, -numeric_limits<double>::infinity(), 11511730Sar4jc@virginia.edu 1.414);}, 11611730Sar4jc@virginia.edu "fnmsub.d, -infinity"); 11711730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 11811730Sar4jc@virginia.edu []{return D::fnmsub_d(3.14, 1.816, 11911730Sar4jc@virginia.edu numeric_limits<double>::infinity());}, 12011730Sar4jc@virginia.edu "fnmsub.d, subtract infinity"); 12111730Sar4jc@virginia.edu 12211730Sar4jc@virginia.edu // FNMADD.D 12311730Sar4jc@virginia.edu expect<double>(D::number(0xC019FD5AED13B1CEULL), 12411730Sar4jc@virginia.edu []{return D::fnmadd_d(3.1415926, 1.61803398875, 1.41421356237);}, 12511730Sar4jc@virginia.edu "fnmadd.d"); 12611730Sar4jc@virginia.edu expect<bool>(true, []{ 12711730Sar4jc@virginia.edu double fd = D::fnmadd_d(numeric_limits<double>::quiet_NaN(), 3.14, 12811730Sar4jc@virginia.edu 1.816); 12911730Sar4jc@virginia.edu return D::isquietnan(fd); 13011730Sar4jc@virginia.edu }, "fnmadd.d, quiet NaN"); 13111730Sar4jc@virginia.edu expect<bool>(true, []{ 13211730Sar4jc@virginia.edu double fd = D::fnmadd_d(3.14, 13311730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN(), 1.816); 13411730Sar4jc@virginia.edu return D::isquietnan(fd); 13511730Sar4jc@virginia.edu }, "fnmadd.d, signaling NaN"); 13611730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 13711730Sar4jc@virginia.edu []{return D::fnmadd_d(3.14, numeric_limits<double>::infinity(), 13811730Sar4jc@virginia.edu 1.414);}, 13911730Sar4jc@virginia.edu "fnmadd.d, infinity"); 14011730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 14111730Sar4jc@virginia.edu []{return D::fnmadd_d(3.14, -numeric_limits<double>::infinity(), 14211730Sar4jc@virginia.edu 1.414);}, 14311730Sar4jc@virginia.edu "fnmadd.d, -infinity"); 14411730Sar4jc@virginia.edu 14511730Sar4jc@virginia.edu // FADD.D 14611730Sar4jc@virginia.edu expect<double>(D::number(0x4012392540292D7CULL), 14711730Sar4jc@virginia.edu []{return D::fadd_d(3.1415926, 1.41421356237);}, "fadd.d"); 14811730Sar4jc@virginia.edu expect<bool>(true, []{ 14911730Sar4jc@virginia.edu double fd = D::fadd_d(numeric_limits<double>::quiet_NaN(), 1.414); 15011730Sar4jc@virginia.edu return D::isquietnan(fd); 15111730Sar4jc@virginia.edu }, "fadd.d, quiet NaN"); 15211730Sar4jc@virginia.edu expect<bool>(true, []{ 15311730Sar4jc@virginia.edu double fd = D::fadd_d(3.14, 15411730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 15511730Sar4jc@virginia.edu return D::isquietnan(fd); 15611730Sar4jc@virginia.edu }, "fadd.d, signaling NaN"); 15711730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 15811730Sar4jc@virginia.edu []{return D::fadd_d(3.14, numeric_limits<double>::infinity());}, 15911730Sar4jc@virginia.edu "fadd.d, infinity"); 16011730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 16111730Sar4jc@virginia.edu []{return D::fadd_d(-numeric_limits<double>::infinity(), 1.816);}, 16211730Sar4jc@virginia.edu "fadd.d, -infinity"); 16311730Sar4jc@virginia.edu 16411730Sar4jc@virginia.edu // FSUB.D 16511730Sar4jc@virginia.edu expect<double>(D::number(0xBFFBA35833AB7AAEULL), 16611730Sar4jc@virginia.edu []{return D::fsub_d(1.4142135623, 3.1415926);}, "fsub.d"); 16711730Sar4jc@virginia.edu expect<bool>(true, []{ 16811730Sar4jc@virginia.edu double fd = D::fsub_d(numeric_limits<double>::quiet_NaN(), 1.414); 16911730Sar4jc@virginia.edu return D::isquietnan(fd); 17011730Sar4jc@virginia.edu }, "fsub.d, quiet NaN"); 17111730Sar4jc@virginia.edu expect<bool>(true, []{ 17211730Sar4jc@virginia.edu double fd = D::fsub_d(3.14, 17311730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 17411730Sar4jc@virginia.edu return D::isquietnan(fd); 17511730Sar4jc@virginia.edu }, "fsub.d, signaling NaN"); 17611730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 17711730Sar4jc@virginia.edu []{return D::fsub_d(numeric_limits<double>::infinity(), 3.14);}, 17811730Sar4jc@virginia.edu "fsub.d, infinity"); 17911730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 18011730Sar4jc@virginia.edu []{return D::fsub_d(-numeric_limits<double>::infinity(), 3.14);}, 18111730Sar4jc@virginia.edu "fsub.d, -infinity"); 18211730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 18311730Sar4jc@virginia.edu []{return D::fsub_d(1.414, numeric_limits<double>::infinity());}, 18411730Sar4jc@virginia.edu "fsub.d, subtract infinity"); 18511730Sar4jc@virginia.edu 18611730Sar4jc@virginia.edu // FMUL.D 18711730Sar4jc@virginia.edu expect<double>(D::number(0x40024E53B708ED9AULL), 18811730Sar4jc@virginia.edu []{return D::fmul_d(1.61803398875, 1.4142135623);}, "fmul.d"); 18911730Sar4jc@virginia.edu expect<bool>(true, []{ 19011730Sar4jc@virginia.edu double fd = D::fmul_d(numeric_limits<double>::quiet_NaN(), 1.414); 19111730Sar4jc@virginia.edu return D::isquietnan(fd); 19211730Sar4jc@virginia.edu }, "fmul.d, quiet NaN"); 19311730Sar4jc@virginia.edu expect<bool>(true, []{ 19411730Sar4jc@virginia.edu double fd = D::fmul_d(1.816, 19511730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 19611730Sar4jc@virginia.edu return D::isquietnan(fd); 19711730Sar4jc@virginia.edu }, "fmul.d, signaling NaN"); 19811730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 19911730Sar4jc@virginia.edu []{return D::fmul_d(numeric_limits<double>::infinity(), 2.718);}, 20011730Sar4jc@virginia.edu "fmul.d, infinity"); 20111730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 20211730Sar4jc@virginia.edu []{return D::fmul_d(2.5966, -numeric_limits<double>::infinity());}, 20311730Sar4jc@virginia.edu "fmul.d, -infinity"); 20411730Sar4jc@virginia.edu expect<bool>(true, []{ 20511730Sar4jc@virginia.edu double fd = D::fmul_d(0.0, numeric_limits<double>::infinity()); 20611730Sar4jc@virginia.edu return D::isquietnan(fd); 20711730Sar4jc@virginia.edu }, "fmul.d, 0*infinity"); 20811730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 20911730Sar4jc@virginia.edu []{return D::fmul_d(numeric_limits<double>::max(), 2.0);}, 21011730Sar4jc@virginia.edu "fmul.d, overflow"); 21111730Sar4jc@virginia.edu expect<double>(0.0, 21211730Sar4jc@virginia.edu []{return D::fmul_d(numeric_limits<double>::min(), 21311730Sar4jc@virginia.edu numeric_limits<double>::min());}, 21411730Sar4jc@virginia.edu "fmul.d, underflow"); 21511730Sar4jc@virginia.edu 21611730Sar4jc@virginia.edu // FDIV.D 21711730Sar4jc@virginia.edu expect<double>(2.5, []{return D::fdiv_d(10.0, 4.0);}, "fdiv.d"); 21811730Sar4jc@virginia.edu expect<bool>(true, []{ 21911730Sar4jc@virginia.edu double fd = D::fdiv_d(numeric_limits<double>::quiet_NaN(), 4.0); 22011730Sar4jc@virginia.edu return D::isquietnan(fd); 22111730Sar4jc@virginia.edu }, "fdiv.d, quiet NaN"); 22211730Sar4jc@virginia.edu expect<bool>(true, []{ 22311730Sar4jc@virginia.edu double fd = D::fdiv_d(10.0, 22411730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 22511730Sar4jc@virginia.edu return D::isquietnan(fd); 22611730Sar4jc@virginia.edu }, "fdiv.d, signaling NaN"); 22711730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 22811730Sar4jc@virginia.edu []{return D::fdiv_d(10.0, 0.0);}, "fdiv.d/0"); 22911730Sar4jc@virginia.edu expect<double>(0.0, 23011730Sar4jc@virginia.edu []{return D::fdiv_d(10.0, numeric_limits<double>::infinity());}, 23111730Sar4jc@virginia.edu "fdiv.d/infinity"); 23211730Sar4jc@virginia.edu expect<bool>(true, []{ 23311730Sar4jc@virginia.edu double fd = D::fdiv_d(numeric_limits<double>::infinity(), 23411730Sar4jc@virginia.edu numeric_limits<double>::infinity()); 23511730Sar4jc@virginia.edu return D::isquietnan(fd); 23611730Sar4jc@virginia.edu }, "fdiv.d, infinity/infinity"); 23711730Sar4jc@virginia.edu expect<bool>(true, []{ 23811730Sar4jc@virginia.edu double fd = D::fdiv_d(0.0, 0.0); 23911730Sar4jc@virginia.edu return D::isquietnan(fd); 24011730Sar4jc@virginia.edu }, "fdiv.d, 0/0"); 24111730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 24211730Sar4jc@virginia.edu []{return D::fdiv_d(numeric_limits<double>::infinity(), 0.0);}, 24311730Sar4jc@virginia.edu "fdiv.d, infinity/0"); 24411730Sar4jc@virginia.edu expect<double>(0.0, 24511730Sar4jc@virginia.edu []{return D::fdiv_d(0.0, numeric_limits<double>::infinity());}, 24611730Sar4jc@virginia.edu "fdiv.d, 0/infinity"); 24711730Sar4jc@virginia.edu expect<double>(0.0, 24811730Sar4jc@virginia.edu []{return D::fdiv_d(numeric_limits<double>::min(), 24911730Sar4jc@virginia.edu numeric_limits<double>::max());}, 25011730Sar4jc@virginia.edu "fdiv.d, underflow"); 25111730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 25211730Sar4jc@virginia.edu []{return D::fdiv_d(numeric_limits<double>::max(), 25311730Sar4jc@virginia.edu numeric_limits<double>::min());}, 25411730Sar4jc@virginia.edu "fdiv.d, overflow"); 25511730Sar4jc@virginia.edu 25611730Sar4jc@virginia.edu // FSQRT.D 25711730Sar4jc@virginia.edu expect<double>(1e154, []{return D::fsqrt_d(1e308);}, "fsqrt.d"); 25811730Sar4jc@virginia.edu expect<bool>(true, []{ 25911730Sar4jc@virginia.edu double fd = D::fsqrt_d(-1.0); 26011730Sar4jc@virginia.edu return D::isquietnan(fd); 26111730Sar4jc@virginia.edu }, "fsqrt.d, NaN"); 26211730Sar4jc@virginia.edu expect<bool>(true, []{ 26311730Sar4jc@virginia.edu double fd = D::fsqrt_d(numeric_limits<double>::quiet_NaN()); 26411730Sar4jc@virginia.edu return D::isquietnan(fd); 26511730Sar4jc@virginia.edu }, "fsqrt.d, quiet NaN"); 26611730Sar4jc@virginia.edu expect<bool>(true, []{ 26711730Sar4jc@virginia.edu double fd = D::fsqrt_d(numeric_limits<double>::signaling_NaN()); 26811730Sar4jc@virginia.edu return D::isquietnan(fd); 26911730Sar4jc@virginia.edu }, "fsqrt.d, signaling NaN"); 27011730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 27111730Sar4jc@virginia.edu []{return D::fsqrt_d(numeric_limits<double>::infinity());}, 27211730Sar4jc@virginia.edu "fsqrt.d, infinity"); 27311730Sar4jc@virginia.edu 27411730Sar4jc@virginia.edu // FSGNJ.D 27511730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnj_d(1.0, 25.0);}, "fsgnj.d, ++"); 27611730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnj_d(1.0, -25.0);}, "fsgnj.d, +-"); 27711730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnj_d(-1.0, 25.0);}, "fsgnj.d, -+"); 27811730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnj_d(-1.0, -25.0);}, "fsgnj.d, --"); 27911730Sar4jc@virginia.edu expect<bool>(true, []{ 28011730Sar4jc@virginia.edu double fd = D::fsgnj_d(numeric_limits<double>::quiet_NaN(), -4.0); 28111730Sar4jc@virginia.edu return D::isquietnan(fd); 28211730Sar4jc@virginia.edu }, "fsgnj.d, quiet NaN"); 28311730Sar4jc@virginia.edu expect<bool>(true, []{ 28411730Sar4jc@virginia.edu double fd = D::fsgnj_d(numeric_limits<double>::signaling_NaN(), 28511730Sar4jc@virginia.edu -4.0); 28611730Sar4jc@virginia.edu return D::issignalingnan(fd); 28711730Sar4jc@virginia.edu }, "fsgnj.d, signaling NaN"); 28811730Sar4jc@virginia.edu expect<double>(4.0, 28911730Sar4jc@virginia.edu []{return D::fsgnj_d(4.0, numeric_limits<double>::quiet_NaN());}, 29011730Sar4jc@virginia.edu "fsgnj.d, inject NaN"); 29111730Sar4jc@virginia.edu expect<double>(-4.0, 29211730Sar4jc@virginia.edu []{return D::fsgnj_d(4.0, -numeric_limits<double>::quiet_NaN());}, 29311730Sar4jc@virginia.edu "fsgnj.d, inject -NaN"); 29411730Sar4jc@virginia.edu 29511730Sar4jc@virginia.edu // FSGNJN.D 29611730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnjn_d(1.0, 25.0);}, "fsgnjn.d, ++"); 29711730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnjn_d(1.0, -25.0);}, "fsgnjn.d, +-"); 29811730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnjn_d(-1.0, 25.0);}, "fsgnjn.d, -+"); 29911730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnjn_d(-1.0, -25.0);}, "fsgnjn.d, --"); 30011730Sar4jc@virginia.edu expect<bool>(true, []{ 30111730Sar4jc@virginia.edu double fd = D::fsgnjn_d(numeric_limits<double>::quiet_NaN(), -4.0); 30211730Sar4jc@virginia.edu return D::isquietnan(fd); 30311730Sar4jc@virginia.edu }, "fsgnjn.d, quiet NaN"); 30411730Sar4jc@virginia.edu expect<bool>(true, []{ 30511730Sar4jc@virginia.edu double fd = D::fsgnjn_d(numeric_limits<double>::signaling_NaN(), 30611730Sar4jc@virginia.edu -4.0); 30711730Sar4jc@virginia.edu return D::issignalingnan(fd); 30811730Sar4jc@virginia.edu }, "fsgnjn.d, signaling NaN"); 30911730Sar4jc@virginia.edu expect<double>(-4.0, 31011730Sar4jc@virginia.edu []{return D::fsgnjn_d(4.0, numeric_limits<double>::quiet_NaN());}, 31111730Sar4jc@virginia.edu "fsgnjn.d, inject NaN"); 31211730Sar4jc@virginia.edu expect<double>(4.0, 31311730Sar4jc@virginia.edu []{return D::fsgnjn_d(4.0, -numeric_limits<double>::quiet_NaN());}, 31411730Sar4jc@virginia.edu "fsgnjn.d, inject NaN"); 31511730Sar4jc@virginia.edu 31611730Sar4jc@virginia.edu // FSGNJX.D 31711730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnjx_d(1.0, 25.0);}, "fsgnjx.d, ++"); 31811730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnjx_d(1.0, -25.0);}, "fsgnjx.d, +-"); 31911730Sar4jc@virginia.edu expect<double>(-1.0, []{return D::fsgnjx_d(-1.0, 25.0);}, "fsgnjx.d, -+"); 32011730Sar4jc@virginia.edu expect<double>(1.0, []{return D::fsgnjx_d(-1.0, -25.0);}, "fsgnjx.d, --"); 32111730Sar4jc@virginia.edu expect<bool>(true, []{ 32211730Sar4jc@virginia.edu double fd = D::fsgnjx_d(numeric_limits<double>::quiet_NaN(), -4.0); 32311730Sar4jc@virginia.edu return D::isquietnan(fd); 32411730Sar4jc@virginia.edu }, "fsgnjx.d, quiet NaN"); 32511730Sar4jc@virginia.edu expect<bool>(true, []{ 32611730Sar4jc@virginia.edu double fd = D::fsgnjx_d(numeric_limits<double>::signaling_NaN(), 32711730Sar4jc@virginia.edu -4.0); 32811730Sar4jc@virginia.edu return D::issignalingnan(fd); 32911730Sar4jc@virginia.edu }, "fsgnjx.d, signaling NaN"); 33011730Sar4jc@virginia.edu expect<double>(4.0, 33111730Sar4jc@virginia.edu []{return D::fsgnjx_d(4.0, numeric_limits<double>::quiet_NaN());}, 33211730Sar4jc@virginia.edu "fsgnjx.d, inject NaN"); 33311730Sar4jc@virginia.edu expect<double>(-4.0, 33411730Sar4jc@virginia.edu []{return D::fsgnjx_d(4.0, -numeric_limits<double>::quiet_NaN());}, 33511730Sar4jc@virginia.edu "fsgnjx.d, inject NaN"); 33611730Sar4jc@virginia.edu 33711730Sar4jc@virginia.edu // FMIN.D 33811730Sar4jc@virginia.edu expect<double>(2.718, []{return D::fmin_d(3.14, 2.718);}, "fmin.d"); 33911730Sar4jc@virginia.edu expect<double>(-numeric_limits<double>::infinity(), 34011730Sar4jc@virginia.edu []{return D::fmin_d(-numeric_limits<double>::infinity(), 34111730Sar4jc@virginia.edu numeric_limits<double>::min());}, 34211730Sar4jc@virginia.edu "fmin.d, -infinity"); 34311730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::max(), 34411730Sar4jc@virginia.edu []{return D::fmin_d(numeric_limits<double>::infinity(), 34511730Sar4jc@virginia.edu numeric_limits<double>::max());}, 34611730Sar4jc@virginia.edu "fmin.d, infinity"); 34711730Sar4jc@virginia.edu expect<double>(-1.414, 34811730Sar4jc@virginia.edu []{return D::fmin_d(numeric_limits<double>::quiet_NaN(), -1.414);}, 34911730Sar4jc@virginia.edu "fmin.d, quiet NaN first"); 35011730Sar4jc@virginia.edu expect<double>(2.718, 35111730Sar4jc@virginia.edu []{return D::fmin_d(2.718, numeric_limits<double>::quiet_NaN());}, 35211730Sar4jc@virginia.edu "fmin.d, quiet NaN second"); 35311730Sar4jc@virginia.edu expect<bool>(true, []{ 35411730Sar4jc@virginia.edu double fd = D::fmin_d(numeric_limits<double>::quiet_NaN(), 35511730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN()); 35611730Sar4jc@virginia.edu return D::isquietnan(fd); 35711730Sar4jc@virginia.edu }, "fmin.d, quiet NaN both"); 35811730Sar4jc@virginia.edu expect<double>(3.14, 35911730Sar4jc@virginia.edu []{return D::fmin_d(numeric_limits<double>::signaling_NaN(), 36011730Sar4jc@virginia.edu 3.14);}, 36111730Sar4jc@virginia.edu "fmin.d, signaling NaN first"); 36211730Sar4jc@virginia.edu expect<double>(1.816, 36311730Sar4jc@virginia.edu []{return D::fmin_d(1.816, 36411730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN());}, 36511730Sar4jc@virginia.edu "fmin.d, signaling NaN second"); 36611730Sar4jc@virginia.edu expect<bool>(true, []{ 36711730Sar4jc@virginia.edu double fd = D::fmin_d(numeric_limits<double>::signaling_NaN(), 36811730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 36911730Sar4jc@virginia.edu return D::issignalingnan(fd); 37011730Sar4jc@virginia.edu }, "fmin.d, signaling NaN both"); 37111730Sar4jc@virginia.edu 37211730Sar4jc@virginia.edu // FMAX.D 37311730Sar4jc@virginia.edu expect<double>(3.14, []{return D::fmax_d(3.14, 2.718);}, "fmax.d"); 37411730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::min(), 37511730Sar4jc@virginia.edu []{return D::fmax_d(-numeric_limits<double>::infinity(), 37611730Sar4jc@virginia.edu numeric_limits<double>::min());}, 37711730Sar4jc@virginia.edu "fmax.d, -infinity"); 37811730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 37911730Sar4jc@virginia.edu []{return D::fmax_d(numeric_limits<double>::infinity(), 38011730Sar4jc@virginia.edu numeric_limits<double>::max());}, 38111730Sar4jc@virginia.edu "fmax.d, infinity"); 38211730Sar4jc@virginia.edu expect<double>(-1.414, 38311730Sar4jc@virginia.edu []{return D::fmax_d(numeric_limits<double>::quiet_NaN(), -1.414);}, 38411730Sar4jc@virginia.edu "fmax.d, quiet NaN first"); 38511730Sar4jc@virginia.edu expect<double>(2.718, 38611730Sar4jc@virginia.edu []{return D::fmax_d(2.718, numeric_limits<double>::quiet_NaN());}, 38711730Sar4jc@virginia.edu "fmax.d, quiet NaN second"); 38811730Sar4jc@virginia.edu expect<bool>(true, []{ 38911730Sar4jc@virginia.edu double fd = D::fmax_d(numeric_limits<double>::quiet_NaN(), 39011730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN()); 39111730Sar4jc@virginia.edu return D::isquietnan(fd); 39211730Sar4jc@virginia.edu }, "fmax.d, quiet NaN both"); 39311730Sar4jc@virginia.edu expect<double>(3.14, 39411730Sar4jc@virginia.edu []{return D::fmax_d(numeric_limits<double>::signaling_NaN(), 39511730Sar4jc@virginia.edu 3.14);}, 39611730Sar4jc@virginia.edu "fmax.d, signaling NaN first"); 39711730Sar4jc@virginia.edu expect<double>(1.816, 39811730Sar4jc@virginia.edu []{return D::fmax_d(1.816, 39911730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN());}, 40011730Sar4jc@virginia.edu "fmax.d, signaling NaN second"); 40111730Sar4jc@virginia.edu expect<bool>(true, []{ 40211730Sar4jc@virginia.edu double fd = D::fmax_d(numeric_limits<double>::signaling_NaN(), 40311730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN()); 40411730Sar4jc@virginia.edu return D::issignalingnan(fd); 40511730Sar4jc@virginia.edu }, "fmax.d, signaling NaN both"); 40611730Sar4jc@virginia.edu 40711730Sar4jc@virginia.edu // FCVT.S.D 40811730Sar4jc@virginia.edu expect<float>(4.0, []{return D::fcvt_s_d(4.0);}, "fcvt.s.d"); 40911730Sar4jc@virginia.edu expect<bool>(true, []{ 41011730Sar4jc@virginia.edu float fd = D::fcvt_s_d(numeric_limits<double>::quiet_NaN()); 41111730Sar4jc@virginia.edu return F::isquietnan(fd); 41211730Sar4jc@virginia.edu }, "fcvt.s.d, quiet NaN"); 41311730Sar4jc@virginia.edu expect<bool>(true, []{ 41411730Sar4jc@virginia.edu float fd = D::fcvt_s_d(numeric_limits<double>::signaling_NaN()); 41511730Sar4jc@virginia.edu return F::isquietnan(fd); 41611730Sar4jc@virginia.edu }, "fcvt.s.d, signaling NaN"); 41711730Sar4jc@virginia.edu expect<float>(numeric_limits<float>::infinity(), 41811730Sar4jc@virginia.edu []{return D::fcvt_s_d(numeric_limits<double>::infinity());}, 41911730Sar4jc@virginia.edu "fcvt.s.d, infinity"); 42011730Sar4jc@virginia.edu expect<float>(numeric_limits<float>::infinity(), 42111730Sar4jc@virginia.edu []{return D::fcvt_s_d(numeric_limits<double>::max());}, 42211730Sar4jc@virginia.edu "fcvt.s.d, overflow"); 42311730Sar4jc@virginia.edu expect<float>(0.0, []{return D::fcvt_s_d(numeric_limits<double>::min());}, 42411730Sar4jc@virginia.edu "fcvt.s.d, underflow"); 42511730Sar4jc@virginia.edu 42611730Sar4jc@virginia.edu // FCVT.D.S 42711730Sar4jc@virginia.edu expect<double>(D::number(0x4005BE76C0000000), 42811730Sar4jc@virginia.edu []{return D::fcvt_d_s(2.718);}, "fcvt.d.s"); 42911730Sar4jc@virginia.edu expect<bool>(true, []{ 43011730Sar4jc@virginia.edu double fd = D::fcvt_d_s(numeric_limits<float>::quiet_NaN()); 43111730Sar4jc@virginia.edu return D::isquietnan(fd); 43211730Sar4jc@virginia.edu }, "fcvt.d.s, quiet NaN"); 43311730Sar4jc@virginia.edu expect<bool>(true, []{ 43411730Sar4jc@virginia.edu double fd = D::fcvt_d_s(numeric_limits<float>::signaling_NaN()); 43511730Sar4jc@virginia.edu return D::isquietnan(fd); 43611730Sar4jc@virginia.edu }, "fcvt.d.s, signaling NaN"); 43711730Sar4jc@virginia.edu expect<double>(numeric_limits<double>::infinity(), 43811730Sar4jc@virginia.edu []{return D::fcvt_d_s(numeric_limits<float>::infinity());}, 43911730Sar4jc@virginia.edu "fcvt.d.s, infinity"); 44011730Sar4jc@virginia.edu 44111730Sar4jc@virginia.edu // FEQ.D 44211730Sar4jc@virginia.edu expect<bool>(true, []{return D::feq_d(1.414, 1.414);}, "feq.d, equal"); 44311730Sar4jc@virginia.edu expect<bool>(false,[]{return D::feq_d(2.718, 1.816);}, "feq.d, not equal"); 44411730Sar4jc@virginia.edu expect<bool>(true, []{return D::feq_d(0.0, -0.0);}, "feq.d, 0 == -0"); 44511730Sar4jc@virginia.edu expect<bool>(false, 44611730Sar4jc@virginia.edu []{return D::feq_d(numeric_limits<double>::quiet_NaN(), -1.0);}, 44711730Sar4jc@virginia.edu "feq.d, quiet NaN first"); 44811730Sar4jc@virginia.edu expect<bool>(false, 44911730Sar4jc@virginia.edu []{return D::feq_d(2.0, numeric_limits<double>::quiet_NaN());}, 45011730Sar4jc@virginia.edu "feq.d, quiet NaN second"); 45111730Sar4jc@virginia.edu expect<bool>(false, 45211730Sar4jc@virginia.edu []{return D::feq_d(numeric_limits<double>::quiet_NaN(), 45311730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN());}, 45411730Sar4jc@virginia.edu "feq.d, quiet NaN both"); 45511730Sar4jc@virginia.edu expect<bool>(false, 45611730Sar4jc@virginia.edu []{return D::feq_d(numeric_limits<double>::signaling_NaN(),-1.0);}, 45711730Sar4jc@virginia.edu "feq.d, signaling NaN first"); 45811730Sar4jc@virginia.edu expect<bool>(false, 45911730Sar4jc@virginia.edu []{return D::feq_d(2.0, numeric_limits<double>::signaling_NaN());}, 46011730Sar4jc@virginia.edu "feq.d, signaling NaN second"); 46111730Sar4jc@virginia.edu expect<bool>(false, 46211730Sar4jc@virginia.edu []{return D::feq_d(numeric_limits<double>::signaling_NaN(), 46311730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN());}, 46411730Sar4jc@virginia.edu "feq.d, signaling NaN both"); 46511730Sar4jc@virginia.edu 46611730Sar4jc@virginia.edu // FLT.D 46711730Sar4jc@virginia.edu expect<bool>(false, []{return D::flt_d(1.414, 1.414);}, "flt.d, equal"); 46811730Sar4jc@virginia.edu expect<bool>(true, []{return D::flt_d(1.816, 2.718);}, "flt.d, less"); 46911730Sar4jc@virginia.edu expect<bool>(false, []{return D::flt_d(2.718, 1.816);}, "flt.d, greater"); 47011730Sar4jc@virginia.edu expect<bool>(false, 47111730Sar4jc@virginia.edu []{return D::flt_d(numeric_limits<double>::quiet_NaN(), -1.0);}, 47211730Sar4jc@virginia.edu "flt.d, quiet NaN first"); 47311730Sar4jc@virginia.edu expect<bool>(false, 47411730Sar4jc@virginia.edu []{return D::flt_d(2.0, numeric_limits<double>::quiet_NaN());}, 47511730Sar4jc@virginia.edu "flt.d, quiet NaN second"); 47611730Sar4jc@virginia.edu expect<bool>(false, 47711730Sar4jc@virginia.edu []{return D::flt_d(numeric_limits<double>::quiet_NaN(), 47811730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN());}, 47911730Sar4jc@virginia.edu "flt.d, quiet NaN both"); 48011730Sar4jc@virginia.edu expect<bool>(false, 48111730Sar4jc@virginia.edu []{return D::flt_d(numeric_limits<double>::signaling_NaN(),-1.0);}, 48211730Sar4jc@virginia.edu "flt.d, signaling NaN first"); 48311730Sar4jc@virginia.edu expect<bool>(false, 48411730Sar4jc@virginia.edu []{return D::flt_d(2.0, numeric_limits<double>::signaling_NaN());}, 48511730Sar4jc@virginia.edu "flt.d, signaling NaN second"); 48611730Sar4jc@virginia.edu expect<bool>(false, 48711730Sar4jc@virginia.edu []{return D::flt_d(numeric_limits<double>::signaling_NaN(), 48811730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN());}, 48911730Sar4jc@virginia.edu "flt.d, signaling NaN both"); 49011730Sar4jc@virginia.edu 49111730Sar4jc@virginia.edu // FLE.D 49211730Sar4jc@virginia.edu expect<bool>(true, []{return D::fle_d(1.414, 1.414);}, "fle.d, equal"); 49311730Sar4jc@virginia.edu expect<bool>(true, []{return D::fle_d(1.816, 2.718);}, "fle.d, less"); 49411730Sar4jc@virginia.edu expect<bool>(false, []{return D::fle_d(2.718, 1.816);}, "fle.d, greater"); 49511730Sar4jc@virginia.edu expect<bool>(true, []{return D::fle_d(0.0, -0.0);}, "fle.d, 0 == -0"); 49611730Sar4jc@virginia.edu expect<bool>(false, 49711730Sar4jc@virginia.edu []{return D::fle_d(numeric_limits<double>::quiet_NaN(), -1.0);}, 49811730Sar4jc@virginia.edu "fle.d, quiet NaN first"); 49911730Sar4jc@virginia.edu expect<bool>(false, 50011730Sar4jc@virginia.edu []{return D::fle_d(2.0, numeric_limits<double>::quiet_NaN());}, 50111730Sar4jc@virginia.edu "fle.d, quiet NaN second"); 50211730Sar4jc@virginia.edu expect<bool>(false, 50311730Sar4jc@virginia.edu []{return D::fle_d(numeric_limits<double>::quiet_NaN(), 50411730Sar4jc@virginia.edu numeric_limits<double>::quiet_NaN());}, 50511730Sar4jc@virginia.edu "fle.d, quiet NaN both"); 50611730Sar4jc@virginia.edu expect<bool>(false, 50711730Sar4jc@virginia.edu []{return D::fle_d(numeric_limits<double>::signaling_NaN(),-1.0);}, 50811730Sar4jc@virginia.edu "fle.d, signaling NaN first"); 50911730Sar4jc@virginia.edu expect<bool>(false, 51011730Sar4jc@virginia.edu []{return D::fle_d(2.0, numeric_limits<double>::signaling_NaN());}, 51111730Sar4jc@virginia.edu "fle.d, signaling NaN second"); 51211730Sar4jc@virginia.edu expect<bool>(false, 51311730Sar4jc@virginia.edu []{return D::fle_d(numeric_limits<double>::signaling_NaN(), 51411730Sar4jc@virginia.edu numeric_limits<double>::signaling_NaN());}, 51511730Sar4jc@virginia.edu "fle.d, signaling NaN both"); 51611730Sar4jc@virginia.edu 51711730Sar4jc@virginia.edu // FCLASS.D 51811730Sar4jc@virginia.edu expect<uint64_t>(0x1, 51911730Sar4jc@virginia.edu []{return D::fclass_d(-numeric_limits<double>::infinity());}, 52011730Sar4jc@virginia.edu "fclass.d, -infinity"); 52111730Sar4jc@virginia.edu expect<uint64_t>(0x2, 52211730Sar4jc@virginia.edu []{return D::fclass_d(-3.14);}, "fclass.d, -normal"); 52311730Sar4jc@virginia.edu expect<uint64_t>(0x4, 52411730Sar4jc@virginia.edu []{return D::fclass_d(D::number(0x800FFFFFFFFFFFFFULL));}, 52511730Sar4jc@virginia.edu "fclass.d, -subnormal"); 52611730Sar4jc@virginia.edu expect<uint64_t>(0x8, []{return D::fclass_d(-0.0);}, "fclass.d, -0.0"); 52711730Sar4jc@virginia.edu expect<uint64_t>(0x10, []{return D::fclass_d(0.0);}, "fclass.d, 0.0"); 52811730Sar4jc@virginia.edu expect<uint64_t>(0x20, 52911730Sar4jc@virginia.edu []{return D::fclass_d(D::number(0x000FFFFFFFFFFFFFULL));}, 53011730Sar4jc@virginia.edu "fclass.d, subnormal"); 53111730Sar4jc@virginia.edu expect<uint64_t>(0x40, []{return D::fclass_d(1.816);}, "fclass.d, normal"); 53211730Sar4jc@virginia.edu expect<uint64_t>(0x80, 53311730Sar4jc@virginia.edu []{return D::fclass_d(numeric_limits<double>::infinity());}, 53411730Sar4jc@virginia.edu "fclass.d, infinity"); 53511730Sar4jc@virginia.edu expect<uint64_t>(0x100, 53611730Sar4jc@virginia.edu []{return D::fclass_d(numeric_limits<double>::signaling_NaN());}, 53711730Sar4jc@virginia.edu "fclass.d, signaling NaN"); 53811730Sar4jc@virginia.edu expect<uint64_t>(0x200, 53911730Sar4jc@virginia.edu []{return D::fclass_d(numeric_limits<double>::quiet_NaN());}, 54011730Sar4jc@virginia.edu "fclass.s, quiet NaN"); 54111730Sar4jc@virginia.edu 54211730Sar4jc@virginia.edu // FCVT.W.D 54311730Sar4jc@virginia.edu expect<int64_t>(256, []{return D::fcvt_w_d(256.3);}, 54411730Sar4jc@virginia.edu "fcvt.w.d, truncate positive"); 54511730Sar4jc@virginia.edu expect<int64_t>(-256, []{return D::fcvt_w_d(-256.2);}, 54611730Sar4jc@virginia.edu "fcvt.w.d, truncate negative"); 54711730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_w_d(0.0);}, "fcvt.w.d, 0.0"); 54811730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_w_d(-0.0);}, "fcvt.w.d, -0.0"); 54911730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::max(), 55011730Sar4jc@virginia.edu []{return D::fcvt_w_d(numeric_limits<double>::max());}, 55111730Sar4jc@virginia.edu "fcvt.w.d, overflow"); 55211730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_w_d(numeric_limits<double>::min());}, 55311730Sar4jc@virginia.edu "fcvt.w.d, underflow"); 55411730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::max(), 55511730Sar4jc@virginia.edu []{return D::fcvt_w_d(numeric_limits<double>::infinity());}, 55611730Sar4jc@virginia.edu "fcvt.w.d, infinity"); 55711730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::min(), 55811730Sar4jc@virginia.edu []{return D::fcvt_w_d(-numeric_limits<double>::infinity());}, 55911730Sar4jc@virginia.edu "fcvt.w.d, -infinity"); 56011730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::max(), 56111730Sar4jc@virginia.edu []{return D::fcvt_w_d(numeric_limits<double>::quiet_NaN());}, 56211730Sar4jc@virginia.edu "fcvt.w.d, quiet NaN"); 56311730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::max(), 56411730Sar4jc@virginia.edu []{return D::fcvt_w_d(-numeric_limits<double>::quiet_NaN());}, 56511730Sar4jc@virginia.edu "fcvt.w.d, quiet -NaN"); 56611730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int32_t>::max(), 56711730Sar4jc@virginia.edu []{return D::fcvt_w_d(numeric_limits<double>::signaling_NaN());}, 56811730Sar4jc@virginia.edu "fcvt.w.d, signaling NaN"); 56911730Sar4jc@virginia.edu 57011730Sar4jc@virginia.edu // FCVT.WU.D 57111730Sar4jc@virginia.edu expect<uint64_t>(256, []{return D::fcvt_wu_d(256.3);}, 57211730Sar4jc@virginia.edu "fcvt.wu.d, truncate positive"); 57311730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_wu_d(-256.2);}, 57411730Sar4jc@virginia.edu "fcvt.wu.d, truncate negative"); 57511730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_wu_d(0.0);}, "fcvt.wu.d, 0.0"); 57611730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_wu_d(-0.0);}, "fcvt.wu.d, -0.0"); 57711730Sar4jc@virginia.edu expect<uint64_t>(numeric_limits<uint64_t>::max(), 57811730Sar4jc@virginia.edu []{return D::fcvt_wu_d(numeric_limits<double>::max());}, 57911730Sar4jc@virginia.edu "fcvt.wu.d, overflow"); 58011730Sar4jc@virginia.edu expect<uint64_t>(0,[]{return D::fcvt_wu_d(numeric_limits<double>::min());}, 58111730Sar4jc@virginia.edu "fcvt.wu.d, underflow"); 58211730Sar4jc@virginia.edu expect<uint64_t>(numeric_limits<uint64_t>::max(), 58311730Sar4jc@virginia.edu []{return D::fcvt_wu_d(numeric_limits<double>::infinity());}, 58411730Sar4jc@virginia.edu "fcvt.wu.d, infinity"); 58511730Sar4jc@virginia.edu expect<uint64_t>(0, 58611730Sar4jc@virginia.edu []{return D::fcvt_wu_d(-numeric_limits<double>::infinity());}, 58711730Sar4jc@virginia.edu "fcvt.wu.d, -infinity"); 58811730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 58911730Sar4jc@virginia.edu []{return D::fcvt_wu_d(numeric_limits<double>::quiet_NaN());}, 59011730Sar4jc@virginia.edu "fcvt.wu.d, quiet NaN"); 59111730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 59211730Sar4jc@virginia.edu []{return D::fcvt_wu_d(-numeric_limits<double>::quiet_NaN());}, 59311730Sar4jc@virginia.edu "fcvt.wu.d, quiet -NaN"); 59411730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 59511730Sar4jc@virginia.edu []{return D::fcvt_wu_d(numeric_limits<double>::signaling_NaN());}, 59611730Sar4jc@virginia.edu "fcvt.wu.d, signaling NaN"); 59711730Sar4jc@virginia.edu 59811730Sar4jc@virginia.edu // FCVT.D.W 59911730Sar4jc@virginia.edu expect<double>(0.0, []{return D::fcvt_d_w(0);}, "fcvt.d.w, 0"); 60011730Sar4jc@virginia.edu expect<double>(-2147483648.0, 60111730Sar4jc@virginia.edu []{return D::fcvt_d_w(numeric_limits<int32_t>::min());}, 60211730Sar4jc@virginia.edu "fcvt.d.w, negative"); 60311730Sar4jc@virginia.edu expect<double>(255.0, []{return D::fcvt_d_w(0xFFFFFFFF000000FFLL);}, 60411730Sar4jc@virginia.edu "fcvt.d.w, truncate"); 60511730Sar4jc@virginia.edu 60611730Sar4jc@virginia.edu // FCVT.D.WU 60711730Sar4jc@virginia.edu expect<double>(0.0, []{return D::fcvt_d_wu(0);}, "fcvt.d.wu, 0"); 60811730Sar4jc@virginia.edu expect<double>(2147483648.0, 60911730Sar4jc@virginia.edu []{return D::fcvt_d_wu(numeric_limits<int32_t>::min());}, 61011730Sar4jc@virginia.edu "fcvt.d.wu"); 61111730Sar4jc@virginia.edu expect<double>(255.0, 61211730Sar4jc@virginia.edu []{return D::fcvt_d_wu(0xFFFFFFFF000000FFLL);}, 61311730Sar4jc@virginia.edu "fcvt.d.wu, truncate"); 61411730Sar4jc@virginia.edu 61511730Sar4jc@virginia.edu // FCVT.L.D 61611730Sar4jc@virginia.edu expect<int64_t>(256, []{return D::fcvt_l_d(256.3);}, 61711730Sar4jc@virginia.edu "fcvt.l.d, truncate positive"); 61811730Sar4jc@virginia.edu expect<int64_t>(-256, []{return D::fcvt_l_d(-256.2);}, 61911730Sar4jc@virginia.edu "fcvt.l.d, truncate negative"); 62011730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_l_d(0.0);}, "fcvt.l.d, 0.0"); 62111730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_l_d(-0.0);}, "fcvt.l.d, -0.0"); 62211730Sar4jc@virginia.edu expect<int64_t>(-8589934592LL, []{return D::fcvt_l_d(-8589934592.0);}, 62311730Sar4jc@virginia.edu "fcvt.l.d, 32-bit overflow"); 62411730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::max(), 62511730Sar4jc@virginia.edu []{return D::fcvt_l_d(numeric_limits<double>::max());}, 62611730Sar4jc@virginia.edu "fcvt.l.d, overflow"); 62711730Sar4jc@virginia.edu expect<int64_t>(0, []{return D::fcvt_l_d(numeric_limits<double>::min());}, 62811730Sar4jc@virginia.edu "fcvt.l.d, underflow"); 62911730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::max(), 63011730Sar4jc@virginia.edu []{return D::fcvt_l_d(numeric_limits<double>::infinity());}, 63111730Sar4jc@virginia.edu "fcvt.l.d, infinity"); 63211730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::min(), 63311730Sar4jc@virginia.edu []{return D::fcvt_l_d(-numeric_limits<double>::infinity());}, 63411730Sar4jc@virginia.edu "fcvt.l.d, -infinity"); 63511730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::max(), 63611730Sar4jc@virginia.edu []{return D::fcvt_l_d(numeric_limits<double>::quiet_NaN());}, 63711730Sar4jc@virginia.edu "fcvt.l.d, quiet NaN"); 63811730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::max(), 63911730Sar4jc@virginia.edu []{return D::fcvt_l_d(-numeric_limits<double>::quiet_NaN());}, 64011730Sar4jc@virginia.edu "fcvt.l.d, quiet -NaN"); 64111730Sar4jc@virginia.edu expect<int64_t>(numeric_limits<int64_t>::max(), 64211730Sar4jc@virginia.edu []{return D::fcvt_l_d(numeric_limits<double>::signaling_NaN());}, 64311730Sar4jc@virginia.edu "fcvt.l.d, signaling NaN"); 64411730Sar4jc@virginia.edu 64511730Sar4jc@virginia.edu // FCVT.LU.D 64611730Sar4jc@virginia.edu expect<uint64_t>(256, []{return D::fcvt_lu_d(256.3);}, 64711730Sar4jc@virginia.edu "fcvt.lu.d, truncate positive"); 64811730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_lu_d(-256.2);}, 64911730Sar4jc@virginia.edu "fcvt.lu.d, truncate negative"); 65011730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_lu_d(0.0);}, "fcvt.lu.d, 0.0"); 65111730Sar4jc@virginia.edu expect<uint64_t>(0, []{return D::fcvt_lu_d(-0.0);}, "fcvt.lu.d, -0.0"); 65211730Sar4jc@virginia.edu expect<uint64_t>(8589934592LL, []{return D::fcvt_lu_d(8589934592.0);}, 65311730Sar4jc@virginia.edu "fcvt.lu.d, 32-bit overflow"); 65411730Sar4jc@virginia.edu expect<uint64_t>(numeric_limits<uint64_t>::max(), 65511730Sar4jc@virginia.edu []{return D::fcvt_lu_d(numeric_limits<double>::max());}, 65611730Sar4jc@virginia.edu "fcvt.lu.d, overflow"); 65711730Sar4jc@virginia.edu expect<uint64_t>(0,[]{return D::fcvt_lu_d(numeric_limits<double>::min());}, 65811730Sar4jc@virginia.edu "fcvt.lu.d, underflow"); 65911730Sar4jc@virginia.edu expect<uint64_t>(numeric_limits<uint64_t>::max(), 66011730Sar4jc@virginia.edu []{return D::fcvt_lu_d(numeric_limits<double>::infinity());}, 66111730Sar4jc@virginia.edu "fcvt.lu.d, infinity"); 66211730Sar4jc@virginia.edu expect<uint64_t>(0, 66311730Sar4jc@virginia.edu []{return D::fcvt_lu_d(-numeric_limits<double>::infinity());}, 66411730Sar4jc@virginia.edu "fcvt.lu.d, -infinity"); 66511730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 66611730Sar4jc@virginia.edu []{return D::fcvt_lu_d(numeric_limits<double>::quiet_NaN());}, 66711730Sar4jc@virginia.edu "fcvt.lu.d, quiet NaN"); 66811730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 66911730Sar4jc@virginia.edu []{return D::fcvt_lu_d(-numeric_limits<double>::quiet_NaN());}, 67011730Sar4jc@virginia.edu "fcvt.lu.d, quiet -NaN"); 67111730Sar4jc@virginia.edu expect<uint64_t>(0xFFFFFFFFFFFFFFFFULL, 67211730Sar4jc@virginia.edu []{return D::fcvt_lu_d(numeric_limits<double>::signaling_NaN());}, 67311730Sar4jc@virginia.edu "fcvt.lu.d, signaling NaN"); 67411730Sar4jc@virginia.edu 67511730Sar4jc@virginia.edu // FMV.X.D 67611730Sar4jc@virginia.edu expect<uint64_t>(0x40091EB851EB851FULL, []{return D::fmv_x_d(3.14);}, 67711730Sar4jc@virginia.edu "fmv.x.d, positive"); 67811730Sar4jc@virginia.edu expect<uint64_t>(0xC0091EB851EB851FULL, []{return D::fmv_x_d(-3.14);}, 67911730Sar4jc@virginia.edu "fmv.x.d, negative"); 68011730Sar4jc@virginia.edu expect<uint64_t>(0x0000000000000000ULL, []{return D::fmv_x_d(0.0);}, 68111730Sar4jc@virginia.edu "fmv.x.d, 0.0"); 68211730Sar4jc@virginia.edu expect<uint64_t>(0x8000000000000000ULL, []{return D::fmv_x_d(-0.0);}, 68311730Sar4jc@virginia.edu "fmv.x.d, -0.0"); 68411730Sar4jc@virginia.edu 68511730Sar4jc@virginia.edu // FCVT.D.L 68611730Sar4jc@virginia.edu expect<double>(0.0, []{return D::fcvt_d_l(0);}, "fcvt.d.l, 0"); 68711730Sar4jc@virginia.edu expect<double>(D::number(0xC3E0000000000000), 68811730Sar4jc@virginia.edu []{return D::fcvt_d_l(numeric_limits<int64_t>::min());}, 68911730Sar4jc@virginia.edu "fcvt.d.l, negative"); 69011730Sar4jc@virginia.edu expect<double>(D::number(0xC1EFFFFFE0200000), 69111730Sar4jc@virginia.edu []{return D::fcvt_d_l(0xFFFFFFFF000000FFLL);}, 69211730Sar4jc@virginia.edu "fcvt.d.l, 32-bit truncate"); 69311730Sar4jc@virginia.edu 69411730Sar4jc@virginia.edu // FCVT.D.LU 69511730Sar4jc@virginia.edu expect<double>(0.0, []{return D::fcvt_d_lu(0);}, "fcvt.d.lu, 0"); 69611730Sar4jc@virginia.edu expect<double>(D::number(0x43E0000000000000), 69711730Sar4jc@virginia.edu []{return D::fcvt_d_lu(numeric_limits<int64_t>::min());}, 69811730Sar4jc@virginia.edu "fcvt.d.lu"); 69911730Sar4jc@virginia.edu expect<double>(D::number(0x43EFFFFFFFE00000), 70011730Sar4jc@virginia.edu []{return D::fcvt_d_lu(0xFFFFFFFF000000FFLL);}, 70111730Sar4jc@virginia.edu "fcvt.d.lu, 32-bit truncate"); 70211730Sar4jc@virginia.edu 70311730Sar4jc@virginia.edu // FMV.D.X 70411730Sar4jc@virginia.edu expect<double>(-numeric_limits<float>::infinity(), 70511730Sar4jc@virginia.edu []{return D::fmv_d_x(0xFFF0000000000000ULL);}, "fmv.d.x"); 70611730Sar4jc@virginia.edu 70711730Sar4jc@virginia.edu return 0; 70811730Sar4jc@virginia.edu} 709