Merge from mainline (gomp-merge-2005-02-26).
[official-gcc.git] / gcc / config / sh / ushmedia.h
blob6fb70162618c19ebe23bbc0a0924d80b19e32d6e
1 /* Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
3 This file is part of GCC.
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 2, or (at your option)
8 any later version.
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.
15 You should have received a copy of the GNU General Public License
16 along with GCC; see the file COPYING. If not, write to
17 the Free Software Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
20 /* As a special exception, if you include this header file into source
21 files compiled by GCC, this header file does not by itself cause
22 the resulting executable to be covered by the GNU General Public
23 License. This exception does not however invalidate any other
24 reasons why the executable file might be covered by the GNU General
25 Public License. */
27 /* ushmedia.h: Intrinsics corresponding to SHmedia instructions that
28 may be executed in both user and privileged mode. */
30 #ifndef _USHMEDIA_H
31 #define _USHMEDIA_H
33 #if __SHMEDIA__
34 #if ! __SH4_NO_FPU
35 typedef float __GCC_FV __attribute__ ((vector_size (4 * sizeof (float))));
36 typedef float __GCC_MTRX __attribute__ ((vector_size (16 * sizeof (float))));
37 #endif
39 __inline__ static
40 unsigned long long
41 sh_media_MABS_L (unsigned long long mm)
43 unsigned long long res;
44 __asm__ ("mabs.l %1, %0" : "=r" (res) : "r" (mm));
45 return res;
48 __inline__ static
49 unsigned long long
50 sh_media_MABS_W (unsigned long long mm)
52 unsigned long long res;
53 __asm__ ("mabs.w %1, %0" : "=r" (res) : "r" (mm));
54 return res;
57 __inline__ static
58 unsigned long long
59 sh_media_MADD_L (unsigned long long mm, unsigned long long mn)
61 unsigned long long res;
62 __asm__ ("madd.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
63 return res;
66 __inline__ static
67 unsigned long long
68 sh_media_MADD_W (unsigned long long mm, unsigned long long mn)
70 unsigned long long res;
71 __asm__ ("madd.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
72 return res;
75 __inline__ static
76 unsigned long long
77 sh_media_MADDS_L (unsigned long long mm, unsigned long long mn)
79 unsigned long long res;
80 __asm__ ("madds.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
81 return res;
84 __inline__ static
85 unsigned long long
86 sh_media_MADDS_UB (unsigned long long mm, unsigned long long mn)
88 unsigned long long res;
89 __asm__ ("madds.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
90 return res;
93 __inline__ static
94 unsigned long long
95 sh_media_MADDS_W (unsigned long long mm, unsigned long long mn)
97 unsigned long long res;
98 __asm__ ("madds.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
99 return res;
102 __inline__ static
103 unsigned long long
104 sh_media_MCMPEQ_B (unsigned long long mm, unsigned long long mn)
106 unsigned long long res;
107 __asm__ ("mcmpeq.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
108 return res;
111 __inline__ static
112 unsigned long long
113 sh_media_MCMPEQ_L (unsigned long long mm, unsigned long long mn)
115 unsigned long long res;
116 __asm__ ("mcmpeq.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
117 return res;
120 __inline__ static
121 unsigned long long
122 sh_media_MCMPEQ_W (unsigned long long mm, unsigned long long mn)
124 unsigned long long res;
125 __asm__ ("mcmpeq.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
126 return res;
129 __inline__ static
130 unsigned long long
131 sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn)
133 unsigned long long res;
134 __asm__ ("mcmpgt.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
135 return res;
138 __inline__ static
139 unsigned long long
140 sh_media_MCMPGT_UB (unsigned long long mm, unsigned long long mn)
142 unsigned long long res;
143 __asm__ ("mcmpgt.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
144 return res;
147 __inline__ static
148 unsigned long long
149 sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn)
151 unsigned long long res;
152 __asm__ ("mcmpgt.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
153 return res;
156 __inline__ static
157 unsigned long long
158 sh_media_MCMV (unsigned long long mm, unsigned long long mn, unsigned long long mw)
160 unsigned long long res;
161 __asm__ ("mcmv %1, %2, %0" : "=r" (res)
162 : "r" (mm), "r" (mn), "0" (mw));
163 return res;
166 __inline__ static
167 unsigned long long
168 sh_media_MCNVS_LW (unsigned long long mm, unsigned long long mn)
170 unsigned long long res;
171 __asm__ ("mcnvs.lw %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
172 return res;
175 __inline__ static
176 unsigned long long
177 sh_media_MCNVS_WB (unsigned long long mm, unsigned long long mn)
179 unsigned long long res;
180 __asm__ ("mcnvs.wb %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
181 return res;
184 __inline__ static
185 unsigned long long
186 sh_media_MCNVS_WUB (unsigned long long mm, unsigned long long mn)
188 unsigned long long res;
189 __asm__ ("mcnvs.wub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
190 return res;
193 __inline__ static
194 unsigned long long
195 sh_media_MEXTR1 (unsigned long long mm, unsigned long long mn)
197 unsigned long long res;
198 __asm__ ("mextr1 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
199 return res;
202 __inline__ static
203 unsigned long long
204 sh_media_MEXTR2 (unsigned long long mm, unsigned long long mn)
206 unsigned long long res;
207 __asm__ ("mextr2 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
208 return res;
211 __inline__ static
212 unsigned long long
213 sh_media_MEXTR3 (unsigned long long mm, unsigned long long mn)
215 unsigned long long res;
216 __asm__ ("mextr3 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
217 return res;
220 __inline__ static
221 unsigned long long
222 sh_media_MEXTR4 (unsigned long long mm, unsigned long long mn)
224 unsigned long long res;
225 __asm__ ("mextr4 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
226 return res;
229 __inline__ static
230 unsigned long long
231 sh_media_MEXTR5 (unsigned long long mm, unsigned long long mn)
233 unsigned long long res;
234 __asm__ ("mextr5 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
235 return res;
238 __inline__ static
239 unsigned long long
240 sh_media_MEXTR6 (unsigned long long mm, unsigned long long mn)
242 unsigned long long res;
243 __asm__ ("mextr6 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
244 return res;
247 __inline__ static
248 unsigned long long
249 sh_media_MEXTR7 (unsigned long long mm, unsigned long long mn)
251 unsigned long long res;
252 __asm__ ("mextr7 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
253 return res;
256 __inline__ static
257 unsigned long long
258 sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw)
260 unsigned long long res;
261 __asm__ ("mmacfx.wl %1, %2, %0" : "=r" (res)
262 : "r" (mm), "r" (mn), "0" (mw));
263 return res;
266 __inline__ static
267 unsigned long long
268 sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw)
270 unsigned long long res;
271 __asm__ ("mmacnfx.wl %1, %2, %0" : "=r" (res)
272 : "r" (mm), "r" (mn), "0" (mw));
273 return res;
276 __inline__ static
277 unsigned long long
278 sh_media_MMUL_L (unsigned long long mm, unsigned long long mn)
280 unsigned long long res;
281 __asm__ ("mmul.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
282 return res;
285 __inline__ static
286 unsigned long long
287 sh_media_MMUL_W (unsigned long long mm, unsigned long long mn)
289 unsigned long long res;
290 __asm__ ("mmul.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
291 return res;
294 __inline__ static
295 unsigned long long
296 sh_media_MMULFX_L (unsigned long long mm, unsigned long long mn)
298 unsigned long long res;
299 __asm__ ("mmulfx.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
300 return res;
303 __inline__ static
304 unsigned long long
305 sh_media_MMULFX_W (unsigned long long mm, unsigned long long mn)
307 unsigned long long res;
308 __asm__ ("mmulfx.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
309 return res;
312 __inline__ static
313 unsigned long long
314 sh_media_MMULFXRP_W (unsigned long long mm, unsigned long long mn)
316 unsigned long long res;
317 __asm__ ("mmulfxrp.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
318 return res;
321 __inline__ static
322 unsigned long long
323 sh_media_MMULHI_WL (unsigned long long mm, unsigned long long mn)
325 unsigned long long res;
326 __asm__ ("mmulhi.wl %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
327 return res;
330 __inline__ static
331 unsigned long long
332 sh_media_MMULLO_WL (unsigned long long mm, unsigned long long mn)
334 unsigned long long res;
335 __asm__ ("mmullo.wl %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
336 return res;
339 __inline__ static
340 unsigned long long
341 sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
343 unsigned long long res;
344 __asm__ ("mmulsum.wq %1, %2, %0" : "=r" (res)
345 : "r" (mm), "r" (mn), "0" (mw));
346 return res;
349 __inline__ static
350 unsigned long long
351 sh_media_MPERM_W (unsigned long long mm, unsigned int mn)
353 unsigned long long res;
354 __asm__ ("mperm.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
355 return res;
358 __inline__ static
359 unsigned long long
360 sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
362 unsigned long long res;
363 __asm__ ("msad.ubq %1, %2, %0" : "=r" (res)
364 : "r" (mm), "r" (mn), "0" (mw));
365 return res;
368 __inline__ static
369 unsigned long long
370 sh_media_MSHALDS_L (unsigned long long mm, unsigned int mn)
372 unsigned long long res;
373 __asm__ ("mshalds.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
374 return res;
377 __inline__ static
378 unsigned long long
379 sh_media_MSHALDS_W (unsigned long long mm, unsigned int mn)
381 unsigned long long res;
382 __asm__ ("mshalds.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
383 return res;
386 __inline__ static
387 unsigned long long
388 sh_media_MSHARD_L (unsigned long long mm, unsigned int mn)
390 unsigned long long res;
391 __asm__ ("mshard.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
392 return res;
395 __inline__ static
396 unsigned long long
397 sh_media_MSHARD_W (unsigned long long mm, unsigned int mn)
399 unsigned long long res;
400 __asm__ ("mshard.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
401 return res;
404 __inline__ static
405 short
406 sh_media_MSHARDS_Q (long long mm, unsigned int mn)
408 short res;
409 __asm__ ("mshards.q %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
410 return res;
413 __inline__ static
414 unsigned long long
415 sh_media_MSHFHI_B (unsigned long long mm, unsigned long long mn)
417 unsigned long long res;
418 __asm__ ("mshfhi.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
419 return res;
422 __inline__ static
423 unsigned long long
424 sh_media_MSHFHI_L (unsigned long long mm, unsigned long long mn)
426 unsigned long long res;
427 __asm__ ("mshfhi.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
428 return res;
431 __inline__ static
432 unsigned long long
433 sh_media_MSHFHI_W (unsigned long long mm, unsigned long long mn)
435 unsigned long long res;
436 __asm__ ("mshfhi.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
437 return res;
440 __inline__ static
441 unsigned long long
442 sh_media_MSHFLO_B (unsigned long long mm, unsigned long long mn)
444 unsigned long long res;
445 __asm__ ("mshflo.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
446 return res;
449 __inline__ static
450 unsigned long long
451 sh_media_MSHFLO_L (unsigned long long mm, unsigned long long mn)
453 unsigned long long res;
454 __asm__ ("mshflo.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
455 return res;
458 __inline__ static
459 unsigned long long
460 sh_media_MSHFLO_W (unsigned long long mm, unsigned long long mn)
462 unsigned long long res;
463 __asm__ ("mshflo.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
464 return res;
467 __inline__ static
468 unsigned long long
469 sh_media_MSHLLD_L (unsigned long long mm, unsigned int mn)
471 unsigned long long res;
472 __asm__ ("mshlld.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
473 return res;
476 __inline__ static
477 unsigned long long
478 sh_media_MSHLLD_W (unsigned long long mm, unsigned int mn)
480 unsigned long long res;
481 __asm__ ("mshlld.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
482 return res;
485 __inline__ static
486 unsigned long long
487 sh_media_MSHLRD_L (unsigned long long mm, unsigned int mn)
489 unsigned long long res;
490 __asm__ ("mshlrd.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
491 return res;
494 __inline__ static
495 unsigned long long
496 sh_media_MSHLRD_W (unsigned long long mm, unsigned int mn)
498 unsigned long long res;
499 __asm__ ("mshlrd.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
500 return res;
503 __inline__ static
504 unsigned long long
505 sh_media_MSUB_L (unsigned long long mm, unsigned long long mn)
507 unsigned long long res;
508 __asm__ ("msub.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
509 return res;
512 __inline__ static
513 unsigned long long
514 sh_media_MSUB_W (unsigned long long mm, unsigned long long mn)
516 unsigned long long res;
517 __asm__ ("msub.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
518 return res;
521 __inline__ static
522 unsigned long long
523 sh_media_MSUBS_L (unsigned long long mm, unsigned long long mn)
525 unsigned long long res;
526 __asm__ ("msubs.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
527 return res;
530 __inline__ static
531 unsigned long long
532 sh_media_MSUBS_UB (unsigned long long mm, unsigned long long mn)
534 unsigned long long res;
535 __asm__ ("msubs.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
536 return res;
539 __inline__ static
540 unsigned long long
541 sh_media_MSUBS_W (unsigned long long mm, unsigned long long mn)
543 unsigned long long res;
544 __asm__ ("msubs.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
545 return res;
548 #if ! __SH4_NOFPU__
549 __inline__ static
550 double
551 sh_media_FABS_D (double dg)
553 double res;
554 __asm__ ("fabs.d %1, %0" : "=f" (res) : "f" (dg));
555 return res;
558 __inline__ static
559 float
560 sh_media_FABS_S (float fg)
562 float res;
563 __asm__ ("fabs.s %1, %0" : "=f" (res) : "f" (fg));
564 return res;
567 __inline__ static
568 int
569 sh_media_FCMPUN_D (double dg, double dh)
571 int res;
572 __asm__ ("fcmpun.d %1, %2, %0" : "=f" (res) : "f" (dg), "f" (dh));
573 return res;
576 __inline__ static
577 int
578 sh_media_FCMPUN_S (float fg, float fh)
580 int res;
581 __asm__ ("fcmpun.s %1, %2, %0" : "=f" (res) : "f" (fg), "f" (fh));
582 return res;
585 __inline__ static
586 float
587 sh_media_FGETSCR (void)
589 float res;
590 __asm__ ("fgetscr %0" : "=f" (res));
591 return res;
594 __inline__ static
595 float
596 sh_media_FIPR_S (const void *fvg, const void *fvh)
598 float res;
599 __asm__ ("fipr.s %1, %2, %0" : "=f" (res)
600 : "f" (*(const __GCC_FV *)fvg), "f" (*(const __GCC_FV *)fvh));
601 return res;
604 __inline__ static
605 float
606 sh_media_FMAC_S (float fg, float fh, float fq)
608 float res;
609 __asm__ ("fmac.s %1, %2, %0" : "=f" (res)
610 : "f" (fg), "f" (fh), "0" (fq));
611 return res;
614 __inline__ static
615 long long
616 sh_media_FMOV_DQ (double dg)
618 long long res;
619 __asm__ ("fmov.dq %1, %0" : "=r" (res) : "f" (dg));
620 return res;
623 __inline__ static
624 float
625 sh_media_FMOV_LS (int mm)
627 float res;
628 __asm__ ("fmov.ls %1, %0" : "=f" (res) : "r" (mm));
629 return res;
632 __inline__ static
633 double
634 sh_media_FMOV_QD (long long mm)
636 double res;
637 __asm__ ("fmov.qd %1, %0" : "=f" (res) : "r" (mm));
638 return res;
641 __inline__ static
643 sh_media_FMOV_SL (float fg)
645 int res;
646 __asm__ ("fmov.sl %1, %0" : "=r" (res) : "f" (fg));
647 return res;
650 __inline__ static
651 void
652 sh_media_FPUTSCR (float fg)
654 __asm__ ("fputscr %0" : : "f" (fg));
657 __inline__ static
658 double
659 sh_media_FSQRT_D (double dg)
661 double res;
662 __asm__ ("fsqrt.d %1, %0" : "=f" (res) : "f" (dg));
663 return res;
666 __inline__ static
667 float
668 sh_media_FSQRT_S (float fg)
670 float res;
671 __asm__ ("fsqrt.s %1, %0" : "=f" (res) : "f" (fg));
672 return res;
675 __inline__ static
676 void
677 sh_media_FTRV_S (const void *mtrxg, const void *fvh, void *fvf)
679 __asm__ ("ftrv.s %2, %1, %0" : "=f" (*(__GCC_FV *)fvf)
680 : "f" (*(const __GCC_FV *)fvh), "f" (*(const __GCC_MTRX *)mtrxg));
682 #endif /* ! __SH4_NOFPU__ */
684 __inline__ static
685 unsigned long long
686 sh_media_LDHI_L (void *p, int s)
688 unsigned long long res;
689 __asm__ ("ldhi.l %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
690 return res;
693 __inline__ static
694 unsigned long long
695 sh_media_LDHI_Q (void *p, int s)
697 unsigned long long res;
698 __asm__ ("ldhi.q %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
699 return res;
702 __inline__ static
703 unsigned long long
704 sh_media_LDLO_L (void *p, int s)
706 unsigned long long res;
707 __asm__ ("ldlo.l %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
708 return res;
711 __inline__ static
712 unsigned long long
713 sh_media_LDLO_Q (void *p, int s)
715 unsigned long long res;
716 __asm__ ("ldlo.q %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
717 return res;
720 __inline__ static
721 void
722 sh_media_STHI_L (void *p, int s, unsigned int mw)
724 __asm__ ("sthi.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
727 __inline__ static
728 void
729 sh_media_STHI_Q (void *p, int s, unsigned long long mw)
731 __asm__ ("sthi.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
734 __inline__ static
735 void
736 sh_media_STLO_L (void *p, int s, unsigned int mw)
738 __asm__ ("stlo.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
741 __inline__ static
742 void
743 sh_media_STLO_Q (void *p, int s, unsigned long long mw)
745 __asm__ ("stlo.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
748 __inline__ static
749 unsigned char
750 sh_media_NSB (long long mm)
752 unsigned char res;
753 __asm__ ("nsb %1, %0" : "=r" (res) : "r" (mm));
754 return res;
757 __inline__ static
758 unsigned long long
759 sh_media_BYTEREV (unsigned long long mm)
761 unsigned long long res;
762 __asm__ ("byterev %1, %0" : "=r" (res) : "r" (mm));
763 return res;
766 __inline__ static
767 unsigned long long
768 sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
770 unsigned long long res;
771 __asm__ ("cmveq %1, %2, %0" : "=r" (res)
772 : "r" (mm), "r" (mn), "0" (mw));
773 return res;
776 __inline__ static
777 unsigned long long
778 sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw)
780 unsigned long long res;
781 __asm__ ("cmveq %1, %2, %0" : "=r" (res)
782 : "r" (mm), "r" (mn), "0" (mw));
783 return res;
786 __inline__ static
787 unsigned long long
788 sh_media_ADDZ_L (unsigned int mm, unsigned int mn)
790 unsigned long long res;
791 __asm__ ("addz.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
792 return res;
795 __inline__ static
796 void
797 sh_media_NOP (void)
799 __asm__ __volatile__ ("nop" : :);
802 __inline__ static
803 unsigned long long
804 sh_media_SWAP_Q (void *mm, long long mn, unsigned long long mw)
806 unsigned long long res;
807 unsigned long long *addr = (unsigned long long *)((char *)mm + mn);
808 __asm__ ("swap.q %m1, %0" : "=r" (res), "+o" (*addr) : "0" (mw));
809 return res;
812 __inline__ static
813 void
814 sh_media_SYNCI (void)
816 __asm__ __volatile__ ("synci");
819 __inline__ static
820 void
821 sh_media_SYNCO (void)
823 __asm__ __volatile__ ("synco");
826 __inline__ static
827 void
828 sh_media_ALLOCO (void *mm, int s)
830 __asm__ __volatile__ ("alloco %m0" : : "o" (((char*)mm)[s]));
833 __inline__ static
834 void
835 sh_media_ICBI (void *mm, int s)
837 __asm__ __volatile__ ("icbi %m0" : : "o" (((char*)mm)[s]));
840 __inline__ static
841 void
842 sh_media_OCBI (void *mm, int s)
844 __asm__ __volatile__ ("ocbi %m0" : : "o" (((char*)mm)[s]));
847 __inline__ static
848 void
849 sh_media_OCBP (void *mm, int s)
851 __asm__ __volatile__ ("ocbp %m0" : : "o" (((char*)mm)[s]));
854 __inline__ static
855 void
856 sh_media_OCBWB (void *mm, int s)
858 __asm__ __volatile__ ("ocbwb %m0" : : "o" (((char*)mm)[s]));
861 __inline__ static
862 void
863 sh_media_PREFI (void *mm, int s)
865 __asm__ __volatile__ ("prefi %m0" : : "o" (((char*)mm)[s]));
868 __inline__ static
869 void
870 sh_media_PREFO (void *mm, int s)
872 __asm__ __volatile__ ("ld.b %m0, r63" : : "o" (((char*)mm)[s]));
875 __inline__ static
876 void
877 sh_media_BRK (void)
879 __asm__ __volatile__ ("brk");
882 __inline__ static
883 void
884 sh_media_TRAPA (unsigned long long mm)
886 __asm__ __volatile__ ("trapa %%0" : : "r" (mm));
889 __inline__ static
890 short
891 sh_media_unaligned_LD_W (void *p)
893 #if __LITTLE_ENDIAN__
894 return (((unsigned char *)p)[0]
895 | (((short)((__signed__ char *)p)[1]) << 8));
896 #else
897 return ((((short)((__signed__ char *)p)[0]) << 8)
898 | ((unsigned char *)p)[1]);
899 #endif
902 __inline__ static
903 unsigned short
904 sh_media_unaligned_LD_UW (void *p)
906 unsigned char *addr = p;
907 #if __LITTLE_ENDIAN__
908 return sh_media_MSHFLO_B (addr[0], addr[1]);
909 #else
910 return sh_media_MSHFLO_B (addr[1], addr[0]);
911 #endif
914 __inline__ static
915 int
916 sh_media_unaligned_LD_L (void *p)
918 #if __LITTLE_ENDIAN__
919 return sh_media_LDHI_L (p, 3) | sh_media_LDLO_L (p, 0);
920 #else
921 return sh_media_LDLO_L (p, 3) | sh_media_LDHI_L (p, 0);
922 #endif
925 __inline__ static
926 long long
927 sh_media_unaligned_LD_Q (void *p)
929 #if __LITTLE_ENDIAN__
930 return sh_media_LDHI_Q (p, 7) | sh_media_LDLO_Q (p, 0);
931 #else
932 return sh_media_LDLO_Q (p, 7) | sh_media_LDHI_Q (p, 0);
933 #endif
936 __inline__ static
937 void
938 sh_media_unaligned_ST_W (void *p, unsigned int k)
940 char *addr = p;
941 #if __LITTLE_ENDIAN__
942 addr[0] = k;
943 addr[1] = k >> 8;
944 #else
945 addr[1] = k;
946 addr[0] = k >> 8;
947 #endif
950 __inline__ static
951 void
952 sh_media_unaligned_ST_L (void *p, unsigned int k)
954 #if __LITTLE_ENDIAN__
955 sh_media_STHI_L (p, 3, k);
956 sh_media_STLO_L (p, 0, k);
957 #else
958 sh_media_STLO_L (p, 3, k);
959 sh_media_STHI_L (p, 0, k);
960 #endif
963 __inline__ static
964 void
965 sh_media_unaligned_ST_Q (void *p, unsigned long long k)
967 #if __LITTLE_ENDIAN__
968 sh_media_STHI_Q (p, 7, k);
969 sh_media_STLO_Q (p, 0, k);
970 #else
971 sh_media_STLO_Q (p, 7, k);
972 sh_media_STHI_Q (p, 0, k);
973 #endif
976 #if ! __SH4_NOFPU__
977 __inline__ static
978 void
979 sh_media_FVCOPY_S (const void *fvg, void *fvf)
981 const __GCC_FV *g = fvg;
982 __GCC_FV *f = fvf;
983 *f = *g;
986 __inline__ static
987 void
988 sh_media_FVADD_S (const void *fvg, const void *fvh, void *fvf)
990 const float *g = fvg, *h = fvh;
991 float *f = fvf;
992 #if 1
993 int i;
995 for (i = 0; i < 4; i++)
996 f[i] = g[i] + h[i];
997 #else
998 f[0] = g[0] + h[0];
999 f[1] = g[1] + h[1];
1000 f[2] = g[2] + h[2];
1001 f[3] = g[3] + h[3];
1002 #endif
1005 __inline__ static
1006 void
1007 sh_media_FVSUB_S (const void *fvg, const void *fvh, void *fvf)
1009 const float *g = fvg, *h = fvh;
1010 float *f = fvf;
1011 #if 1
1012 int i;
1014 for (i = 0; i < 4; i++)
1015 f[i] = g[i] - h[i];
1016 #else
1017 f[0] = g[0] - h[0];
1018 f[1] = g[1] - h[1];
1019 f[2] = g[2] - h[2];
1020 f[3] = g[3] - h[3];
1021 #endif
1024 __inline__ static
1025 void
1026 sh_media_FMTRXCOPY_S (const void *mtrxg, void *mtrxf)
1028 const __GCC_MTRX *g = mtrxg;
1029 __GCC_MTRX *f = mtrxf;
1030 *f = *g;
1033 __inline__ static
1034 void
1035 sh_media_FMTRXADD_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1037 const __GCC_FV *g = mtrxg, *h = mtrxh;
1038 __GCC_FV *f = mtrxf;
1039 #if 1
1040 int i;
1042 for (i = 0; i < 4; i++)
1043 sh_media_FVADD_S (&g[i], &h[i], &f[i]);
1044 #else
1045 sh_media_FVADD_S (&g[0], &h[0], &f[0]);
1046 sh_media_FVADD_S (&g[1], &h[1], &f[1]);
1047 sh_media_FVADD_S (&g[2], &h[2], &f[2]);
1048 sh_media_FVADD_S (&g[3], &h[3], &f[3]);
1049 #endif
1052 __inline__ static
1053 void
1054 sh_media_FMTRXSUB_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1056 const __GCC_FV *g = mtrxg, *h = mtrxh;
1057 __GCC_FV *f = mtrxf;
1058 #if 1
1059 int i;
1061 for (i = 0; i < 4; i++)
1062 sh_media_FVSUB_S (&g[i], &h[i], &f[i]);
1063 #else
1064 sh_media_FVSUB_S (&g[0], &h[0], &f[0]);
1065 sh_media_FVSUB_S (&g[1], &h[1], &f[1]);
1066 sh_media_FVSUB_S (&g[2], &h[2], &f[2]);
1067 sh_media_FVSUB_S (&g[3], &h[3], &f[3]);
1068 #endif
1071 __inline__ static
1072 void
1073 sh_media_FTRVADD_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf)
1075 sh_media_FTRV_S (mtrxg, fvh, fvf);
1076 sh_media_FVADD_S (fvf, fvi, fvf);
1079 __inline__ static
1080 void
1081 sh_media_FTRVSUB_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf)
1083 sh_media_FTRV_S (mtrxg, fvh, fvf);
1084 sh_media_FVSUB_S (fvf, fvi, fvf);
1087 __inline__ static
1088 void
1089 sh_media_FMTRXMUL_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1091 const __GCC_FV *g = mtrxg;
1092 __GCC_FV *f = mtrxf;
1093 #if 1
1094 int j;
1096 for (j = 0; j < 4; j++)
1097 sh_media_FTRV_S (mtrxh, &g[j], &f[j]);
1098 #else
1099 sh_media_FTRV_S (mtrxh, &g[0], &f[0]);
1100 sh_media_FTRV_S (mtrxh, &g[1], &f[1]);
1101 sh_media_FTRV_S (mtrxh, &g[2], &f[2]);
1102 sh_media_FTRV_S (mtrxh, &g[3], &f[3]);
1103 #endif
1106 __inline__ static
1107 void
1108 sh_media_FMTRXMULADD_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf)
1110 const __GCC_FV *g = mtrxg, *i = mtrxi;
1111 __GCC_FV *f = mtrxf;
1112 #if 1
1113 int j;
1115 for (j = 0; j < 4; j++)
1116 sh_media_FTRVADD_S (mtrxh, &g[j], &i[j], &f[j]);
1117 #else
1118 sh_media_FTRVADD_S (mtrxh, &g[0], &i[0], &f[0]);
1119 sh_media_FTRVADD_S (mtrxh, &g[1], &i[1], &f[1]);
1120 sh_media_FTRVADD_S (mtrxh, &g[2], &i[2], &f[2]);
1121 sh_media_FTRVADD_S (mtrxh, &g[3], &i[3], &f[3]);
1122 #endif
1125 __inline__ static
1126 void
1127 sh_media_FMTRXMULSUB_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf)
1129 const __GCC_FV *g = mtrxg, *i = mtrxi;
1130 __GCC_FV *f = mtrxf;
1131 #if 1
1132 int j;
1134 for (j = 0; j < 4; j++)
1135 sh_media_FTRVSUB_S (mtrxh, &g[j], &i[j], &f[j]);
1136 #else
1137 sh_media_FTRVSUB_S (mtrxh, &g[0], &i[0], &f[0]);
1138 sh_media_FTRVSUB_S (mtrxh, &g[1], &i[1], &f[1]);
1139 sh_media_FTRVSUB_S (mtrxh, &g[2], &i[2], &f[2]);
1140 sh_media_FTRVSUB_S (mtrxh, &g[3], &i[3], &f[3]);
1141 #endif
1143 #endif /* ! __SH4_NOFPU__ */
1145 #endif /* __SHMEDIA__ */
1147 #endif /* _USHMEDIA_H */