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.
This commit is contained in:
parent
8912313df8
commit
f4f7216c56
2 changed files with 31 additions and 0 deletions
|
@ -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
|
||||
|
|
17
gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c
Normal file
17
gcc/testsuite/gcc.target/aarch64/acle/acle_fma.c
Normal file
|
@ -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 } } */
|
Loading…
Add table
Reference in a new issue