1 /* { dg-do run { target { powerpc*-*-linux* } } } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-require-effective-target p9vector_hw } */
4 /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
5
6 #include <altivec.h>
7 #include <stdlib.h>
8
9 __attribute__ ((__noinline__))
10 vector float
11 insert_0 (vector float v, float f)
12 {
13 return vec_insert (f, v, 0);
14 }
15
16 __attribute__ ((__noinline__))
17 vector float
18 insert_1 (vector float v, float f)
19 {
20 return vec_insert (f, v, 1);
21 }
22
23 __attribute__ ((__noinline__))
24 vector float
25 insert_2 (vector float v, float f)
26 {
27 return vec_insert (f, v, 2);
28 }
29
30 __attribute__ ((__noinline__))
31 vector float
32 insert_3 (vector float v, float f)
33 {
34 return vec_insert (f, v, 3);
35 }
36
37 __attribute__ ((__noinline__))
38 void
39 test_insert (void)
40 {
41 vector float v1 = { 1.0f, 2.0f, 3.0f, 4.0f };
42 vector float v2 = { 5.0f, 6.0f, 7.0f, 8.0f };
43
44 v1 = insert_0 (v1, 5.0f);
45 v1 = insert_1 (v1, 6.0f);
46 v1 = insert_2 (v1, 7.0f);
47 v1 = insert_3 (v1, 8.0f);
48
49 if (vec_any_ne (v1, v2))
50 abort ();
51 }
52
53 __attribute__ ((__noinline__))
54 vector float
55 insert_extract_0_3 (vector float v1, vector float v2)
56 {
57 return vec_insert (vec_extract (v2, 3), v1, 0);
58 }
59
60 __attribute__ ((__noinline__))
61 vector float
62 insert_extract_1_2 (vector float v1, vector float v2)
63 {
64 return vec_insert (vec_extract (v2, 2), v1, 1);
65 }
66
67 __attribute__ ((__noinline__))
68 vector float
69 insert_extract_2_1 (vector float v1, vector float v2)
70 {
71 return vec_insert (vec_extract (v2, 1), v1, 2);
72 }
73
74 __attribute__ ((__noinline__))
75 vector float
76 insert_extract_3_0 (vector float v1, vector float v2)
77 {
78 return vec_insert (vec_extract (v2, 0), v1, 3);
79 }
80
81 __attribute__ ((__noinline__))
82 void
83 test_insert_extract (void)
84 {
85 vector float v1 = { 1.0f, 2.0f, 3.0f, 4.0f };
86 vector float v2 = { 5.0f, 6.0f, 7.0f, 8.0f };
87 vector float v3 = { 8.0f, 7.0f, 6.0f, 5.0f };
88
89 v1 = insert_extract_0_3 (v1, v2);
90 v1 = insert_extract_1_2 (v1, v2);
91 v1 = insert_extract_2_1 (v1, v2);
92 v1 = insert_extract_3_0 (v1, v2);
93
94 if (vec_any_ne (v1, v3))
95 abort ();
96 }
97
98 int
99 main (void)
100 {
101 test_insert ();
102 test_insert_extract ();
103 return 0;
104 }