vector.md (GPR move splitter): Do not split moves of vectors in GPRS if they are...
[gcc.git] / gcc / testsuite / gcc.target / powerpc / direct-move.h
1 /* Test functions for direct move support. */
2
3
4 void __attribute__((__noinline__))
5 copy (TYPE *a, TYPE *b)
6 {
7 *b = *a;
8 }
9
10 #ifndef NO_GPR
11 void __attribute__((__noinline__))
12 load_gpr (TYPE *a, TYPE *b)
13 {
14 TYPE c = *a;
15 __asm__ ("# gpr, reg = %0" : "+b" (c));
16 *b = c;
17 }
18 #endif
19
20 #ifndef NO_FPR
21 void __attribute__((__noinline__))
22 load_fpr (TYPE *a, TYPE *b)
23 {
24 TYPE c = *a;
25 __asm__ ("# fpr, reg = %0" : "+d" (c));
26 *b = c;
27 }
28 #endif
29
30 #ifndef NO_ALTIVEC
31 void __attribute__((__noinline__))
32 load_altivec (TYPE *a, TYPE *b)
33 {
34 TYPE c = *a;
35 __asm__ ("# altivec, reg = %0" : "+v" (c));
36 *b = c;
37 }
38 #endif
39
40 #ifndef NO_VSX
41 void __attribute__((__noinline__))
42 load_vsx (TYPE *a, TYPE *b)
43 {
44 TYPE c = *a;
45 __asm__ ("# vsx, reg = %x0" : "+wa" (c));
46 *b = c;
47 }
48 #endif
49
50 #ifndef NO_GPR_TO_VSX
51 void __attribute__((__noinline__))
52 load_gpr_to_vsx (TYPE *a, TYPE *b)
53 {
54 TYPE c = *a;
55 TYPE d;
56 __asm__ ("# gpr, reg = %0" : "+b" (c));
57 d = c;
58 __asm__ ("# vsx, reg = %x0" : "+wa" (d));
59 *b = d;
60 }
61 #endif
62
63 #ifndef NO_VSX_TO_GPR
64 void __attribute__((__noinline__))
65 load_vsx_to_gpr (TYPE *a, TYPE *b)
66 {
67 TYPE c = *a;
68 TYPE d;
69 __asm__ ("# vsx, reg = %x0" : "+wa" (c));
70 d = c;
71 __asm__ ("# gpr, reg = %0" : "+b" (d));
72 *b = d;
73 }
74 #endif
75
76 #ifdef DO_MAIN
77 typedef void (fn_type (TYPE *, TYPE *));
78
79 struct test_struct {
80 fn_type *func;
81 const char *name;
82 };
83
84 const struct test_struct test_functions[] = {
85 { copy, "copy" },
86 #ifndef NO_GPR
87 { load_gpr, "load_gpr" },
88 #endif
89 #ifndef NO_FPR
90 { load_fpr, "load_fpr" },
91 #endif
92 #ifndef NO_ALTIVEC
93 { load_altivec, "load_altivec" },
94 #endif
95 #ifndef NO_VSX
96 { load_vsx, "load_vsx" },
97 #endif
98 #ifndef NO_GPR_TO_VSX
99 { load_gpr_to_vsx, "load_gpr_to_vsx" },
100 #endif
101 #ifndef NO_VSX_TO_GPR
102 { load_vsx_to_gpr, "load_vsx_to_gpr" },
103 #endif
104 };
105
106 /* Test a given value for each of the functions. */
107 void __attribute__((__noinline__))
108 test_value (TYPE a)
109 {
110 size_t i;
111
112 for (i = 0; i < sizeof (test_functions) / sizeof (test_functions[0]); i++)
113 {
114 TYPE b;
115
116 test_functions[i].func (&a, &b);
117 if (memcmp ((void *)&a, (void *)&b, sizeof (TYPE)) != 0)
118 abort ();
119 }
120 }
121
122 /* Main program. */
123 int
124 main (void)
125 {
126 size_t i;
127 long j;
128 union {
129 TYPE value;
130 unsigned char bytes[sizeof (TYPE)];
131 } u;
132
133 #if IS_INT
134 TYPE value = (TYPE)-5;
135 for (i = 0; i < 12; i++)
136 {
137 test_value (value);
138 value++;
139 }
140
141 for (i = 0; i < 8*sizeof (TYPE); i++)
142 test_value (((TYPE)1) << i);
143
144 #elif IS_UNS
145 TYPE value = (TYPE)0;
146 for (i = 0; i < 10; i++)
147 {
148 test_value (value);
149 test_value (~ value);
150 value++;
151 }
152
153 for (i = 0; i < 8*sizeof (TYPE); i++)
154 test_value (((TYPE)1) << i);
155
156 #elif IS_FLOAT
157 TYPE value = (TYPE)-5;
158 for (i = 0; i < 12; i++)
159 {
160 test_value (value);
161 value++;
162 }
163
164 test_value ((TYPE)3.1415926535);
165 test_value ((TYPE)1.23456);
166 test_value ((TYPE)(-0.0));
167 test_value ((TYPE)NAN);
168 test_value ((TYPE)+INFINITY);
169 test_value ((TYPE)-INFINITY);
170 #else
171
172 for (j = 0; j < 10; j++)
173 {
174 for (i = 0; i < sizeof (TYPE); i++)
175 u.bytes[i] = (unsigned char) (random () >> 4);
176
177 test_value (u.value);
178 }
179 #endif
180
181 return 0;
182 }
183 #endif