2 /* { dg-require-effective-target p8vector_hw } */
3 /* { dg-options "-mdejagnu-cpu=power8 -O3 " } */
7 extern void abort (void);
10 const vector
short y
= { 0, 1, 2, 3, 4, 5, 6, 7 };
16 return y
; /* Remove 1 swap and use lvx. */
22 x
= y
; /* Remove 2 redundant swaps here. */
23 return x
; /* Remove 1 swap and use lvx. */
26 void __attribute__ ((noinline
))
27 fill_local (vector
short *vp
)
29 *vp
= x
; /* Remove 2 redundant swaps here. */
32 /* Test aligned load from local. */
38 /* Need to be clever here because v will normally reside in a
39 register rather than memory. */
41 return v
; /* Remove 1 swap and use lvx. */
45 /* Test aligned load from pointer. */
47 foo3 (vector
short *arg
)
49 return *arg
; /* Remove 1 swap and use lvx. */
52 /* In this structure, the compiler should insert padding to assure
53 that a_vector is properly aligned. */
56 vector
short a_vector
;
62 return bp
->a_vector
; /* Remove 1 swap and use lvx. */
65 /* Test aligned store to global. */
67 baz (vector
short arg
)
69 x
= arg
; /* Remove 1 swap and use stvx. */
72 void __attribute__ ((noinline
))
73 copy_local (vector
short *arg
)
75 x
= *arg
; /* Remove 2 redundant swaps. */
79 /* Test aligned store to local. */
81 baz1 (vector
short arg
)
85 /* Need cleverness, because v will normally reside in a register
86 rather than memory. */
87 v
= arg
; /* Aligned store to local: remove 1
92 /* Test aligned store to pointer. */
94 baz2 (vector
short *arg1
, vector
short arg2
)
96 /* Assume arg2 resides in register. */
97 *arg1
= arg2
; /* Remove 1 swap and use stvx. */
101 baz3 (struct bar
*bp
, vector
short v
)
103 /* Assume v resides in register. */
104 bp
->a_vector
= v
; /* Remove 1 swap and use stvx. */
108 main (int argc
, short *argv
[])
110 vector
short fetched_value
= foo ();
111 if (fetched_value
[0] != 0 || fetched_value
[7] != 7)
114 fetched_value
= foo1 ();
115 if (fetched_value
[1] != 1 || fetched_value
[6] != 6)
118 fetched_value
= foo2 ();
119 if (fetched_value
[2] != 2 || fetched_value
[5] != 5)
122 fetched_value
= foo3 (&x
);
123 if (fetched_value
[3] != 3 || fetched_value
[4] != 4)
127 a_struct
.a_vector
= x
; /* Remove 2 redundant swaps. */
128 fetched_value
= foo4 (&a_struct
);
129 if (fetched_value
[4] != 4 || fetched_value
[3] != 3)
132 for (int i
= 0; i
< 8; i
++)
136 if (x
[0] != 7 || x
[7] != 0)
139 vector
short source
= { 8, 7, 6, 5, 4, 3, 2, 1 };
142 if (x
[3] != 5 || x
[7] != 1)
146 baz2 (&dest
, source
);
147 if (dest
[4] != 4 || dest
[1] != 7)
150 baz3 (&a_struct
, source
);
151 if (a_struct
.a_vector
[7] != 1 || a_struct
.a_vector
[5] != 3)