Hi,
This patch adds float -> int builtins to the set
of builtins we can try to vectorize in aarch64_builtin_vectorized_function.
In particular, we add BUILT_IN_IFLOORF, BUILT_IN_ICEILF, BUILT_IN_LROUND,
BUILT_IN_IROUNDF.
The BUILT_IN_LROUND cases won't be triggered unless -ffast-math
or something else which turns off inexact errors is enabled.
Regression tested for aarch64-none-elf with no regressions.
Thanks,
James
---
gcc/
2013-04-26 James Greenhalgh <[email protected]>
* config/aarch64/aarch64-builtins.c
(aarch64_builtin_vectorized_function): Vectorize over ifloorf,
iceilf, lround, iroundf.
diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index d2e5136..53d2c6a 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -1245,6 +1245,7 @@ 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_IFLOORF:
{
tree new_tree = NULL_TREE;
if (AARCH64_CHECK_BUILTIN_MODE (2, D))
@@ -1259,6 +1260,7 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
return new_tree;
}
case BUILT_IN_LCEIL:
+ case BUILT_IN_ICEILF:
{
tree new_tree = NULL_TREE;
if (AARCH64_CHECK_BUILTIN_MODE (2, D))
@@ -1272,6 +1274,22 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv2sfv2si];
return new_tree;
}
+ case BUILT_IN_LROUND:
+ case BUILT_IN_IROUNDF:
+ {
+ tree new_tree = NULL_TREE;
+ if (AARCH64_CHECK_BUILTIN_MODE (2, D))
+ new_tree =
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2dfv2di];
+ else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
+ new_tree =
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv4sfv4si];
+ else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
+ new_tree =
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2sfv2si];
+ return new_tree;
+ }
+
default:
return NULL_TREE;
}