1 /* { dg-do compile { target { powerpc64le-*-* } } } */
2 /* { dg-require-effective-target powerpc_p8vector_ok } */
3 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
4 /* { dg-options "-mcpu=power8 -O3 " } */
6 /* Previous versions of this test required that the assembler does not
7 contain xxpermdi or xxswapd. However, with the more sophisticated
8 code generation used today, it is now possible that xxpermdi (aka
9 xxswapd) show up without being part of a lxvd2x or stxvd2x
14 extern void abort (void);
17 const vector
float y
= { 0.0F
, 0.1F
, 0.2F
, 0.3F
};
23 return y
; /* Remove 1 swap and use lvx. */
29 x
= y
; /* Remove 2 redundant swaps here. */
30 return x
; /* Remove 1 swap and use lvx. */
33 void __attribute__ ((noinline
))
34 fill_local (vector
float *vp
)
36 *vp
= x
; /* Remove 2 redundant swaps here. */
39 /* Test aligned load from local. */
45 /* Need to be clever here because v will normally reside in a
46 register rather than memory. */
48 return v
; /* Remove 1 swap and use lvx. */
52 /* Test aligned load from pointer. */
54 foo3 (vector
float *arg
)
56 return *arg
; /* Remove 1 swap and use lvx. */
59 /* In this structure, the compiler should insert padding to assure
60 that a_vector is properly aligned. */
63 vector
float a_vector
;
69 return bp
->a_vector
; /* Remove 1 swap and use lvx. */
72 /* Test aligned store to global. */
74 baz (vector
float arg
)
76 x
= arg
; /* Remove 1 swap and use stvx. */
79 void __attribute__ ((noinline
))
80 copy_local (vector
float *arg
)
82 x
= *arg
; /* Remove 2 redundant swaps. */
86 /* Test aligned store to local. */
88 baz1 (vector
float arg
)
92 /* Need cleverness, because v will normally reside in a register
93 rather than memory. */
94 v
= arg
; /* Aligned store to local: remove 1
99 /* Test aligned store to pointer. */
101 baz2 (vector
float *arg1
, vector
float arg2
)
103 /* Assume arg2 resides in register. */
104 *arg1
= arg2
; /* Remove 1 swap and use stvx. */
108 baz3 (struct bar
*bp
, vector
float v
)
110 /* Assume v resides in register. */
111 bp
->a_vector
= v
; /* Remove 1 swap and use stvx. */
115 main (float argc
, float *argv
[])
117 vector
float fetched_value
= foo ();
118 if (fetched_value
[0] != 0.0F
|| fetched_value
[3] != 0.3F
)
121 fetched_value
= foo1 ();
122 if (fetched_value
[1] != 0.1F
|| fetched_value
[2] != 0.2F
)
125 fetched_value
= foo2 ();
126 if (fetched_value
[2] != 0.2F
|| fetched_value
[1] != 0.1F
)
129 fetched_value
= foo3 (&x
);
130 if (fetched_value
[3] != 0.3F
|| fetched_value
[0] != 0.0F
)
134 a_struct
.a_vector
= x
; /* Remove 2 redundant swaps. */
135 fetched_value
= foo4 (&a_struct
);
136 if (fetched_value
[2] != 0.2F
|| fetched_value
[3] != 0.3F
)
145 if (x
[0] != 0.7F
|| x
[3] != 0.4F
)
148 vector
float source
= { 0.8F
, 0.7F
, 0.6F
, 0.5F
};
151 if (x
[3] != 0.6F
|| x
[2] != 0.7F
)
155 baz2 (&dest
, source
);
156 if (dest
[0] != 0.8F
|| dest
[1] != 0.7F
)
159 baz3 (&a_struct
, source
);
160 if (a_struct
.a_vector
[3] != 0.5F
|| a_struct
.a_vector
[0] != 0.8F
)