1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s 2 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 reassoc nnan ninf nsz arcp afn <4 x float> [[vecf4]] to <4 x double> 10// CHECK: store <4 x double> [[vecd4]], ptr [[d4]] 11void f3_to_d4() { 12 vector<float,3> f3 = 1.0; 13 vector<double,4> d4 = f3.xyzx; 14} 15 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]] 23void f3_to_f2() { 24 vector<float,3> f3 = 2.0; 25 vector<float,2> f2 = f3; 26} 27 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 reassoc nnan ninf nsz arcp afn <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]] 36void d4_to_f2() { 37 vector<double,4> d4 = 3.0; 38 vector<float,2> f2 = d4; 39} 40 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]] 48void f2_to_i2() { 49 vector<float,2> f2 = 4.0; 50 vector<int,2> i2 = f2; 51} 52 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]] 61void d4_to_i2() { 62 vector<double,4> d4 = 5.0; 63 vector<int,2> i2 = d4; 64} 65 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]] 73void d4_to_l4() { 74 vector<double,4> d4 = 6.0; 75 vector<long,4> l4 = d4; 76} 77 78 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]] 87void l4_to_i2() { 88 vector<long, 4> l4 = 7; 89 vector<int,2> i2 = l4; 90} 91 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]] 101void i2_to_b2() { 102 vector<int, 2> i2 = 8; 103 vector<bool, 2> b2 = i2; 104} 105 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 reassoc nnan ninf nsz arcp afn 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]] 116void d4_to_b2() { 117 vector<double,4> d4 = 9.0; 118 vector<bool, 2> b2 = d4; 119} 120 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 128void d4_to_d1() { 129 vector<double,4> d4 = 9.0; 130 vector<double,1> d1 = d4; 131} 132 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]] 140void d4_to_dScalar() { 141 vector<double,4> d4 = 9.0; 142 double d = d4; 143} 144