15edede2dSTim Gymnich; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*7d0ca601SFarzon Lotfi; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s 35edede2dSTim Gymnich 45edede2dSTim Gymnich 55edede2dSTim Gymnichdefine noundef i32 @sign_half(half noundef %a) { 65edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_half( 75edede2dSTim Gymnich; CHECK-SAME: half noundef [[A:%.*]]) { 85edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 95edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt half 0xH0000, [[A]] 105edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt half [[A]], 0xH0000 115edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 125edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 135edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 145edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 155edede2dSTim Gymnich; 165edede2dSTim Gymnichentry: 175edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.f16(half %a) 185edede2dSTim Gymnich ret i32 %elt.sign 195edede2dSTim Gymnich} 205edede2dSTim Gymnich 215edede2dSTim Gymnichdefine noundef i32 @sign_float(float noundef %a) { 225edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_float( 235edede2dSTim Gymnich; CHECK-SAME: float noundef [[A:%.*]]) { 245edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 255edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt float 0.000000e+00, [[A]] 265edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt float [[A]], 0.000000e+00 275edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 285edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 295edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 305edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 315edede2dSTim Gymnich; 325edede2dSTim Gymnichentry: 335edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.f32(float %a) 345edede2dSTim Gymnich ret i32 %elt.sign 355edede2dSTim Gymnich} 365edede2dSTim Gymnich 375edede2dSTim Gymnichdefine noundef i32 @sign_double(double noundef %a) { 385edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_double( 395edede2dSTim Gymnich; CHECK-SAME: double noundef [[A:%.*]]) { 405edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 415edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt double 0.000000e+00, [[A]] 425edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt double [[A]], 0.000000e+00 435edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 445edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 455edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 465edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 475edede2dSTim Gymnich; 485edede2dSTim Gymnichentry: 495edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.f64(double %a) 505edede2dSTim Gymnich ret i32 %elt.sign 515edede2dSTim Gymnich} 525edede2dSTim Gymnich 535edede2dSTim Gymnichdefine noundef i32 @sign_i16(i16 noundef %a) { 545edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_i16( 555edede2dSTim Gymnich; CHECK-SAME: i16 noundef [[A:%.*]]) { 565edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 575edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i16 0, [[A]] 585edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i16 [[A]], 0 595edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 605edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 615edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 625edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 635edede2dSTim Gymnich; 645edede2dSTim Gymnichentry: 655edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.i16(i16 %a) 665edede2dSTim Gymnich ret i32 %elt.sign 675edede2dSTim Gymnich} 685edede2dSTim Gymnich 695edede2dSTim Gymnichdefine noundef i32 @sign_i32(i32 noundef %a) { 705edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_i32( 715edede2dSTim Gymnich; CHECK-SAME: i32 noundef [[A:%.*]]) { 725edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 735edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 0, [[A]] 745edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A]], 0 755edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 765edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 775edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 785edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 795edede2dSTim Gymnich; 805edede2dSTim Gymnichentry: 815edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.i32(i32 %a) 825edede2dSTim Gymnich ret i32 %elt.sign 835edede2dSTim Gymnich} 845edede2dSTim Gymnich 855edede2dSTim Gymnichdefine noundef i32 @sign_i64(i64 noundef %a) { 865edede2dSTim Gymnich; CHECK-LABEL: define noundef i32 @sign_i64( 875edede2dSTim Gymnich; CHECK-SAME: i64 noundef [[A:%.*]]) { 885edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 895edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i64 0, [[A]] 905edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i64 [[A]], 0 915edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP0]] to i32 925edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext i1 [[TMP1]] to i32 935edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]] 945edede2dSTim Gymnich; CHECK-NEXT: ret i32 [[TMP4]] 955edede2dSTim Gymnich; 965edede2dSTim Gymnichentry: 975edede2dSTim Gymnich %elt.sign = call i32 @llvm.dx.sign.i64(i64 %a) 985edede2dSTim Gymnich ret i32 %elt.sign 995edede2dSTim Gymnich} 1005edede2dSTim Gymnich 1015edede2dSTim Gymnichdefine noundef <4 x i32> @sign_half_vector(<4 x half> noundef %a) { 1025edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_half_vector( 1035edede2dSTim Gymnich; CHECK-SAME: <4 x half> noundef [[A:%.*]]) { 1045edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1055edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt <4 x half> zeroinitializer, [[A]] 1065edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x half> [[A]], zeroinitializer 1075edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1085edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1095edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1105edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1115edede2dSTim Gymnich; 1125edede2dSTim Gymnichentry: 1135edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4f16(<4 x half> %a) 1145edede2dSTim Gymnich ret <4 x i32> %elt.sign 1155edede2dSTim Gymnich} 1165edede2dSTim Gymnich 1175edede2dSTim Gymnichdefine noundef <4 x i32> @sign_float_vector(<4 x float> noundef %a) { 1185edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_float_vector( 1195edede2dSTim Gymnich; CHECK-SAME: <4 x float> noundef [[A:%.*]]) { 1205edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1215edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt <4 x float> zeroinitializer, [[A]] 1225edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x float> [[A]], zeroinitializer 1235edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1245edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1255edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1265edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1275edede2dSTim Gymnich; 1285edede2dSTim Gymnichentry: 1295edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4f32(<4 x float> %a) 1305edede2dSTim Gymnich ret <4 x i32> %elt.sign 1315edede2dSTim Gymnich} 1325edede2dSTim Gymnich 1335edede2dSTim Gymnichdefine noundef <4 x i32> @sign_double_vector(<4 x double> noundef %a) { 1345edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_double_vector( 1355edede2dSTim Gymnich; CHECK-SAME: <4 x double> noundef [[A:%.*]]) { 1365edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1375edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = fcmp olt <4 x double> zeroinitializer, [[A]] 1385edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x double> [[A]], zeroinitializer 1395edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1405edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1415edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1425edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1435edede2dSTim Gymnich; 1445edede2dSTim Gymnichentry: 1455edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4f64(<4 x double> %a) 1465edede2dSTim Gymnich ret <4 x i32> %elt.sign 1475edede2dSTim Gymnich} 1485edede2dSTim Gymnich 1495edede2dSTim Gymnichdefine noundef <4 x i32> @sign_i16_vector(<4 x i16> noundef %a) { 1505edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_i16_vector( 1515edede2dSTim Gymnich; CHECK-SAME: <4 x i16> noundef [[A:%.*]]) { 1525edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1535edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt <4 x i16> zeroinitializer, [[A]] 1545edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i16> [[A]], zeroinitializer 1555edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1565edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1575edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1585edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1595edede2dSTim Gymnich; 1605edede2dSTim Gymnichentry: 1615edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4i16(<4 x i16> %a) 1625edede2dSTim Gymnich ret <4 x i32> %elt.sign 1635edede2dSTim Gymnich} 1645edede2dSTim Gymnich 1655edede2dSTim Gymnichdefine noundef <4 x i32> @sign_i32_vector(<4 x i32> noundef %a) { 1665edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_i32_vector( 1675edede2dSTim Gymnich; CHECK-SAME: <4 x i32> noundef [[A:%.*]]) { 1685edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1695edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt <4 x i32> zeroinitializer, [[A]] 1705edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[A]], zeroinitializer 1715edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1725edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1735edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1745edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1755edede2dSTim Gymnich; 1765edede2dSTim Gymnichentry: 1775edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4i32(<4 x i32> %a) 1785edede2dSTim Gymnich ret <4 x i32> %elt.sign 1795edede2dSTim Gymnich} 1805edede2dSTim Gymnich 1815edede2dSTim Gymnichdefine noundef <4 x i32> @sign_i64_vector(<4 x i64> noundef %a) { 1825edede2dSTim Gymnich; CHECK-LABEL: define noundef <4 x i32> @sign_i64_vector( 1835edede2dSTim Gymnich; CHECK-SAME: <4 x i64> noundef [[A:%.*]]) { 1845edede2dSTim Gymnich; CHECK-NEXT: [[ENTRY:.*:]] 1855edede2dSTim Gymnich; CHECK-NEXT: [[TMP0:%.*]] = icmp slt <4 x i64> zeroinitializer, [[A]] 1865edede2dSTim Gymnich; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i64> [[A]], zeroinitializer 1875edede2dSTim Gymnich; CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32> 1885edede2dSTim Gymnich; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i32> 1895edede2dSTim Gymnich; CHECK-NEXT: [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]] 1905edede2dSTim Gymnich; CHECK-NEXT: ret <4 x i32> [[TMP4]] 1915edede2dSTim Gymnich; 1925edede2dSTim Gymnichentry: 1935edede2dSTim Gymnich %elt.sign = call <4 x i32> @llvm.dx.sign.v4i64(<4 x i64> %a) 1945edede2dSTim Gymnich ret <4 x i32> %elt.sign 1955edede2dSTim Gymnich} 1965edede2dSTim Gymnich 1975edede2dSTim Gymnich 1985edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.f16(half) 1995edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.f32(float) 2005edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.f64(double) 2015edede2dSTim Gymnich 2025edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.i16(i16) 2035edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.i32(i32) 2045edede2dSTim Gymnichdeclare i32 @llvm.dx.sign.i64(i64) 2055edede2dSTim Gymnich 2065edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4f16(<4 x half>) 2075edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4f32(<4 x float>) 2085edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4f64(<4 x double>) 2095edede2dSTim Gymnich 2105edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4i16(<4 x i16>) 2115edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4i32(<4 x i32>) 2125edede2dSTim Gymnichdeclare <4 x i32> @llvm.dx.sign.v4i64(<4 x i64>) 213