1/* { dg-do run } */ 2/* { dg-options "-O2 -mavx512f" } */ 3/* { dg-require-effective-target avx512f } */ 4 5#define AVX512F 6 7#include "avx512f-helper.h" 8 9#define SIZE (AVX512F_LEN / 32) 10#include "avx512f-mask-type.h" 11#include <limits.h> 12 13void 14CALC (char *r, int *s, int mem) 15{ 16 int i; 17 int len = mem ? SIZE : 16; 18 for (i = 0; i < len; i++) 19 { 20 if (i < SIZE) 21 { 22 if (s[i] < CHAR_MIN) 23 r[i] = CHAR_MIN; 24 else if (s[i] > CHAR_MAX) 25 r[i] = CHAR_MAX; 26 else 27 r[i] = s[i]; 28 } 29 else 30 r[i] = 0; 31 } 32} 33 34void 35TEST (void) 36{ 37 int i, sign; 38 UNION_TYPE (128, i_b) res1, res2, res3; 39 char res4[16]; 40 UNION_TYPE (AVX512F_LEN, i_d) src; 41 MASK_TYPE mask = MASK_VALUE; 42 char res_ref[16]; 43 char res_ref2[16]; 44 45 sign = -1; 46 for (i = 0; i < SIZE; i++) 47 { 48 src.a[i] = 1 + 34 * i * sign; 49 sign = sign * -1; 50 res2.a[i] = DEFAULT_VALUE; 51 res4[i] = DEFAULT_VALUE; 52 } 53 54 for (i = SIZE; i < 16; i++) 55 { 56 res4[i] = DEFAULT_VALUE * 2; 57 res_ref2[i] = DEFAULT_VALUE * 2; 58 } 59 60 res1.x = INTRINSIC (_cvtsepi32_epi8) (src.x); 61 res2.x = INTRINSIC (_mask_cvtsepi32_epi8) (res2.x, mask, src.x); 62 res3.x = INTRINSIC (_maskz_cvtsepi32_epi8) (mask, src.x); 63 64 CALC (res_ref, src.a, 0); 65 66 if (UNION_CHECK (128, i_b) (res1, res_ref)) 67 abort (); 68 69 MASK_MERGE (i_b) (res_ref, mask, SIZE); 70 if (UNION_CHECK (128, i_b) (res2, res_ref)) 71 abort (); 72 73 MASK_ZERO (i_b) (res_ref, mask, SIZE); 74 if (UNION_CHECK (128, i_b) (res3, res_ref)) 75 abort (); 76 77 INTRINSIC (_mask_cvtsepi32_storeu_epi8) (res4, mask, src.x); 78 CALC (res_ref2, src.a, 1); 79 80 MASK_MERGE (i_b) (res_ref2, mask, SIZE); 81 if (checkVc (res4, res_ref2, 16)) 82 abort (); 83} 84