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