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()7 uint64_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()16 uint64_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()24 uint64_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()31 uint64_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()38 uint64_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()45 uint64_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()52 uint64_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()60 uint64_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()68 uint64_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()76 uint64_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()84 uint64_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()92 uint64_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()100 uint64_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()108 uint64_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()116 uint64_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()124 uint64_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()132 uint64_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()140 uint64_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