blob: c3bf7349597aa9b75e0bc34cfd4cde4dc16b95f3 [file] [log] [blame]
/* Test vadd works correctly. */
/* { dg-do run } */
/* { dg-options "--save-temps" } */
#include <arm_neon.h>
#define FLT_EPSILON __FLT_EPSILON__
#define DBL_EPSILON __DBL_EPSILON__
#define TESTA0 0.33333
#define TESTA1 -1.7777
#define TESTA2 0
#define TESTA3 1.23456
/* 2^54, double has 53 significand bits
according to Double-precision floating-point format. */
#define TESTA4 18014398509481984
#define TESTA5 (1.0 / TESTA4)
#define TESTB0 0.66667
#define TESTB1 2
#define TESTB2 0
#define TESTB3 -2
#define TESTB4 1.0
#define TESTB5 2.0
#define ANSW0 1
#define ANSW1 0.2223
#define ANSW2 0
#define ANSW3 -0.76544
#define ANSW4 TESTA4
#define ANSW5 2.0
extern void abort (void);
#define EPSILON __DBL_EPSILON__
#define ABS(a) __builtin_fabs (a)
#define ISNAN(a) __builtin_isnan (a)
#define FP_equals(a, b, epsilon) \
( \
((a) == (b)) \
|| (ISNAN (a) && ISNAN (b)) \
|| (ABS (a - b) < epsilon) \
)
int
test_vadd_f64 ()
{
float64x1_t a;
float64x1_t b;
float64x1_t c;
a = TESTA0;
b = TESTB0;
c = ANSW0;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
a = TESTA1;
b = TESTB1;
c = ANSW1;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
a = TESTA2;
b = TESTB2;
c = ANSW2;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
a = TESTA3;
b = TESTB3;
c = ANSW3;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
a = TESTA4;
b = TESTB4;
c = ANSW4;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
a = TESTA5;
b = TESTB5;
c = ANSW5;
a = vadd_f64 (a, b);
if (!FP_equals (a, c, EPSILON))
return 1;
return 0;
}
/* { dg-final { scan-assembler-times "fadd\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 6 } } */
int
main (int argc, char **argv)
{
if (test_vadd_f64 ())
abort ();
return 0;
}
/* { dg-final { cleanup-saved-temps } } */