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_svcntb()7 uint64_t test_svcntb()
8 {
9   // CHECK-LABEL: test_svcntb
10   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.vscale.i64()
11   // CHECK-NEXT: %[[RET:.*]] = shl i64 %[[INTRINSIC]], 4
12   // CHECK: ret i64 %[[RET]]
13   return svcntb();
14 }
15 
test_svcntb_pat()16 uint64_t test_svcntb_pat()
17 {
18   // CHECK-LABEL: test_svcntb_pat
19   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 0)
20   // CHECK: ret i64 %[[INTRINSIC]]
21   return svcntb_pat(SV_POW2);
22 }
23 
test_svcntb_pat_1()24 uint64_t test_svcntb_pat_1()
25 {
26   // CHECK-LABEL: test_svcntb_pat_1
27   // CHECK: ret i64 1
28   return svcntb_pat(SV_VL1);
29 }
30 
test_svcntb_pat_2()31 uint64_t test_svcntb_pat_2()
32 {
33   // CHECK-LABEL: test_svcntb_pat_2
34   // CHECK: ret i64 2
35   return svcntb_pat(SV_VL2);
36 }
37 
test_svcntb_pat_3()38 uint64_t test_svcntb_pat_3()
39 {
40   // CHECK-LABEL: test_svcntb_pat_3
41   // CHECK: ret i64 3
42   return svcntb_pat(SV_VL3);
43 }
44 
test_svcntb_pat_4()45 uint64_t test_svcntb_pat_4()
46 {
47   // CHECK-LABEL: test_svcntb_pat_4
48   // CHECK: ret i64 4
49   return svcntb_pat(SV_VL4);
50 }
51 
test_svcntb_pat_5()52 uint64_t test_svcntb_pat_5()
53 {
54   // CHECK-LABEL: test_svcntb_pat_5
55   // CHECK: ret i64 5
56   return svcntb_pat(SV_VL5);
57 }
58 
test_svcntb_pat_6()59 uint64_t test_svcntb_pat_6()
60 {
61   // CHECK-LABEL: test_svcntb_pat_6
62   // CHECK: ret i64 6
63   return svcntb_pat(SV_VL6);
64 }
65 
test_svcntb_pat_7()66 uint64_t test_svcntb_pat_7()
67 {
68   // CHECK-LABEL: test_svcntb_pat_7
69   // CHECK: ret i64 7
70   return svcntb_pat(SV_VL7);
71 }
72 
test_svcntb_pat_8()73 uint64_t test_svcntb_pat_8()
74 {
75   // CHECK-LABEL: test_svcntb_pat_8
76   // CHECK: ret i64 8
77   return svcntb_pat(SV_VL8);
78 }
79 
test_svcntb_pat_9()80 uint64_t test_svcntb_pat_9()
81 {
82   // CHECK-LABEL: test_svcntb_pat_9
83   // CHECK: ret i64 16
84   return svcntb_pat(SV_VL16);
85 }
86 
test_svcntb_pat_10()87 uint64_t test_svcntb_pat_10()
88 {
89   // CHECK-LABEL: test_svcntb_pat_10
90   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 10)
91   // CHECK: ret i64 %[[INTRINSIC]]
92   return svcntb_pat(SV_VL32);
93 }
94 
test_svcntb_pat_11()95 uint64_t test_svcntb_pat_11()
96 {
97   // CHECK-LABEL: test_svcntb_pat_11
98   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 11)
99   // CHECK: ret i64 %[[INTRINSIC]]
100   return svcntb_pat(SV_VL64);
101 }
102 
test_svcntb_pat_12()103 uint64_t test_svcntb_pat_12()
104 {
105   // CHECK-LABEL: test_svcntb_pat_12
106   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 12)
107   // CHECK: ret i64 %[[INTRINSIC]]
108   return svcntb_pat(SV_VL128);
109 }
110 
test_svcntb_pat_13()111 uint64_t test_svcntb_pat_13()
112 {
113   // CHECK-LABEL: test_svcntb_pat_13
114   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 13)
115   // CHECK: ret i64 %[[INTRINSIC]]
116   return svcntb_pat(SV_VL256);
117 }
118 
test_svcntb_pat_14()119 uint64_t test_svcntb_pat_14()
120 {
121   // CHECK-LABEL: test_svcntb_pat_14
122   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 29)
123   // CHECK: ret i64 %[[INTRINSIC]]
124   return svcntb_pat(SV_MUL4);
125 }
126 
test_svcntb_pat_15()127 uint64_t test_svcntb_pat_15()
128 {
129   // CHECK-LABEL: test_svcntb_pat_15
130   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.aarch64.sve.cntb(i32 30)
131   // CHECK: ret i64 %[[INTRINSIC]]
132   return svcntb_pat(SV_MUL3);
133 }
134 
test_svcntb_pat_16()135 uint64_t test_svcntb_pat_16()
136 {
137   // CHECK-LABEL: test_svcntb_pat_16
138   // CHECK: %[[INTRINSIC:.*]] = call i64 @llvm.vscale.i64()
139   // CHECK-NEXT: %[[RET:.*]] = shl i64 %[[INTRINSIC]], 4
140   // CHECK: ret i64 %[[RET]]
141   return svcntb_pat(SV_ALL);
142 }
143