Mercurial > hg > CbC > CbC_gcc
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 |