11// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2+ // RUN: %clang_cc1 -ffreestanding -triple armv8a-none-eabi -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s -check-prefixes=ARM,AArch32
23// RUN: %clang_cc1 -ffreestanding -triple armv8a-none-eabi -target-feature +crc -target-feature +dsp -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s -check-prefixes=ARM,AArch32
34// RUN: %clang_cc1 -ffreestanding -Wno-error=implicit-function-declaration -triple aarch64-none-elf -target-feature +neon -target-feature +crc -target-feature +crypto -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s -check-prefixes=ARM,AArch64
45// RUN: %clang_cc1 -ffreestanding -triple aarch64-none-elf -target-feature +v8.3a -target-feature +crc -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s -check-prefixes=ARM,AArch64,AArch6483
@@ -638,12 +639,15 @@ uint32_t test_usat(int32_t t) {
638639#endif
639640
640641/* 9.4.2 Saturating addition and subtraction intrinsics */
641- #ifdef __ARM_FEATURE_DSP
642+ #ifdef __ARM_32BIT_STATE
642643// AArch32-LABEL: @test_qadd(
643644// AArch32-NEXT: entry:
644645// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.qadd(i32 [[A:%.*]], i32 [[B:%.*]])
645646// AArch32-NEXT: ret i32 [[TMP0]]
646647//
648+ #ifndef __ARM_FEATURE_DSP
649+ __attribute__((target ("dsp" )))
650+ #endif
647651int32_t test_qadd (int32_t a , int32_t b ) {
648652 return __qadd (a , b );
649653}
@@ -653,6 +657,9 @@ int32_t test_qadd(int32_t a, int32_t b) {
653657// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.qsub(i32 [[A:%.*]], i32 [[B:%.*]])
654658// AArch32-NEXT: ret i32 [[TMP0]]
655659//
660+ #ifndef __ARM_FEATURE_DSP
661+ __attribute__((target ("dsp" )))
662+ #endif
656663int32_t test_qsub (int32_t a , int32_t b ) {
657664 return __qsub (a , b );
658665}
@@ -664,6 +671,9 @@ extern int32_t f();
664671// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.qadd(i32 [[CALL]], i32 [[CALL]])
665672// AArch32-NEXT: ret i32 [[TMP0]]
666673//
674+ #ifndef __ARM_FEATURE_DSP
675+ __attribute__((target ("dsp" )))
676+ #endif
667677int32_t test_qdbl () {
668678 return __qdbl (f ());
669679}
@@ -672,12 +682,15 @@ int32_t test_qdbl() {
672682/*
673683 * 9.3 16-bit multiplications
674684 */
675- #if __ARM_FEATURE_DSP
685+ #ifdef __ARM_32BIT_STATE
676686// AArch32-LABEL: @test_smulbb(
677687// AArch32-NEXT: entry:
678688// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smulbb(i32 [[A:%.*]], i32 [[B:%.*]])
679689// AArch32-NEXT: ret i32 [[TMP0]]
680690//
691+ #ifndef __ARM_FEATURE_DSP
692+ __attribute__((target ("dsp" )))
693+ #endif
681694int32_t test_smulbb (int32_t a , int32_t b ) {
682695 return __smulbb (a , b );
683696}
@@ -687,6 +700,9 @@ int32_t test_smulbb(int32_t a, int32_t b) {
687700// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smulbt(i32 [[A:%.*]], i32 [[B:%.*]])
688701// AArch32-NEXT: ret i32 [[TMP0]]
689702//
703+ #ifndef __ARM_FEATURE_DSP
704+ __attribute__((target ("dsp" )))
705+ #endif
690706int32_t test_smulbt (int32_t a , int32_t b ) {
691707 return __smulbt (a , b );
692708}
@@ -696,6 +712,9 @@ int32_t test_smulbt(int32_t a, int32_t b) {
696712// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smultb(i32 [[A:%.*]], i32 [[B:%.*]])
697713// AArch32-NEXT: ret i32 [[TMP0]]
698714//
715+ #ifndef __ARM_FEATURE_DSP
716+ __attribute__((target ("dsp" )))
717+ #endif
699718int32_t test_smultb (int32_t a , int32_t b ) {
700719 return __smultb (a , b );
701720}
@@ -705,6 +724,9 @@ int32_t test_smultb(int32_t a, int32_t b) {
705724// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smultt(i32 [[A:%.*]], i32 [[B:%.*]])
706725// AArch32-NEXT: ret i32 [[TMP0]]
707726//
727+ #ifndef __ARM_FEATURE_DSP
728+ __attribute__((target ("dsp" )))
729+ #endif
708730int32_t test_smultt (int32_t a , int32_t b ) {
709731 return __smultt (a , b );
710732}
@@ -714,6 +736,9 @@ int32_t test_smultt(int32_t a, int32_t b) {
714736// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smulwb(i32 [[A:%.*]], i32 [[B:%.*]])
715737// AArch32-NEXT: ret i32 [[TMP0]]
716738//
739+ #ifndef __ARM_FEATURE_DSP
740+ __attribute__((target ("dsp" )))
741+ #endif
717742int32_t test_smulwb (int32_t a , int32_t b ) {
718743 return __smulwb (a , b );
719744}
@@ -723,18 +748,24 @@ int32_t test_smulwb(int32_t a, int32_t b) {
723748// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smulwt(i32 [[A:%.*]], i32 [[B:%.*]])
724749// AArch32-NEXT: ret i32 [[TMP0]]
725750//
751+ #ifndef __ARM_FEATURE_DSP
752+ __attribute__((target ("dsp" )))
753+ #endif
726754int32_t test_smulwt (int32_t a , int32_t b ) {
727755 return __smulwt (a , b );
728756}
729757#endif
730758
731759/* 9.4.3 Accumultating multiplications */
732- #if __ARM_FEATURE_DSP
760+ #ifdef __ARM_32BIT_STATE
733761// AArch32-LABEL: @test_smlabb(
734762// AArch32-NEXT: entry:
735763// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlabb(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
736764// AArch32-NEXT: ret i32 [[TMP0]]
737765//
766+ #ifndef __ARM_FEATURE_DSP
767+ __attribute__((target ("dsp" )))
768+ #endif
738769int32_t test_smlabb (int32_t a , int32_t b , int32_t c ) {
739770 return __smlabb (a , b , c );
740771}
@@ -744,6 +775,9 @@ int32_t test_smlabb(int32_t a, int32_t b, int32_t c) {
744775// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlabt(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
745776// AArch32-NEXT: ret i32 [[TMP0]]
746777//
778+ #ifndef __ARM_FEATURE_DSP
779+ __attribute__((target ("dsp" )))
780+ #endif
747781int32_t test_smlabt (int32_t a , int32_t b , int32_t c ) {
748782 return __smlabt (a , b , c );
749783}
@@ -753,6 +787,9 @@ int32_t test_smlabt(int32_t a, int32_t b, int32_t c) {
753787// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlatb(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
754788// AArch32-NEXT: ret i32 [[TMP0]]
755789//
790+ #ifndef __ARM_FEATURE_DSP
791+ __attribute__((target ("dsp" )))
792+ #endif
756793int32_t test_smlatb (int32_t a , int32_t b , int32_t c ) {
757794 return __smlatb (a , b , c );
758795}
@@ -762,6 +799,9 @@ int32_t test_smlatb(int32_t a, int32_t b, int32_t c) {
762799// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlatt(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
763800// AArch32-NEXT: ret i32 [[TMP0]]
764801//
802+ #ifndef __ARM_FEATURE_DSP
803+ __attribute__((target ("dsp" )))
804+ #endif
765805int32_t test_smlatt (int32_t a , int32_t b , int32_t c ) {
766806 return __smlatt (a , b , c );
767807}
@@ -771,6 +811,9 @@ int32_t test_smlatt(int32_t a, int32_t b, int32_t c) {
771811// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlawb(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
772812// AArch32-NEXT: ret i32 [[TMP0]]
773813//
814+ #ifndef __ARM_FEATURE_DSP
815+ __attribute__((target ("dsp" )))
816+ #endif
774817int32_t test_smlawb (int32_t a , int32_t b , int32_t c ) {
775818 return __smlawb (a , b , c );
776819}
@@ -780,6 +823,9 @@ int32_t test_smlawb(int32_t a, int32_t b, int32_t c) {
780823// AArch32-NEXT: [[TMP0:%.*]] = call i32 @llvm.arm.smlawt(i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]])
781824// AArch32-NEXT: ret i32 [[TMP0]]
782825//
826+ #ifndef __ARM_FEATURE_DSP
827+ __attribute__((target ("dsp" )))
828+ #endif
783829int32_t test_smlawt (int32_t a , int32_t b , int32_t c ) {
784830 return __smlawt (a , b , c );
785831}
@@ -1335,6 +1381,9 @@ int32_t test_smusdx(int16x2_t a, int16x2_t b) {
13351381// AArch64-NEXT: [[TMP1:%.*]] = call i32 @llvm.aarch64.crc32b(i32 [[A:%.*]], i32 [[TMP0]])
13361382// AArch64-NEXT: ret i32 [[TMP1]]
13371383//
1384+ #ifndef __ARM_FEATURE_CRC32
1385+ __attribute__((target ("crc" )))
1386+ #endif
13381387uint32_t test_crc32b (uint32_t a , uint8_t b ) {
13391388 return __crc32b (a , b );
13401389}
@@ -1351,6 +1400,9 @@ uint32_t test_crc32b(uint32_t a, uint8_t b) {
13511400// AArch64-NEXT: [[TMP1:%.*]] = call i32 @llvm.aarch64.crc32h(i32 [[A:%.*]], i32 [[TMP0]])
13521401// AArch64-NEXT: ret i32 [[TMP1]]
13531402//
1403+ #ifndef __ARM_FEATURE_CRC32
1404+ __attribute__((target ("crc" )))
1405+ #endif
13541406uint32_t test_crc32h (uint32_t a , uint16_t b ) {
13551407 return __crc32h (a , b );
13561408}
@@ -1365,6 +1417,9 @@ uint32_t test_crc32h(uint32_t a, uint16_t b) {
13651417// AArch64-NEXT: [[TMP0:%.*]] = call i32 @llvm.aarch64.crc32w(i32 [[A:%.*]], i32 [[B:%.*]])
13661418// AArch64-NEXT: ret i32 [[TMP0]]
13671419//
1420+ #ifndef __ARM_FEATURE_CRC32
1421+ __attribute__((target ("crc" )))
1422+ #endif
13681423uint32_t test_crc32w (uint32_t a , uint32_t b ) {
13691424 return __crc32w (a , b );
13701425}
@@ -1383,6 +1438,9 @@ uint32_t test_crc32w(uint32_t a, uint32_t b) {
13831438// AArch64-NEXT: [[TMP0:%.*]] = call i32 @llvm.aarch64.crc32x(i32 [[A:%.*]], i64 [[B:%.*]])
13841439// AArch64-NEXT: ret i32 [[TMP0]]
13851440//
1441+ #ifndef __ARM_FEATURE_CRC32
1442+ __attribute__((target ("crc" )))
1443+ #endif
13861444uint32_t test_crc32d (uint32_t a , uint64_t b ) {
13871445 return __crc32d (a , b );
13881446}
@@ -1399,6 +1457,9 @@ uint32_t test_crc32d(uint32_t a, uint64_t b) {
13991457// AArch64-NEXT: [[TMP1:%.*]] = call i32 @llvm.aarch64.crc32cb(i32 [[A:%.*]], i32 [[TMP0]])
14001458// AArch64-NEXT: ret i32 [[TMP1]]
14011459//
1460+ #ifndef __ARM_FEATURE_CRC32
1461+ __attribute__((target ("crc" )))
1462+ #endif
14021463uint32_t test_crc32cb (uint32_t a , uint8_t b ) {
14031464 return __crc32cb (a , b );
14041465}
@@ -1415,6 +1476,9 @@ uint32_t test_crc32cb(uint32_t a, uint8_t b) {
14151476// AArch64-NEXT: [[TMP1:%.*]] = call i32 @llvm.aarch64.crc32ch(i32 [[A:%.*]], i32 [[TMP0]])
14161477// AArch64-NEXT: ret i32 [[TMP1]]
14171478//
1479+ #ifndef __ARM_FEATURE_CRC32
1480+ __attribute__((target ("crc" )))
1481+ #endif
14181482uint32_t test_crc32ch (uint32_t a , uint16_t b ) {
14191483 return __crc32ch (a , b );
14201484}
@@ -1429,6 +1493,9 @@ uint32_t test_crc32ch(uint32_t a, uint16_t b) {
14291493// AArch64-NEXT: [[TMP0:%.*]] = call i32 @llvm.aarch64.crc32cw(i32 [[A:%.*]], i32 [[B:%.*]])
14301494// AArch64-NEXT: ret i32 [[TMP0]]
14311495//
1496+ #ifndef __ARM_FEATURE_CRC32
1497+ __attribute__((target ("crc" )))
1498+ #endif
14321499uint32_t test_crc32cw (uint32_t a , uint32_t b ) {
14331500 return __crc32cw (a , b );
14341501}
@@ -1447,6 +1514,9 @@ uint32_t test_crc32cw(uint32_t a, uint32_t b) {
14471514// AArch64-NEXT: [[TMP0:%.*]] = call i32 @llvm.aarch64.crc32cx(i32 [[A:%.*]], i64 [[B:%.*]])
14481515// AArch64-NEXT: ret i32 [[TMP0]]
14491516//
1517+ #ifndef __ARM_FEATURE_CRC32
1518+ __attribute__((target ("crc" )))
1519+ #endif
14501520uint32_t test_crc32cd (uint32_t a , uint64_t b ) {
14511521 return __crc32cd (a , b );
14521522}
0 commit comments