1 // REQUIRES: aarch64-registered-target 2 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s 3 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s 4 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -o - %s >/dev/null 5 #include <arm_sve.h> 6 test_svcntw()7uint64_t test_svcntw() 8 { 9 // CHECK-LABEL: test_svcntw 10 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.vscale.i64() 11 // CHECK-NEXT: %[[RET:.*]] = shl i64 %[[INTRINSIC]], 2 12 // CHECK: ret i64 %[[RET]] 13 return svcntw(); 14 } 15 test_svcntw_pat()16uint64_t test_svcntw_pat() 17 { 18 // CHECK-LABEL: test_svcntw_pat 19 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 0) 20 // CHECK: ret i64 %[[INTRINSIC]] 21 return svcntw_pat(SV_POW2); 22 } 23 test_svcntw_pat_1()24uint64_t test_svcntw_pat_1() 25 { 26 // CHECK-LABEL: test_svcntw_pat_1 27 // CHECK: ret i64 1 28 return svcntw_pat(SV_VL1); 29 } 30 test_svcntw_pat_2()31uint64_t test_svcntw_pat_2() 32 { 33 // CHECK-LABEL: test_svcntw_pat_2 34 // CHECK: ret i64 2 35 return svcntw_pat(SV_VL2); 36 } 37 test_svcntw_pat_3()38uint64_t test_svcntw_pat_3() 39 { 40 // CHECK-LABEL: test_svcntw_pat_3 41 // CHECK: ret i64 3 42 return svcntw_pat(SV_VL3); 43 } 44 test_svcntw_pat_4()45uint64_t test_svcntw_pat_4() 46 { 47 // CHECK-LABEL: test_svcntw_pat_4 48 // CHECK: ret i64 4 49 return svcntw_pat(SV_VL4); 50 } 51 test_svcntw_pat_5()52uint64_t test_svcntw_pat_5() 53 { 54 // CHECK-LABEL: test_svcntw_pat_5 55 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 5) 56 // CHECK: ret i64 %[[INTRINSIC]] 57 return svcntw_pat(SV_VL5); 58 } 59 test_svcntw_pat_6()60uint64_t test_svcntw_pat_6() 61 { 62 // CHECK-LABEL: test_svcntw_pat_6 63 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 6) 64 // CHECK: ret i64 %[[INTRINSIC]] 65 return svcntw_pat(SV_VL6); 66 } 67 test_svcntw_pat_7()68uint64_t test_svcntw_pat_7() 69 { 70 // CHECK-LABEL: test_svcntw_pat_7 71 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 7) 72 // CHECK: ret i64 %[[INTRINSIC]] 73 return svcntw_pat(SV_VL7); 74 } 75 test_svcntw_pat_8()76uint64_t test_svcntw_pat_8() 77 { 78 // CHECK-LABEL: test_svcntw_pat_8 79 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 8) 80 // CHECK: ret i64 %[[INTRINSIC]] 81 return svcntw_pat(SV_VL8); 82 } 83 test_svcntw_pat_9()84uint64_t test_svcntw_pat_9() 85 { 86 // CHECK-LABEL: test_svcntw_pat_9 87 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 9) 88 // CHECK: ret i64 %[[INTRINSIC]] 89 return svcntw_pat(SV_VL16); 90 } 91 test_svcntw_pat_10()92uint64_t test_svcntw_pat_10() 93 { 94 // CHECK-LABEL: test_svcntw_pat_10 95 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 10) 96 // CHECK: ret i64 %[[INTRINSIC]] 97 return svcntw_pat(SV_VL32); 98 } 99 test_svcntw_pat_11()100uint64_t test_svcntw_pat_11() 101 { 102 // CHECK-LABEL: test_svcntw_pat_11 103 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 11) 104 // CHECK: ret i64 %[[INTRINSIC]] 105 return svcntw_pat(SV_VL64); 106 } 107 test_svcntw_pat_12()108uint64_t test_svcntw_pat_12() 109 { 110 // CHECK-LABEL: test_svcntw_pat_12 111 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 12) 112 // CHECK: ret i64 %[[INTRINSIC]] 113 return svcntw_pat(SV_VL128); 114 } 115 test_svcntw_pat_13()116uint64_t test_svcntw_pat_13() 117 { 118 // CHECK-LABEL: test_svcntw_pat_13 119 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 13) 120 // CHECK: ret i64 %[[INTRINSIC]] 121 return svcntw_pat(SV_VL256); 122 } 123 test_svcntw_pat_14()124uint64_t test_svcntw_pat_14() 125 { 126 // CHECK-LABEL: test_svcntw_pat_14 127 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 29) 128 // CHECK: ret i64 %[[INTRINSIC]] 129 return svcntw_pat(SV_MUL4); 130 } 131 test_svcntw_pat_15()132uint64_t test_svcntw_pat_15() 133 { 134 // CHECK-LABEL: test_svcntw_pat_15 135 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntw(i32 30) 136 // CHECK: ret i64 %[[INTRINSIC]] 137 return svcntw_pat(SV_MUL3); 138 } 139 test_svcntw_pat_16()140uint64_t test_svcntw_pat_16() 141 { 142 // CHECK-LABEL: test_svcntw_pat_16 143 // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.vscale.i64() 144 // CHECK-NEXT: %[[RET:.*]] = shl i64 %[[INTRINSIC]], 2 145 // CHECK: ret i64 %[[RET]] 146 return svcntw_pat(SV_ALL); 147 } 148