blob: 2d45ae3fe833cfb548aa163c6cdf50bac71b3b9b [file] [log] [blame]
Andrew Hsieh38586de2014-01-27 22:20:28 -08001/* Intrinsics for ST Microelectronics Loongson-2E/2F SIMD operations.
2
3 Copyright (C) 2008-2013 Free Software Foundation, Inc.
4 Contributed by CodeSourcery.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
21
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
26
27#ifndef _GCC_LOONGSON_H
28#define _GCC_LOONGSON_H
29
30#if !defined(__mips_loongson_vector_rev)
31# error "You must select -march=loongson2e or -march=loongson2f to use loongson.h"
32#endif
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#include <stdint.h>
39
40/* Vectors of unsigned bytes, halfwords and words. */
41typedef uint8_t uint8x8_t __attribute__((vector_size (8)));
42typedef uint16_t uint16x4_t __attribute__((vector_size (8)));
43typedef uint32_t uint32x2_t __attribute__((vector_size (8)));
44
45/* Vectors of signed bytes, halfwords and words. */
46typedef int8_t int8x8_t __attribute__((vector_size (8)));
47typedef int16_t int16x4_t __attribute__((vector_size (8)));
48typedef int32_t int32x2_t __attribute__((vector_size (8)));
49
50/* SIMD intrinsics.
51 Unless otherwise noted, calls to the functions below will expand into
52 precisely one machine instruction, modulo any moves required to
53 satisfy register allocation constraints. */
54
55/* Pack with signed saturation. */
56__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
57packsswh (int32x2_t s, int32x2_t t)
58{
59 return __builtin_loongson_packsswh (s, t);
60}
61
62__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
63packsshb (int16x4_t s, int16x4_t t)
64{
65 return __builtin_loongson_packsshb (s, t);
66}
67
68/* Pack with unsigned saturation. */
69__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
70packushb (uint16x4_t s, uint16x4_t t)
71{
72 return __builtin_loongson_packushb (s, t);
73}
74
75/* Vector addition, treating overflow by wraparound. */
76__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
77paddw_u (uint32x2_t s, uint32x2_t t)
78{
79 return __builtin_loongson_paddw_u (s, t);
80}
81
82__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
83paddh_u (uint16x4_t s, uint16x4_t t)
84{
85 return __builtin_loongson_paddh_u (s, t);
86}
87
88__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
89paddb_u (uint8x8_t s, uint8x8_t t)
90{
91 return __builtin_loongson_paddb_u (s, t);
92}
93
94__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
95paddw_s (int32x2_t s, int32x2_t t)
96{
97 return __builtin_loongson_paddw_s (s, t);
98}
99
100__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
101paddh_s (int16x4_t s, int16x4_t t)
102{
103 return __builtin_loongson_paddh_s (s, t);
104}
105
106__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
107paddb_s (int8x8_t s, int8x8_t t)
108{
109 return __builtin_loongson_paddb_s (s, t);
110}
111
112/* Addition of doubleword integers, treating overflow by wraparound. */
113__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
114paddd_u (uint64_t s, uint64_t t)
115{
116 return __builtin_loongson_paddd_u (s, t);
117}
118
119__extension__ static __inline int64_t __attribute__ ((__always_inline__))
120paddd_s (int64_t s, int64_t t)
121{
122 return __builtin_loongson_paddd_s (s, t);
123}
124
125/* Vector addition, treating overflow by signed saturation. */
126__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
127paddsh (int16x4_t s, int16x4_t t)
128{
129 return __builtin_loongson_paddsh (s, t);
130}
131
132__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
133paddsb (int8x8_t s, int8x8_t t)
134{
135 return __builtin_loongson_paddsb (s, t);
136}
137
138/* Vector addition, treating overflow by unsigned saturation. */
139__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
140paddush (uint16x4_t s, uint16x4_t t)
141{
142 return __builtin_loongson_paddush (s, t);
143}
144
145__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
146paddusb (uint8x8_t s, uint8x8_t t)
147{
148 return __builtin_loongson_paddusb (s, t);
149}
150
151/* Logical AND NOT. */
152__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
153pandn_ud (uint64_t s, uint64_t t)
154{
155 return __builtin_loongson_pandn_ud (s, t);
156}
157
158__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
159pandn_uw (uint32x2_t s, uint32x2_t t)
160{
161 return __builtin_loongson_pandn_uw (s, t);
162}
163
164__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
165pandn_uh (uint16x4_t s, uint16x4_t t)
166{
167 return __builtin_loongson_pandn_uh (s, t);
168}
169
170__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
171pandn_ub (uint8x8_t s, uint8x8_t t)
172{
173 return __builtin_loongson_pandn_ub (s, t);
174}
175
176__extension__ static __inline int64_t __attribute__ ((__always_inline__))
177pandn_sd (int64_t s, int64_t t)
178{
179 return __builtin_loongson_pandn_sd (s, t);
180}
181
182__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
183pandn_sw (int32x2_t s, int32x2_t t)
184{
185 return __builtin_loongson_pandn_sw (s, t);
186}
187
188__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
189pandn_sh (int16x4_t s, int16x4_t t)
190{
191 return __builtin_loongson_pandn_sh (s, t);
192}
193
194__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
195pandn_sb (int8x8_t s, int8x8_t t)
196{
197 return __builtin_loongson_pandn_sb (s, t);
198}
199
200/* Average. */
201__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
202pavgh (uint16x4_t s, uint16x4_t t)
203{
204 return __builtin_loongson_pavgh (s, t);
205}
206
207__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
208pavgb (uint8x8_t s, uint8x8_t t)
209{
210 return __builtin_loongson_pavgb (s, t);
211}
212
213/* Equality test. */
214__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
215pcmpeqw_u (uint32x2_t s, uint32x2_t t)
216{
217 return __builtin_loongson_pcmpeqw_u (s, t);
218}
219
220__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
221pcmpeqh_u (uint16x4_t s, uint16x4_t t)
222{
223 return __builtin_loongson_pcmpeqh_u (s, t);
224}
225
226__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
227pcmpeqb_u (uint8x8_t s, uint8x8_t t)
228{
229 return __builtin_loongson_pcmpeqb_u (s, t);
230}
231
232__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
233pcmpeqw_s (int32x2_t s, int32x2_t t)
234{
235 return __builtin_loongson_pcmpeqw_s (s, t);
236}
237
238__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
239pcmpeqh_s (int16x4_t s, int16x4_t t)
240{
241 return __builtin_loongson_pcmpeqh_s (s, t);
242}
243
244__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
245pcmpeqb_s (int8x8_t s, int8x8_t t)
246{
247 return __builtin_loongson_pcmpeqb_s (s, t);
248}
249
250/* Greater-than test. */
251__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
252pcmpgtw_u (uint32x2_t s, uint32x2_t t)
253{
254 return __builtin_loongson_pcmpgtw_u (s, t);
255}
256
257__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
258pcmpgth_u (uint16x4_t s, uint16x4_t t)
259{
260 return __builtin_loongson_pcmpgth_u (s, t);
261}
262
263__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
264pcmpgtb_u (uint8x8_t s, uint8x8_t t)
265{
266 return __builtin_loongson_pcmpgtb_u (s, t);
267}
268
269__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
270pcmpgtw_s (int32x2_t s, int32x2_t t)
271{
272 return __builtin_loongson_pcmpgtw_s (s, t);
273}
274
275__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
276pcmpgth_s (int16x4_t s, int16x4_t t)
277{
278 return __builtin_loongson_pcmpgth_s (s, t);
279}
280
281__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
282pcmpgtb_s (int8x8_t s, int8x8_t t)
283{
284 return __builtin_loongson_pcmpgtb_s (s, t);
285}
286
287/* Extract halfword. */
288__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
289pextrh_u (uint16x4_t s, int field /* 0--3 */)
290{
291 return __builtin_loongson_pextrh_u (s, field);
292}
293
294__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
295pextrh_s (int16x4_t s, int field /* 0--3 */)
296{
297 return __builtin_loongson_pextrh_s (s, field);
298}
299
300/* Insert halfword. */
301__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
302pinsrh_0_u (uint16x4_t s, uint16x4_t t)
303{
304 return __builtin_loongson_pinsrh_0_u (s, t);
305}
306
307__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
308pinsrh_1_u (uint16x4_t s, uint16x4_t t)
309{
310 return __builtin_loongson_pinsrh_1_u (s, t);
311}
312
313__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
314pinsrh_2_u (uint16x4_t s, uint16x4_t t)
315{
316 return __builtin_loongson_pinsrh_2_u (s, t);
317}
318
319__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
320pinsrh_3_u (uint16x4_t s, uint16x4_t t)
321{
322 return __builtin_loongson_pinsrh_3_u (s, t);
323}
324
325__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
326pinsrh_0_s (int16x4_t s, int16x4_t t)
327{
328 return __builtin_loongson_pinsrh_0_s (s, t);
329}
330
331__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
332pinsrh_1_s (int16x4_t s, int16x4_t t)
333{
334 return __builtin_loongson_pinsrh_1_s (s, t);
335}
336
337__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
338pinsrh_2_s (int16x4_t s, int16x4_t t)
339{
340 return __builtin_loongson_pinsrh_2_s (s, t);
341}
342
343__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
344pinsrh_3_s (int16x4_t s, int16x4_t t)
345{
346 return __builtin_loongson_pinsrh_3_s (s, t);
347}
348
349/* Multiply and add. */
350__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
351pmaddhw (int16x4_t s, int16x4_t t)
352{
353 return __builtin_loongson_pmaddhw (s, t);
354}
355
356/* Maximum of signed halfwords. */
357__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
358pmaxsh (int16x4_t s, int16x4_t t)
359{
360 return __builtin_loongson_pmaxsh (s, t);
361}
362
363/* Maximum of unsigned bytes. */
364__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
365pmaxub (uint8x8_t s, uint8x8_t t)
366{
367 return __builtin_loongson_pmaxub (s, t);
368}
369
370/* Minimum of signed halfwords. */
371__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
372pminsh (int16x4_t s, int16x4_t t)
373{
374 return __builtin_loongson_pminsh (s, t);
375}
376
377/* Minimum of unsigned bytes. */
378__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
379pminub (uint8x8_t s, uint8x8_t t)
380{
381 return __builtin_loongson_pminub (s, t);
382}
383
384/* Move byte mask. */
385__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
386pmovmskb_u (uint8x8_t s)
387{
388 return __builtin_loongson_pmovmskb_u (s);
389}
390
391__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
392pmovmskb_s (int8x8_t s)
393{
394 return __builtin_loongson_pmovmskb_s (s);
395}
396
397/* Multiply unsigned integers and store high result. */
398__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
399pmulhuh (uint16x4_t s, uint16x4_t t)
400{
401 return __builtin_loongson_pmulhuh (s, t);
402}
403
404/* Multiply signed integers and store high result. */
405__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
406pmulhh (int16x4_t s, int16x4_t t)
407{
408 return __builtin_loongson_pmulhh (s, t);
409}
410
411/* Multiply signed integers and store low result. */
412__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
413pmullh (int16x4_t s, int16x4_t t)
414{
415 return __builtin_loongson_pmullh (s, t);
416}
417
418/* Multiply unsigned word integers. */
419__extension__ static __inline int64_t __attribute__ ((__always_inline__))
420pmuluw (uint32x2_t s, uint32x2_t t)
421{
422 return __builtin_loongson_pmuluw (s, t);
423}
424
425/* Absolute difference. */
426__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
427pasubub (uint8x8_t s, uint8x8_t t)
428{
429 return __builtin_loongson_pasubub (s, t);
430}
431
432/* Sum of unsigned byte integers. */
433__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
434biadd (uint8x8_t s)
435{
436 return __builtin_loongson_biadd (s);
437}
438
439/* Sum of absolute differences.
440 Note that this intrinsic expands into two machine instructions:
441 PASUBUB followed by BIADD. */
442__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
443psadbh (uint8x8_t s, uint8x8_t t)
444{
445 return __builtin_loongson_psadbh (s, t);
446}
447
448/* Shuffle halfwords. */
449__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
450pshufh_u (uint16x4_t dest, uint16x4_t s, uint8_t order)
451{
452 return __builtin_loongson_pshufh_u (s, order);
453}
454
455__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
456pshufh_s (int16x4_t dest, int16x4_t s, uint8_t order)
457{
458 return __builtin_loongson_pshufh_s (s, order);
459}
460
461/* Shift left logical. */
462__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
463psllh_u (uint16x4_t s, uint8_t amount)
464{
465 return __builtin_loongson_psllh_u (s, amount);
466}
467
468__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
469psllh_s (int16x4_t s, uint8_t amount)
470{
471 return __builtin_loongson_psllh_s (s, amount);
472}
473
474__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
475psllw_u (uint32x2_t s, uint8_t amount)
476{
477 return __builtin_loongson_psllw_u (s, amount);
478}
479
480__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
481psllw_s (int32x2_t s, uint8_t amount)
482{
483 return __builtin_loongson_psllw_s (s, amount);
484}
485
486/* Shift right logical. */
487__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
488psrlh_u (uint16x4_t s, uint8_t amount)
489{
490 return __builtin_loongson_psrlh_u (s, amount);
491}
492
493__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
494psrlh_s (int16x4_t s, uint8_t amount)
495{
496 return __builtin_loongson_psrlh_s (s, amount);
497}
498
499__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
500psrlw_u (uint32x2_t s, uint8_t amount)
501{
502 return __builtin_loongson_psrlw_u (s, amount);
503}
504
505__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
506psrlw_s (int32x2_t s, uint8_t amount)
507{
508 return __builtin_loongson_psrlw_s (s, amount);
509}
510
511/* Shift right arithmetic. */
512__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
513psrah_u (uint16x4_t s, uint8_t amount)
514{
515 return __builtin_loongson_psrah_u (s, amount);
516}
517
518__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
519psrah_s (int16x4_t s, uint8_t amount)
520{
521 return __builtin_loongson_psrah_s (s, amount);
522}
523
524__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
525psraw_u (uint32x2_t s, uint8_t amount)
526{
527 return __builtin_loongson_psraw_u (s, amount);
528}
529
530__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
531psraw_s (int32x2_t s, uint8_t amount)
532{
533 return __builtin_loongson_psraw_s (s, amount);
534}
535
536/* Vector subtraction, treating overflow by wraparound. */
537__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
538psubw_u (uint32x2_t s, uint32x2_t t)
539{
540 return __builtin_loongson_psubw_u (s, t);
541}
542
543__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
544psubh_u (uint16x4_t s, uint16x4_t t)
545{
546 return __builtin_loongson_psubh_u (s, t);
547}
548
549__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
550psubb_u (uint8x8_t s, uint8x8_t t)
551{
552 return __builtin_loongson_psubb_u (s, t);
553}
554
555__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
556psubw_s (int32x2_t s, int32x2_t t)
557{
558 return __builtin_loongson_psubw_s (s, t);
559}
560
561__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
562psubh_s (int16x4_t s, int16x4_t t)
563{
564 return __builtin_loongson_psubh_s (s, t);
565}
566
567__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
568psubb_s (int8x8_t s, int8x8_t t)
569{
570 return __builtin_loongson_psubb_s (s, t);
571}
572
573/* Subtraction of doubleword integers, treating overflow by wraparound. */
574__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
575psubd_u (uint64_t s, uint64_t t)
576{
577 return __builtin_loongson_psubd_u (s, t);
578}
579
580__extension__ static __inline int64_t __attribute__ ((__always_inline__))
581psubd_s (int64_t s, int64_t t)
582{
583 return __builtin_loongson_psubd_s (s, t);
584}
585
586/* Vector subtraction, treating overflow by signed saturation. */
587__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
588psubsh (int16x4_t s, int16x4_t t)
589{
590 return __builtin_loongson_psubsh (s, t);
591}
592
593__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
594psubsb (int8x8_t s, int8x8_t t)
595{
596 return __builtin_loongson_psubsb (s, t);
597}
598
599/* Vector subtraction, treating overflow by unsigned saturation. */
600__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
601psubush (uint16x4_t s, uint16x4_t t)
602{
603 return __builtin_loongson_psubush (s, t);
604}
605
606__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
607psubusb (uint8x8_t s, uint8x8_t t)
608{
609 return __builtin_loongson_psubusb (s, t);
610}
611
612/* Unpack high data. */
613__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
614punpckhwd_u (uint32x2_t s, uint32x2_t t)
615{
616 return __builtin_loongson_punpckhwd_u (s, t);
617}
618
619__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
620punpckhhw_u (uint16x4_t s, uint16x4_t t)
621{
622 return __builtin_loongson_punpckhhw_u (s, t);
623}
624
625__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
626punpckhbh_u (uint8x8_t s, uint8x8_t t)
627{
628 return __builtin_loongson_punpckhbh_u (s, t);
629}
630
631__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
632punpckhwd_s (int32x2_t s, int32x2_t t)
633{
634 return __builtin_loongson_punpckhwd_s (s, t);
635}
636
637__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
638punpckhhw_s (int16x4_t s, int16x4_t t)
639{
640 return __builtin_loongson_punpckhhw_s (s, t);
641}
642
643__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
644punpckhbh_s (int8x8_t s, int8x8_t t)
645{
646 return __builtin_loongson_punpckhbh_s (s, t);
647}
648
649/* Unpack low data. */
650__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
651punpcklwd_u (uint32x2_t s, uint32x2_t t)
652{
653 return __builtin_loongson_punpcklwd_u (s, t);
654}
655
656__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
657punpcklhw_u (uint16x4_t s, uint16x4_t t)
658{
659 return __builtin_loongson_punpcklhw_u (s, t);
660}
661
662__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
663punpcklbh_u (uint8x8_t s, uint8x8_t t)
664{
665 return __builtin_loongson_punpcklbh_u (s, t);
666}
667
668__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
669punpcklwd_s (int32x2_t s, int32x2_t t)
670{
671 return __builtin_loongson_punpcklwd_s (s, t);
672}
673
674__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
675punpcklhw_s (int16x4_t s, int16x4_t t)
676{
677 return __builtin_loongson_punpcklhw_s (s, t);
678}
679
680__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
681punpcklbh_s (int8x8_t s, int8x8_t t)
682{
683 return __builtin_loongson_punpcklbh_s (s, t);
684}
685
686#ifdef __cplusplus
687}
688#endif
689
690#endif