OSDN Git Service

* config/i386/i386.c (legitimate_pic_address_disp_p): Allow
[pf3gnuchains/gcc-fork.git] / gcc / config / sh / ushmedia.h
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 */