1 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
3 // CHECK-LABEL: f3_to_d4
4 // CHECK: [[f3:%.*]] = alloca <3 x float>
5 // CHECK: [[d4:%.*]] = alloca <4 x double>
6 // CHECK: store <3 x float> splat (float 1.000000e+00), ptr [[f3]]
7 // CHECK: [[vecf3:%.*]] = load <3 x float>, ptr [[f3]]
8 // CHECK: [[vecf4:%.*]] = shufflevector <3 x float> [[vecf3]], <3 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 0>
9 // CHECK: [[vecd4:%.*]] = fpext <4 x float> [[vecf4]] to <4 x double>
10 // CHECK: store <4 x double> [[vecd4]], ptr [[d4]]
12 vector<float,3> f3 = 1.0;
13 vector<double,4> d4 = f3.xyzx;
16 // CHECK-LABEL: f3_to_f2
17 // CHECK: [[f3:%.*]] = alloca <3 x float>
18 // CHECK: [[f2:%.*]] = alloca <2 x float>
19 // CHECK: store <3 x float> splat (float 2.000000e+00), ptr [[f3]]
20 // CHECK: [[vecf3:%.*]] = load <3 x float>, ptr [[f3]]
21 // CHECK: [[vecf2:%.*]] = shufflevector <3 x float> [[vecf3]], <3 x float> poison, <2 x i32> <i32 0, i32 1>
22 // CHECK: store <2 x float> [[vecf2]], ptr [[f2]]
24 vector<float,3> f3 = 2.0;
25 vector<float,2> f2 = f3;
28 // CHECK-LABEL: d4_to_f2
29 // CHECK: [[d4:%.*]] = alloca <4 x double>
30 // CHECK: [[f2:%.*]] = alloca <2 x float>
31 // CHECK: store <4 x double> splat (double 3.000000e+00), ptr [[d4]]
32 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
33 // CHECK: [[vecf4:%.*]] = fptrunc <4 x double> [[vecd4]] to <4 x float>
34 // CHECK: [[vecf2:%.*]] = shufflevector <4 x float> [[vecf4]], <4 x float> poison, <2 x i32> <i32 0, i32 1>
35 // CHECK: store <2 x float> [[vecf2]], ptr [[f2]]
37 vector<double,4> d4 = 3.0;
38 vector<float,2> f2 = d4;
41 // CHECK-LABEL: f2_to_i2
42 // CHECK: [[f2:%.*]] = alloca <2 x float>
43 // CHECK: [[i2:%.*]] = alloca <2 x i32>
44 // CHECK: store <2 x float> splat (float 4.000000e+00), ptr [[f2]]
45 // CHECK: [[vecf2:%.*]] = load <2 x float>, ptr [[f2]]
46 // CHECK: [[veci2:%.*]] = fptosi <2 x float> [[vecf2]] to <2 x i32>
47 // CHECK: store <2 x i32> [[veci2]], ptr [[i2]]
49 vector<float,2> f2 = 4.0;
50 vector<int,2> i2 = f2;
53 // CHECK-LABEL: d4_to_i2
54 // CHECK: [[f4:%.*]] = alloca <4 x double>
55 // CHECK: [[i2:%.*]] = alloca <2 x i32>
56 // CHECK: store <4 x double> splat (double 5.000000e+00), ptr [[d4]]
57 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
58 // CHECK: [[veci4:%.*]] = fptosi <4 x double> [[vecd4]] to <4 x i32>
59 // CHECK: [[veci2:%.*]] = shufflevector <4 x i32> [[veci4]], <4 x i32> poison, <2 x i32> <i32 0, i32 1>
60 // CHECK: store <2 x i32> [[veci2]], ptr [[i2]]
62 vector<double,4> d4 = 5.0;
63 vector<int,2> i2 = d4;
66 // CHECK-LABEL: d4_to_l4
67 // CHECK: [[d4:%.*]] = alloca <4 x double>
68 // CHECK: [[l4:%.*]] = alloca <4 x i64>
69 // CHECK: store <4 x double> splat (double 6.000000e+00), ptr [[d4]]
70 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
71 // CHECK: [[vecl4:%.*]] = fptosi <4 x double> [[vecd4]] to <4 x i64>
72 // CHECK: store <4 x i64> [[vecl4]], ptr [[l4]]
74 vector<double,4> d4 = 6.0;
75 vector<long,4> l4 = d4;
79 // CHECK-LABEL: l4_to_i2
80 // CHECK: [[l4:%.*]] = alloca <4 x i64>
81 // CHECK: [[i2:%.*]] = alloca <2 x i32>
82 // CHECK: store <4 x i64> splat (i64 7), ptr [[l4]]
83 // CHECK: [[vecl4:%.*]] = load <4 x i64>, ptr [[l4]]
84 // CHECK: [[veci4:%.*]] = trunc <4 x i64> [[vecl4]] to <4 x i32>
85 // CHECK: [[veci2:%.*]] = shufflevector <4 x i32> [[veci4]], <4 x i32> poison, <2 x i32> <i32 0, i32 1>
86 // CHECK: store <2 x i32> [[veci2]], ptr [[i2]]
88 vector<long, 4> l4 = 7;
89 vector<int,2> i2 = l4;
92 // CHECK-LABEL: i2_to_b2
93 // CHECK: [[l2:%.*]] = alloca <2 x i32>
94 // CHECK: [[b2:%.*]] = alloca i8
95 // CHECK: store <2 x i32> splat (i32 8), ptr [[i2]]
96 // CHECK: [[veci2:%.*]] = load <2 x i32>, ptr [[i2]]
97 // CHECK: [[vecb2:%.*]] = icmp ne <2 x i32> [[veci2]], zeroinitializer
98 // CHECK: [[vecb8:%.*]] = shufflevector <2 x i1> [[vecb2]], <2 x i1> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
99 // CHECK: [[i8:%.*]] = bitcast <8 x i1> [[vecb8]] to i8
100 // CHECK: store i8 [[i8]], ptr [[b2]]
102 vector<int, 2> i2 = 8;
103 vector<bool, 2> b2 = i2;
106 // CHECK-LABEL: d4_to_b2
107 // CHECK: [[d4:%.*]] = alloca <4 x double>
108 // CHECK: [[b2:%.*]] = alloca i8
109 // CHECK: store <4 x double> splat (double 9.000000e+00), ptr [[d4]]
110 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
111 // CHECK: [[vecb4:%.*]] = fcmp une <4 x double> [[vecd4]], zeroinitializer
112 // CHECK: [[vecd2:%.*]] = shufflevector <4 x i1> [[vecb4]], <4 x i1> poison, <2 x i32> <i32 0, i32 1>
113 // CHECK: [[vecb8:%.*]] = shufflevector <2 x i1> [[vecd2]], <2 x i1> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
114 // CHECK: [[i8:%.*]] = bitcast <8 x i1> [[vecb8]] to i8
115 // CHECK: store i8 [[i8]], ptr [[b2]]
117 vector<double,4> d4 = 9.0;
118 vector<bool, 2> b2 = d4;
121 // CHECK-LABEL: d4_to_d1
122 // CHECK: [[d4:%.*]] = alloca <4 x double>
123 // CHECK: [[d1:%.*]] = alloca <1 x double>
124 // CHECK: store <4 x double> splat (double 9.000000e+00), ptr [[d4]]
125 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
126 // CHECK: [[vecd1:%.*]] = shufflevector <4 x double> [[vecd4]], <4 x double> poison, <1 x i32> zeroinitializer
127 // CHECK: store <1 x double> [[vecd1]], ptr [[d1:%.*]], align 8
129 vector<double,4> d4 = 9.0;
130 vector<double,1> d1 = d4;
133 // CHECK-LABEL: d4_to_dScalar
134 // CHECK: [[d4:%.*]] = alloca <4 x double>
135 // CHECK: [[d:%.*]] = alloca double
136 // CHECK: store <4 x double> splat (double 9.000000e+00), ptr [[d4]]
137 // CHECK: [[vecd4:%.*]] = load <4 x double>, ptr [[d4]]
138 // CHECK: [[d4x:%.*]] = extractelement <4 x double> [[vecd4]], i32 0
139 // CHECK: store double [[d4x]], ptr [[d]]
140 void d4_to_dScalar() {
141 vector<double,4> d4 = 9.0;