OSDN Git Service

* alpha.h, arc.h, arm/aout.h, avr.h, cris.h, d30v.h, dsp16xx.h,
[pf3gnuchains/gcc-fork.git] / gcc / config / sh / ushmedia.h
1 /* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
2
3 This file is part of GNU CC.
4
5 GNU CC 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.
9
10 GNU CC 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 You should have received a copy of the GNU General Public License
16 along with GNU CC; see the file COPYING.  If not, write to
17 the Free Software Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.  */
19
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.  */
26
27 /* ushmedia.h: Intrinsics corresponding to SHmedia instructions that
28    may be executed in both user and privileged mode.  */
29
30 #ifndef _USHMEDIA_H
31 #define _USHMEDIA_H
32
33 #if __SHMEDIA__
34 #if ! __SH4_NO_FPU
35 typedef float __GCC_FV __attribute__ ((mode (V4SF)));
36 typedef float __GCC_MTRX __attribute__ ((mode (V16SF)));
37 #endif
38
39 __inline__ static
40 unsigned long long
41 sh_media_MABS_L (unsigned long long mm)
42 {
43   unsigned long long res;
44   __asm__ ("mabs.l      %1, %0" : "=r" (res) : "r" (mm));
45   return res;
46 }
47
48 __inline__ static
49 unsigned long long
50 sh_media_MABS_W (unsigned long long mm)
51 {
52   unsigned long long res;
53   __asm__ ("mabs.w      %1, %0" : "=r" (res) : "r" (mm));
54   return res;
55 }
56
57 __inline__ static
58 unsigned long long
59 sh_media_MADD_L (unsigned long long mm, unsigned long long mn)
60 {
61   unsigned long long res;
62   __asm__ ("madd.l      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
63   return res;
64 }
65
66 __inline__ static
67 unsigned long long
68 sh_media_MADD_W (unsigned long long mm, unsigned long long mn)
69 {
70   unsigned long long res;
71   __asm__ ("madd.w      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
72   return res;
73 }
74
75 __inline__ static
76 unsigned long long
77 sh_media_MADDS_L (unsigned long long mm, unsigned long long mn)
78 {
79   unsigned long long res;
80   __asm__ ("madds.l     %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
81   return res;
82 }
83
84 __inline__ static
85 unsigned long long
86 sh_media_MADDS_UB (unsigned long long mm, unsigned long long mn)
87 {
88   unsigned long long res;
89   __asm__ ("madds.ub    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
90   return res;
91 }
92
93 __inline__ static
94 unsigned long long
95 sh_media_MADDS_W (unsigned long long mm, unsigned long long mn)
96 {
97   unsigned long long res;
98   __asm__ ("madds.w     %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
99   return res;
100 }
101
102 __inline__ static
103 unsigned long long
104 sh_media_MCMPEQ_B (unsigned long long mm, unsigned long long mn)
105 {
106   unsigned long long res;
107   __asm__ ("mcmpeq.b    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
108   return res;
109 }
110
111 __inline__ static
112 unsigned long long
113 sh_media_MCMPEQ_L (unsigned long long mm, unsigned long long mn)
114 {
115   unsigned long long res;
116   __asm__ ("mcmpeq.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
117   return res;
118 }
119
120 __inline__ static
121 unsigned long long
122 sh_media_MCMPEQ_W (unsigned long long mm, unsigned long long mn)
123 {
124   unsigned long long res;
125   __asm__ ("mcmpeq.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
126   return res;
127 }
128
129 __inline__ static
130 unsigned long long
131 sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn)
132 {
133   unsigned long long res;
134   __asm__ ("mcmpgt.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
135   return res;
136 }
137
138 __inline__ static
139 unsigned long long
140 sh_media_MCMPGT_UB (unsigned long long mm, unsigned long long mn)
141 {
142   unsigned long long res;
143   __asm__ ("mcmpgt.ub   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
144   return res;
145 }
146
147 __inline__ static
148 unsigned long long
149 sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn)
150 {
151   unsigned long long res;
152   __asm__ ("mcmpgt.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
153   return res;
154 }
155
156 __inline__ static
157 unsigned long long
158 sh_media_MCMV (unsigned long long mm, unsigned long long mn, unsigned long long mw)
159 {
160   unsigned long long res;
161   __asm__ ("mcmv        %1, %2, %0" : "=r" (res)
162            : "r" (mm), "r" (mn), "0" (mw));
163   return res;
164 }
165
166 __inline__ static
167 unsigned long long
168 sh_media_MCNVS_LW (unsigned long long mm, unsigned long long mn)
169 {
170   unsigned long long res;
171   __asm__ ("mcnvs.lw    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
172   return res;
173 }
174
175 __inline__ static
176 unsigned long long
177 sh_media_MCNVS_WB (unsigned long long mm, unsigned long long mn)
178 {
179   unsigned long long res;
180   __asm__ ("mcnvs.wb    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
181   return res;
182 }
183
184 __inline__ static
185 unsigned long long
186 sh_media_MCNVS_WUB (unsigned long long mm, unsigned long long mn)
187 {
188   unsigned long long res;
189   __asm__ ("mcnvs.wub   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
190   return res;
191 }
192
193 __inline__ static
194 unsigned long long
195 sh_media_MEXTR1 (unsigned long long mm, unsigned long long mn)
196 {
197   unsigned long long res;
198   __asm__ ("mextr1      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
199   return res;
200 }
201
202 __inline__ static
203 unsigned long long
204 sh_media_MEXTR2 (unsigned long long mm, unsigned long long mn)
205 {
206   unsigned long long res;
207   __asm__ ("mextr2      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
208   return res;
209 }
210
211 __inline__ static
212 unsigned long long
213 sh_media_MEXTR3 (unsigned long long mm, unsigned long long mn)
214 {
215   unsigned long long res;
216   __asm__ ("mextr3      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
217   return res;
218 }
219
220 __inline__ static
221 unsigned long long
222 sh_media_MEXTR4 (unsigned long long mm, unsigned long long mn)
223 {
224   unsigned long long res;
225   __asm__ ("mextr4      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
226   return res;
227 }
228
229 __inline__ static
230 unsigned long long
231 sh_media_MEXTR5 (unsigned long long mm, unsigned long long mn)
232 {
233   unsigned long long res;
234   __asm__ ("mextr5      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
235   return res;
236 }
237
238 __inline__ static
239 unsigned long long
240 sh_media_MEXTR6 (unsigned long long mm, unsigned long long mn)
241 {
242   unsigned long long res;
243   __asm__ ("mextr6      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
244   return res;
245 }
246
247 __inline__ static
248 unsigned long long
249 sh_media_MEXTR7 (unsigned long long mm, unsigned long long mn)
250 {
251   unsigned long long res;
252   __asm__ ("mextr7      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
253   return res;
254 }
255
256 __inline__ static
257 unsigned long long
258 sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw)
259 {
260   unsigned long long res;
261   __asm__ ("mmacfx.wl   %1, %2, %0" : "=r" (res)
262            : "r" (mm), "r" (mn), "0" (mw));
263   return res;
264 }
265
266 __inline__ static
267 unsigned long long
268 sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw)
269 {
270   unsigned long long res;
271   __asm__ ("mmacnfx.wl  %1, %2, %0" : "=r" (res)
272            : "r" (mm), "r" (mn), "0" (mw));
273   return res;
274 }
275
276 __inline__ static
277 unsigned long long
278 sh_media_MMUL_L (unsigned long long mm, unsigned long long mn)
279 {
280   unsigned long long res;
281   __asm__ ("mmul.l      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
282   return res;
283 }
284
285 __inline__ static
286 unsigned long long
287 sh_media_MMUL_W (unsigned long long mm, unsigned long long mn)
288 {
289   unsigned long long res;
290   __asm__ ("mmul.w      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
291   return res;
292 }
293
294 __inline__ static
295 unsigned long long
296 sh_media_MMULFX_L (unsigned long long mm, unsigned long long mn)
297 {
298   unsigned long long res;
299   __asm__ ("mmulfx.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
300   return res;
301 }
302
303 __inline__ static
304 unsigned long long
305 sh_media_MMULFX_W (unsigned long long mm, unsigned long long mn)
306 {
307   unsigned long long res;
308   __asm__ ("mmulfx.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
309   return res;
310 }
311
312 __inline__ static
313 unsigned long long
314 sh_media_MMULFXRP_W (unsigned long long mm, unsigned long long mn)
315 {
316   unsigned long long res;
317   __asm__ ("mmulfxrp.w  %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
318   return res;
319 }
320
321 __inline__ static
322 unsigned long long
323 sh_media_MMULHI_WL (unsigned long long mm, unsigned long long mn)
324 {
325   unsigned long long res;
326   __asm__ ("mmulhi.wl   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
327   return res;
328 }
329
330 __inline__ static
331 unsigned long long
332 sh_media_MMULLO_WL (unsigned long long mm, unsigned long long mn)
333 {
334   unsigned long long res;
335   __asm__ ("mmullo.wl   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
336   return res;
337 }
338
339 __inline__ static
340 unsigned long long
341 sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
342 {
343   unsigned long long res;
344   __asm__ ("mmulsum.wq  %1, %2, %0" : "=r" (res)
345            : "r" (mm), "r" (mn), "0" (mw));
346   return res;
347 }
348
349 __inline__ static
350 unsigned long long
351 sh_media_MPERM_W (unsigned long long mm, unsigned int mn)
352 {
353   unsigned long long res;
354   __asm__ ("mperm.w     %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
355   return res;
356 }
357
358 __inline__ static
359 unsigned long long
360 sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
361 {
362   unsigned long long res;
363   __asm__ ("msad.ubq    %1, %2, %0" : "=r" (res)
364            : "r" (mm), "r" (mn), "0" (mw));
365   return res;
366 }
367
368 __inline__ static
369 unsigned long long
370 sh_media_MSHALDS_L (unsigned long long mm, unsigned int mn)
371 {
372   unsigned long long res;
373   __asm__ ("mshalds.l   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
374   return res;
375 }
376
377 __inline__ static
378 unsigned long long
379 sh_media_MSHALDS_W (unsigned long long mm, unsigned int mn)
380 {
381   unsigned long long res;
382   __asm__ ("mshalds.w   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
383   return res;
384 }
385
386 __inline__ static
387 unsigned long long
388 sh_media_MSHARD_L (unsigned long long mm, unsigned int mn)
389 {
390   unsigned long long res;
391   __asm__ ("mshard.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
392   return res;
393 }
394
395 __inline__ static
396 unsigned long long
397 sh_media_MSHARD_W (unsigned long long mm, unsigned int mn)
398 {
399   unsigned long long res;
400   __asm__ ("mshard.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
401   return res;
402 }
403
404 __inline__ static
405 short
406 sh_media_MSHARDS_Q (long long mm, unsigned int mn)
407 {
408   short res;
409   __asm__ ("mshards.q   %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
410   return res;
411 }
412
413 __inline__ static
414 unsigned long long
415 sh_media_MSHFHI_B (unsigned long long mm, unsigned long long mn)
416 {
417   unsigned long long res;
418   __asm__ ("mshfhi.b    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
419   return res;
420 }
421
422 __inline__ static
423 unsigned long long
424 sh_media_MSHFHI_L (unsigned long long mm, unsigned long long mn)
425 {
426   unsigned long long res;
427   __asm__ ("mshfhi.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
428   return res;
429 }
430
431 __inline__ static
432 unsigned long long
433 sh_media_MSHFHI_W (unsigned long long mm, unsigned long long mn)
434 {
435   unsigned long long res;
436   __asm__ ("mshfhi.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
437   return res;
438 }
439
440 __inline__ static
441 unsigned long long
442 sh_media_MSHFLO_B (unsigned long long mm, unsigned long long mn)
443 {
444   unsigned long long res;
445   __asm__ ("mshflo.b    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
446   return res;
447 }
448
449 __inline__ static
450 unsigned long long
451 sh_media_MSHFLO_L (unsigned long long mm, unsigned long long mn)
452 {
453   unsigned long long res;
454   __asm__ ("mshflo.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
455   return res;
456 }
457
458 __inline__ static
459 unsigned long long
460 sh_media_MSHFLO_W (unsigned long long mm, unsigned long long mn)
461 {
462   unsigned long long res;
463   __asm__ ("mshflo.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
464   return res;
465 }
466
467 __inline__ static
468 unsigned long long
469 sh_media_MSHLLD_L (unsigned long long mm, unsigned int mn)
470 {
471   unsigned long long res;
472   __asm__ ("mshlld.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
473   return res;
474 }
475
476 __inline__ static
477 unsigned long long
478 sh_media_MSHLLD_W (unsigned long long mm, unsigned int mn)
479 {
480   unsigned long long res;
481   __asm__ ("mshlld.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
482   return res;
483 }
484
485 __inline__ static
486 unsigned long long
487 sh_media_MSHLRD_L (unsigned long long mm, unsigned int mn)
488 {
489   unsigned long long res;
490   __asm__ ("mshlrd.l    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
491   return res;
492 }
493
494 __inline__ static
495 unsigned long long
496 sh_media_MSHLRD_W (unsigned long long mm, unsigned int mn)
497 {
498   unsigned long long res;
499   __asm__ ("mshlrd.w    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
500   return res;
501 }
502
503 __inline__ static
504 unsigned long long
505 sh_media_MSUB_L (unsigned long long mm, unsigned long long mn)
506 {
507   unsigned long long res;
508   __asm__ ("msub.l      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
509   return res;
510 }
511
512 __inline__ static
513 unsigned long long
514 sh_media_MSUB_W (unsigned long long mm, unsigned long long mn)
515 {
516   unsigned long long res;
517   __asm__ ("msub.w      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
518   return res;
519 }
520
521 __inline__ static
522 unsigned long long
523 sh_media_MSUBS_L (unsigned long long mm, unsigned long long mn)
524 {
525   unsigned long long res;
526   __asm__ ("msubs.l     %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
527   return res;
528 }
529
530 __inline__ static
531 unsigned long long
532 sh_media_MSUBS_UB (unsigned long long mm, unsigned long long mn)
533 {
534   unsigned long long res;
535   __asm__ ("msubs.ub    %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
536   return res;
537 }
538
539 __inline__ static
540 unsigned long long
541 sh_media_MSUBS_W (unsigned long long mm, unsigned long long mn)
542 {
543   unsigned long long res;
544   __asm__ ("msubs.w     %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
545   return res;
546 }
547
548 #if ! __SH4_NOFPU__
549 __inline__ static
550 double
551 sh_media_FABS_D (double dg)
552 {
553   double res;
554   __asm__ ("fabs.d      %1, %0" : "=f" (res) : "f" (dg));
555   return res;
556 }
557
558 __inline__ static
559 float 
560 sh_media_FABS_S (float fg)
561 {
562   float res;
563   __asm__ ("fabs.s      %1, %0" : "=f" (res) : "f" (fg));
564   return res;
565 }
566
567 __inline__ static
568 int   
569 sh_media_FCMPUN_D (double dg, double dh)
570 {
571   int res;
572   __asm__ ("fcmpun.d    %1, %2, %0" : "=f" (res) : "f" (dg), "f" (dh));
573   return res;
574 }
575
576 __inline__ static
577 int   
578 sh_media_FCMPUN_S (float fg, float fh)
579 {
580   int res;
581   __asm__ ("fcmpun.s    %1, %2, %0" : "=f" (res) : "f" (fg), "f" (fh));
582   return res;
583 }
584
585 __inline__ static
586 float 
587 sh_media_FGETSCR (void)
588 {
589   float res;
590   __asm__ ("fgetscr     %0" : "=f" (res));
591   return res;
592 }
593
594 __inline__ static
595 float 
596 sh_media_FIPR_S (const void *fvg, const void *fvh)
597 {
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;
602 }
603
604 __inline__ static
605 float 
606 sh_media_FMAC_S (float fg, float fh, float fq)
607 {
608   float res;
609   __asm__ ("fmac.s      %1, %2, %0" : "=f" (res)
610            : "f" (fg), "f" (fh), "0" (fq));
611   return res;
612 }
613
614 __inline__ static
615 long long
616 sh_media_FMOV_DQ (double dg)
617 {
618   long long res;
619   __asm__ ("fmov.dq     %1, %0" : "=r" (res) : "f" (dg));
620   return res;
621 }
622
623 __inline__ static
624 float
625 sh_media_FMOV_LS (int mm)
626 {
627   float res;
628   __asm__ ("fmov.ls     %1, %0" : "=f" (res) : "r" (mm));
629   return res;
630 }
631
632 __inline__ static
633 double
634 sh_media_FMOV_QD (long long mm)
635 {
636   double res;
637   __asm__ ("fmov.qd     %1, %0" : "=f" (res) : "r" (mm));
638   return res;
639 }
640
641 __inline__ static
642 int
643 sh_media_FMOV_SL (float fg)
644 {
645   int res;
646   __asm__ ("fmov.sl     %1, %0" : "=r" (res) : "f" (fg));
647   return res;
648 }
649
650 __inline__ static
651 void  
652 sh_media_FPUTSCR (float fg)
653 {
654   __asm__ ("fputscr     %0" : : "f" (fg));
655 }
656
657 __inline__ static
658 double
659 sh_media_FSQRT_D (double dg)
660 {
661   double res;
662   __asm__ ("fsqrt.d     %1, %0" : "=f" (res) : "f" (dg));
663   return res;
664 }
665
666 __inline__ static
667 float 
668 sh_media_FSQRT_S (float fg)
669 {
670   float res;
671   __asm__ ("fsqrt.s     %1, %0" : "=f" (res) : "f" (fg));
672   return res;
673 }
674
675 __inline__ static
676 void  
677 sh_media_FTRV_S (const void *mtrxg, const void *fvh, void *fvf)
678 {
679   __asm__ ("ftrv.s      %2, %1, %0" : "=f" (*(__GCC_FV *)fvf)
680            : "f" (*(const __GCC_FV *)fvh), "f" (*(const __GCC_MTRX *)mtrxg));
681 }
682 #endif /* ! __SH4_NOFPU__ */
683
684 __inline__ static
685 unsigned long long
686 sh_media_LDHI_L (void *p, int s)
687 {
688   unsigned long long res;
689   __asm__ ("ldhi.l      %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
690   return res;
691 }
692
693 __inline__ static
694 unsigned long long
695 sh_media_LDHI_Q (void *p, int s)
696 {
697   unsigned long long res;
698   __asm__ ("ldhi.q      %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
699   return res;
700 }
701
702 __inline__ static
703 unsigned long long
704 sh_media_LDLO_L (void *p, int s)
705 {
706   unsigned long long res;
707   __asm__ ("ldlo.l      %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
708   return res;
709 }
710
711 __inline__ static
712 unsigned long long
713 sh_media_LDLO_Q (void *p, int s)
714 {
715   unsigned long long res;
716   __asm__ ("ldlo.q      %m1, %0" : "=r" (res) : "o" (((char*)p)[s]));
717   return res;
718 }
719
720 __inline__ static
721 void     
722 sh_media_STHI_L (void *p, int s, unsigned int mw)
723 {
724   __asm__ ("sthi.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
725 }
726
727 __inline__ static
728 void     
729 sh_media_STHI_Q (void *p, int s, unsigned long long mw)
730 {
731   __asm__ ("sthi.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
732 }
733
734 __inline__ static
735 void     
736 sh_media_STLO_L (void *p, int s, unsigned int mw)
737 {
738   __asm__ ("stlo.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
739 }
740
741 __inline__ static
742 void     
743 sh_media_STLO_Q (void *p, int s, unsigned long long mw)
744 {
745   __asm__ ("stlo.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw));
746 }
747
748 __inline__ static
749 unsigned char
750 sh_media_NSB (long long mm)
751 {
752   unsigned char res;
753   __asm__ ("nsb %1, %0" : "=r" (res) : "r" (mm));
754   return res;
755 }
756
757 __inline__ static
758 unsigned long long
759 sh_media_BYTEREV (unsigned long long mm)
760 {
761   unsigned long long res;
762   __asm__ ("byterev     %1, %0" : "=r" (res) : "r" (mm));
763   return res;
764 }
765
766 __inline__ static
767 unsigned long long
768 sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
769 {
770   unsigned long long res;
771   __asm__ ("cmveq       %1, %2, %0" : "=r" (res)
772            : "r" (mm), "r" (mn), "0" (mw));
773   return res;
774 }
775
776 __inline__ static
777 unsigned long long
778 sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw)
779 {
780   unsigned long long res;
781   __asm__ ("cmveq       %1, %2, %0" : "=r" (res)
782            : "r" (mm), "r" (mn), "0" (mw));
783   return res;
784 }
785
786 __inline__ static
787 unsigned long long
788 sh_media_ADDZ_L (unsigned int mm, unsigned int mn)
789 {
790   unsigned long long res;
791   __asm__ ("addz.l      %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn));
792   return res;
793 }
794
795 __inline__ static
796 void
797 sh_media_NOP (void)
798 {
799   __asm__ __volatile__ ("nop" : :);
800 }
801
802 __inline__ static
803 unsigned long long
804 sh_media_SWAP_Q (void *mm, long long mn, unsigned long long mw)
805 {
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;
810 }
811
812 __inline__ static
813 void     
814 sh_media_SYNCI (void)
815 {
816   __asm__ __volatile__ ("synci");
817 }
818
819 __inline__ static
820 void     
821 sh_media_SYNCO (void)
822 {
823   __asm__ __volatile__ ("synco");
824 }
825
826 __inline__ static
827 void
828 sh_media_ALLOCO (void *mm, int s)
829 {
830   __asm__ __volatile__ ("alloco %m0" : : "o" (((char*)mm)[s]));
831 }
832
833 __inline__ static
834 void
835 sh_media_ICBI (void *mm, int s)
836 {
837   __asm__ __volatile__ ("icbi   %m0" : : "o" (((char*)mm)[s]));
838 }
839
840 __inline__ static
841 void
842 sh_media_OCBI (void *mm, int s)
843 {
844   __asm__ __volatile__ ("ocbi   %m0" : : "o" (((char*)mm)[s]));
845 }
846
847 __inline__ static
848 void
849 sh_media_OCBP (void *mm, int s)
850 {
851   __asm__ __volatile__ ("ocbp   %m0" : : "o" (((char*)mm)[s]));
852 }
853
854 __inline__ static
855 void
856 sh_media_OCBWB (void *mm, int s)
857 {
858   __asm__ __volatile__ ("ocbwb  %m0" : : "o" (((char*)mm)[s]));
859 }
860
861 __inline__ static
862 void
863 sh_media_PREFI (void *mm, int s)
864 {
865   __asm__ __volatile__ ("prefi  %m0" : : "o" (((char*)mm)[s]));
866 }
867
868 __inline__ static
869 void
870 sh_media_PREFO (void *mm, int s)
871 {
872   __asm__ __volatile__ ("ld.b   %m0, r63" : : "o" (((char*)mm)[s]));
873 }
874
875 __inline__ static
876 void
877 sh_media_BRK (void)
878 {
879   __asm__ __volatile__ ("brk");
880 }
881
882 __inline__ static
883 void
884 sh_media_TRAPA (unsigned long long mm)
885 {
886   __asm__ __volatile__ ("trapa  %%0" : : "r" (mm));
887 }
888
889 __inline__ static
890 short         
891 sh_media_unaligned_LD_W (void *p)
892 {
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
900 }
901
902 __inline__ static
903 unsigned short
904 sh_media_unaligned_LD_UW (void *p)
905 {
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
912 }
913
914 __inline__ static
915 int           
916 sh_media_unaligned_LD_L (void *p)
917 {
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
923 }
924
925 __inline__ static
926 long long     
927 sh_media_unaligned_LD_Q (void *p)
928 {
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
934 }
935
936 __inline__ static
937 void
938 sh_media_unaligned_ST_W (void *p, unsigned int k)
939 {
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
948 }
949
950 __inline__ static
951 void
952 sh_media_unaligned_ST_L (void *p, unsigned int k)
953 {
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
961 }
962
963 __inline__ static
964 void
965 sh_media_unaligned_ST_Q (void *p, unsigned long long k)
966 {
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
974 }
975
976 #if ! __SH4_NOFPU__
977 __inline__ static
978 void
979 sh_media_FVCOPY_S (const void *fvg, void *fvf)
980 {
981   const __GCC_FV *g = fvg;
982   __GCC_FV *f = fvf;
983   *f = *g;
984 }
985
986 __inline__ static
987 void
988 sh_media_FVADD_S (const void *fvg, const void *fvh, void *fvf)
989 {
990   const float *g = fvg, *h = fvh;
991   float *f = fvf;
992 #if 1
993   int i;
994
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
1003 }
1004
1005 __inline__ static
1006 void
1007 sh_media_FVSUB_S (const void *fvg, const void *fvh, void *fvf)
1008 {
1009   const float *g = fvg, *h = fvh;
1010   float *f = fvf;
1011 #if 1
1012   int i;
1013
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
1022 }
1023
1024 __inline__ static
1025 void
1026 sh_media_FMTRXCOPY_S (const void *mtrxg, void *mtrxf)
1027 {
1028   const __GCC_MTRX *g = mtrxg;
1029   __GCC_MTRX *f = mtrxf;
1030   *f = *g;
1031 }
1032
1033 __inline__ static
1034 void
1035 sh_media_FMTRXADD_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1036 {
1037   const __GCC_FV *g = mtrxg, *h = mtrxh;
1038   __GCC_FV *f = mtrxf;
1039 #if 1
1040   int i;
1041
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
1050 }
1051
1052 __inline__ static
1053 void
1054 sh_media_FMTRXSUB_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1055 {
1056   const __GCC_FV *g = mtrxg, *h = mtrxh;
1057   __GCC_FV *f = mtrxf;
1058 #if 1
1059   int i;
1060
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
1069 }
1070
1071 __inline__ static
1072 void
1073 sh_media_FTRVADD_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf)
1074 {
1075   sh_media_FTRV_S (mtrxg, fvh, fvf);
1076   sh_media_FVADD_S (fvf, fvi, fvf);
1077 }
1078
1079 __inline__ static
1080 void
1081 sh_media_FTRVSUB_S (const void *mtrxg, const void *fvh, const void *fvi, void *fvf)
1082 {
1083   sh_media_FTRV_S (mtrxg, fvh, fvf);
1084   sh_media_FVSUB_S (fvf, fvi, fvf);
1085 }
1086
1087 __inline__ static
1088 void
1089 sh_media_FMTRXMUL_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1090 {
1091   const __GCC_FV *g = mtrxg;
1092   __GCC_FV *f = mtrxf;
1093 #if 1
1094   int j;
1095
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
1104 }
1105
1106 __inline__ static
1107 void
1108 sh_media_FMTRXMULADD_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf)
1109 {
1110   const __GCC_FV *g = mtrxg, *i = mtrxi;
1111   __GCC_FV *f = mtrxf;
1112 #if 1
1113   int j;
1114
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
1123 }
1124
1125 __inline__ static
1126 void
1127 sh_media_FMTRXMULSUB_S (const void *mtrxg, const void *mtrxh, const void *mtrxi, void *mtrxf)
1128 {
1129   const __GCC_FV *g = mtrxg, *i = mtrxi;
1130   __GCC_FV *f = mtrxf;
1131 #if 1
1132   int j;
1133
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
1142 }
1143 #endif /* ! __SH4_NOFPU__ */
1144
1145 #endif /* __SHMEDIA__ */
1146
1147 #endif /* _USHMEDIA_H */