1/* { dg-do run } */
2/* { dg-options "-O3 -mzarch -march=z13 --save-temps" } */
3/* { dg-require-effective-target vector } */
4/* { dg-require-effective-target int128 } */
5
6typedef unsigned char     uv16qi __attribute__((vector_size(16)));
7typedef unsigned short     uv8hi __attribute__((vector_size(16)));
8typedef unsigned int       uv4si __attribute__((vector_size(16)));
9typedef unsigned long long uv2di __attribute__((vector_size(16)));
10typedef unsigned __int128  uv1ti __attribute__((vector_size(16)));
11
12uv2di __attribute__((noinline))
13foo1 ()
14{
15  return (uv2di){ 0xff00ff00ff00ff00, 0x00ff00ff00ff00ff };
16}
17/* { dg-final { scan-assembler-times "vgbm\t%v24,43605" 1 } } */
18
19uv4si __attribute__((noinline))
20foo2 ()
21{
22  return (uv4si){ 0xff0000ff, 0x0000ffff, 0xffff0000, 0x00ffff00 };
23}
24/* { dg-final { scan-assembler-times "vgbm\t%v24,37830" 1 } } */
25
26uv8hi __attribute__((noinline))
27foo3a ()
28{
29  return (uv8hi){ 0xff00, 0xff00, 0xff00, 0xff00,
30      0xff00, 0xff00, 0xff00, 0xff00 };
31}
32/* { dg-final { scan-assembler-times "vgbm\t%v24,43690" 1 } } */
33
34uv8hi __attribute__((noinline))
35foo3b ()
36{
37  return (uv8hi){ 0x00ff, 0x00ff, 0x00ff, 0x00ff,
38      0x00ff, 0x00ff, 0x00ff, 0x00ff };
39}
40/* { dg-final { scan-assembler-times "vgbm\t%v24,21845" 1 } } */
41
42uv16qi __attribute__((noinline))
43foo4 ()
44{
45  return (uv16qi){ 0xff, 0xff, 0xff, 0xff,
46      0, 0, 0, 0,
47      0xff, 0, 0xff, 0,
48      0, 0xff, 0, 0xff };
49}
50
51uv1ti __attribute__((noinline))
52foo5 ()
53{
54  return (uv1ti){ 0xff00ff00ff00ff00ULL };
55}
56
57/* { dg-final { scan-assembler-times "vgbm\t%v24,61605" 1 } } */
58
59int
60main ()
61{
62  if (foo1()[1] != 0x00ff00ff00ff00ffULL)
63    __builtin_abort ();
64
65  if (foo2()[1] != 0x0000ffff)
66    __builtin_abort ();
67
68  if (foo3a()[1] != 0xff00)
69    __builtin_abort ();
70
71  if (foo3b()[1] != 0x00ff)
72    __builtin_abort ();
73
74  if (foo4()[1] != 0xff)
75    __builtin_abort ();
76
77  if (foo5()[0] != 0xff00ff00ff00ff00ULL)
78    __builtin_abort ();
79
80  return 0;
81}
82
83/* { dg-final { cleanup-saved-temps } } */
84