1 /* { dg-do run } */
2 /* { dg-options "-mpaired-single" } */
3
4 /* Test v2sf calculations */
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 typedef float v2sf __attribute__ ((vector_size (8)));
9
10 v2sf A = {100, 200};
11
12 /* Init from float */
init(float a,float b)13 v2sf init (float a, float b)
14 {
15 return (v2sf) {a, b};
16 }
17
18 /* Move between registers */
move(v2sf a)19 v2sf move (v2sf a)
20 {
21 return a;
22 }
23
24 /* Load from memory */
load()25 v2sf load ()
26 {
27 return A;
28 }
29
30 /* Store to memory */
store(v2sf a)31 void store (v2sf a)
32 {
33 A = a;
34 }
35
36 /* Add */
add(v2sf a,v2sf b)37 v2sf add (v2sf a, v2sf b)
38 {
39 return a + b;
40 }
41
42 /* Subtract */
sub(v2sf a,v2sf b)43 v2sf sub (v2sf a, v2sf b)
44 {
45 return a - b;
46 }
47
48 /* Negate */
neg(v2sf a)49 v2sf neg (v2sf a)
50 {
51 return - a;
52 }
53
54 /* Multiply */
mul(v2sf a,v2sf b)55 v2sf mul (v2sf a, v2sf b)
56 {
57 return a * b;
58 }
59
60 /* Multiply and add */
madd(v2sf a,v2sf b,v2sf c)61 v2sf madd (v2sf a, v2sf b, v2sf c)
62 {
63 return a * b + c;
64 }
65
66 /* Multiply and subtract */
msub(v2sf a,v2sf b,v2sf c)67 v2sf msub (v2sf a, v2sf b, v2sf c)
68 {
69 return a * b - c;
70 }
71
72 /* Negate Multiply and add */
nmadd(v2sf a,v2sf b,v2sf c)73 v2sf nmadd (v2sf a, v2sf b, v2sf c)
74 {
75 return - (a * b + c);
76 }
77
78 /* Negate Multiply and subtract */
nmsub(v2sf a,v2sf b,v2sf c)79 v2sf nmsub (v2sf a, v2sf b, v2sf c)
80 {
81 return - (a * b - c);
82 }
83
84 /* Conditional Move */
cond_move1(v2sf a,v2sf b,long i)85 v2sf cond_move1 (v2sf a, v2sf b, long i)
86 {
87 if (i > 0)
88 return a;
89 else
90 return b;
91 }
92
93 /* Conditional Move */
cond_move2(v2sf a,v2sf b,int i)94 v2sf cond_move2 (v2sf a, v2sf b, int i)
95 {
96 if (i > 0)
97 return a;
98 else
99 return b;
100 }
101
102 /* Conditional Move */
cond_move3(v2sf a,v2sf b,float i)103 v2sf cond_move3 (v2sf a, v2sf b, float i)
104 {
105 if (i > 0.0)
106 return a;
107 else
108 return b;
109 }
110
111 /* Conditional Move */
cond_move4(v2sf a,v2sf b,double i)112 v2sf cond_move4 (v2sf a, v2sf b, double i)
113 {
114 if (i > 0.0)
115 return a;
116 else
117 return b;
118 }
119
main()120 NOMIPS16 int main()
121 {
122 v2sf a, b, c, d, e, f;
123 float f1, f2;
124
125 f1 = 1.2;
126 f2 = 3.4;
127 a = init (f1, f2);
128 b = (v2sf) {1.2, 3.4};
129 if (!__builtin_mips_upper_c_eq_ps (a, b) ||
130 !__builtin_mips_lower_c_eq_ps (a, b))
131 abort ();
132
133 a = (v2sf) {1.2, 2.3};
134 b = (v2sf) {5.3, 6.1};
135 b = move (a);
136
137 if (!__builtin_mips_upper_c_eq_ps (a, b) ||
138 !__builtin_mips_lower_c_eq_ps (a, b))
139 abort ();
140
141 a = (v2sf) {1.2, 2.3};
142 b = (v2sf) {5.3, 6.1};
143 c = add (a, b);
144 d = (v2sf) {6.5, 8.4};
145 if (!__builtin_mips_upper_c_eq_ps (c, d) ||
146 !__builtin_mips_lower_c_eq_ps (c, d))
147 abort ();
148
149 a = (v2sf) {1, 12};
150 b = (v2sf) {5, 6};
151 c = sub (a, b);
152 d = (v2sf) {-4, 6};
153 if (!__builtin_mips_upper_c_eq_ps (c, d) ||
154 !__builtin_mips_lower_c_eq_ps (c, d))
155 abort ();
156
157 a = (v2sf) {1, 12};
158 b = (v2sf) {5, 6};
159 c = mul (a, b);
160 d = (v2sf) {5, 72};
161 if (!__builtin_mips_upper_c_eq_ps (c, d) ||
162 !__builtin_mips_lower_c_eq_ps (c, d))
163 abort ();
164
165 a = (v2sf) {1, 12};
166 b = (v2sf) {5, 6};
167 c = (v2sf) {5, 6};
168 d = madd (a, b, c);
169 e = (v2sf) {10, 78};
170 if (!__builtin_mips_upper_c_eq_ps (d, e) ||
171 !__builtin_mips_lower_c_eq_ps (d, e))
172 abort ();
173
174 a = (v2sf) {1, 12};
175 b = (v2sf) {5, 6};
176 c = (v2sf) {5, 6};
177 d = msub (a, b, c);
178 e = (v2sf) {0, 66};
179 if (!__builtin_mips_upper_c_eq_ps (d, e) ||
180 !__builtin_mips_lower_c_eq_ps (d, e))
181 abort ();
182
183 a = (v2sf) {1, 12};
184 b = (v2sf) {5, 6};
185 c = (v2sf) {5, 6};
186 d = nmadd (a, b, c);
187 e = (v2sf) {-10, -78};
188 if (!__builtin_mips_upper_c_eq_ps (d, e) ||
189 !__builtin_mips_lower_c_eq_ps (d, e))
190 abort ();
191
192 a = (v2sf) {1, 12};
193 b = (v2sf) {5, 6};
194 c = (v2sf) {5, 6};
195 d = nmsub (a, b, c);
196 e = (v2sf) {0, -66};
197 if (!__builtin_mips_upper_c_eq_ps (d, e) ||
198 !__builtin_mips_lower_c_eq_ps (d, e))
199 abort ();
200
201 a = (v2sf) {98, 12};
202 b = neg (a);
203 c = (v2sf) {-98, -12};
204 if (!__builtin_mips_upper_c_eq_ps (b, c) ||
205 !__builtin_mips_lower_c_eq_ps (b, c))
206 abort ();
207
208 a = (v2sf) {1, 12};
209 b = (v2sf) {5, 6};
210 c = cond_move1 (a, b, 1000);
211 if (!__builtin_mips_upper_c_eq_ps (c, a) ||
212 !__builtin_mips_lower_c_eq_ps (c, a))
213 abort ();
214
215 a = (v2sf) {1, 12};
216 b = (v2sf) {5, 6};
217 c = cond_move2 (a, b, -1000);
218 if (!__builtin_mips_upper_c_eq_ps (c, b) ||
219 !__builtin_mips_lower_c_eq_ps (c, b))
220 abort ();
221
222 a = (v2sf) {1, 12};
223 b = (v2sf) {5, 6};
224 c = cond_move3 (a, b, 9.0);
225 if (!__builtin_mips_upper_c_eq_ps (c, a) ||
226 !__builtin_mips_lower_c_eq_ps (c, a))
227 abort ();
228
229 a = (v2sf) {1, 12};
230 b = (v2sf) {5, 6};
231 c = cond_move4 (a, b, -10.0);
232 if (!__builtin_mips_upper_c_eq_ps (c, b) ||
233 !__builtin_mips_lower_c_eq_ps (c, b))
234 abort ();
235
236 a = (v2sf) {5, 12};
237 b = (v2sf) {5, 6};
238 c = (v2sf) {33, 123};
239 d = (v2sf) {8, 78};
240 e = __builtin_mips_movt_c_eq_ps (a, b, c, d);
241 f = (v2sf) {8, 123};
242 if (!__builtin_mips_upper_c_eq_ps (e, f) ||
243 !__builtin_mips_lower_c_eq_ps (e, f))
244 abort ();
245
246 a = (v2sf) {5, 12};
247 b = (v2sf) {5, 6};
248 c = (v2sf) {33, 123};
249 d = (v2sf) {8, 78};
250 e = __builtin_mips_movf_c_eq_ps (a, b, c, d);
251 f = (v2sf) {33, 78};
252 if (!__builtin_mips_upper_c_eq_ps (e, f) ||
253 !__builtin_mips_lower_c_eq_ps (e, f))
254 abort ();
255
256 a = load();
257 b = (v2sf) {100, 200};
258 if (!__builtin_mips_upper_c_eq_ps (a, b) ||
259 !__builtin_mips_lower_c_eq_ps (a, b))
260 abort ();
261
262 a = (v2sf) {123, 321};
263 store (a);
264 b = load();
265 if (!__builtin_mips_upper_c_eq_ps (a, b) ||
266 !__builtin_mips_lower_c_eq_ps (a, b))
267 abort ();
268
269 printf ("Test Passes\n");
270 exit (0);
271 }
272