1 /* { dg-do compile { target { powerpc*-*-* } } } */ 2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */ 3 /* { dg-require-effective-target powerpc_p8vector_ok } */ 4 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ 5 /* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */ 6 7 #include <altivec.h> 8 9 #ifndef SIZE 10 #define SIZE 1024 11 #endif 12 13 #ifndef ALIGN 14 #define ALIGN 32 15 #endif 16 17 #ifndef ATTR_ALIGN 18 #define ATTR_ALIGN __attribute__((__aligned__(ALIGN))) 19 #endif 20 21 #define DOIT(TYPE, PREFIX) \ 22 TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b) \ 23 { \ 24 return vec_eqv (a, b); \ 25 } \ 26 \ 27 TYPE PREFIX ## _eqv_arith (TYPE a, TYPE b) \ 28 { \ 29 return ~(a ^ b); \ 30 } \ 31 \ 32 TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b) \ 33 { \ 34 return vec_nand (a, b); \ 35 } \ 36 \ 37 TYPE PREFIX ## _nand_arith1 (TYPE a, TYPE b) \ 38 { \ 39 return ~(a & b); \ 40 } \ 41 \ 42 TYPE PREFIX ## _nand_arith2 (TYPE a, TYPE b) \ 43 { \ 44 return (~a) | (~b); \ 45 } \ 46 \ 47 TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b) \ 48 { \ 49 return vec_orc (a, b); \ 50 } \ 51 \ 52 TYPE PREFIX ## _orc_arith1 (TYPE a, TYPE b) \ 53 { \ 54 return (~ a) | b; \ 55 } \ 56 \ 57 TYPE PREFIX ## _orc_arith2 (TYPE a, TYPE b) \ 58 { \ 59 return a | (~ b); \ 60 } 61 62 #define DOIT_FLOAT(TYPE, PREFIX) \ 63 TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b) \ 64 { \ 65 return vec_eqv (a, b); \ 66 } \ 67 \ 68 TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b) \ 69 { \ 70 return vec_nand (a, b); \ 71 } \ 72 \ 73 TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b) \ 74 { \ 75 return vec_orc (a, b); \ 76 } 77 78 typedef vector signed char sign_char_vec; 79 typedef vector short sign_short_vec; 80 typedef vector int sign_int_vec; 81 typedef vector long long sign_llong_vec; 82 83 typedef vector unsigned char uns_char_vec; 84 typedef vector unsigned short uns_short_vec; 85 typedef vector unsigned int uns_int_vec; 86 typedef vector unsigned long long uns_llong_vec; 87 88 typedef vector float float_vec; 89 typedef vector double double_vec; 90 91 DOIT(sign_char_vec, sign_char) 92 DOIT(sign_short_vec, sign_short) 93 DOIT(sign_int_vec, sign_int) 94 DOIT(sign_llong_vec, sign_llong) 95 96 DOIT(uns_char_vec, uns_char) 97 DOIT(uns_short_vec, uns_short) 98 DOIT(uns_int_vec, uns_int) 99 DOIT(uns_llong_vec, uns_llong) 100 101 DOIT_FLOAT(float_vec, float) 102 DOIT_FLOAT(double_vec, double) 103 104 /* { dg-final { scan-assembler-times "xxleqv" 18 } } */ 105 /* { dg-final { scan-assembler-times "xxlnand" 26 } } */ 106 /* { dg-final { scan-assembler-times "xxlorc" 26 } } */ 107