1 // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
2 // RUN: spirv-unknown-vulkan-compute %s -fnative-half-type \
3 // RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \
4 // RUN: --check-prefixes=CHECK,NATIVE_HALF \
5 // RUN: -DFNATTRS="spir_func noundef" -DTARGET=spv
6 // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
7 // RUN: spirv-unknown-vulkan-compute %s -emit-llvm -disable-llvm-passes \
8 // RUN: -o - | FileCheck %s --check-prefixes=CHECK \
9 // RUN: -DFNATTRS="spir_func noundef" -DTARGET=spv
10 // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
11 // RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type \
12 // RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \
13 // RUN: --check-prefixes=CHECK,NATIVE_HALF \
14 // RUN: -DFNATTRS=noundef -DTARGET=dx
15 // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
16 // RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \
17 // RUN: -o - | FileCheck %s --check-prefixes=CHECK \
18 // RUN: -DFNATTRS=noundef -DTARGET=dx
20 #ifdef __HLSL_ENABLE_16_BIT
21 // NATIVE_HALF: define [[FNATTRS]] i1 @
22 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.i16
23 // NATIVE_HALF: ret i1 %hlsl.all
24 bool test_all_int16_t(int16_t p0) { return all(p0); }
25 // NATIVE_HALF: define [[FNATTRS]] i1 @
26 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i16
27 // NATIVE_HALF: ret i1 %hlsl.all
28 bool test_all_int16_t2(int16_t2 p0) { return all(p0); }
29 // NATIVE_HALF: define [[FNATTRS]] i1 @
30 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i16
31 // NATIVE_HALF: ret i1 %hlsl.all
32 bool test_all_int16_t3(int16_t3 p0) { return all(p0); }
33 // NATIVE_HALF: define [[FNATTRS]] i1 @
34 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i16
35 // NATIVE_HALF: ret i1 %hlsl.all
36 bool test_all_int16_t4(int16_t4 p0) { return all(p0); }
37 // NATIVE_HALF: define [[FNATTRS]] i1 @
38 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.i16
39 // NATIVE_HALF: ret i1 %hlsl.all
40 bool test_all_uint16_t(uint16_t p0) { return all(p0); }
41 // NATIVE_HALF: define [[FNATTRS]] i1 @
42 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i16
43 // NATIVE_HALF: ret i1 %hlsl.all
44 bool test_all_uint16_t2(uint16_t2 p0) { return all(p0); }
45 // NATIVE_HALF: define [[FNATTRS]] i1 @
46 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i16
47 // NATIVE_HALF: ret i1 %hlsl.all
48 bool test_all_uint16_t3(uint16_t3 p0) { return all(p0); }
49 // NATIVE_HALF: define [[FNATTRS]] i1 @
50 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i16
51 // NATIVE_HALF: ret i1 %hlsl.all
52 bool test_all_uint16_t4(uint16_t4 p0) { return all(p0); }
53 #endif // __HLSL_ENABLE_16_BIT
55 // CHECK: define [[FNATTRS]] i1 @
56 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.f16
57 // NO_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.f32
58 // CHECK: ret i1 %hlsl.all
59 bool test_all_half(half p0) { return all(p0); }
60 // CHECK: define [[FNATTRS]] i1 @
61 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2f16
62 // NO_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2f32
63 // CHECK: ret i1 %hlsl.all
64 bool test_all_half2(half2 p0) { return all(p0); }
65 // CHECK: define [[FNATTRS]] i1 @
66 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3f16
67 // NO_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3f32
68 // CHECK: ret i1 %hlsl.all
69 bool test_all_half3(half3 p0) { return all(p0); }
70 // CHECK: define [[FNATTRS]] i1 @
71 // NATIVE_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4f16
72 // NO_HALF: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4f32
73 // CHECK: ret i1 %hlsl.all
74 bool test_all_half4(half4 p0) { return all(p0); }
76 // CHECK: define [[FNATTRS]] i1 @
77 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.f32
78 // CHECK: ret i1 %hlsl.all
79 bool test_all_float(float p0) { return all(p0); }
80 // CHECK: define [[FNATTRS]] i1 @
81 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2f32
82 // CHECK: ret i1 %hlsl.all
83 bool test_all_float2(float2 p0) { return all(p0); }
84 // CHECK: define [[FNATTRS]] i1 @
85 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3f32
86 // CHECK: ret i1 %hlsl.all
87 bool test_all_float3(float3 p0) { return all(p0); }
88 // CHECK: define [[FNATTRS]] i1 @
89 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4f32
90 // CHECK: ret i1 %hlsl.all
91 bool test_all_float4(float4 p0) { return all(p0); }
93 // CHECK: define [[FNATTRS]] i1 @
94 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.f64
95 // CHECK: ret i1 %hlsl.all
96 bool test_all_double(double p0) { return all(p0); }
97 // CHECK: define [[FNATTRS]] i1 @
98 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2f64
99 // CHECK: ret i1 %hlsl.all
100 bool test_all_double2(double2 p0) { return all(p0); }
101 // CHECK: define [[FNATTRS]] i1 @
102 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3f64
103 // CHECK: ret i1 %hlsl.all
104 bool test_all_double3(double3 p0) { return all(p0); }
105 // CHECK: define [[FNATTRS]] i1 @
106 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4f64
107 // CHECK: ret i1 %hlsl.all
108 bool test_all_double4(double4 p0) { return all(p0); }
110 // CHECK: define [[FNATTRS]] i1 @
111 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.i32
112 // CHECK: ret i1 %hlsl.all
113 bool test_all_int(int p0) { return all(p0); }
114 // CHECK: define [[FNATTRS]] i1 @
115 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i32
116 // CHECK: ret i1 %hlsl.all
117 bool test_all_int2(int2 p0) { return all(p0); }
118 // CHECK: define [[FNATTRS]] i1 @
119 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i32
120 // CHECK: ret i1 %hlsl.all
121 bool test_all_int3(int3 p0) { return all(p0); }
122 // CHECK: define [[FNATTRS]] i1 @
123 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i32
124 // CHECK: ret i1 %hlsl.all
125 bool test_all_int4(int4 p0) { return all(p0); }
127 // CHECK: define [[FNATTRS]] i1 @
128 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.i32
129 // CHECK: ret i1 %hlsl.all
130 bool test_all_uint(uint p0) { return all(p0); }
131 // CHECK: define [[FNATTRS]] i1 @
132 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i32
133 // CHECK: ret i1 %hlsl.all
134 bool test_all_uint2(uint2 p0) { return all(p0); }
135 // CHECK: define [[FNATTRS]] i1 @
136 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i32
137 // CHECK: ret i1 %hlsl.all
138 bool test_all_uint3(uint3 p0) { return all(p0); }
139 // CHECK: define [[FNATTRS]] i1 @
140 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i32
141 // CHECK: ret i1 %hlsl.all
142 bool test_all_uint4(uint4 p0) { return all(p0); }
144 // CHECK: define [[FNATTRS]] i1 @
145 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.i64
146 // CHECK: ret i1 %hlsl.all
147 bool test_all_int64_t(int64_t p0) { return all(p0); }
148 // CHECK: define [[FNATTRS]] i1 @
149 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i64
150 // CHECK: ret i1 %hlsl.all
151 bool test_all_int64_t2(int64_t2 p0) { return all(p0); }
152 // CHECK: define [[FNATTRS]] i1 @
153 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i64
154 // CHECK: ret i1 %hlsl.all
155 bool test_all_int64_t3(int64_t3 p0) { return all(p0); }
156 // CHECK: define [[FNATTRS]] i1 @
157 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i64
158 // CHECK: ret i1 %hlsl.all
159 bool test_all_int64_t4(int64_t4 p0) { return all(p0); }
161 // CHECK: define [[FNATTRS]] i1 @
162 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.i64
163 // CHECK: ret i1 %hlsl.all
164 bool test_all_uint64_t(uint64_t p0) { return all(p0); }
165 // CHECK: define [[FNATTRS]] i1 @
166 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i64
167 // CHECK: ret i1 %hlsl.all
168 bool test_all_uint64_t2(uint64_t2 p0) { return all(p0); }
169 // CHECK: define [[FNATTRS]] i1 @
170 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i64
171 // CHECK: ret i1 %hlsl.all
172 bool test_all_uint64_t3(uint64_t3 p0) { return all(p0); }
173 // CHECK: define [[FNATTRS]] i1 @
174 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i64
175 // CHECK: ret i1 %hlsl.all
176 bool test_all_uint64_t4(uint64_t4 p0) { return all(p0); }
178 // CHECK: define [[FNATTRS]] i1 @
179 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.i1
180 // CHECK: ret i1 %hlsl.all
181 bool test_all_bool(bool p0) { return all(p0); }
182 // CHECK: define [[FNATTRS]] i1 @
183 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v2i1
184 // CHECK: ret i1 %hlsl.all
185 bool test_all_bool2(bool2 p0) { return all(p0); }
186 // CHECK: define [[FNATTRS]] i1 @
187 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v3i1
188 // CHECK: ret i1 %hlsl.all
189 bool test_all_bool3(bool3 p0) { return all(p0); }
190 // CHECK: define [[FNATTRS]] i1 @
191 // CHECK: %hlsl.all = call i1 @llvm.[[TARGET]].all.v4i1
192 // CHECK: ret i1 %hlsl.all
193 bool test_all_bool4(bool4 p0) { return all(p0); }