aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAyan Shafqat <ayan.x.shafqat@gmail.com>2025-03-17 09:28:27 +0100
committerKyrylo Tkachov <ktkachov@nvidia.com>2025-03-17 09:29:56 +0100
commitf4f7216c56fe2f67c72db5b7c4afa220725f3ed1 (patch)
treec0d3850128c232ce2f3a0b69cb23285f85db9eb8 /gcc
parent8912313df87679e202f2897ec25c924a67ee8117 (diff)
downloadgcc-f4f7216c56fe2f67c72db5b7c4afa220725f3ed1.zip
gcc-f4f7216c56fe2f67c72db5b7c4afa220725f3ed1.tar.gz
gcc-f4f7216c56fe2f67c72db5b7c4afa220725f3ed1.tar.bz2
Aarch64: Add FMA and FMAF intrinsic and corresponding tests
This patch introduces inline definitions for the __fma and __fmaf functions in arm_acle.h for Aarch64 targets. These definitions rely on __builtin_fma and __builtin_fmaf to ensure proper inlining and to meet the ACLE requirements [1]. The patch has been tested locally using a crosstool-NG sysroot for Aarch64, confirming that the generated code uses the expected fused multiply-accumulate instructions (fmadd). [1] https://arm-software.github.io/acle/main/acle.html#fused-multiply-accumulate-fma gcc/ChangeLog: * config/aarch64/arm_acle.h (__fma, __fmaf): New functions. gcc/testsuite/ChangeLog: * gcc.target/aarch64/acle/acle_fma.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/arm_acle.h14
-rw-r--r--gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c17
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h
index 7976c11..d9e2401 100644
--- a/gcc/config/aarch64/arm_acle.h
+++ b/gcc/config/aarch64/arm_acle.h
@@ -129,6 +129,20 @@ __jcvt (double __a)
#pragma GCC pop_options
+__extension__ extern __inline double
+__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
+__fma (double __x, double __y, double __z)
+{
+ return __builtin_fma (__x, __y, __z);
+}
+
+__extension__ extern __inline float
+__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
+__fmaf (float __x, float __y, float __z)
+{
+ return __builtin_fmaf (__x, __y, __z);
+}
+
#pragma GCC push_options
#pragma GCC target ("+nothing+frintts")
__extension__ extern __inline float
diff --git a/gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c b/gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c
new file mode 100644
index 0000000..9363a75
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include "arm_acle.h"
+
+double test_acle_fma (double x, double y, double z)
+{
+ return __fma (x, y, z);
+}
+
+float test_acle_fmaf (float x, float y, float z)
+{
+ return __fmaf (x, y, z);
+}
+
+/* { dg-final { scan-assembler-times "fmadd\td\[0-9\]" 1 } } */
+/* { dg-final { scan-assembler-times "fmadd\ts\[0-9\]" 1 } } */