1 /* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
2 /* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
3 /* { dg-require-effective-target powerpc_altivec_ok } */
4 /* { dg-options "-maltivec" } */
5 
6 extern void exit (int);
7 extern void abort (void);
8 
9 typedef int int4 __attribute__ ((vector_size (16)));
10 typedef float float4 __attribute__ ((vector_size (16)));
11 
12 int4 a1 = (int4) { 100, 200, 300, 400 };
13 int4 a2 = (int4) { 500, 600, 700, 800 };
14 
15 float4 f1 = (float4) { 1.0, 2.0, 3.0, 4.0 };
16 float4 f2 = (float4) { 5.0, 6.0, 7.0, 8.0 };
17 
18 int i3[4] __attribute__((aligned(16)));
19 int j3[4] __attribute__((aligned(16)));
20 float h3[4] __attribute__((aligned(16)));
21 float g3[4] __attribute__((aligned(16)));
22 
23 #define vec_store(dst, src) \
24   __builtin_vec_st (src, 0, (__typeof__ (src) *) dst)
25 
26 #define vec_add_int4(x, y) \
27   __builtin_altivec_vaddsws (x, y)
28 
29 #define vec_add_float4(x, y) \
30   __builtin_altivec_vaddfp (x, y)
31 
32 #define my_abs(x) (x > 0.0F ? x : -x)
33 
34 void
compare_int4(int * a,int * b)35 compare_int4 (int *a, int *b)
36 {
37   int i;
38 
39   for (i = 0; i < 4; ++i)
40     if (a[i] != b[i])
41       abort ();
42 }
43 
44 void
compare_float4(float * a,float * b)45 compare_float4 (float *a, float *b)
46 {
47   int i;
48 
49   for (i = 0; i < 4; ++i)
50     if (my_abs(a[i] - b[i]) >= 1.0e-6)
51       abort ();
52 }
53 
54 void
main1()55 main1 ()
56 {
57   int loc1 = 600, loc2 = 800;
58   int4 a3 = (int4) { loc1, loc2, 1000, 1200 };
59   int4 itmp;
60   double locf = 12.0;
61   float4 f3 = (float4) { 6.0, 8.0, 10.0, 12.0 };
62   float4 ftmp;
63 
64   vec_store (i3, a3);
65   itmp = vec_add_int4 (a1, a2);
66   vec_store (j3, itmp);
67   compare_int4 (i3, j3);
68 
69   vec_store (g3, f3);
70   ftmp = vec_add_float4 (f1, f2);
71   vec_store (h3, ftmp);
72   compare_float4 (g3, h3);
73 }
74 
75 int
main()76 main ()
77 {
78   main1 ();
79   exit (0);
80 }
81