1/* { dg-do run } */ 2/* { dg-options "-mavx512f -O2" } */ 3/* { dg-require-effective-target avx512f } */ 4 5#define SIZE (128 / 64) 6 7#include <math.h> 8#include "avx512f-check.h" 9 10static void 11compute_rndscalesd (double *s1, double *s2, double *r, int imm) 12{ 13 int rc, m; 14 rc = imm & 0xf; 15 m = imm >> 4; 16 17 switch (rc) 18 { 19 case _MM_FROUND_FLOOR: 20 r[0] = floor (s2[0] * pow (2, m)) / pow (2, m); 21 break; 22 case _MM_FROUND_CEIL: 23 r[0] = ceil (s2[0] * pow (2, m)) / pow (2, m); 24 break; 25 default: 26 abort (); 27 break; 28 } 29 30 r[1] = s1[1]; 31} 32 33static void 34avx512f_test (void) 35{ 36 int imm = _MM_FROUND_FLOOR | (7 << 4); 37 union128d s1, s2, res1; 38 double res_ref[SIZE]; 39 40 s1.x = _mm_set_pd (4.05084, -1.23162); 41 s2.x = _mm_set_pd (-3.53222, 7.33527); 42 43 res1.x = _mm_roundscale_sd (s1.x, s2.x, imm); 44 45 compute_rndscalesd (s1.a, s2.a, res_ref, imm); 46 47 if (check_union128d (res1, res_ref)) 48 abort (); 49} 50