/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
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
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 \
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 \
check_PROGRAMS = \
allexec \
bug484426 \
+ bug489338 \
cvtf_imm \
dc_cvax \
fp_and_simd \
endif
if HAVE_CXX17
- check_PROGRAMS += frinta_frintn
+ check_PROGRAMS += fcvta_s_u frinta_frintn
endif
if BUILD_ARMV82_DOTPROD_TESTS
# 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
--- /dev/null
+/*
+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 <stdio.h>
+#include <math.h>
+
+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);
+ }
+}
--- /dev/null
+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
--- /dev/null
+prog: bug489338
+vgopts: -q
--- /dev/null
+/*
+ * An extra testcase for bug489338
+ * The testcase supplied only tests op-codes used by round()
+ */
+
+#include <type_traits>
+#include <cassert>
+#include <iostream>
+
+template<typename T, typename U>
+void test_fcvtas(T input, U expected)
+{
+ U result;
+ U* rp(&result);
+ T* ip(&input);
+ if constexpr (std::is_same_v<double, T> == true)
+ {
+ if constexpr (std::is_same_v<long, U> == 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<long, U> == 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<typename T, typename U>
+void test_fcvtau(T input, U expected)
+{
+ U result;
+ U* rp(&result);
+ T* ip(&input);
+ if constexpr (std::is_same_v<double, T> == true)
+ {
+ if constexpr (std::is_same_v<unsigned long, U> == 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<unsigned long, U> == 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);
+}
+
--- /dev/null
+prog: fcvta_s_u
+vgopts: -q