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