From: Julian Seward Date: Wed, 6 Mar 2013 08:35:12 +0000 (+0000) Subject: Add test cases for VCVT.{S,U}32.F64 D[d], D[d], #frac_bits. X-Git-Tag: svn/VALGRIND_3_9_0~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3525bf5b27675b3674e22c55e8e78528d3a0dc8a;p=thirdparty%2Fvalgrind.git Add test cases for VCVT.{S,U}32.F64 D[d], D[d], #frac_bits. Pertains to #315738. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13313 --- diff --git a/none/tests/arm/vcvt_fixed_float_VFP.c b/none/tests/arm/vcvt_fixed_float_VFP.c index d9aaeb5ee6..5d988648b7 100644 --- a/none/tests/arm/vcvt_fixed_float_VFP.c +++ b/none/tests/arm/vcvt_fixed_float_VFP.c @@ -2,6 +2,8 @@ #include #include +typedef unsigned long long int ULong; + __attribute__((noinline)) float s32_to_f32_imm1(int x) { float y; @@ -130,9 +132,90 @@ void try_u32_to_f64 ( int x ) +__attribute__((noinline)) ULong f64_to_s32_imm1 ( double d ) +{ + double block[5]; + memset(block, 0x55, sizeof(block)); + block[1] = d; + __asm__ __volatile__( + "mov r8, %0" "\n\t" + "vldr d14, [r8, #8]" "\n\t" + "vcvt.s32.f64 d14,d14,#1" "\n\t" + "vstr d14, [r8,#24]" "\n\t" + : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" + ); + return *(ULong*)(&block[3]); +} + +__attribute__((noinline)) ULong f64_to_s32_imm32 ( double d ) +{ + double block[5]; + memset(block, 0x55, sizeof(block)); + block[1] = d; + __asm__ __volatile__( + "mov r8, %0" "\n\t" + "vldr d14, [r8, #8]" "\n\t" + "vcvt.s32.f64 d14,d14,#32" "\n\t" + "vstr d14, [r8,#24]" "\n\t" + : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" + ); + return *(ULong*)(&block[3]); +} + +void try_f64_to_s32 ( double d ) +{ + ULong res = f64_to_s32_imm32(d); + printf("f64_to_s32_imm32: %18.14e -> 0x%016llx\n", d, res); + res = f64_to_s32_imm1(d); + printf("f64_to_s32_imm1: %18.14e -> 0x%016llx\n", d, res); +} + + + +__attribute__((noinline)) ULong f64_to_u32_imm1 ( double d ) +{ + double block[5]; + memset(block, 0x55, sizeof(block)); + block[1] = d; + __asm__ __volatile__( + "mov r8, %0" "\n\t" + "vldr d14, [r8, #8]" "\n\t" + "vcvt.u32.f64 d14,d14,#1" "\n\t" + "vstr d14, [r8,#24]" "\n\t" + : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" + ); + return *(ULong*)(&block[3]); +} + +__attribute__((noinline)) ULong f64_to_u32_imm32 ( double d ) +{ + double block[5]; + memset(block, 0x55, sizeof(block)); + block[1] = d; + __asm__ __volatile__( + "mov r8, %0" "\n\t" + "vldr d14, [r8, #8]" "\n\t" + "vcvt.u32.f64 d14,d14,#32" "\n\t" + "vstr d14, [r8,#24]" "\n\t" + : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" + ); + return *(ULong*)(&block[3]); +} + +void try_f64_to_u32 ( double d ) +{ + ULong res = f64_to_u32_imm32(d); + printf("f64_to_u32_imm32: %18.14e -> 0x%016llx\n", d, res); + res = f64_to_u32_imm1(d); + printf("f64_to_u32_imm1: %18.14e -> 0x%016llx\n", d, res); +} + + + int main ( void ) { int i; + double d; try_s32_to_f32(0); try_s32_to_f32(1); @@ -188,5 +271,23 @@ int main ( void ) try_u32_to_f64(0xFFFFFFFE); try_u32_to_f64(0xFFFFFFFF); + printf("\n"); + try_f64_to_s32(0.0); + try_f64_to_s32(1.0); + try_f64_to_s32(-1.0); + try_f64_to_s32(0.0 / 0.0); + for (d = -100000.01; d < 100000.0; d += 10000.0) { + try_f64_to_s32(d); + } + + printf("\n"); + try_f64_to_u32(0.0); + try_f64_to_u32(1.0); + try_f64_to_u32(-1.0); + try_f64_to_u32(0.0 / 0.0); + for (d = -100000.01; d < 100000.0; d += 10000.0) { + try_f64_to_u32(d); + } + return 0; } diff --git a/none/tests/arm/vcvt_fixed_float_VFP.stdout.exp b/none/tests/arm/vcvt_fixed_float_VFP.stdout.exp index 92973d20d0..64e62af4c1 100644 --- a/none/tests/arm/vcvt_fixed_float_VFP.stdout.exp +++ b/none/tests/arm/vcvt_fixed_float_VFP.stdout.exp @@ -865,3 +865,105 @@ u32_to_f64_imm32: -2 -> 9.99999999534339e-01 u32_to_f64_imm1: -2 -> 2.14748364700000e+09 u32_to_f64_imm32: -1 -> 9.99999999767169e-01 u32_to_f64_imm1: -1 -> 2.14748364750000e+09 + +f64_to_s32_imm32: 0.00000000000000e+00 -> 0x0000000000000000 +f64_to_s32_imm1: 0.00000000000000e+00 -> 0x0000000000000000 +f64_to_s32_imm32: 1.00000000000000e+00 -> 0x000000007fffffff +f64_to_s32_imm1: 1.00000000000000e+00 -> 0x0000000000000002 +f64_to_s32_imm32: -1.00000000000000e+00 -> 0xffffffff80000000 +f64_to_s32_imm1: -1.00000000000000e+00 -> 0xfffffffffffffffe +f64_to_s32_imm32: nan -> 0x0000000000000000 +f64_to_s32_imm1: nan -> 0x0000000000000000 +f64_to_s32_imm32: -1.00000010000000e+05 -> 0xffffffff80000000 +f64_to_s32_imm1: -1.00000010000000e+05 -> 0xfffffffffffcf2c0 +f64_to_s32_imm32: -9.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -9.00000100000000e+04 -> 0xfffffffffffd40e0 +f64_to_s32_imm32: -8.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -8.00000100000000e+04 -> 0xfffffffffffd8f00 +f64_to_s32_imm32: -7.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -7.00000100000000e+04 -> 0xfffffffffffddd20 +f64_to_s32_imm32: -6.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -6.00000100000000e+04 -> 0xfffffffffffe2b40 +f64_to_s32_imm32: -5.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -5.00000100000000e+04 -> 0xfffffffffffe7960 +f64_to_s32_imm32: -4.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -4.00000100000000e+04 -> 0xfffffffffffec780 +f64_to_s32_imm32: -3.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -3.00000100000000e+04 -> 0xffffffffffff15a0 +f64_to_s32_imm32: -2.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -2.00000100000000e+04 -> 0xffffffffffff63c0 +f64_to_s32_imm32: -1.00000100000000e+04 -> 0xffffffff80000000 +f64_to_s32_imm1: -1.00000100000000e+04 -> 0xffffffffffffb1e0 +f64_to_s32_imm32: -9.99999999476131e-03 -> 0xfffffffffd70a3d8 +f64_to_s32_imm1: -9.99999999476131e-03 -> 0x0000000000000000 +f64_to_s32_imm32: 9.99999000000001e+03 -> 0x000000007fffffff +f64_to_s32_imm1: 9.99999000000001e+03 -> 0x0000000000004e1f +f64_to_s32_imm32: 1.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 1.99999900000000e+04 -> 0x0000000000009c3f +f64_to_s32_imm32: 2.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 2.99999900000000e+04 -> 0x000000000000ea5f +f64_to_s32_imm32: 3.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 3.99999900000000e+04 -> 0x000000000001387f +f64_to_s32_imm32: 4.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 4.99999900000000e+04 -> 0x000000000001869f +f64_to_s32_imm32: 5.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 5.99999900000000e+04 -> 0x000000000001d4bf +f64_to_s32_imm32: 6.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 6.99999900000000e+04 -> 0x00000000000222df +f64_to_s32_imm32: 7.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 7.99999900000000e+04 -> 0x00000000000270ff +f64_to_s32_imm32: 8.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 8.99999900000000e+04 -> 0x000000000002bf1f +f64_to_s32_imm32: 9.99999900000000e+04 -> 0x000000007fffffff +f64_to_s32_imm1: 9.99999900000000e+04 -> 0x0000000000030d3f + +f64_to_u32_imm32: 0.00000000000000e+00 -> 0x0000000000000000 +f64_to_u32_imm1: 0.00000000000000e+00 -> 0x0000000000000000 +f64_to_u32_imm32: 1.00000000000000e+00 -> 0x00000000ffffffff +f64_to_u32_imm1: 1.00000000000000e+00 -> 0x0000000000000002 +f64_to_u32_imm32: -1.00000000000000e+00 -> 0x0000000000000000 +f64_to_u32_imm1: -1.00000000000000e+00 -> 0x0000000000000000 +f64_to_u32_imm32: nan -> 0x0000000000000000 +f64_to_u32_imm1: nan -> 0x0000000000000000 +f64_to_u32_imm32: -1.00000010000000e+05 -> 0x0000000000000000 +f64_to_u32_imm1: -1.00000010000000e+05 -> 0x0000000000000000 +f64_to_u32_imm32: -9.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -9.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -8.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -8.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -7.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -7.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -6.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -6.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -5.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -5.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -4.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -4.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -3.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -3.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -2.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -2.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -1.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm1: -1.00000100000000e+04 -> 0x0000000000000000 +f64_to_u32_imm32: -9.99999999476131e-03 -> 0x0000000000000000 +f64_to_u32_imm1: -9.99999999476131e-03 -> 0x0000000000000000 +f64_to_u32_imm32: 9.99999000000001e+03 -> 0x00000000ffffffff +f64_to_u32_imm1: 9.99999000000001e+03 -> 0x0000000000004e1f +f64_to_u32_imm32: 1.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 1.99999900000000e+04 -> 0x0000000000009c3f +f64_to_u32_imm32: 2.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 2.99999900000000e+04 -> 0x000000000000ea5f +f64_to_u32_imm32: 3.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 3.99999900000000e+04 -> 0x000000000001387f +f64_to_u32_imm32: 4.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 4.99999900000000e+04 -> 0x000000000001869f +f64_to_u32_imm32: 5.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 5.99999900000000e+04 -> 0x000000000001d4bf +f64_to_u32_imm32: 6.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 6.99999900000000e+04 -> 0x00000000000222df +f64_to_u32_imm32: 7.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 7.99999900000000e+04 -> 0x00000000000270ff +f64_to_u32_imm32: 8.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 8.99999900000000e+04 -> 0x000000000002bf1f +f64_to_u32_imm32: 9.99999900000000e+04 -> 0x00000000ffffffff +f64_to_u32_imm1: 9.99999900000000e+04 -> 0x0000000000030d3f