From: Paul Floyd Date: Mon, 1 Jul 2024 06:24:39 +0000 (+0200) Subject: arm64 regtest: add 2 tests for bug489338 X-Git-Tag: VALGRIND_3_24_0~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=582d38aa79310b06e9a5a51d3fb32a05b2a10b5b;p=thirdparty%2Fvalgrind.git arm64 regtest: add 2 tests for bug489338 --- diff --git a/.gitignore b/.gitignore index ae366c544..33e71c133 100644 --- a/.gitignore +++ b/.gitignore @@ -1810,9 +1810,11 @@ /none/tests/arm64/allexec /none/tests/arm64/atomics_v81 /none/tests/arm64/bug484426 +/none/tests/arm64/bug489338 /none/tests/arm64/crc32 /none/tests/arm64/cvtf_imm /none/tests/arm64/dc_cvax +/none/tests/arm64/fcvta_s_u /none/tests/arm64/fmadd_sub /none/tests/arm64/fp_and_simd /none/tests/arm64/fp_and_simd_v82 diff --git a/NEWS b/NEWS index d860bd07b..87aa1bd7d 100644 --- a/NEWS +++ b/NEWS @@ -53,6 +53,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 488441 Add tests for --track-fds=yes --xml=yes and fd suppression tests 489040 massif trace change to show the location increasing the stack 489088 Valgrind throws unhandled instruction bytes: 0xC5 0x79 0xD6 0xE0 0xC5 +489338 arm64: Instruction fcvtas should round 322.5 to 323, but result is 322. To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX diff --git a/none/tests/arm64/Makefile.am b/none/tests/arm64/Makefile.am index 071cce005..8e57118e3 100644 --- a/none/tests/arm64/Makefile.am +++ b/none/tests/arm64/Makefile.am @@ -5,9 +5,11 @@ dist_noinst_SCRIPTS = filter_stderr filter_nan EXTRA_DIST = \ bug484426.stdout.exp bug484426.stderr.exp bug484426.vgtest \ - crc32.stdout.exp crc32.stderr.exp crc32.vgtest \ - cvtf_imm.stdout.exp cvtf_imm.stderr.exp cvtf_imm.vgtest \ - dc_cvax.vgtest dc_cvax.stderr.exp \ + bug489338.stdout.exp bug489338.stderr.exp bug489338.vgtest \ + crc32.stdout.exp crc32.stderr.exp crc32.vgtest \ + cvtf_imm.stdout.exp cvtf_imm.stderr.exp cvtf_imm.vgtest \ + dc_cvax.vgtest dc_cvax.stderr.exp \ + fcvta_s_u.vgtest fcvta_s_u.stderr.exp \ fp_and_simd.stdout.exp fp_and_simd.stderr.exp fp_and_simd.vgtest \ frinta_frintn.stderr.exp frinta_frintn.vgtest \ integer.stdout.exp integer.stderr.exp integer.vgtest \ @@ -16,7 +18,7 @@ EXTRA_DIST = \ atomics_v81.stdout.exp atomics_v81.stderr.exp atomics_v81.vgtest \ simd_v81.stdout.exp simd_v81.stderr.exp simd_v81.vgtest \ simd_dotprod.stdout.exp simd_dotprod.stderr.exp simd_dotprod.vgtest \ - fmadd_sub.stdout.exp fmadd_sub.stderr.exp fmadd_sub.vgtest \ + fmadd_sub.stdout.exp fmadd_sub.stderr.exp fmadd_sub.vgtest \ fp_and_simd_v82.stdout.exp fp_and_simd_v82.stderr.exp \ fp_and_simd_v82.vgtest \ ldxp_stxp_basisimpl.stdout.exp ldxp_stxp_basisimpl.stderr.exp \ @@ -28,6 +30,7 @@ EXTRA_DIST = \ check_PROGRAMS = \ allexec \ bug484426 \ + bug489338 \ cvtf_imm \ dc_cvax \ fp_and_simd \ @@ -53,7 +56,7 @@ if HAVE_SHA3 endif if HAVE_CXX17 - check_PROGRAMS += frinta_frintn + check_PROGRAMS += fcvta_s_u frinta_frintn endif if BUILD_ARMV82_DOTPROD_TESTS @@ -78,6 +81,8 @@ fp_and_simd_v82_CFLAGS = $(AM_CFLAGS) -march=armv8.2-a+fp16+crypto # SHA-512 is not part of SHA-3, either as an algorithm or in Arm features, but # GCC lumps SHA-512 and SHA-3 extensions together as "sha3". sha512_v82_CFLAGS = $(AM_CFLAGS) -march=armv8.2-a+sha3 +fcvta_s_u_SOURCES = fcvta_s_u.cpp +fcvta_s_u_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 frinta_frintn_SOURCES = frinta_frintn.cpp frinta_frintn_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 integer_CFLAGS = $(AM_CFLAGS) -g -O0 -DTEST_BFM=0 diff --git a/none/tests/arm64/bug489338.c b/none/tests/arm64/bug489338.c new file mode 100644 index 000000000..481d74464 --- /dev/null +++ b/none/tests/arm64/bug489338.c @@ -0,0 +1,33 @@ +/* +cat fp-valgrind-test.c +gcc -g -O2 fp-valgrind-test.c -o fp-valgrind-test +./fp-valgrind-test +valgrind ./fp-valgrind-test +gdb -q --args ./fp-valgrind-test +disassemble main +q +*/ + +#include +#include + +double value(int s) +{ + switch (s) { + case 0: return -322.500001; break; + case 1: return -322.5; break; + case 2: return -322.499999; break; + case 3: return 322.499999; break; + case 4: return 322.5; break; + default: return 322.500001; break; + } +} + +int main() +{ + for (int i = 0; i < 6; i++) { + volatile double a = value(i); + int b = (int)round(a); + printf("i=%d a=%f a=0x%llx b=%d\n", i, a, *(long long unsigned int*)&a, b); + } +} diff --git a/none/tests/arm64/bug489338.stderr.exp b/none/tests/arm64/bug489338.stderr.exp new file mode 100644 index 000000000..e69de29bb diff --git a/none/tests/arm64/bug489338.stdout.exp b/none/tests/arm64/bug489338.stdout.exp new file mode 100644 index 000000000..a26feaaf1 --- /dev/null +++ b/none/tests/arm64/bug489338.stdout.exp @@ -0,0 +1,6 @@ +i=0 a=-322.500001 a=0xc0742800010c6f7a b=-323 +i=1 a=-322.500000 a=0xc074280000000000 b=-323 +i=2 a=-322.499999 a=0xc07427fffef39086 b=-322 +i=3 a=322.499999 a=0x407427fffef39086 b=322 +i=4 a=322.500000 a=0x4074280000000000 b=323 +i=5 a=322.500001 a=0x40742800010c6f7a b=323 diff --git a/none/tests/arm64/bug489338.vgtest b/none/tests/arm64/bug489338.vgtest new file mode 100644 index 000000000..80f0b3943 --- /dev/null +++ b/none/tests/arm64/bug489338.vgtest @@ -0,0 +1,2 @@ +prog: bug489338 +vgopts: -q diff --git a/none/tests/arm64/fcvta_s_u.cpp b/none/tests/arm64/fcvta_s_u.cpp new file mode 100644 index 000000000..4bd5681ed --- /dev/null +++ b/none/tests/arm64/fcvta_s_u.cpp @@ -0,0 +1,178 @@ +/* + * An extra testcase for bug489338 + * The testcase supplied only tests op-codes used by round() + */ + +#include +#include +#include + +template +void test_fcvtas(T input, U expected) +{ + U result; + U* rp(&result); + T* ip(&input); + if constexpr (std::is_same_v == true) + { + if constexpr (std::is_same_v == true) + { + // double to long + __asm__ __volatile__( + "ldr d0, [%1];\n" + "fcvtas x0, d0;\n" + "str x0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "d0", "x0"); + assert(result == expected); + } + else + { + // double to int + __asm__ __volatile__( + "ldr d0, [%1];\n" + "fcvtas w0, d0;\n" + "str w0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "d0", "x0"); + assert(result == expected); + } + } + else + { + if constexpr (std::is_same_v == true) + { + // float to long + __asm__ __volatile__( + "ldr s0, [%1];\n" + "fcvtas x0, s0;\n" + "str x0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "s0", "x0"); + assert(result == expected); + } + else + { + // float to int + __asm__ __volatile__( + "ldr s0, [%1];\n" + "fcvtas w0, s0;\n" + "str w0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "s0", "w0"); + assert(result == expected); + } + } +} + +template +void test_fcvtau(T input, U expected) +{ + U result; + U* rp(&result); + T* ip(&input); + if constexpr (std::is_same_v == true) + { + if constexpr (std::is_same_v == true) + { + // double to unsigned long + __asm__ __volatile__( + "ldr d0, [%1];\n" + "fcvtau x0, d0;\n" + "str x0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "d0", "x0"); + assert(result == expected); + } + else + { + // double to unsigned int + __asm__ __volatile__( + "ldr d0, [%1];\n" + "fcvtau w0, d0;\n" + "str w0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "d0", "w0"); + assert(result == expected); + } + } + else + { + if constexpr (std::is_same_v == true) + { + // float to unsigned long + __asm__ __volatile__( + "ldr s0, [%1];\n" + "fcvtau x0, s0;\n" + "str x0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "s0", "x0"); + assert(result == expected); + } + else + { + // float to unsigned int + __asm__ __volatile__( + "ldr s0, [%1];\n" + "fcvtau w0, s0;\n" + "str w0, [%0];\n" + : "+rm" (rp) + : "r" (ip) + : "memory", "s0", "w0"); + assert(result == expected); + } + } +} + + +int main() +{ + // round "away from zero" + test_fcvtas(1.5, 2L); + test_fcvtas(2.5, 3L); + test_fcvtas(-1.5, -2L); + test_fcvtas(-2.5, -3L); + test_fcvtas(0.0, 0L); + + test_fcvtas(1.5, 2); + test_fcvtas(2.5, 3); + test_fcvtas(-1.5, -2); + test_fcvtas(-2.5, -3); + test_fcvtas(0.0, 0); + + test_fcvtas(1.5F, 2L); + test_fcvtas(2.5F, 3L); + test_fcvtas(-1.5F, -2L); + test_fcvtas(-2.5F, -3L); + test_fcvtas(0.0F, 0L); + + test_fcvtas(1.5F, 2); + test_fcvtas(2.5F, 3); + test_fcvtas(-1.5F, -2); + test_fcvtas(-2.5F, -3); + test_fcvtas(0.0F, 0); + + test_fcvtau(1.5, 2UL); + test_fcvtau(2.5, 3UL); + test_fcvtau(0.0, 0UL); + + test_fcvtau(1.5, 2U); + test_fcvtau(2.5, 3U); + test_fcvtau(0.0, 0U); + + test_fcvtau(1.5F, 2UL); + test_fcvtau(2.5F, 3UL); + test_fcvtau(0.0F, 0UL); + + test_fcvtau(1.5F, 2U); + test_fcvtau(2.5F, 3U); + test_fcvtau(0.0F, 0U); +} + diff --git a/none/tests/arm64/fcvta_s_u.stderr.exp b/none/tests/arm64/fcvta_s_u.stderr.exp new file mode 100644 index 000000000..e69de29bb diff --git a/none/tests/arm64/fcvta_s_u.vgtest b/none/tests/arm64/fcvta_s_u.vgtest new file mode 100644 index 000000000..f3454b54e --- /dev/null +++ b/none/tests/arm64/fcvta_s_u.vgtest @@ -0,0 +1,2 @@ +prog: fcvta_s_u +vgopts: -q