comparison gcc/config/arm/arm_acle.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
1 /* ARM Non-NEON ACLE intrinsics include file. 1 /* ARM Non-NEON ACLE intrinsics include file.
2 2
3 Copyright (C) 2013-2018 Free Software Foundation, Inc. 3 Copyright (C) 2013-2020 Free Software Foundation, Inc.
4 Contributed by ARM Ltd. 4 Contributed by ARM Ltd.
5 5
6 This file is part of GCC. 6 This file is part of GCC.
7 7
8 GCC is free software; you can redistribute it and/or modify it 8 GCC is free software; you can redistribute it and/or modify it
171 #endif /* __ARM_ARCH >= 6. */ 171 #endif /* __ARM_ARCH >= 6. */
172 #endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */ 172 #endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */
173 #endif /* __ARM_ARCH >= 5. */ 173 #endif /* __ARM_ARCH >= 5. */
174 #endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */ 174 #endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */
175 175
176 #ifdef __ARM_FEATURE_SIMD32
177 typedef int32_t int16x2_t;
178 typedef uint32_t uint16x2_t;
179 typedef int32_t int8x4_t;
180 typedef uint32_t uint8x4_t;
181
182 __extension__ extern __inline int16x2_t
183 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
184 __sxtab16 (int16x2_t __a, int8x4_t __b)
185 {
186 return __builtin_arm_sxtab16 (__a, __b);
187 }
188
189 __extension__ extern __inline int16x2_t
190 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
191 __sxtb16 (int8x4_t __a)
192 {
193 return __builtin_arm_sxtb16 (__a);
194 }
195
196 __extension__ extern __inline uint16x2_t
197 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
198 __uxtab16 (uint16x2_t __a, uint8x4_t __b)
199 {
200 return __builtin_arm_uxtab16 (__a, __b);
201 }
202
203 __extension__ extern __inline uint16x2_t
204 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
205 __uxtb16 (uint8x4_t __a)
206 {
207 return __builtin_arm_uxtb16 (__a);
208 }
209
210 __extension__ extern __inline int8x4_t
211 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
212 __qadd8 (int8x4_t __a, int8x4_t __b)
213 {
214 return __builtin_arm_qadd8 (__a, __b);
215 }
216
217 __extension__ extern __inline int8x4_t
218 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
219 __qsub8 (int8x4_t __a, int8x4_t __b)
220 {
221 return __builtin_arm_qsub8 (__a, __b);
222 }
223
224 __extension__ extern __inline int8x4_t
225 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
226 __shadd8 (int8x4_t __a, int8x4_t __b)
227 {
228 return __builtin_arm_shadd8 (__a, __b);
229 }
230
231 __extension__ extern __inline int8x4_t
232 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
233 __shsub8 (int8x4_t __a, int8x4_t __b)
234 {
235 return __builtin_arm_shsub8 (__a, __b);
236 }
237
238 __extension__ extern __inline uint8x4_t
239 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
240 __uhadd8 (uint8x4_t __a, uint8x4_t __b)
241 {
242 return __builtin_arm_uhadd8 (__a, __b);
243 }
244
245 __extension__ extern __inline uint8x4_t
246 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
247 __uhsub8 (uint8x4_t __a, uint8x4_t __b)
248 {
249 return __builtin_arm_uhsub8 (__a, __b);
250 }
251
252 __extension__ extern __inline uint8x4_t
253 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
254 __uqadd8 (uint8x4_t __a, uint8x4_t __b)
255 {
256 return __builtin_arm_uqadd8 (__a, __b);
257 }
258
259 __extension__ extern __inline uint8x4_t
260 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
261 __uqsub8 (uint8x4_t __a, uint8x4_t __b)
262 {
263 return __builtin_arm_uqsub8 (__a, __b);
264 }
265
266 __extension__ extern __inline int16x2_t
267 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
268 __qadd16 (int16x2_t __a, int16x2_t __b)
269 {
270 return __builtin_arm_qadd16 (__a, __b);
271 }
272
273 __extension__ extern __inline int16x2_t
274 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
275 __qasx (int16x2_t __a, int16x2_t __b)
276 {
277 return __builtin_arm_qasx (__a, __b);
278 }
279
280 __extension__ extern __inline int16x2_t
281 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
282 __qsax (int16x2_t __a, int16x2_t __b)
283 {
284 return __builtin_arm_qsax (__a, __b);
285 }
286
287 __extension__ extern __inline int16x2_t
288 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
289 __qsub16 (int16x2_t __a, int16x2_t __b)
290 {
291 return __builtin_arm_qsub16 (__a, __b);
292 }
293
294 __extension__ extern __inline int16x2_t
295 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
296 __shadd16 (int16x2_t __a, int16x2_t __b)
297 {
298 return __builtin_arm_shadd16 (__a, __b);
299 }
300
301 __extension__ extern __inline int16x2_t
302 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
303 __shasx (int16x2_t __a, int16x2_t __b)
304 {
305 return __builtin_arm_shasx (__a, __b);
306 }
307
308 __extension__ extern __inline int16x2_t
309 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
310 __shsax (int16x2_t __a, int16x2_t __b)
311 {
312 return __builtin_arm_shsax (__a, __b);
313 }
314
315 __extension__ extern __inline int16x2_t
316 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
317 __shsub16 (int16x2_t __a, int16x2_t __b)
318 {
319 return __builtin_arm_shsub16 (__a, __b);
320 }
321
322 __extension__ extern __inline uint16x2_t
323 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
324 __uhadd16 (uint16x2_t __a, uint16x2_t __b)
325 {
326 return __builtin_arm_uhadd16 (__a, __b);
327 }
328
329 __extension__ extern __inline uint16x2_t
330 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
331 __uhasx (uint16x2_t __a, uint16x2_t __b)
332 {
333 return __builtin_arm_uhasx (__a, __b);
334 }
335
336 __extension__ extern __inline uint16x2_t
337 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
338 __uhsax (uint16x2_t __a, uint16x2_t __b)
339 {
340 return __builtin_arm_uhsax (__a, __b);
341 }
342
343 __extension__ extern __inline uint16x2_t
344 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
345 __uhsub16 (uint16x2_t __a, uint16x2_t __b)
346 {
347 return __builtin_arm_uhsub16 (__a, __b);
348 }
349
350 __extension__ extern __inline uint16x2_t
351 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
352 __uqadd16 (uint16x2_t __a, uint16x2_t __b)
353 {
354 return __builtin_arm_uqadd16 (__a, __b);
355 }
356
357 __extension__ extern __inline uint16x2_t
358 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
359 __uqasx (uint16x2_t __a, uint16x2_t __b)
360 {
361 return __builtin_arm_uqasx (__a, __b);
362 }
363
364 __extension__ extern __inline uint16x2_t
365 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
366 __uqsax (uint16x2_t __a, uint16x2_t __b)
367 {
368 return __builtin_arm_uqsax (__a, __b);
369 }
370
371 __extension__ extern __inline uint16x2_t
372 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
373 __uqsub16 (uint16x2_t __a, uint16x2_t __b)
374 {
375 return __builtin_arm_uqsub16 (__a, __b);
376 }
377
378 __extension__ extern __inline int32_t
379 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
380 __smusd (int16x2_t __a, int16x2_t __b)
381 {
382 return __builtin_arm_smusd (__a, __b);
383 }
384
385 __extension__ extern __inline int32_t
386 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
387 __smusdx (int16x2_t __a, int16x2_t __b)
388 {
389 return __builtin_arm_smusdx (__a, __b);
390 }
391
392 __extension__ extern __inline uint32_t
393 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
394 __usad8 (uint8x4_t __a, uint8x4_t __b)
395 {
396 return __builtin_arm_usad8 (__a, __b);
397 }
398
399 __extension__ extern __inline uint32_t
400 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
401 __usada8 (uint8x4_t __a, uint8x4_t __b, uint32_t __c)
402 {
403 return __builtin_arm_usada8 (__a, __b, __c);
404 }
405
406 __extension__ extern __inline int64_t
407 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
408 __smlald (int16x2_t __a, int16x2_t __b, int64_t __c)
409 {
410 return __builtin_arm_smlald (__a, __b, __c);
411 }
412
413 __extension__ extern __inline int64_t
414 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
415 __smlaldx (int16x2_t __a, int16x2_t __b, int64_t __c)
416 {
417 return __builtin_arm_smlaldx (__a, __b, __c);
418 }
419
420 __extension__ extern __inline int64_t
421 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
422 __smlsld (int16x2_t __a, int16x2_t __b, int64_t __c)
423 {
424 return __builtin_arm_smlsld (__a, __b, __c);
425 }
426
427 __extension__ extern __inline int64_t
428 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
429 __smlsldx (int16x2_t __a, int16x2_t __b, int64_t __c)
430 {
431 return __builtin_arm_smlsldx (__a, __b, __c);
432 }
433
434 __extension__ extern __inline uint8x4_t
435 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
436 __sel (uint8x4_t __a, uint8x4_t __b)
437 {
438 return __builtin_arm_sel (__a, __b);
439 }
440
441 __extension__ extern __inline int8x4_t
442 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
443 __sadd8 (int8x4_t __a, int8x4_t __b)
444 {
445 return __builtin_arm_sadd8 (__a, __b);
446 }
447
448 __extension__ extern __inline int8x4_t
449 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
450 __ssub8 (int8x4_t __a, int8x4_t __b)
451 {
452 return __builtin_arm_ssub8 (__a, __b);
453 }
454
455 __extension__ extern __inline uint8x4_t
456 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
457 __uadd8 (uint8x4_t __a, uint8x4_t __b)
458 {
459 return __builtin_arm_uadd8 (__a, __b);
460 }
461
462 __extension__ extern __inline uint8x4_t
463 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
464 __usub8 (uint8x4_t __a, uint8x4_t __b)
465 {
466 return __builtin_arm_usub8 (__a, __b);
467 }
468
469 __extension__ extern __inline int16x2_t
470 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
471 __sadd16 (int16x2_t __a, int16x2_t __b)
472 {
473 return __builtin_arm_sadd16 (__a, __b);
474 }
475
476 __extension__ extern __inline int16x2_t
477 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
478 __sasx (int16x2_t __a, int16x2_t __b)
479 {
480 return __builtin_arm_sasx (__a, __b);
481 }
482
483 __extension__ extern __inline int16x2_t
484 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
485 __ssax (int16x2_t __a, int16x2_t __b)
486 {
487 return __builtin_arm_ssax (__a, __b);
488 }
489
490 __extension__ extern __inline int16x2_t
491 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
492 __ssub16 (int16x2_t __a, int16x2_t __b)
493 {
494 return __builtin_arm_ssub16 (__a, __b);
495 }
496
497 __extension__ extern __inline uint16x2_t
498 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
499 __uadd16 (uint16x2_t __a, uint16x2_t __b)
500 {
501 return __builtin_arm_uadd16 (__a, __b);
502 }
503
504 __extension__ extern __inline uint16x2_t
505 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
506 __uasx (uint16x2_t __a, uint16x2_t __b)
507 {
508 return __builtin_arm_uasx (__a, __b);
509 }
510
511 __extension__ extern __inline uint16x2_t
512 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
513 __usax (uint16x2_t __a, uint16x2_t __b)
514 {
515 return __builtin_arm_usax (__a, __b);
516 }
517
518 __extension__ extern __inline uint16x2_t
519 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
520 __usub16 (uint16x2_t __a, uint16x2_t __b)
521 {
522 return __builtin_arm_usub16 (__a, __b);
523 }
524
525 __extension__ extern __inline int32_t
526 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
527 __smlad (int16x2_t __a, int16x2_t __b, int32_t __c)
528 {
529 return __builtin_arm_smlad (__a, __b, __c);
530 }
531
532 __extension__ extern __inline int32_t
533 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
534 __smladx (int16x2_t __a, int16x2_t __b, int32_t __c)
535 {
536 return __builtin_arm_smladx (__a, __b, __c);
537 }
538
539 __extension__ extern __inline int32_t
540 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
541 __smlsd (int16x2_t __a, int16x2_t __b, int32_t __c)
542 {
543 return __builtin_arm_smlsd (__a, __b, __c);
544 }
545
546 __extension__ extern __inline int32_t
547 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
548 __smlsdx (int16x2_t __a, int16x2_t __b, int32_t __c)
549 {
550 return __builtin_arm_smlsdx (__a, __b, __c);
551 }
552
553 __extension__ extern __inline int32_t
554 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
555 __smuad (int16x2_t __a, int16x2_t __b)
556 {
557 return __builtin_arm_smuad (__a, __b);
558 }
559
560 __extension__ extern __inline int32_t
561 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
562 __smuadx (int16x2_t __a, int16x2_t __b)
563 {
564 return __builtin_arm_smuadx (__a, __b);
565 }
566
567 #define __ssat16(__a, __sat) \
568 __extension__ \
569 ({ \
570 int16x2_t __arg = (__a); \
571 __builtin_sat_imm_check (__sat, 1, 16); \
572 int16x2_t __res = __builtin_arm_ssat16 (__arg, __sat); \
573 __res; \
574 })
575
576 #define __usat16(__a, __sat) \
577 __extension__ \
578 ({ \
579 int16x2_t __arg = (__a); \
580 __builtin_sat_imm_check (__sat, 0, 15); \
581 int16x2_t __res = __builtin_arm_usat16 (__arg, __sat); \
582 __res; \
583 })
584
585 #endif
586
587 #ifdef __ARM_FEATURE_SAT
588
589 #define __ssat(__a, __sat) \
590 __extension__ \
591 ({ \
592 int32_t __arg = (__a); \
593 __builtin_sat_imm_check (__sat, 1, 32); \
594 int32_t __res = __builtin_arm_ssat (__arg, __sat); \
595 __res; \
596 })
597
598 #define __usat(__a, __sat) \
599 __extension__ \
600 ({ \
601 int32_t __arg = (__a); \
602 __builtin_sat_imm_check (__sat, 0, 31); \
603 uint32_t __res = __builtin_arm_usat (__arg, __sat); \
604 __res; \
605 })
606
607 #endif
608
609 #ifdef __ARM_FEATURE_QBIT
610 __extension__ extern __inline void
611 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
612 __ignore_saturation (void)
613 {
614 /* ACLE designates this intrinsic as a hint.
615 Implement as a nop for now. */
616 }
617
618 /* These are defined as macros because the implementation of the builtins
619 requires easy access to the current function so wrapping it in an
620 always_inline function complicates things. */
621
622 #define __saturation_occurred __builtin_arm_saturation_occurred
623
624 #define __set_saturation_occurred(__a) \
625 __extension__ \
626 ({ \
627 int __arg = (__a); \
628 __builtin_arm_set_saturation (__arg); \
629 })
630 #endif
631
632 #ifdef __ARM_FEATURE_DSP
633 __extension__ extern __inline int32_t
634 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
635 __qadd (int32_t __a, int32_t __b)
636 {
637 return __builtin_arm_qadd (__a, __b);
638 }
639
640 __extension__ extern __inline int32_t
641 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
642 __qsub (int32_t __a, int32_t __b)
643 {
644 return __builtin_arm_qsub (__a, __b);
645 }
646
647 __extension__ extern __inline int32_t
648 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
649 __qdbl (int32_t __x)
650 {
651 return __qadd (__x, __x);
652 }
653
654 __extension__ extern __inline int32_t
655 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
656 __smlabb (int32_t __a, int32_t __b, int32_t __c)
657 {
658 return __builtin_arm_smlabb (__a, __b, __c);
659 }
660
661 __extension__ extern __inline int32_t
662 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
663 __smlatb (int32_t __a, int32_t __b, int32_t __c)
664 {
665 return __builtin_arm_smlatb (__a, __b, __c);
666 }
667
668 /* smlatb is equivalent to smlabt with the two multiplication operands
669 swapped around. */
670 __extension__ extern __inline int32_t
671 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
672 __smlabt (int32_t __a, int32_t __b, int32_t __c)
673 {
674 return __smlatb (__b, __a, __c);
675 }
676
677 __extension__ extern __inline int32_t
678 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
679 __smlatt (int32_t __a, int32_t __b, int32_t __c)
680 {
681 return __builtin_arm_smlatt (__a, __b, __c);
682 }
683
684 __extension__ extern __inline int32_t
685 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
686 __smlawb (int32_t __a, int32_t __b, int32_t __c)
687 {
688 return __builtin_arm_smlawb (__a, __b, __c);
689 }
690
691 __extension__ extern __inline int32_t
692 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
693 __smlawt (int32_t __a, int32_t __b, int32_t __c)
694 {
695 return __builtin_arm_smlawt (__a, __b, __c);
696 }
697 #endif
698
176 #pragma GCC push_options 699 #pragma GCC push_options
177 #if __ARM_ARCH >= 8 700 #ifdef __ARM_FEATURE_CRC32
701 #ifdef __ARM_FP
702 #pragma GCC target ("arch=armv8-a+crc+simd")
703 #else
178 #pragma GCC target ("arch=armv8-a+crc") 704 #pragma GCC target ("arch=armv8-a+crc")
705 #endif
179 706
180 __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 707 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
181 __crc32b (uint32_t __a, uint8_t __b) 708 __crc32b (uint32_t __a, uint8_t __b)
182 { 709 {
183 return __builtin_arm_crc32b (__a, __b); 710 return __builtin_arm_crc32b (__a, __b);
233 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32); 760 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32);
234 return __d; 761 return __d;
235 } 762 }
236 #endif 763 #endif
237 764
238 #endif /* __ARM_ARCH >= 8. */ 765 #endif /* __ARM_FEATURE_CRC32 */
239 #pragma GCC pop_options 766 #pragma GCC pop_options
240 767
241 #ifdef __cplusplus 768 #ifdef __cplusplus
242 } 769 }
243 #endif 770 #endif