]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/sh/ushmedia.h
Update copyright years in gcc/
[thirdparty/gcc.git] / gcc / config / sh / ushmedia.h
CommitLineData
23a5b65a 1/* Copyright (C) 2000-2014 Free Software Foundation, Inc.
fa5322fa 2
7ec022b2 3This file is part of GCC.
fa5322fa 4
7ec022b2 5GCC is free software; you can redistribute it and/or modify
fa5322fa 6it under the terms of the GNU General Public License as published by
748086b7 7the Free Software Foundation; either version 3, or (at your option)
fa5322fa
AO
8any later version.
9
7ec022b2 10GCC is distributed in the hope that it will be useful,
fa5322fa
AO
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
748086b7
JJ
15Under Section 7 of GPL version 3, you are granted additional
16permissions described in the GCC Runtime Library Exception, version
173.1, as published by the Free Software Foundation.
18
19You should have received a copy of the GNU General Public License and
20a copy of the GCC Runtime Library Exception along with this program;
21see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22<http://www.gnu.org/licenses/>. */
fa5322fa 23
fa5322fa
AO
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
4a5eab38
PB
33typedef float __GCC_FV __attribute__ ((vector_size (4 * sizeof (float))));
34typedef float __GCC_MTRX __attribute__ ((vector_size (16 * sizeof (float))));
fa5322fa
AO
35#endif
36
73a4d10b 37static __inline unsigned long long
fa5322fa
AO
38sh_media_MABS_L (unsigned long long mm)
39{
73a4d10b
R
40 typedef float v2si __attribute__ ((mode(V2SI)));
41
42 return (unsigned long long) __builtin_absv2si2 ((v2si) mm);
fa5322fa
AO
43}
44
73a4d10b 45static __inline unsigned long long
fa5322fa
AO
46sh_media_MABS_W (unsigned long long mm)
47{
73a4d10b
R
48 typedef float v4hi __attribute__ ((mode(V4HI)));
49
50 return (unsigned long long) __builtin_absv4hi2 ((v4hi) mm);
fa5322fa
AO
51}
52
73a4d10b 53static __inline unsigned long long
fa5322fa
AO
54sh_media_MADD_L (unsigned long long mm, unsigned long long mn)
55{
73a4d10b
R
56 typedef float v2si __attribute__ ((mode(V2SI)));
57
58 return (unsigned long long) __builtin_addv2si3 ((v2si) mm, (v2si) mn);
fa5322fa
AO
59}
60
73a4d10b 61static __inline unsigned long long
fa5322fa
AO
62sh_media_MADD_W (unsigned long long mm, unsigned long long mn)
63{
73a4d10b
R
64 typedef float v4hi __attribute__ ((mode(V4HI)));
65
66 return (unsigned long long) __builtin_addv4hi3 ((v4hi) mm, (v4hi) mn);
fa5322fa
AO
67}
68
73a4d10b 69static __inline unsigned long long
fa5322fa
AO
70sh_media_MADDS_L (unsigned long long mm, unsigned long long mn)
71{
73a4d10b
R
72 typedef float v2si __attribute__ ((mode(V2SI)));
73
74 return (unsigned long long) __builtin_ssaddv2si3 ((v2si) mm, (v2si) mn);
fa5322fa
AO
75}
76
73a4d10b 77static __inline unsigned long long
fa5322fa
AO
78sh_media_MADDS_UB (unsigned long long mm, unsigned long long mn)
79{
73a4d10b
R
80 typedef float v8qi __attribute__ ((mode(V8QI)));
81
82 return (unsigned long long) __builtin_usaddv8qi3 ((v8qi) mm, (v8qi) mn);
fa5322fa
AO
83}
84
73a4d10b 85static __inline unsigned long long
fa5322fa
AO
86sh_media_MADDS_W (unsigned long long mm, unsigned long long mn)
87{
73a4d10b
R
88 typedef float v4hi __attribute__ ((mode(V4HI)));
89
90 return (unsigned long long) __builtin_ssaddv4hi3 ((v4hi) mm, (v4hi) mn);
fa5322fa
AO
91}
92
73a4d10b 93static __inline unsigned long long
fa5322fa
AO
94sh_media_MCMPEQ_B (unsigned long long mm, unsigned long long mn)
95{
73a4d10b
R
96 typedef float v8qi __attribute__ ((mode(V8QI)));
97
98 return (unsigned long long) __builtin_sh_media_MCMPEQ_B ((v8qi) mm,
99 (v8qi) mn);
fa5322fa
AO
100}
101
73a4d10b 102static __inline unsigned long long
fa5322fa
AO
103sh_media_MCMPEQ_L (unsigned long long mm, unsigned long long mn)
104{
73a4d10b
R
105 typedef float v2si __attribute__ ((mode(V2SI)));
106
107 return (unsigned long long) __builtin_sh_media_MCMPEQ_L ((v2si) mm,
108 (v2si) mn);
fa5322fa
AO
109}
110
73a4d10b 111static __inline unsigned long long
fa5322fa
AO
112sh_media_MCMPEQ_W (unsigned long long mm, unsigned long long mn)
113{
73a4d10b 114 typedef float v4hi __attribute__ ((mode(V4HI)));
fa5322fa 115
73a4d10b
R
116 return (unsigned long long) __builtin_sh_media_MCMPEQ_W ((v4hi) mm,
117 (v4hi) mn);
fa5322fa
AO
118}
119
73a4d10b 120static __inline unsigned long long
fa5322fa
AO
121sh_media_MCMPGT_UB (unsigned long long mm, unsigned long long mn)
122{
73a4d10b
R
123 typedef float v8qi __attribute__ ((mode(V8QI)));
124
125 return (unsigned long long) __builtin_sh_media_MCMPGT_UB ((v8qi) mm,
126 (v8qi) mn);
fa5322fa
AO
127}
128
73a4d10b
R
129static __inline unsigned long long
130sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn)
fa5322fa 131{
73a4d10b
R
132 typedef float v2si __attribute__ ((mode(V2SI)));
133
134 return (unsigned long long) __builtin_sh_media_MCMPGT_L ((v2si) mm,
135 (v2si) mn);
fa5322fa
AO
136}
137
73a4d10b
R
138static __inline unsigned long long
139sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn)
fa5322fa 140{
73a4d10b
R
141 typedef float v4hi __attribute__ ((mode(V4HI)));
142
143 return (unsigned long long) __builtin_sh_media_MCMPGT_W ((v4hi) mm,
144 (v4hi) mn);
fa5322fa
AO
145}
146
73a4d10b
R
147#define sh_media_MCMV __builtin_sh_media_MCMV
148
149static __inline unsigned long long
fa5322fa
AO
150sh_media_MCNVS_LW (unsigned long long mm, unsigned long long mn)
151{
73a4d10b
R
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);
fa5322fa
AO
157}
158
73a4d10b 159static __inline unsigned long long
fa5322fa
AO
160sh_media_MCNVS_WB (unsigned long long mm, unsigned long long mn)
161{
73a4d10b
R
162 typedef float v4hi __attribute__ ((mode(V4HI)));
163
164 return (unsigned long long) __builtin_sh_media_MCNVS_WB ((v4hi) mm,
165 (v4hi) mn);
fa5322fa
AO
166}
167
73a4d10b 168static __inline unsigned long long
fa5322fa
AO
169sh_media_MCNVS_WUB (unsigned long long mm, unsigned long long mn)
170{
73a4d10b
R
171 typedef float v4hi __attribute__ ((mode(V4HI)));
172
173 return (unsigned long long) __builtin_sh_media_MCNVS_WUB ((v4hi) mm,
174 (v4hi) mn);
fa5322fa
AO
175}
176
73a4d10b 177static __inline unsigned long long
fa5322fa
AO
178sh_media_MEXTR1 (unsigned long long mm, unsigned long long mn)
179{
73a4d10b
R
180 typedef float v8qi __attribute__ ((mode(V8QI)));
181
182 return (unsigned long long) __builtin_sh_media_MEXTR1 ((v8qi) mm,
183 (v8qi) mn);
fa5322fa
AO
184}
185
73a4d10b 186static __inline unsigned long long
fa5322fa
AO
187sh_media_MEXTR2 (unsigned long long mm, unsigned long long mn)
188{
73a4d10b
R
189 typedef float v8qi __attribute__ ((mode(V8QI)));
190
191 return (unsigned long long) __builtin_sh_media_MEXTR2 ((v8qi) mm,
192 (v8qi) mn);
fa5322fa
AO
193}
194
73a4d10b 195static __inline unsigned long long
fa5322fa
AO
196sh_media_MEXTR3 (unsigned long long mm, unsigned long long mn)
197{
73a4d10b
R
198 typedef float v8qi __attribute__ ((mode(V8QI)));
199
200 return (unsigned long long) __builtin_sh_media_MEXTR3 ((v8qi) mm,
201 (v8qi) mn);
fa5322fa
AO
202}
203
73a4d10b 204static __inline unsigned long long
fa5322fa
AO
205sh_media_MEXTR4 (unsigned long long mm, unsigned long long mn)
206{
73a4d10b
R
207 typedef float v8qi __attribute__ ((mode(V8QI)));
208
209 return (unsigned long long) __builtin_sh_media_MEXTR4 ((v8qi) mm,
210 (v8qi) mn);
fa5322fa
AO
211}
212
73a4d10b 213static __inline unsigned long long
fa5322fa
AO
214sh_media_MEXTR5 (unsigned long long mm, unsigned long long mn)
215{
73a4d10b
R
216 typedef float v8qi __attribute__ ((mode(V8QI)));
217
218 return (unsigned long long) __builtin_sh_media_MEXTR5 ((v8qi) mm,
219 (v8qi) mn);
fa5322fa
AO
220}
221
73a4d10b 222static __inline unsigned long long
fa5322fa
AO
223sh_media_MEXTR6 (unsigned long long mm, unsigned long long mn)
224{
73a4d10b
R
225 typedef float v8qi __attribute__ ((mode(V8QI)));
226
227 return (unsigned long long) __builtin_sh_media_MEXTR6 ((v8qi) mm,
228 (v8qi) mn);
fa5322fa
AO
229}
230
73a4d10b 231static __inline unsigned long long
fa5322fa
AO
232sh_media_MEXTR7 (unsigned long long mm, unsigned long long mn)
233{
73a4d10b
R
234 typedef float v8qi __attribute__ ((mode(V8QI)));
235
236 return (unsigned long long) __builtin_sh_media_MEXTR7 ((v8qi) mm,
237 (v8qi) mn);
fa5322fa
AO
238}
239
73a4d10b
R
240static __inline unsigned long long
241sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn,
242 unsigned long long mw)
fa5322fa 243{
73a4d10b
R
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));
fa5322fa
AO
254}
255
73a4d10b
R
256static __inline unsigned long long
257sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn,
258 unsigned long long mw)
fa5322fa 259{
73a4d10b
R
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));
fa5322fa
AO
270}
271
73a4d10b 272static __inline unsigned long long
fa5322fa
AO
273sh_media_MMUL_L (unsigned long long mm, unsigned long long mn)
274{
73a4d10b
R
275 typedef float v2si __attribute__ ((mode(V2SI)));
276
277 return (unsigned long long) __builtin_mulv2si3 ((v2si) mm, (v2si) mn);
fa5322fa
AO
278}
279
73a4d10b 280static __inline unsigned long long
fa5322fa
AO
281sh_media_MMUL_W (unsigned long long mm, unsigned long long mn)
282{
73a4d10b
R
283 typedef float v4hi __attribute__ ((mode(V4HI)));
284
285 return (unsigned long long) __builtin_mulv4hi3 ((v4hi) mm, (v4hi) mn);
fa5322fa
AO
286}
287
73a4d10b 288static __inline unsigned long long
fa5322fa
AO
289sh_media_MMULFX_L (unsigned long long mm, unsigned long long mn)
290{
73a4d10b
R
291 typedef float v2si __attribute__ ((mode(V2SI)));
292
293 return (unsigned long long) __builtin_sh_media_MMULFX_L ((v2si) mm,
294 (v2si) mn);
fa5322fa
AO
295}
296
73a4d10b 297static __inline unsigned long long
fa5322fa
AO
298sh_media_MMULFX_W (unsigned long long mm, unsigned long long mn)
299{
73a4d10b
R
300 typedef float v4hi __attribute__ ((mode(V4HI)));
301
302 return (unsigned long long) __builtin_sh_media_MMULFX_W ((v4hi) mm,
303 (v4hi) mn);
fa5322fa
AO
304}
305
73a4d10b 306static __inline unsigned long long
fa5322fa
AO
307sh_media_MMULFXRP_W (unsigned long long mm, unsigned long long mn)
308{
73a4d10b
R
309 typedef float v4hi __attribute__ ((mode(V4HI)));
310
311 return (unsigned long long) __builtin_sh_media_MMULFXRP_W ((v4hi) mm,
312 (v4hi) mn);
fa5322fa
AO
313}
314
73a4d10b 315static __inline unsigned long long
fa5322fa
AO
316sh_media_MMULHI_WL (unsigned long long mm, unsigned long long mn)
317{
73a4d10b
R
318 typedef float v4hi __attribute__ ((mode(V4HI)));
319
320 return (unsigned long long) __builtin_sh_media_MMULHI_WL ((v4hi) mm,
321 (v4hi) mn);
fa5322fa
AO
322}
323
73a4d10b 324static __inline unsigned long long
fa5322fa
AO
325sh_media_MMULLO_WL (unsigned long long mm, unsigned long long mn)
326{
73a4d10b
R
327 typedef float v4hi __attribute__ ((mode(V4HI)));
328
329 return (unsigned long long) __builtin_sh_media_MMULLO_WL ((v4hi) mm,
330 (v4hi) mn);
fa5322fa
AO
331}
332
73a4d10b
R
333static __inline unsigned long long
334sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn,
335 unsigned long long mw)
fa5322fa 336{
73a4d10b
R
337 typedef unsigned int uv4hi __attribute__ ((mode(V4HI)));
338
339 return __builtin_sh_media_MMULSUM_WQ ((uv4hi) mm, (uv4hi) mn, mw);
fa5322fa
AO
340}
341
73a4d10b 342static __inline unsigned long long
fa5322fa
AO
343sh_media_MPERM_W (unsigned long long mm, unsigned int mn)
344{
73a4d10b
R
345 typedef float v4hi __attribute__ ((mode(V4HI)));
346
347 return (unsigned long long) __builtin_sh_media_MPERM_W ((v4hi) mm, mn);
fa5322fa
AO
348}
349
73a4d10b
R
350static __inline unsigned long long
351sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn,
352 unsigned long long mw)
fa5322fa 353{
73a4d10b
R
354 typedef unsigned int uv8qi __attribute__ ((mode(V8QI)));
355
356 return __builtin_sh_media_MSAD_UBQ ((uv8qi) mm, (uv8qi) mn, mw);
fa5322fa
AO
357}
358
73a4d10b 359static __inline unsigned long long
fa5322fa
AO
360sh_media_MSHALDS_L (unsigned long long mm, unsigned int mn)
361{
73a4d10b
R
362 typedef float v2si __attribute__ ((mode(V2SI)));
363
364 return (unsigned long long) __builtin_sh_media_MSHALDS_L ((v2si) mm, mn);
fa5322fa
AO
365}
366
73a4d10b 367static __inline unsigned long long
fa5322fa
AO
368sh_media_MSHALDS_W (unsigned long long mm, unsigned int mn)
369{
73a4d10b
R
370 typedef float v4hi __attribute__ ((mode(V4HI)));
371
372 return (unsigned long long) __builtin_sh_media_MSHALDS_W ((v4hi) mm, mn);
fa5322fa
AO
373}
374
73a4d10b 375static __inline unsigned long long
fa5322fa
AO
376sh_media_MSHARD_L (unsigned long long mm, unsigned int mn)
377{
73a4d10b
R
378 typedef float v2si __attribute__ ((mode(V2SI)));
379
380 return (unsigned long long) __builtin_ashrv2si3 ((v2si) mm, mn);
fa5322fa
AO
381}
382
73a4d10b 383static __inline unsigned long long
fa5322fa
AO
384sh_media_MSHARD_W (unsigned long long mm, unsigned int mn)
385{
73a4d10b 386 typedef float v4hi __attribute__ ((mode(V4HI)));
fa5322fa 387
73a4d10b 388 return (unsigned long long) __builtin_ashrv4hi3 ((v4hi) mm, mn);
fa5322fa
AO
389}
390
73a4d10b
R
391#define sh_media_MSHARDS_Q __builtin_sh_media_MSHARDS_Q
392
393static __inline unsigned long long
fa5322fa
AO
394sh_media_MSHFHI_B (unsigned long long mm, unsigned long long mn)
395{
73a4d10b
R
396 typedef float v8qi __attribute__ ((mode(V8QI)));
397
398 return (unsigned long long) __builtin_sh_media_MSHFHI_B ((v8qi) mm,
399 (v8qi) mn);
fa5322fa
AO
400}
401
73a4d10b 402static __inline unsigned long long
fa5322fa
AO
403sh_media_MSHFHI_L (unsigned long long mm, unsigned long long mn)
404{
73a4d10b
R
405 typedef float v2si __attribute__ ((mode(V2SI)));
406
407 return (unsigned long long) __builtin_sh_media_MSHFHI_L ((v2si) mm,
408 (v2si) mn);
fa5322fa
AO
409}
410
73a4d10b 411static __inline unsigned long long
fa5322fa
AO
412sh_media_MSHFHI_W (unsigned long long mm, unsigned long long mn)
413{
73a4d10b
R
414 typedef float v4hi __attribute__ ((mode(V4HI)));
415
416 return (unsigned long long) __builtin_sh_media_MSHFHI_W ((v4hi) mm,
417 (v4hi) mn);
fa5322fa
AO
418}
419
73a4d10b 420static __inline unsigned long long
fa5322fa
AO
421sh_media_MSHFLO_B (unsigned long long mm, unsigned long long mn)
422{
73a4d10b
R
423 typedef float v8qi __attribute__ ((mode(V8QI)));
424
425 return (unsigned long long) __builtin_sh_media_MSHFLO_B ((v8qi) mm,
426 (v8qi) mn);
fa5322fa
AO
427}
428
73a4d10b 429static __inline unsigned long long
fa5322fa
AO
430sh_media_MSHFLO_L (unsigned long long mm, unsigned long long mn)
431{
73a4d10b
R
432 typedef float v2si __attribute__ ((mode(V2SI)));
433
434 return (unsigned long long) __builtin_sh_media_MSHFLO_L ((v2si) mm,
435 (v2si) mn);
fa5322fa
AO
436}
437
73a4d10b 438static __inline unsigned long long
fa5322fa
AO
439sh_media_MSHFLO_W (unsigned long long mm, unsigned long long mn)
440{
73a4d10b
R
441 typedef float v4hi __attribute__ ((mode(V4HI)));
442
443 return (unsigned long long) __builtin_sh_media_MSHFLO_W ((v4hi) mm,
444 (v4hi) mn);
fa5322fa
AO
445}
446
73a4d10b 447static __inline unsigned long long
fa5322fa
AO
448sh_media_MSHLLD_L (unsigned long long mm, unsigned int mn)
449{
73a4d10b
R
450 typedef float v2si __attribute__ ((mode(V2SI)));
451
452 return (unsigned long long) __builtin_ashlv2si3 ((v2si) mm, mn);
fa5322fa
AO
453}
454
73a4d10b 455static __inline unsigned long long
fa5322fa
AO
456sh_media_MSHLLD_W (unsigned long long mm, unsigned int mn)
457{
73a4d10b
R
458 typedef float v4hi __attribute__ ((mode(V4HI)));
459
460 return (unsigned long long) __builtin_ashlv4hi3 ((v4hi) mm, mn);
fa5322fa
AO
461}
462
73a4d10b 463static __inline unsigned long long
fa5322fa
AO
464sh_media_MSHLRD_L (unsigned long long mm, unsigned int mn)
465{
73a4d10b
R
466 typedef float v2si __attribute__ ((mode(V2SI)));
467
468 return (unsigned long long) __builtin_lshrv2si3 ((v2si) mm, mn);
fa5322fa
AO
469}
470
73a4d10b 471static __inline unsigned long long
fa5322fa
AO
472sh_media_MSHLRD_W (unsigned long long mm, unsigned int mn)
473{
73a4d10b
R
474 typedef float v4hi __attribute__ ((mode(V4HI)));
475
476 return (unsigned long long) __builtin_lshrv4hi3 ((v4hi) mm, mn);
fa5322fa
AO
477}
478
73a4d10b 479static __inline unsigned long long
fa5322fa
AO
480sh_media_MSUB_L (unsigned long long mm, unsigned long long mn)
481{
73a4d10b
R
482 typedef float v2si __attribute__ ((mode(V2SI)));
483
484 return (unsigned long long) __builtin_subv2si3 ((v2si) mm, (v2si) mn);
fa5322fa
AO
485}
486
73a4d10b 487static __inline unsigned long long
fa5322fa
AO
488sh_media_MSUB_W (unsigned long long mm, unsigned long long mn)
489{
73a4d10b
R
490 typedef float v4hi __attribute__ ((mode(V4HI)));
491
492 return (unsigned long long) __builtin_subv4hi3 ((v4hi) mm, (v4hi) mn);
fa5322fa
AO
493}
494
73a4d10b 495static __inline unsigned long long
fa5322fa
AO
496sh_media_MSUBS_L (unsigned long long mm, unsigned long long mn)
497{
73a4d10b
R
498 typedef float v2si __attribute__ ((mode(V2SI)));
499
500 return (unsigned long long) __builtin_sssubv2si3 ((v2si) mm, (v2si) mn);
fa5322fa
AO
501}
502
73a4d10b 503static __inline unsigned long long
fa5322fa
AO
504sh_media_MSUBS_UB (unsigned long long mm, unsigned long long mn)
505{
73a4d10b
R
506 typedef float v8qi __attribute__ ((mode(V8QI)));
507
508 return (unsigned long long) __builtin_ussubv8qi3 ((v8qi) mm, (v8qi) mn);
fa5322fa
AO
509}
510
73a4d10b 511static __inline unsigned long long
fa5322fa
AO
512sh_media_MSUBS_W (unsigned long long mm, unsigned long long mn)
513{
73a4d10b
R
514 typedef float v4hi __attribute__ ((mode(V4HI)));
515
516 return (unsigned long long) __builtin_sssubv4hi3 ((v4hi) mm, (v4hi) mn);
fa5322fa
AO
517}
518
519#if ! __SH4_NOFPU__
73a4d10b 520/* Floating-point Intrinsics */
fa5322fa 521
73a4d10b
R
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
fa5322fa 526
73a4d10b 527static __inline float sh_media_FCOSA_S (float fg)
fa5322fa 528{
73a4d10b 529 union { int i; float f; } u;
fa5322fa 530
73a4d10b
R
531 u.f = fg;
532 return __builtin_sh_media_FCOSA_S (u.i);
fa5322fa
AO
533}
534
73a4d10b 535static __inline float
fa5322fa 536sh_media_FGETSCR (void)
73a4d10b
R
537{
538 float f;
539
540 __asm volatile ("fgetscr %0" : "=f" (f));
541 return f;
fa5322fa
AO
542}
543
73a4d10b 544static __inline float
fa5322fa
AO
545sh_media_FIPR_S (const void *fvg, const void *fvh)
546{
73a4d10b
R
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);
fa5322fa
AO
552}
553
73a4d10b
R
554#if 0
555/* This gives different results for -O0 */
556static __inline float
fa5322fa
AO
557sh_media_FMAC_S (float fg, float fh, float fq)
558{
73a4d10b 559 return fg * fh + fq;
fa5322fa 560}
73a4d10b 561#else
fa5322fa 562
73a4d10b
R
563#define sh_media_FMAC_S __builtin_sh_media_FMAC_S
564#endif
565
566static __inline long long
fa5322fa
AO
567sh_media_FMOV_DQ (double dg)
568{
73a4d10b
R
569 union { long long l; double d; } u;
570
571 u.d = dg;
572 return u.l;
fa5322fa
AO
573}
574
73a4d10b 575static __inline float
fa5322fa
AO
576sh_media_FMOV_LS (int mm)
577{
73a4d10b
R
578 union { int i; float f; } u;
579
580 u.i = mm;
581 return u.f;
fa5322fa
AO
582}
583
73a4d10b 584static __inline double
fa5322fa
AO
585sh_media_FMOV_QD (long long mm)
586{
73a4d10b
R
587 union { long long l; double d; } u;
588
589 u.l = mm;
590 return u.d;
fa5322fa
AO
591}
592
73a4d10b 593static __inline int
fa5322fa
AO
594sh_media_FMOV_SL (float fg)
595{
73a4d10b
R
596 union { int i; float f; } u;
597
598 u.f = fg;
599 return u.i;
fa5322fa
AO
600}
601
73a4d10b 602static __inline void
fa5322fa 603sh_media_FPUTSCR (float fg)
73a4d10b
R
604{
605 __asm volatile ("fputscr %0" : : "f" (fg));
fa5322fa
AO
606}
607
73a4d10b 608static __inline float sh_media_FSINA_S (float fg)
fa5322fa 609{
73a4d10b 610 union { int i; float f; } u;
fa5322fa 611
73a4d10b
R
612 u.f = fg;
613 return __builtin_sh_media_FSINA_S (u.i);
fa5322fa
AO
614}
615
73a4d10b
R
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
622static __inline void
fa5322fa
AO
623sh_media_FTRV_S (const void *mtrxg, const void *fvh, void *fvf)
624{
73a4d10b
R
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);
fa5322fa
AO
631}
632#endif /* ! __SH4_NOFPU__ */
633
73a4d10b
R
634/* Not implemented here: Control and Configuration intrinsics. */
635/* Misaligned Access Support intrinsics */
636
637static __inline unsigned long long
fa5322fa
AO
638sh_media_LDHI_L (void *p, int s)
639{
73a4d10b 640 return __builtin_sh_media_LDHI_L ((char *)p + s);
fa5322fa
AO
641}
642
73a4d10b 643static __inline unsigned long long
fa5322fa
AO
644sh_media_LDHI_Q (void *p, int s)
645{
73a4d10b 646 return __builtin_sh_media_LDHI_Q ((char *)p + s);
fa5322fa
AO
647}
648
73a4d10b 649static __inline unsigned long long
fa5322fa
AO
650sh_media_LDLO_L (void *p, int s)
651{
73a4d10b 652 return __builtin_sh_media_LDLO_L ((char *)p + s);
fa5322fa
AO
653}
654
73a4d10b 655static __inline unsigned long long
fa5322fa
AO
656sh_media_LDLO_Q (void *p, int s)
657{
73a4d10b 658 return __builtin_sh_media_LDLO_Q ((char *)p + s);
fa5322fa
AO
659}
660
73a4d10b 661static __inline void
fa5322fa
AO
662sh_media_STHI_L (void *p, int s, unsigned int mw)
663{
73a4d10b 664 __builtin_sh_media_STHI_L ((char*)p + s, mw);
fa5322fa
AO
665}
666
73a4d10b 667static __inline void
fa5322fa
AO
668sh_media_STHI_Q (void *p, int s, unsigned long long mw)
669{
73a4d10b 670 __builtin_sh_media_STHI_Q ((char*)p + s, mw);
fa5322fa
AO
671}
672
73a4d10b 673static __inline void
fa5322fa
AO
674sh_media_STLO_L (void *p, int s, unsigned int mw)
675{
73a4d10b 676 __builtin_sh_media_STLO_L ((char*)p + s, mw);
fa5322fa
AO
677}
678
73a4d10b 679static __inline void
fa5322fa
AO
680sh_media_STLO_Q (void *p, int s, unsigned long long mw)
681{
73a4d10b 682 __builtin_sh_media_STLO_Q ((char*)p + s, mw);
fa5322fa
AO
683}
684
73a4d10b 685/* Miscellaneous intrinsics */
fa5322fa 686
73a4d10b
R
687#define sh_media_NSB __builtin_sh_media_NSB
688
689static __inline unsigned long long
fa5322fa
AO
690sh_media_BYTEREV (unsigned long long mm)
691{
73a4d10b
R
692 typedef float v8qi __attribute__ ((mode(V8QI)));
693
694 return (unsigned long long) __builtin_sh_media_BYTEREV ((v8qi) mm);
fa5322fa
AO
695}
696
73a4d10b
R
697__inline__ static unsigned long long
698sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline));
699
700__inline__ static unsigned long long
fa5322fa
AO
701sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw)
702{
73a4d10b 703 return mm == 0 ? mn : mw;
fa5322fa
AO
704}
705
73a4d10b
R
706__inline__ static unsigned long long
707sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline));
708
709__inline__ static unsigned long long
fa5322fa
AO
710sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw)
711{
73a4d10b 712 return mm != 0 ? mn : mw;
fa5322fa
AO
713}
714
73a4d10b 715static __inline long long
fa5322fa
AO
716sh_media_ADDZ_L (unsigned int mm, unsigned int mn)
717{
73a4d10b 718 return mm + mn;
fa5322fa
AO
719}
720
0fa2e4df 721/* NOP and Synchronization intrinsics not implemented here. */
73a4d10b
R
722
723static __inline__ void sh_media_PREFO(void *mm, int s)
724{
725 __builtin_sh_media_PREFO (mm + s, 0, 0);
726}
727
0fa2e4df 728/* Event Handling intrinsics not implemented here. */
73a4d10b
R
729
730/* Old asm stuff */
731
732static __inline__
fa5322fa
AO
733void
734sh_media_NOP (void)
735{
73a4d10b 736 __asm__ ("nop" : :);
fa5322fa
AO
737}
738
739__inline__ static
740unsigned long long
741sh_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
750void
751sh_media_SYNCI (void)
752{
753 __asm__ __volatile__ ("synci");
754}
755
756__inline__ static
757void
758sh_media_SYNCO (void)
759{
760 __asm__ __volatile__ ("synco");
761}
762
763__inline__ static
764void
765sh_media_ALLOCO (void *mm, int s)
766{
73a4d10b 767 __builtin_sh_media_ALLOCO (mm + s);
fa5322fa
AO
768}
769
770__inline__ static
771void
772sh_media_ICBI (void *mm, int s)
773{
774 __asm__ __volatile__ ("icbi %m0" : : "o" (((char*)mm)[s]));
775}
776
777__inline__ static
778void
779sh_media_OCBI (void *mm, int s)
780{
781 __asm__ __volatile__ ("ocbi %m0" : : "o" (((char*)mm)[s]));
782}
783
784__inline__ static
785void
786sh_media_OCBP (void *mm, int s)
787{
788 __asm__ __volatile__ ("ocbp %m0" : : "o" (((char*)mm)[s]));
789}
790
791__inline__ static
792void
793sh_media_OCBWB (void *mm, int s)
794{
795 __asm__ __volatile__ ("ocbwb %m0" : : "o" (((char*)mm)[s]));
796}
797
798__inline__ static
799void
800sh_media_PREFI (void *mm, int s)
801{
802 __asm__ __volatile__ ("prefi %m0" : : "o" (((char*)mm)[s]));
803}
804
fa5322fa
AO
805__inline__ static
806void
807sh_media_BRK (void)
808{
809 __asm__ __volatile__ ("brk");
810}
811
812__inline__ static
813void
814sh_media_TRAPA (unsigned long long mm)
815{
816 __asm__ __volatile__ ("trapa %%0" : : "r" (mm));
817}
818
819__inline__ static
820short
821sh_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
833unsigned short
834sh_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
73a4d10b
R
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. */
fa5322fa
AO
847__inline__ static
848int
849sh_media_unaligned_LD_L (void *p)
850{
851#if __LITTLE_ENDIAN__
73a4d10b
R
852 return (__builtin_sh_media_LDHI_L ((char *)p + 3)
853 | __builtin_sh_media_LDLO_L (p));
fa5322fa 854#else
73a4d10b
R
855 return (__builtin_sh_media_LDLO_L ((char *)p + 3)
856 | __builtin_sh_media_LDHI_L (p));
fa5322fa
AO
857#endif
858}
859
860__inline__ static
861long long
862sh_media_unaligned_LD_Q (void *p)
863{
864#if __LITTLE_ENDIAN__
73a4d10b
R
865 return (__builtin_sh_media_LDHI_Q ((char *)p + 7)
866 | __builtin_sh_media_LDLO_Q (p));
fa5322fa 867#else
73a4d10b
R
868 return (__builtin_sh_media_LDLO_Q ((char *)p + 7)
869 | __builtin_sh_media_LDHI_Q (p));
fa5322fa
AO
870#endif
871}
872
873__inline__ static
874void
875sh_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
73a4d10b
R
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. */
fa5322fa
AO
890__inline__ static
891void
892sh_media_unaligned_ST_L (void *p, unsigned int k)
893{
894#if __LITTLE_ENDIAN__
73a4d10b
R
895 __builtin_sh_media_STHI_L (p + 3, k);
896 __builtin_sh_media_STLO_L (p, k);
fa5322fa 897#else
73a4d10b
R
898 __builtin_sh_media_STLO_L (p + 3, k);
899 __builtin_sh_media_STHI_L (p, k);
fa5322fa
AO
900#endif
901}
902
903__inline__ static
904void
905sh_media_unaligned_ST_Q (void *p, unsigned long long k)
906{
907#if __LITTLE_ENDIAN__
73a4d10b
R
908 __builtin_sh_media_STHI_Q (p + 7, k);
909 __builtin_sh_media_STLO_Q (p, k);
fa5322fa 910#else
73a4d10b
R
911 __builtin_sh_media_STLO_Q (p + 7, k);
912 __builtin_sh_media_STHI_Q (p, k);
fa5322fa
AO
913#endif
914}
915
916#if ! __SH4_NOFPU__
917__inline__ static
918void
919sh_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
927void
928sh_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
946void
947sh_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
965void
966sh_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
974void
975sh_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
993void
994sh_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
1012void
50fe8924
OE
1013sh_media_FTRVADD_S (const void *mtrxg, const void *fvh, const void *fvi,
1014 void *fvf)
fa5322fa
AO
1015{
1016 sh_media_FTRV_S (mtrxg, fvh, fvf);
1017 sh_media_FVADD_S (fvf, fvi, fvf);
1018}
1019
1020__inline__ static
1021void
50fe8924
OE
1022sh_media_FTRVSUB_S (const void *mtrxg, const void *fvh, const void *fvi,
1023 void *fvf)
fa5322fa
AO
1024{
1025 sh_media_FTRV_S (mtrxg, fvh, fvf);
1026 sh_media_FVSUB_S (fvf, fvi, fvf);
1027}
1028
1029__inline__ static
1030void
1031sh_media_FMTRXMUL_S (const void *mtrxg, const void *mtrxh, void *mtrxf)
1032{
1033 const __GCC_FV *g = mtrxg;
1034 __GCC_FV *f = mtrxf;
1035#if 1
1036 int j;
1037
1038 for (j = 0; j < 4; j++)
1039 sh_media_FTRV_S (mtrxh, &g[j], &f[j]);
1040#else
1041 sh_media_FTRV_S (mtrxh, &g[0], &f[0]);
1042 sh_media_FTRV_S (mtrxh, &g[1], &f[1]);
1043 sh_media_FTRV_S (mtrxh, &g[2], &f[2]);
1044 sh_media_FTRV_S (mtrxh, &g[3], &f[3]);
1045#endif
1046}
1047
1048__inline__ static
1049void
50fe8924
OE
1050sh_media_FMTRXMULADD_S (const void *mtrxg, const void *mtrxh,
1051 const void *mtrxi, void *mtrxf)
fa5322fa
AO
1052{
1053 const __GCC_FV *g = mtrxg, *i = mtrxi;
1054 __GCC_FV *f = mtrxf;
1055#if 1
1056 int j;
1057
1058 for (j = 0; j < 4; j++)
1059 sh_media_FTRVADD_S (mtrxh, &g[j], &i[j], &f[j]);
1060#else
1061 sh_media_FTRVADD_S (mtrxh, &g[0], &i[0], &f[0]);
1062 sh_media_FTRVADD_S (mtrxh, &g[1], &i[1], &f[1]);
1063 sh_media_FTRVADD_S (mtrxh, &g[2], &i[2], &f[2]);
1064 sh_media_FTRVADD_S (mtrxh, &g[3], &i[3], &f[3]);
1065#endif
1066}
1067
1068__inline__ static
1069void
50fe8924
OE
1070sh_media_FMTRXMULSUB_S (const void *mtrxg, const void *mtrxh,
1071 const void *mtrxi, void *mtrxf)
fa5322fa
AO
1072{
1073 const __GCC_FV *g = mtrxg, *i = mtrxi;
1074 __GCC_FV *f = mtrxf;
1075#if 1
1076 int j;
1077
1078 for (j = 0; j < 4; j++)
1079 sh_media_FTRVSUB_S (mtrxh, &g[j], &i[j], &f[j]);
1080#else
1081 sh_media_FTRVSUB_S (mtrxh, &g[0], &i[0], &f[0]);
1082 sh_media_FTRVSUB_S (mtrxh, &g[1], &i[1], &f[1]);
1083 sh_media_FTRVSUB_S (mtrxh, &g[2], &i[2], &f[2]);
1084 sh_media_FTRVSUB_S (mtrxh, &g[3], &i[3], &f[3]);
1085#endif
1086}
1087#endif /* ! __SH4_NOFPU__ */
1088
1089#endif /* __SHMEDIA__ */
1090
1091#endif /* _USHMEDIA_H */