1/* { dg-do run } */ 2/* { dg-options "-mavx512f -O2 -std=gnu99" } */ 3/* { dg-require-effective-target avx512f } */ 4/* { dg-require-effective-target c99_runtime } */ 5 6#include "avx512f-check.h" 7#include "avx512f-helper.h" 8#include <math.h> 9#include <float.h> 10#include "avx512f-mask-type.h" 11 12void 13compute_fixupimmpd (double *r, double src, long long tbl) 14{ 15 switch (tbl & 0xf) 16 { 17 case 0: 18 *r = src; 19 break; 20 case 1: 21 *r = src; 22 break; 23 case 2: 24 *r = signbit (src) ? -NAN : NAN; 25 break; 26 case 3: 27 *r = -NAN; 28 break; 29 case 4: 30 *r = -INFINITY; 31 break; 32 case 5: 33 *r = INFINITY; 34 break; 35 case 6: 36 *r = signbit (src) ? -INFINITY : INFINITY; 37 break; 38 case 7: 39 *r = 1.0 / -INFINITY; 40 break; 41 case 8: 42 *r = 0.0; 43 break; 44 case 9: 45 *r = -1.0; 46 break; 47 case 10: 48 *r = 1.0; 49 break; 50 case 11: 51 *r = 1.0 / 2.0; 52 break; 53 case 12: 54 *r = 90.0; 55 break; 56 case 13: 57 *r = M_PI_2; 58 break; 59 case 14: 60 *r = DBL_MAX; 61 break; 62 case 15: 63 *r = -DBL_MAX; 64 break; 65 default: 66 abort (); 67 } 68} 69 70void 71avx512f_test (void) 72{ 73 union128d s1, res1, res2, res3; 74 union128i_q s2; 75 double res_ref[2]; 76 int i, j; 77 78 float vals[2] = { -10, 10 }; 79 int controls[10] = { 0x11111111, 80 0x77777777, 0x88888888, 0x99999999, 81 0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 82 0xdddddddd, 0xeeeeeeee, 0xffffffff 83 }; 84 85 MASK_TYPE mask = MASK_VALUE; 86 87 for (i = 0; i < 2; i++) 88 { 89 s1.a[0] = vals[i]; 90 s1.a[1] = 1.0; 91 s2.a[1] = 1.0; 92 93 res_ref[0] = 1.0; 94 res_ref[1] = 1.0; 95 res1.a[0] = res2.a[0] = res3.a[0] = DEFAULT_VALUE; 96 res1.a[1] = res2.a[1] = res3.a[1] = DEFAULT_VALUE; 97 98 for (j = 0; j < 10; j++) 99 { 100 s2.a[0] = controls[j]; 101 compute_fixupimmpd (&res_ref[0], s1.a[0], s2.a[0]); 102 103 res1.x = _mm_fixupimm_sd (res1.x, s1.x, s2.x, 0); 104 res2.x = _mm_mask_fixupimm_sd (res2.x, mask, s1.x, s2.x, 0); 105 res3.x = _mm_maskz_fixupimm_sd (mask, res3.x, s1.x, s2.x, 0); 106 107 if (check_union128d (res1, res_ref)) 108 abort (); 109 110 MASK_MERGE (d) (res_ref, mask, 1); 111 if (check_union128d (res2, res_ref)) 112 abort (); 113 114 MASK_ZERO (d) (res_ref, mask, 1); 115 if (check_union128d (res3, res_ref)) 116 abort (); 117 } 118 } 119} 120