Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/sh/ushmedia.h @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Copyright (C) 2000, 2001, 2004, 2005, 2009 Free Software Foundation, Inc. | |
2 | |
3 This file is part of GCC. | |
4 | |
5 GCC is free software; you can redistribute it and/or modify | |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 3, or (at your option) | |
8 any later version. | |
9 | |
10 GCC is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 Under Section 7 of GPL version 3, you are granted additional | |
16 permissions described in the GCC Runtime Library Exception, version | |
17 3.1, as published by the Free Software Foundation. | |
18 | |
19 You should have received a copy of the GNU General Public License and | |
20 a copy of the GCC Runtime Library Exception along with this program; | |
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
22 <http://www.gnu.org/licenses/>. */ | |
23 | |
24 | |
25 /* ushmedia.h: Intrinsics corresponding to SHmedia instructions that | |
26 may be executed in both user and privileged mode. */ | |
27 | |
28 #ifndef _USHMEDIA_H | |
29 #define _USHMEDIA_H | |
30 | |
31 #if __SHMEDIA__ | |
32 #if ! __SH4_NO_FPU | |
33 typedef float __GCC_FV __attribute__ ((vector_size (4 * sizeof (float)))); | |
34 typedef float __GCC_MTRX __attribute__ ((vector_size (16 * sizeof (float)))); | |
35 #endif | |
36 | |
37 static __inline unsigned long long | |
38 sh_media_MABS_L (unsigned long long mm) | |
39 { | |
40 typedef float v2si __attribute__ ((mode(V2SI))); | |
41 | |
42 return (unsigned long long) __builtin_absv2si2 ((v2si) mm); | |
43 } | |
44 | |
45 static __inline unsigned long long | |
46 sh_media_MABS_W (unsigned long long mm) | |
47 { | |
48 typedef float v4hi __attribute__ ((mode(V4HI))); | |
49 | |
50 return (unsigned long long) __builtin_absv4hi2 ((v4hi) mm); | |
51 } | |
52 | |
53 static __inline unsigned long long | |
54 sh_media_MADD_L (unsigned long long mm, unsigned long long mn) | |
55 { | |
56 typedef float v2si __attribute__ ((mode(V2SI))); | |
57 | |
58 return (unsigned long long) __builtin_addv2si3 ((v2si) mm, (v2si) mn); | |
59 } | |
60 | |
61 static __inline unsigned long long | |
62 sh_media_MADD_W (unsigned long long mm, unsigned long long mn) | |
63 { | |
64 typedef float v4hi __attribute__ ((mode(V4HI))); | |
65 | |
66 return (unsigned long long) __builtin_addv4hi3 ((v4hi) mm, (v4hi) mn); | |
67 } | |
68 | |
69 static __inline unsigned long long | |
70 sh_media_MADDS_L (unsigned long long mm, unsigned long long mn) | |
71 { | |
72 typedef float v2si __attribute__ ((mode(V2SI))); | |
73 | |
74 return (unsigned long long) __builtin_ssaddv2si3 ((v2si) mm, (v2si) mn); | |
75 } | |
76 | |
77 static __inline unsigned long long | |
78 sh_media_MADDS_UB (unsigned long long mm, unsigned long long mn) | |
79 { | |
80 typedef float v8qi __attribute__ ((mode(V8QI))); | |
81 | |
82 return (unsigned long long) __builtin_usaddv8qi3 ((v8qi) mm, (v8qi) mn); | |
83 } | |
84 | |
85 static __inline unsigned long long | |
86 sh_media_MADDS_W (unsigned long long mm, unsigned long long mn) | |
87 { | |
88 typedef float v4hi __attribute__ ((mode(V4HI))); | |
89 | |
90 return (unsigned long long) __builtin_ssaddv4hi3 ((v4hi) mm, (v4hi) mn); | |
91 } | |
92 | |
93 static __inline unsigned long long | |
94 sh_media_MCMPEQ_B (unsigned long long mm, unsigned long long mn) | |
95 { | |
96 typedef float v8qi __attribute__ ((mode(V8QI))); | |
97 | |
98 return (unsigned long long) __builtin_sh_media_MCMPEQ_B ((v8qi) mm, | |
99 (v8qi) mn); | |
100 } | |
101 | |
102 static __inline unsigned long long | |
103 sh_media_MCMPEQ_L (unsigned long long mm, unsigned long long mn) | |
104 { | |
105 typedef float v2si __attribute__ ((mode(V2SI))); | |
106 | |
107 return (unsigned long long) __builtin_sh_media_MCMPEQ_L ((v2si) mm, | |
108 (v2si) mn); | |
109 } | |
110 | |
111 static __inline unsigned long long | |
112 sh_media_MCMPEQ_W (unsigned long long mm, unsigned long long mn) | |
113 { | |
114 typedef float v4hi __attribute__ ((mode(V4HI))); | |
115 | |
116 return (unsigned long long) __builtin_sh_media_MCMPEQ_W ((v4hi) mm, | |
117 (v4hi) mn); | |
118 } | |
119 | |
120 static __inline unsigned long long | |
121 sh_media_MCMPGT_UB (unsigned long long mm, unsigned long long mn) | |
122 { | |
123 typedef float v8qi __attribute__ ((mode(V8QI))); | |
124 | |
125 return (unsigned long long) __builtin_sh_media_MCMPGT_UB ((v8qi) mm, | |
126 (v8qi) mn); | |
127 } | |
128 | |
129 static __inline unsigned long long | |
130 sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn) | |
131 { | |
132 typedef float v2si __attribute__ ((mode(V2SI))); | |
133 | |
134 return (unsigned long long) __builtin_sh_media_MCMPGT_L ((v2si) mm, | |
135 (v2si) mn); | |
136 } | |
137 | |
138 static __inline unsigned long long | |
139 sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn) | |
140 { | |
141 typedef float v4hi __attribute__ ((mode(V4HI))); | |
142 | |
143 return (unsigned long long) __builtin_sh_media_MCMPGT_W ((v4hi) mm, | |
144 (v4hi) mn); | |
145 } | |
146 | |
147 #define sh_media_MCMV __builtin_sh_media_MCMV | |
148 | |
149 static __inline unsigned long long | |
150 sh_media_MCNVS_LW (unsigned long long mm, unsigned long long mn) | |
151 { | |
152 typedef float v2si __attribute__ ((mode(V2SI))); | |
153 typedef unsigned int uv2si __attribute__ ((mode(V2SI))); | |
154 | |
155 return (unsigned long long) __builtin_sh_media_MCNVS_LW ((v2si) mm, | |
156 (uv2si) mn); | |
157 } | |
158 | |
159 static __inline unsigned long long | |
160 sh_media_MCNVS_WB (unsigned long long mm, unsigned long long mn) | |
161 { | |
162 typedef float v4hi __attribute__ ((mode(V4HI))); | |
163 | |
164 return (unsigned long long) __builtin_sh_media_MCNVS_WB ((v4hi) mm, | |
165 (v4hi) mn); | |
166 } | |
167 | |
168 static __inline unsigned long long | |
169 sh_media_MCNVS_WUB (unsigned long long mm, unsigned long long mn) | |
170 { | |
171 typedef float v4hi __attribute__ ((mode(V4HI))); | |
172 | |
173 return (unsigned long long) __builtin_sh_media_MCNVS_WUB ((v4hi) mm, | |
174 (v4hi) mn); | |
175 } | |
176 | |
177 static __inline unsigned long long | |
178 sh_media_MEXTR1 (unsigned long long mm, unsigned long long mn) | |
179 { | |
180 typedef float v8qi __attribute__ ((mode(V8QI))); | |
181 | |
182 return (unsigned long long) __builtin_sh_media_MEXTR1 ((v8qi) mm, | |
183 (v8qi) mn); | |
184 } | |
185 | |
186 static __inline unsigned long long | |
187 sh_media_MEXTR2 (unsigned long long mm, unsigned long long mn) | |
188 { | |
189 typedef float v8qi __attribute__ ((mode(V8QI))); | |
190 | |
191 return (unsigned long long) __builtin_sh_media_MEXTR2 ((v8qi) mm, | |
192 (v8qi) mn); | |
193 } | |
194 | |
195 static __inline unsigned long long | |
196 sh_media_MEXTR3 (unsigned long long mm, unsigned long long mn) | |
197 { | |
198 typedef float v8qi __attribute__ ((mode(V8QI))); | |
199 | |
200 return (unsigned long long) __builtin_sh_media_MEXTR3 ((v8qi) mm, | |
201 (v8qi) mn); | |
202 } | |
203 | |
204 static __inline unsigned long long | |
205 sh_media_MEXTR4 (unsigned long long mm, unsigned long long mn) | |
206 { | |
207 typedef float v8qi __attribute__ ((mode(V8QI))); | |
208 | |
209 return (unsigned long long) __builtin_sh_media_MEXTR4 ((v8qi) mm, | |
210 (v8qi) mn); | |
211 } | |
212 | |
213 static __inline unsigned long long | |
214 sh_media_MEXTR5 (unsigned long long mm, unsigned long long mn) | |
215 { | |
216 typedef float v8qi __attribute__ ((mode(V8QI))); | |
217 | |
218 return (unsigned long long) __builtin_sh_media_MEXTR5 ((v8qi) mm, | |
219 (v8qi) mn); | |
220 } | |
221 | |
222 static __inline unsigned long long | |
223 sh_media_MEXTR6 (unsigned long long mm, unsigned long long mn) | |
224 { | |
225 typedef float v8qi __attribute__ ((mode(V8QI))); | |
226 | |
227 return (unsigned long long) __builtin_sh_media_MEXTR6 ((v8qi) mm, | |
228 (v8qi) mn); | |
229 } | |
230 | |
231 static __inline unsigned long long | |
232 sh_media_MEXTR7 (unsigned long long mm, unsigned long long mn) | |
233 { | |
234 typedef float v8qi __attribute__ ((mode(V8QI))); | |
235 | |
236 return (unsigned long long) __builtin_sh_media_MEXTR7 ((v8qi) mm, | |
237 (v8qi) mn); | |
238 } | |
239 | |
240 static __inline unsigned long long | |
241 sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn, | |
242 unsigned long long mw) | |
243 { | |
244 typedef float v2hi __attribute__ ((mode(V2HI))); | |
245 typedef float v2si __attribute__ ((mode(V2SI))); | |
246 typedef unsigned int uv2si __attribute__ ((mode(V2SI))); | |
247 | |
248 long mm_l = (long) mm; | |
249 long mn_l = (long) mn; | |
250 | |
251 return ((unsigned long long) | |
252 __builtin_sh_media_MMACFX_WL ((v2hi) mm_l, (v2hi) mn_l, | |
253 (uv2si) mw)); | |
254 } | |
255 | |
256 static __inline unsigned long long | |
257 sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn, | |
258 unsigned long long mw) | |
259 { | |
260 typedef float v2hi __attribute__ ((mode(V2HI))); | |
261 typedef float v2si __attribute__ ((mode(V2SI))); | |
262 typedef unsigned int uv2si __attribute__ ((mode(V2SI))); | |
263 | |
264 long mm_l = (long) mm; | |
265 long mn_l = (long) mn; | |
266 | |
267 return ((unsigned long long) | |
268 __builtin_sh_media_MMACNFX_WL ((v2hi) mm_l, (v2hi) mn_l, | |
269 (uv2si) mw)); | |
270 } | |
271 | |
272 static __inline unsigned long long | |
273 sh_media_MMUL_L (unsigned long long mm, unsigned long long mn) | |
274 { | |
275 typedef float v2si __attribute__ ((mode(V2SI))); | |
276 | |
277 return (unsigned long long) __builtin_mulv2si3 ((v2si) mm, (v2si) mn); | |
278 } | |
279 | |
280 static __inline unsigned long long | |
281 sh_media_MMUL_W (unsigned long long mm, unsigned long long mn) | |
282 { | |
283 typedef float v4hi __attribute__ ((mode(V4HI))); | |
284 | |
285 return (unsigned long long) __builtin_mulv4hi3 ((v4hi) mm, (v4hi) mn); | |
286 } | |
287 | |
288 static __inline unsigned long long | |
289 sh_media_MMULFX_L (unsigned long long mm, unsigned long long mn) | |
290 { | |
291 typedef float v2si __attribute__ ((mode(V2SI))); | |
292 | |
293 return (unsigned long long) __builtin_sh_media_MMULFX_L ((v2si) mm, | |
294 (v2si) mn); | |
295 } | |
296 | |
297 static __inline unsigned long long | |
298 sh_media_MMULFX_W (unsigned long long mm, unsigned long long mn) | |
299 { | |
300 typedef float v4hi __attribute__ ((mode(V4HI))); | |
301 | |
302 return (unsigned long long) __builtin_sh_media_MMULFX_W ((v4hi) mm, | |
303 (v4hi) mn); | |
304 } | |
305 | |
306 static __inline unsigned long long | |
307 sh_media_MMULFXRP_W (unsigned long long mm, unsigned long long mn) | |
308 { | |
309 typedef float v4hi __attribute__ ((mode(V4HI))); | |
310 | |
311 return (unsigned long long) __builtin_sh_media_MMULFXRP_W ((v4hi) mm, | |
312 (v4hi) mn); | |
313 } | |
314 | |
315 static __inline unsigned long long | |
316 sh_media_MMULHI_WL (unsigned long long mm, unsigned long long mn) | |
317 { | |
318 typedef float v4hi __attribute__ ((mode(V4HI))); | |
319 | |
320 return (unsigned long long) __builtin_sh_media_MMULHI_WL ((v4hi) mm, | |
321 (v4hi) mn); | |
322 } | |
323 | |
324 static __inline unsigned long long | |
325 sh_media_MMULLO_WL (unsigned long long mm, unsigned long long mn) | |
326 { | |
327 typedef float v4hi __attribute__ ((mode(V4HI))); | |
328 | |
329 return (unsigned long long) __builtin_sh_media_MMULLO_WL ((v4hi) mm, | |
330 (v4hi) mn); | |
331 } | |
332 | |
333 static __inline unsigned long long | |
334 sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn, | |
335 unsigned long long mw) | |
336 { | |
337 typedef unsigned int uv4hi __attribute__ ((mode(V4HI))); | |
338 | |
339 return __builtin_sh_media_MMULSUM_WQ ((uv4hi) mm, (uv4hi) mn, mw); | |
340 } | |
341 | |
342 static __inline unsigned long long | |
343 sh_media_MPERM_W (unsigned long long mm, unsigned int mn) | |
344 { | |
345 typedef float v4hi __attribute__ ((mode(V4HI))); | |
346 | |
347 return (unsigned long long) __builtin_sh_media_MPERM_W ((v4hi) mm, mn); | |
348 } | |
349 | |
350 static __inline unsigned long long | |
351 sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn, | |
352 unsigned long long mw) | |
353 { | |
354 typedef unsigned int uv8qi __attribute__ ((mode(V8QI))); | |
355 | |
356 return __builtin_sh_media_MSAD_UBQ ((uv8qi) mm, (uv8qi) mn, mw); | |
357 } | |
358 | |
359 static __inline unsigned long long | |
360 sh_media_MSHALDS_L (unsigned long long mm, unsigned int mn) | |
361 { | |
362 typedef float v2si __attribute__ ((mode(V2SI))); | |
363 | |
364 return (unsigned long long) __builtin_sh_media_MSHALDS_L ((v2si) mm, mn); | |
365 } | |
366 | |
367 static __inline unsigned long long | |
368 sh_media_MSHALDS_W (unsigned long long mm, unsigned int mn) | |
369 { | |
370 typedef float v4hi __attribute__ ((mode(V4HI))); | |
371 | |
372 return (unsigned long long) __builtin_sh_media_MSHALDS_W ((v4hi) mm, mn); | |
373 } | |
374 | |
375 static __inline unsigned long long | |
376 sh_media_MSHARD_L (unsigned long long mm, unsigned int mn) | |
377 { | |
378 typedef float v2si __attribute__ ((mode(V2SI))); | |
379 | |
380 return (unsigned long long) __builtin_ashrv2si3 ((v2si) mm, mn); | |
381 } | |
382 | |
383 static __inline unsigned long long | |
384 sh_media_MSHARD_W (unsigned long long mm, unsigned int mn) | |
385 { | |
386 typedef float v4hi __attribute__ ((mode(V4HI))); | |
387 | |
388 return (unsigned long long) __builtin_ashrv4hi3 ((v4hi) mm, mn); | |
389 } | |
390 | |
391 #define sh_media_MSHARDS_Q __builtin_sh_media_MSHARDS_Q | |
392 | |
393 static __inline unsigned long long | |
394 sh_media_MSHFHI_B (unsigned long long mm, unsigned long long mn) | |
395 { | |
396 typedef float v8qi __attribute__ ((mode(V8QI))); | |
397 | |
398 return (unsigned long long) __builtin_sh_media_MSHFHI_B ((v8qi) mm, | |
399 (v8qi) mn); | |
400 } | |
401 | |
402 static __inline unsigned long long | |
403 sh_media_MSHFHI_L (unsigned long long mm, unsigned long long mn) | |
404 { | |
405 typedef float v2si __attribute__ ((mode(V2SI))); | |
406 | |
407 return (unsigned long long) __builtin_sh_media_MSHFHI_L ((v2si) mm, | |
408 (v2si) mn); | |
409 } | |
410 | |
411 static __inline unsigned long long | |
412 sh_media_MSHFHI_W (unsigned long long mm, unsigned long long mn) | |
413 { | |
414 typedef float v4hi __attribute__ ((mode(V4HI))); | |
415 | |
416 return (unsigned long long) __builtin_sh_media_MSHFHI_W ((v4hi) mm, | |
417 (v4hi) mn); | |
418 } | |
419 | |
420 static __inline unsigned long long | |
421 sh_media_MSHFLO_B (unsigned long long mm, unsigned long long mn) | |
422 { | |
423 typedef float v8qi __attribute__ ((mode(V8QI))); | |
424 | |
425 return (unsigned long long) __builtin_sh_media_MSHFLO_B ((v8qi) mm, | |
426 (v8qi) mn); | |
427 } | |
428 | |
429 static __inline unsigned long long | |
430 sh_media_MSHFLO_L (unsigned long long mm, unsigned long long mn) | |
431 { | |
432 typedef float v2si __attribute__ ((mode(V2SI))); | |
433 | |
434 return (unsigned long long) __builtin_sh_media_MSHFLO_L ((v2si) mm, | |
435 (v2si) mn); | |
436 } | |
437 | |
438 static __inline unsigned long long | |
439 sh_media_MSHFLO_W (unsigned long long mm, unsigned long long mn) | |
440 { | |
441 typedef float v4hi __attribute__ ((mode(V4HI))); | |
442 | |
443 return (unsigned long long) __builtin_sh_media_MSHFLO_W ((v4hi) mm, | |
444 (v4hi) mn); | |
445 } | |
446 | |
447 static __inline unsigned long long | |
448 sh_media_MSHLLD_L (unsigned long long mm, unsigned int mn) | |
449 { | |
450 typedef float v2si __attribute__ ((mode(V2SI))); | |
451 | |
452 return (unsigned long long) __builtin_ashlv2si3 ((v2si) mm, mn); | |
453 } | |
454 | |
455 static __inline unsigned long long | |
456 sh_media_MSHLLD_W (unsigned long long mm, unsigned int mn) | |
457 { | |
458 typedef float v4hi __attribute__ ((mode(V4HI))); | |
459 | |
460 return (unsigned long long) __builtin_ashlv4hi3 ((v4hi) mm, mn); | |
461 } | |
462 | |
463 static __inline unsigned long long | |
464 sh_media_MSHLRD_L (unsigned long long mm, unsigned int mn) | |
465 { | |
466 typedef float v2si __attribute__ ((mode(V2SI))); | |
467 | |
468 return (unsigned long long) __builtin_lshrv2si3 ((v2si) mm, mn); | |
469 } | |
470 | |
471 static __inline unsigned long long | |
472 sh_media_MSHLRD_W (unsigned long long mm, unsigned int mn) | |
473 { | |
474 typedef float v4hi __attribute__ ((mode(V4HI))); | |
475 | |
476 return (unsigned long long) __builtin_lshrv4hi3 ((v4hi) mm, mn); | |
477 } | |
478 | |
479 static __inline unsigned long long | |
480 sh_media_MSUB_L (unsigned long long mm, unsigned long long mn) | |
481 { | |
482 typedef float v2si __attribute__ ((mode(V2SI))); | |
483 | |
484 return (unsigned long long) __builtin_subv2si3 ((v2si) mm, (v2si) mn); | |
485 } | |
486 | |
487 static __inline unsigned long long | |
488 sh_media_MSUB_W (unsigned long long mm, unsigned long long mn) | |
489 { | |
490 typedef float v4hi __attribute__ ((mode(V4HI))); | |
491 | |
492 return (unsigned long long) __builtin_subv4hi3 ((v4hi) mm, (v4hi) mn); | |
493 } | |
494 | |
495 static __inline unsigned long long | |
496 sh_media_MSUBS_L (unsigned long long mm, unsigned long long mn) | |
497 { | |
498 typedef float v2si __attribute__ ((mode(V2SI))); | |
499 | |
500 return (unsigned long long) __builtin_sssubv2si3 ((v2si) mm, (v2si) mn); | |
501 } | |
502 | |
503 static __inline unsigned long long | |
504 sh_media_MSUBS_UB (unsigned long long mm, unsigned long long mn) | |
505 { | |
506 typedef float v8qi __attribute__ ((mode(V8QI))); | |
507 | |
508 return (unsigned long long) __builtin_ussubv8qi3 ((v8qi) mm, (v8qi) mn); | |
509 } | |
510 | |
511 static __inline unsigned long long | |
512 sh_media_MSUBS_W (unsigned long long mm, unsigned long long mn) | |
513 { | |
514 typedef float v4hi __attribute__ ((mode(V4HI))); | |
515 | |
516 return (unsigned long long) __builtin_sssubv4hi3 ((v4hi) mm, (v4hi) mn); | |
517 } | |
518 | |
519 #if ! __SH4_NOFPU__ | |
520 /* Floating-point Intrinsics */ | |
521 | |
522 #define sh_media_FABS_D __builtin_fabs | |
523 #define sh_media_FABS_S __builtin_fabsf | |
524 #define sh_media_FCMPUN_D __builtin_isunordered | |
525 #define sh_media_FCMPUN_S __builtin_isunordered | |
526 | |
527 static __inline float sh_media_FCOSA_S (float fg) | |
528 { | |
529 union { int i; float f; } u; | |
530 | |
531 u.f = fg; | |
532 return __builtin_sh_media_FCOSA_S (u.i); | |
533 } | |
534 | |
535 static __inline float | |
536 sh_media_FGETSCR (void) | |
537 { | |
538 float f; | |
539 | |
540 __asm volatile ("fgetscr %0" : "=f" (f)); | |
541 return f; | |
542 } | |
543 | |
544 static __inline float | |
545 sh_media_FIPR_S (const void *fvg, const void *fvh) | |
546 { | |
547 typedef float v4sf __attribute__ ((mode(V4SF))); | |
548 v4sf vg = *(v4sf*) fvg; | |
549 v4sf vh = *(v4sf*) fvh; | |
550 | |
551 return __builtin_sh_media_FIPR_S (vg, vh); | |
552 } | |
553 | |
554 #if 0 | |
555 /* This gives different results for -O0 */ | |
556 static __inline float | |
557 sh_media_FMAC_S (float fg, float fh, float fq) | |
558 { | |
559 return fg * fh + fq; | |
560 } | |
561 #else | |
562 | |
563 #define sh_media_FMAC_S __builtin_sh_media_FMAC_S | |
564 #endif | |
565 | |
566 static __inline long long | |
567 sh_media_FMOV_DQ (double dg) | |
568 { | |
569 union { long long l; double d; } u; | |
570 | |
571 u.d = dg; | |
572 return u.l; | |
573 } | |
574 | |
575 static __inline float | |
576 sh_media_FMOV_LS (int mm) | |
577 { | |
578 union { int i; float f; } u; | |
579 | |
580 u.i = mm; | |
581 return u.f; | |
582 } | |
583 | |
584 static __inline double | |
585 sh_media_FMOV_QD (long long mm) | |
586 { | |
587 union { long long l; double d; } u; | |
588 | |
589 u.l = mm; | |
590 return u.d; | |
591 } | |
592 | |
593 static __inline int | |
594 sh_media_FMOV_SL (float fg) | |
595 { | |
596 union { int i; float f; } u; | |
597 | |
598 u.f = fg; | |
599 return u.i; | |
600 } | |
601 | |
602 static __inline void | |
603 sh_media_FPUTSCR (float fg) | |
604 { | |
605 __asm volatile ("fputscr %0" : : "f" (fg)); | |
606 } | |
607 | |
608 static __inline float sh_media_FSINA_S (float fg) | |
609 { | |
610 union { int i; float f; } u; | |
611 | |
612 u.f = fg; | |
613 return __builtin_sh_media_FSINA_S (u.i); | |
614 } | |
615 | |
616 /* Can't use __builtin_sqrt / __builtin_sqrtf because they still implement | |
617 error handling unless -ffast-math is used. */ | |
618 #define sh_media_FSQRT_D __builtin_sh_media_FSQRT_D | |
619 #define sh_media_FSQRT_S __builtin_sh_media_FSQRT_S | |
620 #define sh_media_FSRRA_S __builtin_sh_media_FSRRA_S | |
621 | |
622 static __inline void | |
623 sh_media_FTRV_S (const void *mtrxg, const void *fvh, void *fvf) | |
624 { | |
625 typedef float v16sf __attribute__ ((mode(V16SF))); | |
626 typedef float v4sf __attribute__ ((mode(V4SF))); | |
627 v16sf mtrx = *(v16sf*) mtrxg; | |
628 v4sf vh = *(v4sf*) fvh; | |
629 | |
630 *(v4sf*) fvf = __builtin_sh_media_FTRV_S (mtrx, vh); | |
631 } | |
632 #endif /* ! __SH4_NOFPU__ */ | |
633 | |
634 /* Not implemented here: Control and Configuration intrinsics. */ | |
635 /* Misaligned Access Support intrinsics */ | |
636 | |
637 static __inline unsigned long long | |
638 sh_media_LDHI_L (void *p, int s) | |
639 { | |
640 return __builtin_sh_media_LDHI_L ((char *)p + s); | |
641 } | |
642 | |
643 static __inline unsigned long long | |
644 sh_media_LDHI_Q (void *p, int s) | |
645 { | |
646 return __builtin_sh_media_LDHI_Q ((char *)p + s); | |
647 } | |
648 | |
649 static __inline unsigned long long | |
650 sh_media_LDLO_L (void *p, int s) | |
651 { | |
652 return __builtin_sh_media_LDLO_L ((char *)p + s); | |
653 } | |
654 | |
655 static __inline unsigned long long | |
656 sh_media_LDLO_Q (void *p, int s) | |
657 { | |
658 return __builtin_sh_media_LDLO_Q ((char *)p + s); | |
659 } | |
660 | |
661 static __inline void | |
662 sh_media_STHI_L (void *p, int s, unsigned int mw) | |
663 { | |
664 __builtin_sh_media_STHI_L ((char*)p + s, mw); | |
665 } | |
666 | |
667 static __inline void | |
668 sh_media_STHI_Q (void *p, int s, unsigned long long mw) | |
669 { | |
670 __builtin_sh_media_STHI_Q ((char*)p + s, mw); | |
671 } | |
672 | |
673 static __inline void | |
674 sh_media_STLO_L (void *p, int s, unsigned int mw) | |
675 { | |
676 __builtin_sh_media_STLO_L ((char*)p + s, mw); | |
677 } | |
678 | |
679 static __inline void | |
680 sh_media_STLO_Q (void *p, int s, unsigned long long mw) | |
681 { | |
682 __builtin_sh_media_STLO_Q ((char*)p + s, mw); | |
683 } | |
684 | |
685 /* Miscellaneous intrinsics */ | |
686 | |
687 #define sh_media_NSB __builtin_sh_media_NSB | |
688 | |
689 static __inline unsigned long long | |
690 sh_media_BYTEREV (unsigned long long mm) | |
691 { | |
692 typedef float v8qi __attribute__ ((mode(V8QI))); | |
693 | |
694 return (unsigned long long) __builtin_sh_media_BYTEREV ((v8qi) mm); | |
695 } | |
696 | |
697 __inline__ static unsigned long long | |
698 sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline)); | |
699 | |
700 __inline__ static unsigned long long | |
701 sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) | |
702 { | |
703 return mm == 0 ? mn : mw; | |
704 } | |
705 | |
706 __inline__ static unsigned long long | |
707 sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline)); | |
708 | |
709 __inline__ static unsigned long long | |
710 sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw) | |
711 { | |
712 return mm != 0 ? mn : mw; | |
713 } | |
714 | |
715 static __inline long long | |
716 sh_media_ADDZ_L (unsigned int mm, unsigned int mn) | |
717 { | |
718 return mm + mn; | |
719 } | |
720 | |
721 /* NOP and Synchronization intrinsics not implemented here. */ | |
722 | |
723 static __inline__ void sh_media_PREFO(void *mm, int s) | |
724 { | |
725 __builtin_sh_media_PREFO (mm + s, 0, 0); | |
726 } | |
727 | |
728 /* Event Handling intrinsics not implemented here. */ | |
729 | |
730 /* Old asm stuff */ | |
731 | |
732 static __inline__ | |
733 void | |
734 sh_media_NOP (void) | |
735 { | |
736 __asm__ ("nop" : :); | |
737 } | |
738 | |
739 __inline__ static | |
740 unsigned long long | |
741 sh_media_SWAP_Q (void *mm, long long mn, unsigned long long mw) | |
742 { | |
743 unsigned long long res; | |
744 unsigned long long *addr = (unsigned long long *)((char *)mm + mn); | |
745 __asm__ ("swap.q %m1, %0" : "=r" (res), "+o" (*addr) : "0" (mw)); | |
746 return res; | |
747 } | |
748 | |
749 __inline__ static | |
750 void | |
751 sh_media_SYNCI (void) | |
752 { | |
753 __asm__ __volatile__ ("synci"); | |
754 } | |
755 | |
756 __inline__ static | |
757 void | |
758 sh_media_SYNCO (void) | |
759 { | |
760 __asm__ __volatile__ ("synco"); | |
761 } | |
762 | |
763 __inline__ static | |
764 void | |
765 sh_media_ALLOCO (void *mm, int s) | |
766 { | |
767 __builtin_sh_media_ALLOCO (mm + s); | |
768 } | |
769 | |
770 __inline__ static | |
771 void | |
772 sh_media_ICBI (void *mm, int s) | |
773 { | |
774 __asm__ __volatile__ ("icbi %m0" : : "o" (((char*)mm)[s])); | |
775 } | |
776 | |
777 __inline__ static | |
778 void | |
779 sh_media_OCBI (void *mm, int s) | |
780 { | |
781 __asm__ __volatile__ ("ocbi %m0" : : "o" (((char*)mm)[s])); | |
782 } | |
783 | |
784 __inline__ static | |
785 void | |
786 sh_media_OCBP (void *mm, int s) | |
787 { | |
788 __asm__ __volatile__ ("ocbp %m0" : : "o" (((char*)mm)[s])); | |
789 } | |
790 | |
791 __inline__ static | |
792 void | |
793 sh_media_OCBWB (void *mm, int s) | |
794 { | |
795 __asm__ __volatile__ ("ocbwb %m0" : : "o" (((char*)mm)[s])); | |
796 } | |
797 | |
798 __inline__ static | |
799 void | |
800 sh_media_PREFI (void *mm, int s) | |
801 { | |
802 __asm__ __volatile__ ("prefi %m0" : : "o" (((char*)mm)[s])); | |
803 } | |
804 | |
805 __inline__ static | |
806 void | |
807 sh_media_BRK (void) | |
808 { | |
809 __asm__ __volatile__ ("brk"); | |
810 } | |
811 | |
812 __inline__ static | |
813 void | |
814 sh_media_TRAPA (unsigned long long mm) | |
815 { | |
816 __asm__ __volatile__ ("trapa %%0" : : "r" (mm)); | |
817 } | |
818 | |
819 __inline__ static | |
820 short | |
821 sh_media_unaligned_LD_W (void *p) | |
822 { | |
823 #if __LITTLE_ENDIAN__ | |
824 return (((unsigned char *)p)[0] | |
825 | (((short)((__signed__ char *)p)[1]) << 8)); | |
826 #else | |
827 return ((((short)((__signed__ char *)p)[0]) << 8) | |
828 | ((unsigned char *)p)[1]); | |
829 #endif | |
830 } | |
831 | |
832 __inline__ static | |
833 unsigned short | |
834 sh_media_unaligned_LD_UW (void *p) | |
835 { | |
836 unsigned char *addr = p; | |
837 #if __LITTLE_ENDIAN__ | |
838 return sh_media_MSHFLO_B (addr[0], addr[1]); | |
839 #else | |
840 return sh_media_MSHFLO_B (addr[1], addr[0]); | |
841 #endif | |
842 } | |
843 | |
844 /* We don't use the sh_media_LD* functions here because that turned out | |
845 to impede constant propagation of the offsets into the ldhi / ldlo | |
846 instructions. */ | |
847 __inline__ static | |
848 int | |
849 sh_media_unaligned_LD_L (void *p) | |
850 { | |
851 #if __LITTLE_ENDIAN__ | |
852 return (__builtin_sh_media_LDHI_L ((char *)p + 3) | |
853 | __builtin_sh_media_LDLO_L (p)); | |
854 #else | |
855 return (__builtin_sh_media_LDLO_L ((char *)p + 3) | |
856 | __builtin_sh_media_LDHI_L (p)); | |
857 #endif | |
858 } | |
859 | |
860 __inline__ static | |
861 long long | |
862 sh_media_unaligned_LD_Q (void *p) | |
863 { | |
864 #if __LITTLE_ENDIAN__ | |
865 return (__builtin_sh_media_LDHI_Q ((char *)p + 7) | |
866 | __builtin_sh_media_LDLO_Q (p)); | |
867 #else | |
868 return (__builtin_sh_media_LDLO_Q ((char *)p + 7) | |
869 | __builtin_sh_media_LDHI_Q (p)); | |
870 #endif | |
871 } | |
872 | |
873 __inline__ static | |
874 void | |
875 sh_media_unaligned_ST_W (void *p, unsigned int k) | |
876 { | |
877 char *addr = p; | |
878 #if __LITTLE_ENDIAN__ | |
879 addr[0] = k; | |
880 addr[1] = k >> 8; | |
881 #else | |
882 addr[1] = k; | |
883 addr[0] = k >> 8; | |
884 #endif | |
885 } | |
886 | |
887 /* We don't use the sh_media_ST* functions here because that turned out | |
888 to impede constant propagation of the offsets into the ldhi / ldlo | |
889 instructions. */ | |
890 __inline__ static | |
891 void | |
892 sh_media_unaligned_ST_L (void *p, unsigned int k) | |
893 { | |
894 #if __LITTLE_ENDIAN__ | |
895 __builtin_sh_media_STHI_L (p + 3, k); | |
896 __builtin_sh_media_STLO_L (p, k); | |
897 #else | |
898 __builtin_sh_media_STLO_L (p + 3, k); | |
899 __builtin_sh_media_STHI_L (p, k); | |
900 #endif | |
901 } | |
902 | |
903 __inline__ static | |
904 void | |
905 sh_media_unaligned_ST_Q (void *p, unsigned long long k) | |
906 { | |
907 #if __LITTLE_ENDIAN__ | |
908 __builtin_sh_media_STHI_Q (p + 7, k); | |
909 __builtin_sh_media_STLO_Q (p, k); | |
910 #else | |
911 __builtin_sh_media_STLO_Q (p + 7, k); | |
912 __builtin_sh_media_STHI_Q (p, k); | |
913 #endif | |
914 } | |
915 | |
916 #if ! __SH4_NOFPU__ | |
917 __inline__ static | |
918 void | |
919 sh_media_FVCOPY_S (const void *fvg, void *fvf) | |
920 { | |
921 const __GCC_FV *g = fvg; | |
922 __GCC_FV *f = fvf; | |
923 *f = *g; | |
924 } | |
925 | |
926 __inline__ static | |
927 void | |
928 sh_media_FVADD_S (const void *fvg, const void *fvh, void *fvf) | |
929 { | |
930 const float *g = fvg, *h = fvh; | |
931 float *f = fvf; | |
932 #if 1 | |
933 int i; | |
934 | |
935 for (i = 0; i < 4; i++) | |
936 f[i] = g[i] + h[i]; | |
937 #else | |
938 f[0] = g[0] + h[0]; | |
939 f[1] = g[1] + h[1]; | |
940 f[2] = g[2] + h[2]; | |
941 f[3] = g[3] + h[3]; | |
942 #endif | |
943 } | |
944 | |
945 __inline__ static | |
946 void | |
947 sh_media_FVSUB_S (const void *fvg, const void *fvh, void *fvf) | |
948 { | |
949 const float *g = fvg, *h = fvh; | |
950 float *f = fvf; | |
951 #if 1 | |
952 int i; | |
953 | |
954 for (i = 0; i < 4; i++) | |
955 f[i] = g[i] - h[i]; | |
956 #else | |
957 f[0] = g[0] - h[0]; | |
958 f[1] = g[1] - h[1]; | |
959 f[2] = g[2] - h[2]; | |
960 f[3] = g[3] - h[3]; | |
961 #endif | |
962 } | |
963 | |
964 __inline__ static | |
965 void | |
966 sh_media_FMTRXCOPY_S (const void *mtrxg, void *mtrxf) | |
967 { | |
968 const __GCC_MTRX *g = mtrxg; | |
969 __GCC_MTRX *f = mtrxf; | |
970 *f = *g; | |
971 } | |
972 | |
973 __inline__ static | |
974 void | |
975 sh_media_FMTRXADD_S (const void *mtrxg, const void *mtrxh, void *mtrxf) | |
976 { | |
977 const __GCC_FV *g = mtrxg, *h = mtrxh; | |
978 __GCC_FV *f = mtrxf; | |
979 #if 1 | |
980 int i; | |
981 | |
982 for (i = 0; i < 4; i++) | |
983 sh_media_FVADD_S (&g[i], &h[i], &f[i]); | |
984 #else | |
985 sh_media_FVADD_S (&g[0], &h[0], &f[0]); | |
986 sh_media_FVADD_S (&g[1], &h[1], &f[1]); | |
987 sh_media_FVADD_S (&g[2], &h[2], &f[2]); | |
988 sh_media_FVADD_S (&g[3], &h[3], &f[3]); | |
989 #endif | |
990 } | |
991 | |
992 __inline__ static | |
993 void | |
994 sh_media_FMTRXSUB_S (const void *mtrxg, const void *mtrxh, void *mtrxf) | |
995 { | |
996 const __GCC_FV *g = mtrxg, *h = mtrxh; | |
997 __GCC_FV *f = mtrxf; | |
998 #if 1 | |
999 int i; | |
1000 | |
1001 for (i = 0; i < 4; i++) | |
1002 sh_media_FVSUB_S (&g[i], &h[i], &f[i]); | |
1003 #else | |
1004 sh_media_FVSUB_S (&g[0], &h[0], &f[0]); | |
1005 sh_media_FVSUB_S (&g[1], &h[1], &f[1]); | |
1006 sh_media_FVSUB_S (&g[2], &h[2], &f[2]); | |
1007 sh_media_FVSUB_S (&g[3], &h[3], &f[3]); | |
1008 #endif | |
1009 } | |
1010 | |
1011 __inline__ static | |
1012 void | |
1013 sh_media_FTRVADD_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf) | |
1014 { | |
1015 sh_media_FTRV_S (mtrxg, fvh, fvf); | |
1016 sh_media_FVADD_S (fvf, fvi, fvf); | |
1017 } | |
1018 | |
1019 __inline__ static | |
1020 void | |
1021 sh_media_FTRVSUB_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf) | |
1022 { | |
1023 sh_media_FTRV_S (mtrxg, fvh, fvf); | |
1024 sh_media_FVSUB_S (fvf, fvi, fvf); | |
1025 } | |
1026 | |
1027 __inline__ static | |
1028 void | |
1029 sh_media_FMTRXMUL_S (const void *mtrxg, const void *mtrxh, void *mtrxf) | |
1030 { | |
1031 const __GCC_FV *g = mtrxg; | |
1032 __GCC_FV *f = mtrxf; | |
1033 #if 1 | |
1034 int j; | |
1035 | |
1036 for (j = 0; j < 4; j++) | |
1037 sh_media_FTRV_S (mtrxh, &g[j], &f[j]); | |
1038 #else | |
1039 sh_media_FTRV_S (mtrxh, &g[0], &f[0]); | |
1040 sh_media_FTRV_S (mtrxh, &g[1], &f[1]); | |
1041 sh_media_FTRV_S (mtrxh, &g[2], &f[2]); | |
1042 sh_media_FTRV_S (mtrxh, &g[3], &f[3]); | |
1043 #endif | |
1044 } | |
1045 | |
1046 __inline__ static | |
1047 void | |
1048 sh_media_FMTRXMULADD_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf) | |
1049 { | |
1050 const __GCC_FV *g = mtrxg, *i = mtrxi; | |
1051 __GCC_FV *f = mtrxf; | |
1052 #if 1 | |
1053 int j; | |
1054 | |
1055 for (j = 0; j < 4; j++) | |
1056 sh_media_FTRVADD_S (mtrxh, &g[j], &i[j], &f[j]); | |
1057 #else | |
1058 sh_media_FTRVADD_S (mtrxh, &g[0], &i[0], &f[0]); | |
1059 sh_media_FTRVADD_S (mtrxh, &g[1], &i[1], &f[1]); | |
1060 sh_media_FTRVADD_S (mtrxh, &g[2], &i[2], &f[2]); | |
1061 sh_media_FTRVADD_S (mtrxh, &g[3], &i[3], &f[3]); | |
1062 #endif | |
1063 } | |
1064 | |
1065 __inline__ static | |
1066 void | |
1067 sh_media_FMTRXMULSUB_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf) | |
1068 { | |
1069 const __GCC_FV *g = mtrxg, *i = mtrxi; | |
1070 __GCC_FV *f = mtrxf; | |
1071 #if 1 | |
1072 int j; | |
1073 | |
1074 for (j = 0; j < 4; j++) | |
1075 sh_media_FTRVSUB_S (mtrxh, &g[j], &i[j], &f[j]); | |
1076 #else | |
1077 sh_media_FTRVSUB_S (mtrxh, &g[0], &i[0], &f[0]); | |
1078 sh_media_FTRVSUB_S (mtrxh, &g[1], &i[1], &f[1]); | |
1079 sh_media_FTRVSUB_S (mtrxh, &g[2], &i[2], &f[2]); | |
1080 sh_media_FTRVSUB_S (mtrxh, &g[3], &i[3], &f[3]); | |
1081 #endif | |
1082 } | |
1083 #endif /* ! __SH4_NOFPU__ */ | |
1084 | |
1085 #endif /* __SHMEDIA__ */ | |
1086 | |
1087 #endif /* _USHMEDIA_H */ |