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