1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/* { dg-do compile } */
/* { dg-require-effective-target int128 } */
/* { dg-options "-mdejagnu-cpu=power10" } */
#include <altivec.h>
extern void abort (void);
unsigned long long int
do_vec_gnb (vector unsigned __int128 source, int stride)
{
switch (stride)
{
case 2:
return vec_gnb (source, 2);
case 3:
return vec_gnb (source, 3);
case 4:
return vec_gnb (source, 4);
case 5:
return vec_gnb (source, 5);
case 6:
return vec_gnb (source, 6);
case 7:
return vec_gnb (source, 7);
default:
/* Illegal value of stride */
abort ();
return 0;
}
}
int
main (int argc, char *argv [])
{
/* For result = 0xaaaa_0000_0000_0000, use:
stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
For result = 0xaaaa_aaaa_0000_0000, use:
stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
*/
/* The last array element appears in the left-most (first) bit
positions of the vector register. */
vector unsigned __int128 source_a =
{ ((unsigned __int128) 0x8888888800000000ull) << 64 };
vector unsigned __int128 source_b =
{ ((unsigned __int128) 0x8080808080808080ull) << 64 };
vector unsigned __int128 source_c =
{ ((unsigned __int128) 0x8888888888888888ull) << 64 };
vector unsigned __int128 source_d =
{ 0x8080808080808080ull |
((unsigned __int128) 0x8080808080808080ull) << 64 };
unsigned long long int results [] =
{ 0xaaaa000000000000ull, 0xaaaa000000000000ull,
0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
if (do_vec_gnb (source_a, 2) != results [0])
abort ();
if (do_vec_gnb (source_b, 4) != results [1])
abort ();
if (do_vec_gnb (source_c, 2) != results [2])
abort ();
if (do_vec_gnb (source_d, 4) != results [3])
abort ();
return 0;
}
/* { dg-final { scan-assembler {\mvgnb\M} } } */
|