xref: /llvm-project/llvm/test/CodeGen/DirectX/sign.ll (revision 7d0ca6019d1fce3dc321d7ec051759ba26e862b6)
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