1/* ARM Non-NEON ACLE intrinsics include file. 2 3 Copyright (C) 2013-2020 Free Software Foundation, Inc. 4 Contributed by ARM Ltd. 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_ARM_ACLE_H 28#define _GCC_ARM_ACLE_H 29 30#include <stdint.h> 31#ifdef __cplusplus 32extern "C" { 33#endif 34 35#if (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4 36__extension__ static __inline void __attribute__ ((__always_inline__)) 37__arm_cdp (const unsigned int __coproc, const unsigned int __opc1, 38 const unsigned int __CRd, const unsigned int __CRn, 39 const unsigned int __CRm, const unsigned int __opc2) 40{ 41 __builtin_arm_cdp (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2); 42} 43 44__extension__ static __inline void __attribute__ ((__always_inline__)) 45__arm_ldc (const unsigned int __coproc, const unsigned int __CRd, 46 const void * __p) 47{ 48 __builtin_arm_ldc (__coproc, __CRd, __p); 49} 50 51__extension__ static __inline void __attribute__ ((__always_inline__)) 52__arm_ldcl (const unsigned int __coproc, const unsigned int __CRd, 53 const void * __p) 54{ 55 __builtin_arm_ldcl (__coproc, __CRd, __p); 56} 57 58__extension__ static __inline void __attribute__ ((__always_inline__)) 59__arm_stc (const unsigned int __coproc, const unsigned int __CRd, 60 void * __p) 61{ 62 __builtin_arm_stc (__coproc, __CRd, __p); 63} 64 65__extension__ static __inline void __attribute__ ((__always_inline__)) 66__arm_stcl (const unsigned int __coproc, const unsigned int __CRd, 67 void * __p) 68{ 69 __builtin_arm_stcl (__coproc, __CRd, __p); 70} 71 72__extension__ static __inline void __attribute__ ((__always_inline__)) 73__arm_mcr (const unsigned int __coproc, const unsigned int __opc1, 74 uint32_t __value, const unsigned int __CRn, const unsigned int __CRm, 75 const unsigned int __opc2) 76{ 77 __builtin_arm_mcr (__coproc, __opc1, __value, __CRn, __CRm, __opc2); 78} 79 80__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 81__arm_mrc (const unsigned int __coproc, const unsigned int __opc1, 82 const unsigned int __CRn, const unsigned int __CRm, 83 const unsigned int __opc2) 84{ 85 return __builtin_arm_mrc (__coproc, __opc1, __CRn, __CRm, __opc2); 86} 87#if __ARM_ARCH >= 5 88__extension__ static __inline void __attribute__ ((__always_inline__)) 89__arm_cdp2 (const unsigned int __coproc, const unsigned int __opc1, 90 const unsigned int __CRd, const unsigned int __CRn, 91 const unsigned int __CRm, const unsigned int __opc2) 92{ 93 __builtin_arm_cdp2 (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2); 94} 95 96__extension__ static __inline void __attribute__ ((__always_inline__)) 97__arm_ldc2 (const unsigned int __coproc, const unsigned int __CRd, 98 const void * __p) 99{ 100 __builtin_arm_ldc2 (__coproc, __CRd, __p); 101} 102 103__extension__ static __inline void __attribute__ ((__always_inline__)) 104__arm_ldc2l (const unsigned int __coproc, const unsigned int __CRd, 105 const void * __p) 106{ 107 __builtin_arm_ldc2l (__coproc, __CRd, __p); 108} 109 110__extension__ static __inline void __attribute__ ((__always_inline__)) 111__arm_stc2 (const unsigned int __coproc, const unsigned int __CRd, 112 void * __p) 113{ 114 __builtin_arm_stc2 (__coproc, __CRd, __p); 115} 116 117__extension__ static __inline void __attribute__ ((__always_inline__)) 118__arm_stc2l (const unsigned int __coproc, const unsigned int __CRd, 119 void * __p) 120{ 121 __builtin_arm_stc2l (__coproc, __CRd, __p); 122} 123 124__extension__ static __inline void __attribute__ ((__always_inline__)) 125__arm_mcr2 (const unsigned int __coproc, const unsigned int __opc1, 126 uint32_t __value, const unsigned int __CRn, 127 const unsigned int __CRm, const unsigned int __opc2) 128{ 129 __builtin_arm_mcr2 (__coproc, __opc1, __value, __CRn, __CRm, __opc2); 130} 131 132__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 133__arm_mrc2 (const unsigned int __coproc, const unsigned int __opc1, 134 const unsigned int __CRn, const unsigned int __CRm, 135 const unsigned int __opc2) 136{ 137 return __builtin_arm_mrc2 (__coproc, __opc1, __CRn, __CRm, __opc2); 138} 139 140#if __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__) 141 142__extension__ static __inline void __attribute__ ((__always_inline__)) 143__arm_mcrr (const unsigned int __coproc, const unsigned int __opc1, 144 uint64_t __value, const unsigned int __CRm) 145{ 146 __builtin_arm_mcrr (__coproc, __opc1, __value, __CRm); 147} 148 149__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) 150__arm_mrrc (const unsigned int __coproc, const unsigned int __opc1, 151 const unsigned int __CRm) 152{ 153 return __builtin_arm_mrrc (__coproc, __opc1, __CRm); 154} 155 156#if __ARM_ARCH >= 6 157 158__extension__ static __inline void __attribute__ ((__always_inline__)) 159__arm_mcrr2 (const unsigned int __coproc, const unsigned int __opc1, 160 uint64_t __value, const unsigned int __CRm) 161{ 162 __builtin_arm_mcrr2 (__coproc, __opc1, __value, __CRm); 163} 164 165__extension__ static __inline uint64_t __attribute__ ((__always_inline__)) 166__arm_mrrc2 (const unsigned int __coproc, const unsigned int __opc1, 167 const unsigned int __CRm) 168{ 169 return __builtin_arm_mrrc2 (__coproc, __opc1, __CRm); 170} 171#endif /* __ARM_ARCH >= 6. */ 172#endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */ 173#endif /* __ARM_ARCH >= 5. */ 174#endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */ 175 176#ifdef __ARM_FEATURE_SIMD32 177typedef int32_t int16x2_t; 178typedef uint32_t uint16x2_t; 179typedef int32_t int8x4_t; 180typedef 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 699#pragma GCC push_options 700#ifdef __ARM_FEATURE_CRC32 701#ifdef __ARM_FP 702#pragma GCC target ("arch=armv8-a+crc+simd") 703#else 704#pragma GCC target ("arch=armv8-a+crc") 705#endif 706 707__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 708__crc32b (uint32_t __a, uint8_t __b) 709{ 710 return __builtin_arm_crc32b (__a, __b); 711} 712 713__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 714__crc32h (uint32_t __a, uint16_t __b) 715{ 716 return __builtin_arm_crc32h (__a, __b); 717} 718 719__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 720__crc32w (uint32_t __a, uint32_t __b) 721{ 722 return __builtin_arm_crc32w (__a, __b); 723} 724 725#ifdef __ARM_32BIT_STATE 726__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 727__crc32d (uint32_t __a, uint64_t __b) 728{ 729 uint32_t __d; 730 731 __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32); 732 return __d; 733} 734#endif 735 736__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 737__crc32cb (uint32_t __a, uint8_t __b) 738{ 739 return __builtin_arm_crc32cb (__a, __b); 740} 741 742__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 743__crc32ch (uint32_t __a, uint16_t __b) 744{ 745 return __builtin_arm_crc32ch (__a, __b); 746} 747 748__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 749__crc32cw (uint32_t __a, uint32_t __b) 750{ 751 return __builtin_arm_crc32cw (__a, __b); 752} 753 754#ifdef __ARM_32BIT_STATE 755__extension__ static __inline uint32_t __attribute__ ((__always_inline__)) 756__crc32cd (uint32_t __a, uint64_t __b) 757{ 758 uint32_t __d; 759 760 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32); 761 return __d; 762} 763#endif 764 765#endif /* __ARM_FEATURE_CRC32 */ 766#pragma GCC pop_options 767 768#ifdef __cplusplus 769} 770#endif 771 772#endif 773