22// RUN: %dxc -T cs_6_9 -enable-16bit-types -DNUM=7 %s | FileCheck %s
33// RUN: %dxc -T cs_6_9 -enable-16bit-types -DNUM=125 %s | FileCheck %s
44// RUN: %dxc -T cs_6_9 -enable-16bit-types -DNUM=256 %s | FileCheck %s
5- // RUN: %dxc -T cs_6_9 -enable-16bit-types -DNUM=1024 %s | FileCheck %s
65
76// Test vector-enabled non-trivial intrinsics that take parameters of various types.
87
@@ -203,6 +202,36 @@ void main() {
203202 // CHECK: fmul fast <[[NUM]] x float> [[tmp]], <float 0x3FE62E4300000000
204203 fRes += log (fVec1);
205204
205+ // CHECK-NOT: extractelement
206+ // CHECK-NOT: insertelement
207+ // CHECK: [[tmp:%.*]] = call <[[NUM]] x half> @dx.op.unary.[[HTY]](i32 23, <[[NUM]] x half> [[hvec2]]) ; Log(value)
208+ // CHECK: [[tmp2:%.*]] = fmul fast <[[NUM]] x half> [[tmp]], [[hvec1]]
209+ // CHECK: call <[[NUM]] x half> @dx.op.unary.[[HTY]](i32 21, <[[NUM]] x half> [[tmp2]]) ; Exp(value)
210+ hRes += pow (hVec2, hVec1);
211+
212+ // CHECK-NOT: extractelement
213+ // CHECK-NOT: insertelement
214+ // CHECK: [[tmp:%.*]] = call <[[NUM]] x float> @dx.op.unary.[[FTY]](i32 23, <[[NUM]] x float> [[fvec2]]) ; Log(value)
215+ // CHECK: [[tmp2:%.*]] = fmul fast <[[NUM]] x float> [[tmp]], [[fvec1]]
216+ // CHECK: call <[[NUM]] x float> @dx.op.unary.[[FTY]](i32 21, <[[NUM]] x float> [[tmp2]]) ; Exp(value)
217+ fRes += pow (fVec2, fVec1);
218+
219+ vector <half , NUM> hVal;
220+ // CHECK-NOT: extractelement
221+ // CHECK-NOT: insertelement
222+ // CHECK: [[tmp:%.*]] = call <[[NUM]] x half> @dx.op.unary.[[HTY]](i32 29, <[[NUM]] x half> [[hvec1]]) ; Round_z(value)
223+ // CHECK: fsub fast <[[NUM]] x half> [[hvec1]], [[tmp]]
224+ hRes *= modf (hVec1, hVal);
225+ hRes += hVal;
226+
227+ vector <float , NUM> fVal;
228+ // CHECK-NOT: extractelement
229+ // CHECK-NOT: insertelement
230+ // CHECK: [[tmp:%.*]] = call <[[NUM]] x float> @dx.op.unary.[[FTY]](i32 29, <[[NUM]] x float> [[fvec1]]) ; Round_z(value)
231+ // CHECK: fsub fast <[[NUM]] x float> [[fvec1]], [[tmp]]
232+ fRes *= modf (fVec1, fVal);
233+ fRes += fVal;
234+
206235 // CHECK-NOT: extractelement
207236 // CHECK-NOT: insertelement
208237 // CHECK: [[sub:%.*]] = fsub fast <[[NUM]] x half> [[hvec2]], [[hvec1]]
@@ -227,6 +256,25 @@ void main() {
227256 // CHECK: fmul fast <[[NUM]] x float> [[mul]], [[sub]]
228257 fRes += smoothstep (fVec1, fVec2, fVec3);
229258
259+ // Note that Fabs is tested in longvec-trivial-unary-float-intrinsics.
260+ // CHECK-NOT: extractelement
261+ // CHECK-NOT: insertelement
262+ // CHECK: [[tmp:%.*]] = sub <[[NUM]] x i16> zeroinitializer, [[svec1]]
263+ // CHECK: call <[[NUM]] x i16> @dx.op.binary.[[STY]](i32 37, <[[NUM]] x i16> [[svec1]], <[[NUM]] x i16> [[tmp]]) ; IMax(a,b)
264+ sRes += abs (sVec1);
265+
266+ // CHECK-NOT: extractelement
267+ // CHECK-NOT: insertelement
268+ // CHECK: [[tmp:%.*]] = sub <[[NUM]] x i32> zeroinitializer, [[ivec1]]
269+ // CHECK: call <[[NUM]] x i32> @dx.op.binary.[[ITY]](i32 37, <[[NUM]] x i32> [[ivec1]], <[[NUM]] x i32> [[tmp]]) ; IMax(a,b)
270+ iRes += abs (iVec1);
271+
272+ // CHECK-NOT: extractelement
273+ // CHECK-NOT: insertelement
274+ // CHECK: [[tmp:%.*]] = sub <[[NUM]] x i64> zeroinitializer, [[lvec1]]
275+ // CHECK: call <[[NUM]] x i64> @dx.op.binary.[[LTY]](i32 37, <[[NUM]] x i64> [[lvec1]], <[[NUM]] x i64> [[tmp]]) ; IMax(a,b)
276+ lRes += abs (lVec1);
277+
230278 // Intrinsics that expand into llvm ops.
231279
232280 // CHECK-NOT: extractelement
0 commit comments