https://git.reactos.org/?p=reactos.git;a=commitdiff;h=99ba98468f468be8c9e25e...
commit 99ba98468f468be8c9e25eb94e184e363cc62100 Author: Roman Masanin 36927roma@gmail.com AuthorDate: Tue Jul 27 00:31:29 2021 +0300 Commit: Stanislav Motylkov x86corez@gmail.com CommitDate: Fri Jul 30 14:20:23 2021 +0300
[CRT_APITEST] Add tests for __dtoi64/dtou64/stoi64/stou64 on ARM (#3848)
CORE-17703 CORE-17604 --- modules/rostests/apitests/crt/__fto64.c | 198 +++++++++++++++++++++ .../rostests/apitests/crt/msvcrt_crt_apitest.cmake | 1 + modules/rostests/apitests/crt/testlist.c | 2 + 3 files changed, 201 insertions(+)
diff --git a/modules/rostests/apitests/crt/__fto64.c b/modules/rostests/apitests/crt/__fto64.c new file mode 100644 index 00000000000..9b958aff1d2 --- /dev/null +++ b/modules/rostests/apitests/crt/__fto64.c @@ -0,0 +1,198 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Tests for __dtoi64/dtou64/stoi64/stou64 on ARM + * COPYRIGHT: Copyright 2021 Roman Masanin 36927roma@gmail.com + */ + +#include <apitest.h> + +typedef struct _DTOI64_TEST_DATA +{ + union + { + double value; + unsigned long long raw; + } given; + long long expected; +} DTOI64_TEST_DATA; + +typedef struct _DTOU64_TEST_DATA +{ + union + { + double value; + unsigned long long raw; + } given; + unsigned long long expected; +} DTOU64_TEST_DATA; + +typedef struct _STOI64_TEST_DATA +{ + union + { + float value; + unsigned int raw; + } given; + long long expected; +} STOI64_TEST_DATA; + +typedef struct _STOU64_TEST_DATA +{ + union + { + float value; + unsigned int raw; + } given; + unsigned long long expected; +} STOU64_TEST_DATA; + +START_TEST(__fto64) +{ + DTOI64_TEST_DATA dtoi64[] = + { + { 1383034209.0, 1383034209LL }, /* test 32bit number */ + { -1383034209.0, -1383034209LL }, /* test negative 32bit number */ + { 1383034209.1383034209, 1383034209LL }, /* test rounding 32bit */ + { -1383034209.1383034209, -1383034209LL }, /* test negative rounding 32bit */ + { 1383034209.83034209, 1383034209LL }, /* test rounding up 32bit */ + { -1383034209.83034209, -1383034209LL }, /* test negative rounding up 32bit */ + { 354056757614.0, 354056757614LL }, /* test 64bit int */ + { -354056757614.0, -354056757614LL }, /* test negative 64bit int */ + { 354056757614.83034209, 354056757614LL }, /* test 64bit rounding */ + { 18445937028656326656.0, 0x8000000000000000LL }, /* test unsigned 64bit */ + { 1.0000001, 1LL }, + { 0.0000001, 0LL }, + { -0.0000001, 0LL }, + + /* special values tests */ + + { -0.0, 0LL }, /* test -0 */ + { +0.0, 0LL }, /* test +0 */ + { .given.raw = 0x7FF0000000000000ULL, 0x8000000000000000LL }, /* test +INFINITY */ + { .given.raw = 0xFFF0000000000000ULL, 0x8000000000000000LL }, /* test -INFINITY */ + { .given.raw = 0x7FF0000000000001ULL, 0x8000000000000000LL }, /* test NaN1 */ + { .given.raw = 0x7FF8000000000001ULL, 0x8000000000000000LL }, /* test NaN2 */ + { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000LL }, /* test NaN3 */ + { .given.raw = 0x7FF80000000000F1ULL, 0x8000000000000000LL }, /* test NaN4 */ + }; + DTOU64_TEST_DATA dtou64[] = + { + { 1383034209.0, 1383034209ULL }, /* test 32bit number */ + { -1383034209.0, 18446744073709551615ULL }, /* test negative 32bit number */ + { 1383034209.1383034209, 1383034209ULL }, /* test rounding 32bit */ + { -1383034209.1383034209, 18446744073709551615ULL }, /* test negative rounding 32bit */ + { 1383034209.83034209, 1383034209ULL }, /* test rounding up 32bit */ + { -1383034209.83034209, 18446744073709551615ULL }, /* test negative rounding up 32bit */ + { 354056757614.0, 354056757614ULL }, /* test 64bit int */ + { -354056757614.0, 18446744073709551615ULL }, /* test negative 64bit int */ + { 354056757614.83034209, 354056757614ULL }, /* test 64bit rounding */ + { 18445937028656326656.0, 18445937028656326656ULL }, /* test unsigned 64bit */ + { 1.0000001, 1ULL }, + { 0.0000001, 0ULL }, + { -0.0000001, 0ULL }, + + /* special values tests */ + + { -0.0, 0ULL }, /* test -0 */ + { +0.0, 0ULL }, /* test +0 */ + { .given.raw = 0x7FF0000000000000ULL, 18446744073709551615ULL }, /* test +INFINITY */ + { .given.raw = 0xFFF0000000000000ULL, 18446744073709551615ULL }, /* test -INFINITY */ + { .given.raw = 0x7FF0000000000001ULL, 18446744073709551615ULL }, /* test NaN1 */ + { .given.raw = 0x7FF8000000000001ULL, 18446744073709551615ULL }, /* test NaN2 */ + { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 18446744073709551615ULL }, /* test NaN3 */ + { .given.raw = 0x7FF80000000000F1ULL, 18446744073709551615ULL }, /* test NaN4 */ + }; + STOI64_TEST_DATA stoi64[] = + { + { 1383034.0f, 1383034LL }, /* test 32bit number */ + { -1383034.0f, -1383034LL }, /* test negative 32bit number */ + { 1383034.1383034209f, 1383034LL }, /* test rounding 32bit */ + { -1383034.1383034209f, -1383034LL }, /* test negative rounding 32bit */ + { 1383034.83034209f, 1383034LL }, /* test rounding up 32bit */ + { -1383034.83034209f, -1383034LL }, /* test negative rounding up 32bit */ + { 354056765440.0f, 354056765440LL }, /* test 64bit int */ + { -354056765440.0f, -354056765440LL }, /* test negative 64bit int */ + { 3000000.75f, 3000000LL }, /* test 64bit rounding */ + { 18445937032174764032.0f, 0x8000000000000000LL }, /* test unsigned 64bit */ + { 1.0000001f, 1LL }, + { 0.0000001f, 0LL }, + { -0.0000001f, 0LL }, + + /* special values tests */ + + { -0.0f, 0LL }, /* test -0 */ + { +0.0f, 0LL }, /* test +0 */ + { .given.raw = 0x7F800000U, 0x8000000000000000LL }, /* test +INFINITY */ + { .given.raw = 0xFF800000U, 0x8000000000000000LL }, /* test -INFINITY */ + { .given.raw = 0x7F800001U, 0x8000000000000000LL }, /* test NaN1 */ + { .given.raw = 0x7FC00001U, 0x8000000000000000LL }, /* test NaN2 */ + { .given.raw = 0x7F8FFFFFU, 0x8000000000000000LL }, /* test NaN3 */ + { .given.raw = 0x7F8000F1U, 0x8000000000000000LL }, /* test NaN4 */ + }; + STOU64_TEST_DATA stou64[] = + { + { 1383034.0f, 1383034ULL }, /* test 32bit number */ + { -1383034.0f, 18446744073709551615ULL }, /* test negative 32bit number */ + { 1383034.1383034209f, 1383034ULL }, /* test rounding 32bit */ + { -1383034.1383034209f, 18446744073709551615ULL }, /* test negative rounding 32bit */ + { 1383034.83034209f, 1383034ULL }, /* test rounding up 32bit */ + { -1383034.83034209f, 18446744073709551615ULL }, /* test negative rounding up 32bit */ + { 354056765440.0f, 354056765440ULL }, /* test 64bit int */ + { -354056765440.0f, 18446744073709551615ULL }, /* test negative 64bit int */ + { 3000000.75f, 3000000ULL }, /* test 64bit rounding */ + { 18445937032174764032.0f, 18445937032174764032ULL }, /* test unsigned 64bit */ + { 1.0000001f, 1ULL }, + { 0.0000001f, 0ULL }, + { -0.0000001f, 0ULL }, + + /* special values tests */ + + { -0.0f, 0LL }, /* test -0 */ + { +0.0f, 0LL }, /* test +0 */ + {.given.raw = 0x7F800000U, 18446744073709551615ULL }, /* test +INFINITY */ + {.given.raw = 0xFF800000U, 18446744073709551615ULL }, /* test -INFINITY */ + {.given.raw = 0x7F800001U, 18446744073709551615ULL }, /* test NaN1 */ + {.given.raw = 0x7FC00001U, 18446744073709551615ULL }, /* test NaN2 */ + {.given.raw = 0x7F8FFFFFU, 18446744073709551615ULL }, /* test NaN3 */ + {.given.raw = 0x7F8000F1U, 18446744073709551615ULL }, /* test NaN4 */ + }; + + unsigned int i; + + for (i = 0; i < _countof(dtoi64); ++i) + { + long long actual; + + actual = (long long)dtoi64[i].given.value; + ok(actual == dtoi64[i].expected, "(dtoi64) %d: Expected %lld, but %lf -> %lld\n", + i, dtoi64[i].expected, dtoi64[i].given.value, actual); + } + + for (i = 0; i < _countof(dtou64); ++i) + { + unsigned long long actual; + + actual = (unsigned long long)dtou64[i].given.value; + ok(actual == dtou64[i].expected, "(dtou64) %d: Expected %llu, but %lf -> %llu\n", + i, dtou64[i].expected, dtou64[i].given.value, actual); + } + + for (i = 0; i < _countof(stoi64); ++i) + { + long long actual; + + actual = (long long)stoi64[i].given.value; + ok(actual == stoi64[i].expected, "(stoi64) %d: Expected %lld, but %f -> %lld\n", + i, stoi64[i].expected, stoi64[i].given.value, actual); + } + + for (i = 0; i < _countof(stou64); ++i) + { + unsigned long long actual; + + actual = (unsigned long long)stou64[i].given.value; + ok(actual == stou64[i].expected, "(stou64) %d: Expected %llu, but %f -> %llu\n", + i, stou64[i].expected, stou64[i].given.value, actual); + } +} diff --git a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake index 2375f59472a..5c5bb587fbb 100644 --- a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake +++ b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake @@ -1374,6 +1374,7 @@ elseif(ARCH STREQUAL "amd64") elseif(ARCH STREQUAL "arm") list(APPEND SOURCE_MSVCRT __rt_div.c + __fto64.c ) endif()
diff --git a/modules/rostests/apitests/crt/testlist.c b/modules/rostests/apitests/crt/testlist.c index ca76ebbf593..4c36c86eee4 100644 --- a/modules/rostests/apitests/crt/testlist.c +++ b/modules/rostests/apitests/crt/testlist.c @@ -5,6 +5,7 @@
#if defined(TEST_MSVCRT) extern void func___rt_div(void); +extern void func___fto64(void); extern void func__vscprintf(void); extern void func__vscwprintf(void); extern void func_atexit(void); @@ -62,6 +63,7 @@ const struct test winetest_testlist[] = { "__getmainargs", func___getmainargs }, #elif defined(_M_ARM) { "__rt_div", func___rt_div }, + { "__fto64", func___fto64 }, #endif { "_vscprintf", func__vscprintf }, { "_vscwprintf", func__vscwprintf },