mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-06 13:30:00 +00:00
300 lines
19 KiB
C++
300 lines
19 KiB
C++
#include "prx/libc/libc.hpp"
|
|
#include <bit>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
|
|
static void Require(bool value) { if (!value) std::abort(); }
|
|
|
|
struct ScaleCase { std::uint64_t input; long long exponent; short code; std::uint64_t result; short extendedCode; std::uint64_t extendedResult; };
|
|
struct FloatScaleCase { std::uint32_t input; long long exponent; short code; std::uint32_t result; };
|
|
struct UnscaleCase { std::uint64_t input; short code; short exponent; std::uint64_t result; short extendedCode; short extendedExponent; std::uint64_t extendedResult; };
|
|
struct FloatUnscaleCase { std::uint32_t input; short code; short exponent; std::uint32_t result; };
|
|
|
|
static const ScaleCase kScales[] = {
|
|
{0x0000000000000000ull, 0ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000000ull, 52ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000000ull, -1022ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000000ull, -1075ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000000ull, 2047ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000000ull, -9223372036854775807ll - 1, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x8000000000000000ull, -1ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000000ull, 1023ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000000ull, -1074ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000000ull, 1024ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000000ull, 9223372036854775807ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x0000000000000001ull, 1ll, -1, 0x0000000000000002ull, -1, 0x0000000000000002ull},
|
|
{0x0000000000000001ull, -52ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000001ull, -1023ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000001ull, -1076ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000001ull, -2100ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x8000000000000003ull, 0ll, -1, 0x8000000000000003ull, -1, 0x8000000000000003ull},
|
|
{0x8000000000000003ull, 52ll, -1, 0x8028000000000000ull, -1, 0x8028000000000000ull},
|
|
{0x8000000000000003ull, -1022ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000003ull, -1075ll, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x8000000000000003ull, 2047ll, -1, 0xfcd8000000000000ull, -1, 0xfcd8000000000000ull},
|
|
{0x8000000000000003ull, -9223372036854775807ll - 1, 0, 0x8000000000000000ull, 0, 0x8000000000000000ull},
|
|
{0x000fffffffffffffull, -1ll, -1, 0x0008000000000000ull, -1, 0x0008000000000000ull},
|
|
{0x000fffffffffffffull, 1023ll, -1, 0x3ffffffffffffffeull, -1, 0x3ffffffffffffffeull},
|
|
{0x000fffffffffffffull, -1074ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x000fffffffffffffull, 1024ll, -1, 0x400ffffffffffffeull, -1, 0x400ffffffffffffeull},
|
|
{0x000fffffffffffffull, 9223372036854775807ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x0010000000000000ull, 1ll, -1, 0x0020000000000000ull, -1, 0x0020000000000000ull},
|
|
{0x0010000000000000ull, -52ll, -1, 0x0000000000000001ull, -1, 0x0000000000000001ull},
|
|
{0x0010000000000000ull, -1023ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0010000000000000ull, -1076ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0010000000000000ull, -2100ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ff0000000000000ull, 0ll, -1, 0x3ff0000000000000ull, -1, 0x3ff0000000000000ull},
|
|
{0x3ff0000000000000ull, 52ll, -1, 0x4330000000000000ull, -1, 0x4330000000000000ull},
|
|
{0x3ff0000000000000ull, -1022ll, -1, 0x0010000000000000ull, -1, 0x0010000000000000ull},
|
|
{0x3ff0000000000000ull, -1075ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ff0000000000000ull, 2047ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x3ff0000000000000ull, -9223372036854775807ll - 1, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0xbff8000000000000ull, -1ll, -1, 0xbfe8000000000000ull, -1, 0xbfe8000000000000ull},
|
|
{0xbff8000000000000ull, 1023ll, -1, 0xffe8000000000000ull, -1, 0xffe8000000000000ull},
|
|
{0xbff8000000000000ull, -1074ll, -1, 0x8000000000000002ull, -1, 0x8000000000000002ull},
|
|
{0xbff8000000000000ull, 1024ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xbff8000000000000ull, 9223372036854775807ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0x3ff0000000000001ull, 1ll, -1, 0x4000000000000001ull, -1, 0x4000000000000001ull},
|
|
{0x3ff0000000000001ull, -52ll, -1, 0x3cb0000000000001ull, -1, 0x3cb0000000000001ull},
|
|
{0x3ff0000000000001ull, -1023ll, -1, 0x0008000000000000ull, -1, 0x0008000000000000ull},
|
|
{0x3ff0000000000001ull, -1076ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ff0000000000001ull, -2100ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ff8000000000000ull, 0ll, -1, 0x3ff8000000000000ull, -1, 0x3ff8000000000000ull},
|
|
{0x3ff8000000000000ull, 52ll, -1, 0x4338000000000000ull, -1, 0x4338000000000000ull},
|
|
{0x3ff8000000000000ull, -1022ll, -1, 0x0018000000000000ull, -1, 0x0018000000000000ull},
|
|
{0x3ff8000000000000ull, -1075ll, -1, 0x0000000000000001ull, -1, 0x0000000000000001ull},
|
|
{0x3ff8000000000000ull, 2047ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x3ff8000000000000ull, -9223372036854775807ll - 1, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ff4000000000000ull, -1ll, -1, 0x3fe4000000000000ull, -1, 0x3fe4000000000000ull},
|
|
{0x3ff4000000000000ull, 1023ll, -1, 0x7fe4000000000000ull, -1, 0x7fe4000000000000ull},
|
|
{0x3ff4000000000000ull, -1074ll, -1, 0x0000000000000001ull, -1, 0x0000000000000001ull},
|
|
{0x3ff4000000000000ull, 1024ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x3ff4000000000000ull, 9223372036854775807ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x3ffc000000000000ull, 1ll, -1, 0x400c000000000000ull, -1, 0x400c000000000000ull},
|
|
{0x3ffc000000000000ull, -52ll, -1, 0x3cbc000000000000ull, -1, 0x3cbc000000000000ull},
|
|
{0x3ffc000000000000ull, -1023ll, -1, 0x000e000000000000ull, -1, 0x000e000000000000ull},
|
|
{0x3ffc000000000000ull, -1076ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x3ffc000000000000ull, -2100ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x7fefffffffffffffull, 0ll, -1, 0x7fefffffffffffffull, -1, 0x7fefffffffffffffull},
|
|
{0x7fefffffffffffffull, 52ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7fefffffffffffffull, -1022ll, -1, 0x400fffffffffffffull, -1, 0x400fffffffffffffull},
|
|
{0x7fefffffffffffffull, -1075ll, -1, 0x3cbfffffffffffffull, -1, 0x3cbfffffffffffffull},
|
|
{0x7fefffffffffffffull, 2047ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7fefffffffffffffull, -9223372036854775807ll - 1, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0xffefffffffffffffull, -1ll, -1, 0xffdfffffffffffffull, -1, 0xffdfffffffffffffull},
|
|
{0xffefffffffffffffull, 1023ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xffefffffffffffffull, -1074ll, -1, 0xbccfffffffffffffull, -1, 0xbccfffffffffffffull},
|
|
{0xffefffffffffffffull, 1024ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xffefffffffffffffull, 9223372036854775807ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0x7ff0000000000000ull, 1ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7ff0000000000000ull, -52ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7ff0000000000000ull, -1023ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7ff0000000000000ull, -1076ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x7ff0000000000000ull, -2100ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0xfff0000000000000ull, 0ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xfff0000000000000ull, 52ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xfff0000000000000ull, -1022ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xfff0000000000000ull, -1075ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xfff0000000000000ull, 2047ll, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0xfff0000000000000ull, -9223372036854775807ll - 1, 1, 0xfff0000000000000ull, 1, 0xfff0000000000000ull},
|
|
{0x7ff8000000000000ull, -1ll, 2, 0x7ff8000000000000ull, 2, 0x7ff8000000000000ull},
|
|
{0x7ff8000000000000ull, 1023ll, 2, 0x7ff8000000000000ull, 2, 0x7ff8000000000000ull},
|
|
{0x7ff8000000000000ull, -1074ll, 2, 0x7ff8000000000000ull, 2, 0x7ff8000000000000ull},
|
|
{0x7ff8000000000000ull, 1024ll, 2, 0x7ff8000000000000ull, 2, 0x7ff8000000000000ull},
|
|
{0x7ff8000000000000ull, 9223372036854775807ll, 2, 0x7ff8000000000000ull, 2, 0x7ff8000000000000ull},
|
|
{0x7ff0000000000001ull, 1ll, 2, 0x7ff0000000000001ull, 2, 0x7ff0000000000001ull},
|
|
{0x7ff0000000000001ull, -52ll, 2, 0x7ff0000000000001ull, 2, 0x7ff0000000000001ull},
|
|
{0x7ff0000000000001ull, -1023ll, 2, 0x7ff0000000000001ull, 2, 0x7ff0000000000001ull},
|
|
{0x7ff0000000000001ull, -1076ll, 2, 0x7ff0000000000001ull, 2, 0x7ff0000000000001ull},
|
|
{0x7ff0000000000001ull, -2100ll, 2, 0x7ff0000000000001ull, 2, 0x7ff0000000000001ull},
|
|
{0x405edd2f1a9fbe77ull, 0ll, -1, 0x405edd2f1a9fbe77ull, -1, 0x405edd2f1a9fbe77ull},
|
|
{0x405edd2f1a9fbe77ull, 52ll, -1, 0x439edd2f1a9fbe77ull, -1, 0x439edd2f1a9fbe77ull},
|
|
{0x405edd2f1a9fbe77ull, -1022ll, -1, 0x007edd2f1a9fbe77ull, -1, 0x007edd2f1a9fbe77ull},
|
|
{0x405edd2f1a9fbe77ull, -1075ll, -1, 0x000000000000003eull, -1, 0x000000000000003eull},
|
|
{0x405edd2f1a9fbe77ull, 2047ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x405edd2f1a9fbe77ull, -9223372036854775807ll - 1, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0008000000000000ull, -1ll, -1, 0x0004000000000000ull, -1, 0x0004000000000000ull},
|
|
{0x0008000000000000ull, 1023ll, -1, 0x3ff0000000000000ull, -1, 0x3ff0000000000000ull},
|
|
{0x0008000000000000ull, -1074ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0008000000000000ull, 1024ll, -1, 0x4000000000000000ull, -1, 0x4000000000000000ull},
|
|
{0x0008000000000000ull, 9223372036854775807ll, 1, 0x7ff0000000000000ull, 1, 0x7ff0000000000000ull},
|
|
{0x0000000000000400ull, 1ll, -1, 0x0000000000000800ull, -1, 0x0000000000000800ull},
|
|
{0x0000000000000400ull, -52ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000400ull, -1023ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000400ull, -1076ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
{0x0000000000000400ull, -2100ll, 0, 0x0000000000000000ull, 0, 0x0000000000000000ull},
|
|
};
|
|
|
|
static const FloatScaleCase kFloatScales[] = {
|
|
{0x00000000u, 0ll, 0, 0x00000000u},
|
|
{0x00000000u, 23ll, 0, 0x00000000u},
|
|
{0x00000000u, -127ll, 0, 0x00000000u},
|
|
{0x00000000u, -151ll, 0, 0x00000000u},
|
|
{0x00000000u, 9223372036854775807ll, 0, 0x00000000u},
|
|
{0x80000000u, 1ll, 0, 0x80000000u},
|
|
{0x80000000u, 127ll, 0, 0x80000000u},
|
|
{0x80000000u, -149ll, 0, 0x80000000u},
|
|
{0x80000000u, 255ll, 0, 0x80000000u},
|
|
{0x80000000u, -9223372036854775807ll - 1, 0, 0x80000000u},
|
|
{0x00000001u, 23ll, -1, 0x00800000u},
|
|
{0x00000001u, -126ll, 0, 0x00000000u},
|
|
{0x00000001u, -151ll, 0, 0x00000000u},
|
|
{0x00000001u, -300ll, 0, 0x00000000u},
|
|
{0x80000003u, 1ll, -1, 0x80000006u},
|
|
{0x80000003u, -23ll, 0, 0x80000000u},
|
|
{0x80000003u, -149ll, 0, 0x80000000u},
|
|
{0x80000003u, 128ll, -1, 0xb5c00000u},
|
|
{0x80000003u, -9223372036854775807ll - 1, 0, 0x80000000u},
|
|
{0x007fffffu, -1ll, -1, 0x00400000u},
|
|
{0x007fffffu, -126ll, 0, 0x00000000u},
|
|
{0x007fffffu, -150ll, 0, 0x00000000u},
|
|
{0x007fffffu, -300ll, 0, 0x00000000u},
|
|
{0x00800000u, 0ll, -1, 0x00800000u},
|
|
{0x00800000u, -23ll, -1, 0x00000001u},
|
|
{0x00800000u, -127ll, 0, 0x00000000u},
|
|
{0x00800000u, 128ll, -1, 0x40800000u},
|
|
{0x00800000u, 9223372036854775807ll, 1, 0x7f800000u},
|
|
{0x3f800000u, -1ll, -1, 0x3f000000u},
|
|
{0x3f800000u, 127ll, -1, 0x7f000000u},
|
|
{0x3f800000u, -150ll, 0, 0x00000000u},
|
|
{0x3f800000u, 255ll, 1, 0x7f800000u},
|
|
{0xbfc00000u, 0ll, -1, 0xbfc00000u},
|
|
{0xbfc00000u, 23ll, -1, 0xcb400000u},
|
|
{0xbfc00000u, -127ll, -1, 0x80600000u},
|
|
{0xbfc00000u, -151ll, 0, 0x80000000u},
|
|
{0xbfc00000u, 9223372036854775807ll, 1, 0xff800000u},
|
|
{0x3f800001u, 1ll, -1, 0x40000001u},
|
|
{0x3f800001u, 127ll, -1, 0x7f000001u},
|
|
{0x3f800001u, -149ll, -1, 0x00000001u},
|
|
{0x3f800001u, 255ll, 1, 0x7f800000u},
|
|
{0x3f800001u, -9223372036854775807ll - 1, 0, 0x00000000u},
|
|
{0x3fc00000u, 23ll, -1, 0x4b400000u},
|
|
{0x3fc00000u, -126ll, -1, 0x00c00000u},
|
|
{0x3fc00000u, -151ll, 0, 0x00000000u},
|
|
{0x3fc00000u, -300ll, 0, 0x00000000u},
|
|
{0x3fa00000u, 1ll, -1, 0x40200000u},
|
|
{0x3fa00000u, -23ll, -1, 0x34200000u},
|
|
{0x3fa00000u, -149ll, -1, 0x00000001u},
|
|
{0x3fa00000u, 128ll, 1, 0x7f800000u},
|
|
{0x3fa00000u, -9223372036854775807ll - 1, 0, 0x00000000u},
|
|
{0x3fe00000u, -1ll, -1, 0x3f600000u},
|
|
{0x3fe00000u, -126ll, -1, 0x00e00000u},
|
|
{0x3fe00000u, -150ll, -1, 0x00000001u},
|
|
{0x3fe00000u, -300ll, 0, 0x00000000u},
|
|
{0x7f7fffffu, 0ll, -1, 0x7f7fffffu},
|
|
{0x7f7fffffu, -23ll, -1, 0x73ffffffu},
|
|
{0x7f7fffffu, -127ll, -1, 0x3fffffffu},
|
|
{0x7f7fffffu, 128ll, 1, 0x7f800000u},
|
|
{0x7f7fffffu, 9223372036854775807ll, 1, 0x7f800000u},
|
|
{0xff7fffffu, -1ll, -1, 0xfeffffffu},
|
|
{0xff7fffffu, 127ll, 1, 0xff800000u},
|
|
{0xff7fffffu, -150ll, -1, 0xb47fffffu},
|
|
{0xff7fffffu, 255ll, 1, 0xff800000u},
|
|
{0x7f800000u, 0ll, 1, 0x7f800000u},
|
|
{0x7f800000u, 23ll, 1, 0x7f800000u},
|
|
{0x7f800000u, -127ll, 1, 0x7f800000u},
|
|
{0x7f800000u, -151ll, 1, 0x7f800000u},
|
|
{0x7f800000u, 9223372036854775807ll, 1, 0x7f800000u},
|
|
{0xff800000u, 1ll, 1, 0xff800000u},
|
|
{0xff800000u, 127ll, 1, 0xff800000u},
|
|
{0xff800000u, -149ll, 1, 0xff800000u},
|
|
{0xff800000u, 255ll, 1, 0xff800000u},
|
|
{0xff800000u, -9223372036854775807ll - 1, 1, 0xff800000u},
|
|
{0x7fc00000u, 23ll, 2, 0x7fc00000u},
|
|
{0x7fc00000u, -126ll, 2, 0x7fc00000u},
|
|
{0x7fc00000u, -151ll, 2, 0x7fc00000u},
|
|
{0x7fc00000u, -300ll, 2, 0x7fc00000u},
|
|
{0x7f800001u, 1ll, 2, 0x7f800001u},
|
|
{0x7f800001u, -23ll, 2, 0x7f800001u},
|
|
{0x7f800001u, -149ll, 2, 0x7f800001u},
|
|
{0x7f800001u, 128ll, 2, 0x7f800001u},
|
|
{0x7f800001u, -9223372036854775807ll - 1, 2, 0x7f800001u},
|
|
{0x42f6e979u, -1ll, -1, 0x4276e979u},
|
|
{0x42f6e979u, -126ll, -1, 0x03f6e979u},
|
|
{0x42f6e979u, -150ll, -1, 0x0000003eu},
|
|
{0x42f6e979u, -300ll, 0, 0x00000000u},
|
|
{0x00400000u, 0ll, -1, 0x00400000u},
|
|
{0x00400000u, -23ll, 0, 0x00000000u},
|
|
{0x00400000u, -127ll, 0, 0x00000000u},
|
|
{0x00400000u, 128ll, -1, 0x40000000u},
|
|
{0x00400000u, 9223372036854775807ll, 1, 0x7f800000u},
|
|
{0x00000400u, -1ll, -1, 0x00000200u},
|
|
{0x00000400u, 127ll, -1, 0x39800000u},
|
|
{0x00000400u, -150ll, 0, 0x00000000u},
|
|
{0x00000400u, 255ll, -1, 0x79800000u},
|
|
};
|
|
|
|
static const UnscaleCase kUnscales[] = {
|
|
{0x0000000000000000ull, 0, 0, 0x0000000000000000ull, 0, 0, 0x0000000000000000ull},
|
|
{0x8000000000000000ull, 0, 0, 0x8000000000000000ull, 0, 0, 0x8000000000000000ull},
|
|
{0x0000000000000001ull, -1, -1073, 0x3fe0000000000000ull, -1, -1073, 0x3fe0000000000000ull},
|
|
{0x8000000000000003ull, -1, -1072, 0xbfe8000000000000ull, -1, -1072, 0xbfe8000000000000ull},
|
|
{0x000fffffffffffffull, -1, -1022, 0x3feffffffffffffeull, -1, -1022, 0x3feffffffffffffeull},
|
|
{0x0010000000000000ull, -1, -1021, 0x3fe0000000000000ull, -1, -1021, 0x3fe0000000000000ull},
|
|
{0x3ff0000000000000ull, -1, 1, 0x3fe0000000000000ull, -1, 1, 0x3fe0000000000000ull},
|
|
{0xbff8000000000000ull, -1, 1, 0xbfe8000000000000ull, -1, 1, 0xbfe8000000000000ull},
|
|
{0x3ff0000000000001ull, -1, 1, 0x3fe0000000000001ull, -1, 1, 0x3fe0000000000001ull},
|
|
{0x3ff8000000000000ull, -1, 1, 0x3fe8000000000000ull, -1, 1, 0x3fe8000000000000ull},
|
|
{0x3ff4000000000000ull, -1, 1, 0x3fe4000000000000ull, -1, 1, 0x3fe4000000000000ull},
|
|
{0x3ffc000000000000ull, -1, 1, 0x3fec000000000000ull, -1, 1, 0x3fec000000000000ull},
|
|
{0x7fefffffffffffffull, -1, 1024, 0x3fefffffffffffffull, -1, 1024, 0x3fefffffffffffffull},
|
|
{0xffefffffffffffffull, -1, 1024, 0xbfefffffffffffffull, -1, 1024, 0xbfefffffffffffffull},
|
|
{0x7ff0000000000000ull, 1, 0, 0x7ff0000000000000ull, 1, 0, 0x7ff0000000000000ull},
|
|
{0xfff0000000000000ull, 1, 0, 0xfff0000000000000ull, 1, 0, 0xfff0000000000000ull},
|
|
{0x7ff8000000000000ull, 2, 0, 0x7ff8000000000000ull, 2, 0, 0x7ff8000000000000ull},
|
|
{0x7ff0000000000001ull, 2, 0, 0x7ff0000000000001ull, 2, 0, 0x7ff0000000000001ull},
|
|
{0x405edd2f1a9fbe77ull, -1, 7, 0x3feedd2f1a9fbe77ull, -1, 7, 0x3feedd2f1a9fbe77ull},
|
|
{0x0008000000000000ull, -1, -1022, 0x3fe0000000000000ull, -1, -1022, 0x3fe0000000000000ull},
|
|
{0x0000000000000400ull, -1, -1063, 0x3fe0000000000000ull, -1, -1063, 0x3fe0000000000000ull},
|
|
};
|
|
|
|
static const FloatUnscaleCase kFloatUnscales[] = {
|
|
{0x00000000u, 0, 0, 0x00000000u},
|
|
{0x80000000u, 0, 0, 0x80000000u},
|
|
{0x00000001u, -1, -148, 0x3f000000u},
|
|
{0x80000003u, -1, -147, 0xbf400000u},
|
|
{0x007fffffu, -1, -126, 0x3f7ffffeu},
|
|
{0x00800000u, -1, -125, 0x3f000000u},
|
|
{0x3f800000u, -1, 1, 0x3f000000u},
|
|
{0xbfc00000u, -1, 1, 0xbf400000u},
|
|
{0x3f800001u, -1, 1, 0x3f000001u},
|
|
{0x3fc00000u, -1, 1, 0x3f400000u},
|
|
{0x3fa00000u, -1, 1, 0x3f200000u},
|
|
{0x3fe00000u, -1, 1, 0x3f600000u},
|
|
{0x7f7fffffu, -1, 128, 0x3f7fffffu},
|
|
{0xff7fffffu, -1, 128, 0xbf7fffffu},
|
|
{0x7f800000u, 1, 0, 0x7f800000u},
|
|
{0xff800000u, 1, 0, 0xff800000u},
|
|
{0x7fc00000u, 2, 0, 0x7fc00000u},
|
|
{0x7f800001u, 2, 0, 0x7f800001u},
|
|
{0x42f6e979u, -1, 7, 0x3f76e979u},
|
|
{0x00400000u, -1, -126, 0x3f000000u},
|
|
{0x00000400u, -1, -138, 0x3f000000u},
|
|
};
|
|
|
|
int main() {
|
|
for (const auto& c : kScales) {
|
|
double value = std::bit_cast<double>(c.input);
|
|
Require(_ZNSt8__sce_v27_DscaleEPdl_nid_postfix(&value, c.exponent) == c.code && std::bit_cast<std::uint64_t>(value) == c.result);
|
|
value = std::bit_cast<double>(c.input);
|
|
Require(_ZNSt8__sce_v28_LDscaleEPel_nid_postfix(&value, c.exponent) == c.extendedCode && std::bit_cast<std::uint64_t>(value) == c.extendedResult);
|
|
}
|
|
for (const auto& c : kFloatScales) {
|
|
float value = std::bit_cast<float>(c.input);
|
|
Require(_ZNSt8__sce_v28_FDscaleEPfl_nid_postfix(&value, c.exponent) == c.code && std::bit_cast<std::uint32_t>(value) == c.result);
|
|
}
|
|
for (const auto& c : kUnscales) {
|
|
double value = std::bit_cast<double>(c.input);
|
|
short exponent = 77;
|
|
Require(_ZNSt8__sce_v29_DunscaleEPsPd_nid_postfix(&exponent, &value) == c.code && exponent == c.exponent && std::bit_cast<std::uint64_t>(value) == c.result);
|
|
value = std::bit_cast<double>(c.input);
|
|
exponent = 77;
|
|
Require(_ZNSt8__sce_v210_LDunscaleEPsPe_nid_postfix(&exponent, &value) == c.extendedCode && exponent == c.extendedExponent && std::bit_cast<std::uint64_t>(value) == c.extendedResult);
|
|
}
|
|
for (const auto& c : kFloatUnscales) {
|
|
float value = std::bit_cast<float>(c.input);
|
|
short exponent = 77;
|
|
Require(_ZNSt8__sce_v210_FDunscaleEPsPf_nid_postfix(&exponent, &value) == c.code && exponent == c.exponent && std::bit_cast<std::uint32_t>(value) == c.result);
|
|
}
|
|
}
|