aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Simoes Dias Vieira <andre.simoesdiasvieira@arm.com>2021-10-20 13:12:09 +0100
committerAndre Vieira <andre.simoesdiasvieira@arm.com>2021-10-20 13:14:39 +0100
commit914045dff10fbd27de27b90a0ac78a0058b2c86e (patch)
tree5d2d2b018d25bd149f22f9334b282a286684e465 /gcc
parentac5e46563817f4f1bd786be1d21b85d18e61bc0c (diff)
downloadgcc-914045dff10fbd27de27b90a0ac78a0058b2c86e.zip
gcc-914045dff10fbd27de27b90a0ac78a0058b2c86e.tar.gz
gcc-914045dff10fbd27de27b90a0ac78a0058b2c86e.tar.bz2
[Patch][GCC][middle-end] - Generate FRINTZ for (double)(int) under -ffast-math on aarch64
20-10-2021 Andre Vieira <andre.simoesdiasvieira@arm.com> Jirui Wu <jirui.wu@arm.com> gcc/ChangeLog: * match.pd: Generate IFN_TRUNC. gcc/testsuite/ChangeLog: * gcc.target/aarch64/merge_trunc1.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd13
-rw-r--r--gcc/testsuite/gcc.target/aarch64/merge_trunc1.c41
2 files changed, 54 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 3ff15bc..5bed2e1 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3606,6 +3606,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>= inside_prec - !inside_unsignedp)
(convert @0)))))))
+/* (float_type)(integer_type) x -> trunc (x) if the type of x matches
+ float_type. Only do the transformation if we do not need to preserve
+ trapping behaviour, so require !flag_trapping_math. */
+#if GIMPLE
+(simplify
+ (float (fix_trunc @0))
+ (if (!flag_trapping_math
+ && types_match (type, TREE_TYPE (@0))
+ && direct_internal_fn_supported_p (IFN_TRUNC, type,
+ OPTIMIZE_FOR_BOTH))
+ (IFN_TRUNC @0)))
+#endif
+
/* If we have a narrowing conversion to an integral type that is fed by a
BIT_AND_EXPR, we might be able to remove the BIT_AND_EXPR if it merely
masks off bits outside the final type (and nothing else). */
diff --git a/gcc/testsuite/gcc.target/aarch64/merge_trunc1.c b/gcc/testsuite/gcc.target/aarch64/merge_trunc1.c
new file mode 100644
index 0000000..0721706
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/merge_trunc1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+float
+f1 (float x)
+{
+ int y = x;
+
+ return (float) y;
+}
+
+double
+f2 (double x)
+{
+ long y = x;
+
+ return (double) y;
+}
+
+float
+f3 (double x)
+{
+ int y = x;
+
+ return (float) y;
+}
+
+double
+f4 (float x)
+{
+ int y = x;
+
+ return (double) y;
+}
+
+/* { dg-final { scan-assembler "frintz\\ts\[0-9\]+, s\[0-9\]+" } } */
+/* { dg-final { scan-assembler "frintz\\td\[0-9\]+, d\[0-9\]+" } } */
+/* { dg-final { scan-assembler "fcvtzs\\tw\[0-9\]+, d\[0-9\]+" } } */
+/* { dg-final { scan-assembler "scvtf\\ts\[0-9\]+, w\[0-9\]+" } } */
+/* { dg-final { scan-assembler "fcvtzs\\tw\[0-9\]+, s\[0-9\]+" } } */
+/* { dg-final { scan-assembler "scvtf\\td\[0-9\]+, w\[0-9\]+" } } */