This patch fixes the implementation of vcvtmd_s64_f64 and vcvtpd_s64_f64 in arm_neon.h to use llfloor and llceil instead, which are ILP32-friendly.

This patch will fix the following test failure in the ILP32 mode:

FAIL: gcc.target/aarch64/vect-vcvt.c scan-assembler fcvtms\\tx[0-9]+, d[0-9]+

OK for the trunk?

Thanks,
Yufeng

gcc/

        * config/aarch64/aarch64-builtins.c
        (aarch64_builtin_vectorized_function): Add BUILT_IN_LFLOORF,
        BUILT_IN_LLFLOOR, BUILT_IN_LCEILF and BUILT_IN_LLCEIL.
        * config/aarch64/arm_neon.h (vcvtaq_u64_f64): Call __builtin_llfloor
        instead of __builtin_lfloor.
        (vcvtnq_u64_f64): Call __builtin_llceil instead of __builtin_lceil.
diff --git a/gcc/config/aarch64/aarch64-builtins.c 
b/gcc/config/aarch64/aarch64-builtins.c
index 439c3f4..27af30f 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -1034,6 +1034,8 @@ aarch64_builtin_vectorized_function (tree fndecl, tree 
type_out, tree type_in)
   (out_mode == N##Imode && out_n == C \
    && in_mode == N##Fmode && in_n == C)
        case BUILT_IN_LFLOOR:
+       case BUILT_IN_LFLOORF:
+       case BUILT_IN_LLFLOOR:
        case BUILT_IN_IFLOORF:
          {
            enum aarch64_builtins builtin;
@@ -1049,6 +1051,8 @@ aarch64_builtin_vectorized_function (tree fndecl, tree 
type_out, tree type_in)
            return aarch64_builtin_decls[builtin];
          }
        case BUILT_IN_LCEIL:
+       case BUILT_IN_LCEILF:
+       case BUILT_IN_LLCEIL:
        case BUILT_IN_ICEILF:
          {
            enum aarch64_builtins builtin;
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index e33a684..c855b0f 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -17699,7 +17699,7 @@ vcvtaq_u64_f64 (float64x2_t __a)
 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
 vcvtmd_s64_f64 (float64_t __a)
 {
-  return __builtin_lfloor (__a);
+  return __builtin_llfloor (__a);
 }
 
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
@@ -17835,7 +17835,7 @@ vcvtnq_u64_f64 (float64x2_t __a)
 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
 vcvtpd_s64_f64 (float64_t __a)
 {
-  return __builtin_lceil (__a);
+  return __builtin_llceil (__a);
 }
 
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))

Reply via email to