1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
2db210bc6SSaurabh Jha
3db210bc6SSaurabh Jha template <typename X>
4db210bc6SSaurabh Jha using matrix_4_4 = X __attribute__((matrix_type(4, 4)));
5db210bc6SSaurabh Jha
6db210bc6SSaurabh Jha template <typename Y>
7db210bc6SSaurabh Jha using matrix_5_5 = Y __attribute__((matrix_type(5, 5)));
8db210bc6SSaurabh Jha
9ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z25CastCharMatrixToIntCStylev()
CastCharMatrixToIntCStyle()10ecb235d9SSaurabh Jha void CastCharMatrixToIntCStyle() {
11db210bc6SSaurabh Jha // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
12db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
13db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
14db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
15db210bc6SSaurabh Jha
16db210bc6SSaurabh Jha matrix_5_5<char> c;
17db210bc6SSaurabh Jha matrix_5_5<int> i;
18db210bc6SSaurabh Jha i = (matrix_5_5<int>)c;
19db210bc6SSaurabh Jha }
20db210bc6SSaurabh Jha
21ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z29CastCharMatrixToIntStaticCastv()
CastCharMatrixToIntStaticCast()22ecb235d9SSaurabh Jha void CastCharMatrixToIntStaticCast() {
23ecb235d9SSaurabh Jha // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
24ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
25ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
26ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
27ecb235d9SSaurabh Jha
28ecb235d9SSaurabh Jha matrix_5_5<char> c;
29ecb235d9SSaurabh Jha matrix_5_5<int> i;
30ecb235d9SSaurabh Jha i = static_cast<matrix_5_5<int>>(c);
31ecb235d9SSaurabh Jha }
32ecb235d9SSaurabh Jha
33ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z33CastCharMatrixToUnsignedIntCStylev
CastCharMatrixToUnsignedIntCStyle()34ecb235d9SSaurabh Jha void CastCharMatrixToUnsignedIntCStyle() {
35db210bc6SSaurabh Jha // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
36db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
37db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
38db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
39db210bc6SSaurabh Jha // CHECK-NEXT: ret void
40db210bc6SSaurabh Jha
41db210bc6SSaurabh Jha matrix_5_5<char> c;
42db210bc6SSaurabh Jha matrix_5_5<unsigned int> u;
43db210bc6SSaurabh Jha u = (matrix_5_5<unsigned int>)c;
44db210bc6SSaurabh Jha }
45db210bc6SSaurabh Jha
46ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z37CastCharMatrixToUnsignedIntStaticCastv
CastCharMatrixToUnsignedIntStaticCast()47ecb235d9SSaurabh Jha void CastCharMatrixToUnsignedIntStaticCast() {
48ecb235d9SSaurabh Jha // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
49ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
50ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
51ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
52ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
53ecb235d9SSaurabh Jha
54ecb235d9SSaurabh Jha matrix_5_5<char> c;
55ecb235d9SSaurabh Jha matrix_5_5<unsigned int> u;
56ecb235d9SSaurabh Jha u = static_cast<matrix_5_5<unsigned int>>(c);
57ecb235d9SSaurabh Jha }
58ecb235d9SSaurabh Jha
59ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedLongIntMatrixToShortCStylev
CastUnsignedLongIntMatrixToShortCStyle()60ecb235d9SSaurabh Jha void CastUnsignedLongIntMatrixToShortCStyle() {
61db210bc6SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
62db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
63db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
64db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
65db210bc6SSaurabh Jha // CHECK-NEXT: ret void
66db210bc6SSaurabh Jha
67db210bc6SSaurabh Jha matrix_5_5<unsigned long int> u;
68db210bc6SSaurabh Jha matrix_5_5<short int> s;
69db210bc6SSaurabh Jha s = (matrix_5_5<short int>)u;
70db210bc6SSaurabh Jha }
71db210bc6SSaurabh Jha
72ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z42CastUnsignedLongIntMatrixToShortStaticCastv
CastUnsignedLongIntMatrixToShortStaticCast()73ecb235d9SSaurabh Jha void CastUnsignedLongIntMatrixToShortStaticCast() {
74ecb235d9SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
75ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
76ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
77ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
78ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
79ecb235d9SSaurabh Jha
80ecb235d9SSaurabh Jha matrix_5_5<unsigned long int> u;
81ecb235d9SSaurabh Jha matrix_5_5<short int> s;
82ecb235d9SSaurabh Jha s = static_cast<matrix_5_5<short int>>(u);
83ecb235d9SSaurabh Jha }
84ecb235d9SSaurabh Jha
85ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToShortCStylev()
CastIntMatrixToShortCStyle()86ecb235d9SSaurabh Jha void CastIntMatrixToShortCStyle() {
87db210bc6SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
88db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
89db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
90db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
91db210bc6SSaurabh Jha // CHECK-NEXT: ret void
92db210bc6SSaurabh Jha
93db210bc6SSaurabh Jha matrix_5_5<int> i;
94db210bc6SSaurabh Jha matrix_5_5<short int> s;
95db210bc6SSaurabh Jha s = (matrix_5_5<short int>)i;
96db210bc6SSaurabh Jha }
97db210bc6SSaurabh Jha
98ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToShortStaticCastv()
CastIntMatrixToShortStaticCast()99ecb235d9SSaurabh Jha void CastIntMatrixToShortStaticCast() {
100ecb235d9SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
101ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
102ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
103ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
104ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
105ecb235d9SSaurabh Jha
106ecb235d9SSaurabh Jha matrix_5_5<int> i;
107ecb235d9SSaurabh Jha matrix_5_5<short int> s;
108ecb235d9SSaurabh Jha s = static_cast<matrix_5_5<short int>>(i);
109ecb235d9SSaurabh Jha }
110ecb235d9SSaurabh Jha
111ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToFloatCStylev()
CastIntMatrixToFloatCStyle()112ecb235d9SSaurabh Jha void CastIntMatrixToFloatCStyle() {
113db210bc6SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
114db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
115db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
116db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
117db210bc6SSaurabh Jha // CHECK-NEXT: ret void
118db210bc6SSaurabh Jha
119db210bc6SSaurabh Jha matrix_5_5<int> i;
120db210bc6SSaurabh Jha matrix_5_5<float> f;
121db210bc6SSaurabh Jha f = (matrix_5_5<float>)i;
122db210bc6SSaurabh Jha }
123db210bc6SSaurabh Jha
124ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToFloatStaticCastv()
CastIntMatrixToFloatStaticCast()125ecb235d9SSaurabh Jha void CastIntMatrixToFloatStaticCast() {
126ecb235d9SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
127ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
128ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
129ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
130ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
131ecb235d9SSaurabh Jha
132ecb235d9SSaurabh Jha matrix_5_5<int> i;
133ecb235d9SSaurabh Jha matrix_5_5<float> f;
134ecb235d9SSaurabh Jha f = static_cast<matrix_5_5<float>>(i);
135ecb235d9SSaurabh Jha }
136ecb235d9SSaurabh Jha
137ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z34CastUnsignedIntMatrixToFloatCStylev()
CastUnsignedIntMatrixToFloatCStyle()138ecb235d9SSaurabh Jha void CastUnsignedIntMatrixToFloatCStyle() {
139db210bc6SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
140db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
141db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
142db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
143db210bc6SSaurabh Jha // CHECK-NEXT: ret void
144db210bc6SSaurabh Jha
145db210bc6SSaurabh Jha matrix_5_5<unsigned short int> u;
146db210bc6SSaurabh Jha matrix_5_5<float> f;
147db210bc6SSaurabh Jha f = (matrix_5_5<float>)u;
148db210bc6SSaurabh Jha }
149db210bc6SSaurabh Jha
150ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedIntMatrixToFloatStaticCastv()
CastUnsignedIntMatrixToFloatStaticCast()151ecb235d9SSaurabh Jha void CastUnsignedIntMatrixToFloatStaticCast() {
152ecb235d9SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
153ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
154ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
155ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
156ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
157ecb235d9SSaurabh Jha
158ecb235d9SSaurabh Jha matrix_5_5<unsigned short int> u;
159ecb235d9SSaurabh Jha matrix_5_5<float> f;
160ecb235d9SSaurabh Jha f = static_cast<matrix_5_5<float>>(u);
161ecb235d9SSaurabh Jha }
162ecb235d9SSaurabh Jha
163ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z27CastDoubleMatrixToIntCStylev()
CastDoubleMatrixToIntCStyle()164ecb235d9SSaurabh Jha void CastDoubleMatrixToIntCStyle() {
165db210bc6SSaurabh Jha // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
166db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
167db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
168db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
169db210bc6SSaurabh Jha // CHECK-NEXT: ret void
170db210bc6SSaurabh Jha
171db210bc6SSaurabh Jha matrix_5_5<double> d;
172db210bc6SSaurabh Jha matrix_5_5<int> i;
173db210bc6SSaurabh Jha i = (matrix_5_5<int>)d;
174db210bc6SSaurabh Jha }
175db210bc6SSaurabh Jha
176ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z31CastDoubleMatrixToIntStaticCastv()
CastDoubleMatrixToIntStaticCast()177ecb235d9SSaurabh Jha void CastDoubleMatrixToIntStaticCast() {
178ecb235d9SSaurabh Jha // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
179ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
180ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
181ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
182ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
183ecb235d9SSaurabh Jha
184ecb235d9SSaurabh Jha matrix_5_5<double> d;
185ecb235d9SSaurabh Jha matrix_5_5<int> i;
186ecb235d9SSaurabh Jha i = static_cast<matrix_5_5<int>>(d);
187ecb235d9SSaurabh Jha }
188ecb235d9SSaurabh Jha
189ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z39CastFloatMatrixToUnsignedShortIntCStylev()
CastFloatMatrixToUnsignedShortIntCStyle()190ecb235d9SSaurabh Jha void CastFloatMatrixToUnsignedShortIntCStyle() {
191db210bc6SSaurabh Jha // CHECK: [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
192db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
193db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
194db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
195db210bc6SSaurabh Jha // CHECK-NEXT: ret void
196db210bc6SSaurabh Jha
197db210bc6SSaurabh Jha matrix_5_5<float> f;
198db210bc6SSaurabh Jha matrix_5_5<unsigned short int> i;
199db210bc6SSaurabh Jha i = (matrix_5_5<unsigned short int>)f;
200db210bc6SSaurabh Jha }
201db210bc6SSaurabh Jha
202ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z43CastFloatMatrixToUnsignedShortIntStaticCastv()
CastFloatMatrixToUnsignedShortIntStaticCast()203ecb235d9SSaurabh Jha void CastFloatMatrixToUnsignedShortIntStaticCast() {
204ecb235d9SSaurabh Jha // CHECK: [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
205ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
206ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
207ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
208ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
209ecb235d9SSaurabh Jha
210ecb235d9SSaurabh Jha matrix_5_5<float> f;
211ecb235d9SSaurabh Jha matrix_5_5<unsigned short int> i;
212ecb235d9SSaurabh Jha i = static_cast<matrix_5_5<unsigned short int>>(f);
213ecb235d9SSaurabh Jha }
214ecb235d9SSaurabh Jha
215ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z29CastDoubleMatrixToFloatCStylev()
CastDoubleMatrixToFloatCStyle()216ecb235d9SSaurabh Jha void CastDoubleMatrixToFloatCStyle() {
217db210bc6SSaurabh Jha // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
218db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
219db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
220db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
221db210bc6SSaurabh Jha // CHECK-NEXT: ret void
222db210bc6SSaurabh Jha
223db210bc6SSaurabh Jha matrix_5_5<double> d;
224db210bc6SSaurabh Jha matrix_5_5<float> f;
225db210bc6SSaurabh Jha f = (matrix_5_5<float>)d;
226db210bc6SSaurabh Jha }
227db210bc6SSaurabh Jha
228ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z33CastDoubleMatrixToFloatStaticCastv()
CastDoubleMatrixToFloatStaticCast()229ecb235d9SSaurabh Jha void CastDoubleMatrixToFloatStaticCast() {
230ecb235d9SSaurabh Jha // CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
231ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
232ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
233ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
234ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
235ecb235d9SSaurabh Jha
236ecb235d9SSaurabh Jha matrix_5_5<double> d;
237ecb235d9SSaurabh Jha matrix_5_5<float> f;
238ecb235d9SSaurabh Jha f = static_cast<matrix_5_5<float>>(d);
239ecb235d9SSaurabh Jha }
240ecb235d9SSaurabh Jha
241ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z39CastUnsignedShortIntToUnsignedIntCStylev()
CastUnsignedShortIntToUnsignedIntCStyle()242ecb235d9SSaurabh Jha void CastUnsignedShortIntToUnsignedIntCStyle() {
243db210bc6SSaurabh Jha // CHECK: [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
244db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
245db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
246db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
247db210bc6SSaurabh Jha // CHECK-NEXT: ret void
248db210bc6SSaurabh Jha
249db210bc6SSaurabh Jha matrix_5_5<unsigned short int> s;
250db210bc6SSaurabh Jha matrix_5_5<unsigned int> i;
251db210bc6SSaurabh Jha i = (matrix_5_5<unsigned int>)s;
252db210bc6SSaurabh Jha }
253db210bc6SSaurabh Jha
254ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedShortIntToUnsignedIntStaticCastv()
CastUnsignedShortIntToUnsignedIntStaticCast()255ecb235d9SSaurabh Jha void CastUnsignedShortIntToUnsignedIntStaticCast() {
256ecb235d9SSaurabh Jha // CHECK: [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
257ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
258ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
259ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
260ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
261ecb235d9SSaurabh Jha
262ecb235d9SSaurabh Jha matrix_5_5<unsigned short int> s;
263ecb235d9SSaurabh Jha matrix_5_5<unsigned int> i;
264ecb235d9SSaurabh Jha i = static_cast<matrix_5_5<unsigned int>>(s);
265ecb235d9SSaurabh Jha }
266ecb235d9SSaurabh Jha
267ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedLongIntToUnsignedShortIntCStylev()
CastUnsignedLongIntToUnsignedShortIntCStyle()268ecb235d9SSaurabh Jha void CastUnsignedLongIntToUnsignedShortIntCStyle() {
269db210bc6SSaurabh Jha // CHECK: [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
270db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
271db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
272db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
273db210bc6SSaurabh Jha // CHECK-NEXT: ret void
274db210bc6SSaurabh Jha
275db210bc6SSaurabh Jha matrix_5_5<unsigned long int> l;
276db210bc6SSaurabh Jha matrix_5_5<unsigned short int> s;
277db210bc6SSaurabh Jha s = (matrix_5_5<unsigned short int>)l;
278db210bc6SSaurabh Jha }
279db210bc6SSaurabh Jha
280ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z47CastUnsignedLongIntToUnsignedShortIntStaticCastv()
CastUnsignedLongIntToUnsignedShortIntStaticCast()281ecb235d9SSaurabh Jha void CastUnsignedLongIntToUnsignedShortIntStaticCast() {
282ecb235d9SSaurabh Jha // CHECK: [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
283ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
284ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
285ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
286ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
287ecb235d9SSaurabh Jha
288ecb235d9SSaurabh Jha matrix_5_5<unsigned long int> l;
289ecb235d9SSaurabh Jha matrix_5_5<unsigned short int> s;
290ecb235d9SSaurabh Jha s = static_cast<matrix_5_5<unsigned short int>>(l);
291ecb235d9SSaurabh Jha }
292ecb235d9SSaurabh Jha
293ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z31CastUnsignedShortIntToIntCStylev()
CastUnsignedShortIntToIntCStyle()294ecb235d9SSaurabh Jha void CastUnsignedShortIntToIntCStyle() {
295db210bc6SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
296db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
297db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
298db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
299db210bc6SSaurabh Jha // CHECK-NEXT: ret void
300db210bc6SSaurabh Jha
301db210bc6SSaurabh Jha matrix_5_5<unsigned short int> u;
302db210bc6SSaurabh Jha matrix_5_5<int> i;
303db210bc6SSaurabh Jha i = (matrix_5_5<int>)u;
304db210bc6SSaurabh Jha }
305db210bc6SSaurabh Jha
306ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z35CastUnsignedShortIntToIntStaticCastv()
CastUnsignedShortIntToIntStaticCast()307ecb235d9SSaurabh Jha void CastUnsignedShortIntToIntStaticCast() {
308ecb235d9SSaurabh Jha // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
309ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
310ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
311ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
312ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
313ecb235d9SSaurabh Jha
314ecb235d9SSaurabh Jha matrix_5_5<unsigned short int> u;
315ecb235d9SSaurabh Jha matrix_5_5<int> i;
316ecb235d9SSaurabh Jha i = static_cast<matrix_5_5<int>>(u);
317ecb235d9SSaurabh Jha }
318ecb235d9SSaurabh Jha
319ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z30CastIntToUnsignedLongIntCStylev()
CastIntToUnsignedLongIntCStyle()320ecb235d9SSaurabh Jha void CastIntToUnsignedLongIntCStyle() {
321db210bc6SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
322db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
323db210bc6SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
324db210bc6SSaurabh Jha // CHECK-NEXT: store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
325db210bc6SSaurabh Jha // CHECK-NEXT: ret void
326db210bc6SSaurabh Jha
327db210bc6SSaurabh Jha matrix_5_5<int> i;
328db210bc6SSaurabh Jha matrix_5_5<unsigned long int> u;
329db210bc6SSaurabh Jha u = (matrix_5_5<unsigned long int>)i;
330db210bc6SSaurabh Jha }
331ecb235d9SSaurabh Jha
332ecb235d9SSaurabh Jha // CHECK-LABEL: define{{.*}} void @_Z34CastIntToUnsignedLongIntStaticCastv()
CastIntToUnsignedLongIntStaticCast()333ecb235d9SSaurabh Jha void CastIntToUnsignedLongIntStaticCast() {
334ecb235d9SSaurabh Jha // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
335ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
336ecb235d9SSaurabh Jha // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
337ecb235d9SSaurabh Jha // CHECK-NEXT: store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
338ecb235d9SSaurabh Jha // CHECK-NEXT: ret void
339ecb235d9SSaurabh Jha
340ecb235d9SSaurabh Jha matrix_5_5<int> i;
341ecb235d9SSaurabh Jha matrix_5_5<unsigned long int> u;
342ecb235d9SSaurabh Jha u = static_cast<matrix_5_5<unsigned long int>>(i);
343ecb235d9SSaurabh Jha }
3445bccdde0SFlorian Hahn
3455bccdde0SFlorian Hahn class Foo {
3465bccdde0SFlorian Hahn int x[10];
3475bccdde0SFlorian Hahn
3485bccdde0SFlorian Hahn public:
3495bccdde0SFlorian Hahn Foo(matrix_5_5<int> x);
3505bccdde0SFlorian Hahn };
3515bccdde0SFlorian Hahn
class_constructor_matrix_ty(matrix_5_5<int> m)3525bccdde0SFlorian Hahn Foo class_constructor_matrix_ty(matrix_5_5<int> m) {
3531b1c8d83Shyeongyu kim // CHECK-LABEL: define void @_Z27class_constructor_matrix_tyu11matrix_typeILm5ELm5EiE(%class.Foo* noalias sret(%class.Foo) align 4 %agg.result, <25 x i32> noundef %m)
3545bccdde0SFlorian Hahn // CHECK: [[M:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
35567aa314bSFlorian Hahn // CHECK-NEXT: call void @_ZN3FooC1Eu11matrix_typeILm5ELm5EiE(%class.Foo* noundef nonnull align 4 dereferenceable(40) %agg.result, <25 x i32> noundef [[M]])
3565bccdde0SFlorian Hahn // CHECK-NEXT: ret void
3575bccdde0SFlorian Hahn
3585bccdde0SFlorian Hahn return Foo(m);
3595bccdde0SFlorian Hahn }
3605bccdde0SFlorian Hahn
3615bccdde0SFlorian Hahn struct Bar {
3625bccdde0SFlorian Hahn float x[10];
3635bccdde0SFlorian Hahn Bar(matrix_4_4<float> x);
3645bccdde0SFlorian Hahn };
3655bccdde0SFlorian Hahn
struct_constructor_matrix_ty(matrix_4_4<float> m)3665bccdde0SFlorian Hahn Bar struct_constructor_matrix_ty(matrix_4_4<float> m) {
3671b1c8d83Shyeongyu kim // CHECK-LABEL: define void @_Z28struct_constructor_matrix_tyu11matrix_typeILm4ELm4EfE(%struct.Bar* noalias sret(%struct.Bar) align 4 %agg.result, <16 x float> noundef %m)
3685bccdde0SFlorian Hahn // CHECK: [[M:%.*]] = load <16 x float>, <16 x float>* {{.*}}, align 4
36967aa314bSFlorian Hahn // CHECK-NEXT: call void @_ZN3BarC1Eu11matrix_typeILm4ELm4EfE(%struct.Bar* noundef nonnull align 4 dereferenceable(40) %agg.result, <16 x float> noundef [[M]])
3705bccdde0SFlorian Hahn // CHECK-NEXT: ret void
3715bccdde0SFlorian Hahn
3725bccdde0SFlorian Hahn return Bar(m);
3735bccdde0SFlorian Hahn }
374