1 /* Copyright (C) 2000, 2001 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 2, 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 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.  */
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
sh_media_MABS_L(unsigned long long mm)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
sh_media_MABS_W(unsigned long long mm)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
sh_media_MADD_L(unsigned long long mm,unsigned long long mn)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
sh_media_MADD_W(unsigned long long mm,unsigned long long mn)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
sh_media_MADDS_L(unsigned long long mm,unsigned long long mn)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
sh_media_MADDS_UB(unsigned long long mm,unsigned long long mn)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
sh_media_MADDS_W(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPEQ_B(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPEQ_L(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPEQ_W(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPGT_L(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPGT_UB(unsigned long long mm,unsigned long long mn)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
sh_media_MCMPGT_W(unsigned long long mm,unsigned long long mn)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
sh_media_MCMV(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_MCNVS_LW(unsigned long long mm,unsigned long long mn)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
sh_media_MCNVS_WB(unsigned long long mm,unsigned long long mn)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
sh_media_MCNVS_WUB(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR1(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR2(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR3(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR4(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR5(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR6(unsigned long long mm,unsigned long long mn)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
sh_media_MEXTR7(unsigned long long mm,unsigned long long mn)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
sh_media_MMACFX_WL(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_MMACNFX_WL(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_MMUL_L(unsigned long long mm,unsigned long long mn)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
sh_media_MMUL_W(unsigned long long mm,unsigned long long mn)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
sh_media_MMULFX_L(unsigned long long mm,unsigned long long mn)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
sh_media_MMULFX_W(unsigned long long mm,unsigned long long mn)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
sh_media_MMULFXRP_W(unsigned long long mm,unsigned long long mn)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
sh_media_MMULHI_WL(unsigned long long mm,unsigned long long mn)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
sh_media_MMULLO_WL(unsigned long long mm,unsigned long long mn)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
sh_media_MMULSUM_WQ(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_MPERM_W(unsigned long long mm,unsigned int mn)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
sh_media_MSAD_UBQ(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_MSHALDS_L(unsigned long long mm,unsigned int mn)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
sh_media_MSHALDS_W(unsigned long long mm,unsigned int mn)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
sh_media_MSHARD_L(unsigned long long mm,unsigned int mn)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
sh_media_MSHARD_W(unsigned long long mm,unsigned int mn)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
sh_media_MSHARDS_Q(long long mm,unsigned int mn)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
sh_media_MSHFHI_B(unsigned long long mm,unsigned long long mn)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
sh_media_MSHFHI_L(unsigned long long mm,unsigned long long mn)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
sh_media_MSHFHI_W(unsigned long long mm,unsigned long long mn)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
sh_media_MSHFLO_B(unsigned long long mm,unsigned long long mn)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
sh_media_MSHFLO_L(unsigned long long mm,unsigned long long mn)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
sh_media_MSHFLO_W(unsigned long long mm,unsigned long long mn)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
sh_media_MSHLLD_L(unsigned long long mm,unsigned int mn)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
sh_media_MSHLLD_W(unsigned long long mm,unsigned int mn)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
sh_media_MSHLRD_L(unsigned long long mm,unsigned int mn)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
sh_media_MSHLRD_W(unsigned long long mm,unsigned int mn)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
sh_media_MSUB_L(unsigned long long mm,unsigned long long mn)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
sh_media_MSUB_W(unsigned long long mm,unsigned long long mn)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
sh_media_MSUBS_L(unsigned long long mm,unsigned long long mn)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
sh_media_MSUBS_UB(unsigned long long mm,unsigned long long mn)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
sh_media_MSUBS_W(unsigned long long mm,unsigned long long mn)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
sh_media_FABS_D(double dg)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
sh_media_FABS_S(float fg)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
sh_media_FCMPUN_D(double dg,double dh)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
sh_media_FCMPUN_S(float fg,float fh)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
sh_media_FGETSCR(void)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
sh_media_FIPR_S(const void * fvg,const void * fvh)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
sh_media_FMAC_S(float fg,float fh,float fq)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
sh_media_FMOV_DQ(double dg)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
sh_media_FMOV_LS(int mm)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
sh_media_FMOV_QD(long long mm)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
sh_media_FMOV_SL(float fg)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
sh_media_FPUTSCR(float fg)652 sh_media_FPUTSCR (float fg)
653 {
654   __asm__ ("fputscr	%0" : : "f" (fg));
655 }
656 
657 __inline__ static
658 double
sh_media_FSQRT_D(double dg)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
sh_media_FSQRT_S(float fg)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
sh_media_FTRV_S(const void * mtrxg,const void * fvh,void * fvf)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
sh_media_LDHI_L(void * p,int s)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
sh_media_LDHI_Q(void * p,int s)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
sh_media_LDLO_L(void * p,int s)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
sh_media_LDLO_Q(void * p,int s)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
sh_media_STHI_L(void * p,int s,unsigned int mw)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
sh_media_STHI_Q(void * p,int s,unsigned long long mw)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
sh_media_STLO_L(void * p,int s,unsigned int mw)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
sh_media_STLO_Q(void * p,int s,unsigned long long mw)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
sh_media_NSB(long long mm)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
sh_media_BYTEREV(unsigned long long mm)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
sh_media_CMVEQ(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_CMVNE(unsigned long long mm,unsigned long long mn,unsigned long long mw)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
sh_media_ADDZ_L(unsigned int mm,unsigned int mn)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
sh_media_NOP(void)797 sh_media_NOP (void)
798 {
799   __asm__ __volatile__ ("nop" : :);
800 }
801 
802 __inline__ static
803 unsigned long long
sh_media_SWAP_Q(void * mm,long long mn,unsigned long long mw)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
sh_media_SYNCI(void)814 sh_media_SYNCI (void)
815 {
816   __asm__ __volatile__ ("synci");
817 }
818 
819 __inline__ static
820 void
sh_media_SYNCO(void)821 sh_media_SYNCO (void)
822 {
823   __asm__ __volatile__ ("synco");
824 }
825 
826 __inline__ static
827 void
sh_media_ALLOCO(void * mm,int s)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
sh_media_ICBI(void * mm,int s)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
sh_media_OCBI(void * mm,int s)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
sh_media_OCBP(void * mm,int s)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
sh_media_OCBWB(void * mm,int s)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
sh_media_PREFI(void * mm,int s)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
sh_media_PREFO(void * mm,int s)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
sh_media_BRK(void)877 sh_media_BRK (void)
878 {
879   __asm__ __volatile__ ("brk");
880 }
881 
882 __inline__ static
883 void
sh_media_TRAPA(unsigned long long mm)884 sh_media_TRAPA (unsigned long long mm)
885 {
886   __asm__ __volatile__ ("trapa	%%0" : : "r" (mm));
887 }
888 
889 __inline__ static
890 short
sh_media_unaligned_LD_W(void * p)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
sh_media_unaligned_LD_UW(void * p)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
sh_media_unaligned_LD_L(void * p)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
sh_media_unaligned_LD_Q(void * p)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
sh_media_unaligned_ST_W(void * p,unsigned int k)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
sh_media_unaligned_ST_L(void * p,unsigned int k)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
sh_media_unaligned_ST_Q(void * p,unsigned long long k)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
sh_media_FVCOPY_S(const void * fvg,void * fvf)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
sh_media_FVADD_S(const void * fvg,const void * fvh,void * fvf)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
sh_media_FVSUB_S(const void * fvg,const void * fvh,void * fvf)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
sh_media_FMTRXCOPY_S(const void * mtrxg,void * mtrxf)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
sh_media_FMTRXADD_S(const void * mtrxg,const void * mtrxh,void * mtrxf)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
sh_media_FMTRXSUB_S(const void * mtrxg,const void * mtrxh,void * mtrxf)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
sh_media_FTRVADD_S(const void * mtrxg,const void * fvh,const void * fvi,void * fvf)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
sh_media_FTRVSUB_S(const void * mtrxg,const void * fvh,const void * fvi,void * fvf)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
sh_media_FMTRXMUL_S(const void * mtrxg,const void * mtrxh,void * mtrxf)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
sh_media_FMTRXMULADD_S(const void * mtrxg,const void * mtrxh,const void * mtrxi,void * mtrxf)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
sh_media_FMTRXMULSUB_S(const void * mtrxg,const void * mtrxh,const void * mtrxi,void * mtrxf)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 */
1148