1 /* { dg-do run { target { powerpc*-*-linux* && lp64 } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
3 /* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
4 /* { dg-require-effective-target p8vector_hw } */
5 /* { dg-options "-mcpu=power8 -O2" } */
6
7 #include <stddef.h>
8 #include <stdlib.h>
9 #include <altivec.h>
10
11 #ifdef DEBUG
12 #include <stdio.h>
13 #endif
14
15 typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t;
16 typedef __int128_t scalar_128_t;
17 typedef unsigned long long scalar_64_t;
18
19 volatile scalar_64_t one = 1;
20 volatile scalar_64_t two = 2;
21
22 int
main(void)23 main (void)
24 {
25 scalar_128_t a = (((scalar_128_t)one) << 64) | ((scalar_128_t)two);
26 vector_128_t v1 = (vector_128_t) { a };
27 vector_128_t v2 = __builtin_pack_vector_int128 (one, two);
28 scalar_64_t x0 = __builtin_unpack_vector_int128 (v1, 0);
29 scalar_64_t x1 = __builtin_unpack_vector_int128 (v1, 1);
30 vector_128_t v3 = __builtin_pack_vector_int128 (x0, x1);
31
32 size_t i;
33 union {
34 scalar_128_t i128;
35 vector_128_t v128;
36 scalar_64_t u64;
37 unsigned char uc[sizeof (scalar_128_t)];
38 char c[sizeof (scalar_128_t)];
39 } u, u2;
40
41 #ifdef DEBUG
42 {
43 printf ("a = 0x");
44 u.i128 = a;
45 for (i = 0; i < sizeof (scalar_128_t); i++)
46 printf ("%.2x", u.uc[i]);
47
48 printf ("\nv1 = 0x");
49 u.v128 = v1;
50 for (i = 0; i < sizeof (scalar_128_t); i++)
51 printf ("%.2x", u.uc[i]);
52
53 printf ("\nv2 = 0x");
54 u.v128 = v2;
55 for (i = 0; i < sizeof (scalar_128_t); i++)
56 printf ("%.2x", u.uc[i]);
57
58 printf ("\nv3 = 0x");
59 u.v128 = v3;
60 for (i = 0; i < sizeof (scalar_128_t); i++)
61 printf ("%.2x", u.uc[i]);
62
63 printf ("\nx0 = 0x");
64 u.u64 = x0;
65 for (i = 0; i < sizeof (scalar_64_t); i++)
66 printf ("%.2x", u.uc[i]);
67
68 printf ("\nx1 = 0x");
69 u.u64 = x1;
70 for (i = 0; i < sizeof (scalar_64_t); i++)
71 printf ("%.2x", u.uc[i]);
72
73 printf ("\n");
74 }
75 #endif
76
77 u2.i128 = a;
78 u.v128 = v1;
79 if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
80 abort ();
81
82 u.v128 = v2;
83 if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
84 abort ();
85
86 u.v128 = v3;
87 if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
88 abort ();
89
90 return 0;
91 }
92