| /* { dg-do run } */ |
| /* { dg-require-effective-target avx512er } */ |
| /* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512er" } */ |
| |
| #include "avx512er-check.h" |
| |
| #define MAX 1000 |
| #define EPS 0.00001 |
| |
| __attribute__ ((noinline, optimize (0))) |
| void static |
| compute_rcp_ref (float *a, float *b, float *r) |
| { |
| for (int i = 0; i < MAX; i++) |
| r[i] = a[i] / b[i]; |
| } |
| |
| __attribute__ ((noinline)) |
| void static |
| compute_rcp_exp (float *a, float *b, float *r) |
| { |
| for (int i = 0; i < MAX; i++) |
| r[i] = a[i] / b[i]; |
| } |
| |
| void static |
| avx512er_test (void) |
| { |
| float a[MAX]; |
| float b[MAX]; |
| float ref[MAX]; |
| float exp[MAX]; |
| |
| for (int i = 0; i < MAX; i++) |
| { |
| a[i] = 179.345 - 6.5645 * i; |
| b[i] = 8765.987 - 8.6756 * i; |
| } |
| |
| compute_rcp_ref (a, b, ref); |
| compute_rcp_exp (a, b, exp); |
| |
| for (int i = 0; i < MAX; i++) |
| { |
| float rel_err = (ref[i] - exp[i]) / ref[i]; |
| rel_err = rel_err > 0.0 ? rel_err : -rel_err; |
| if (rel_err > EPS) |
| abort (); |
| } |
| } |