brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 76516a2 Raw
158 lines · plain
1; RUN: opt -S -scalarizer -dxil-op-lower < %s | FileCheck %s2 3; Make sure dxil operation function calls for round are generated for float and half.4 5target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"6target triple = "dxil-pc-shadermodel6.7-library"7; Function Attrs: noinline nounwind optnone8define noundef i16 @umad_ushort(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) #0 {9entry:10  ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR:]]11  %p2.addr = alloca i16, align 212  %p1.addr = alloca i16, align 213  %p0.addr = alloca i16, align 214  store i16 %p2, ptr %p2.addr, align 215  store i16 %p1, ptr %p1.addr, align 216  store i16 %p0, ptr %p0.addr, align 217  %0 = load i16, ptr %p0.addr, align 218  %1 = load i16, ptr %p1.addr, align 219  %2 = load i16, ptr %p2.addr, align 220  %dx.umad = call i16 @llvm.dx.umad.i16(i16 %0, i16 %1, i16 %2)21  ret i16 %dx.umad22}23 24; Function Attrs: nocallback nofree nosync nounwind willreturn25declare i16 @llvm.dx.umad.i16(i16, i16, i16) #126 27; Function Attrs: noinline nounwind optnone28define noundef i32 @umad_uint(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) #0 {29entry:30  ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]31  %p2.addr = alloca i32, align 432  %p1.addr = alloca i32, align 433  %p0.addr = alloca i32, align 434  store i32 %p2, ptr %p2.addr, align 435  store i32 %p1, ptr %p1.addr, align 436  store i32 %p0, ptr %p0.addr, align 437  %0 = load i32, ptr %p0.addr, align 438  %1 = load i32, ptr %p1.addr, align 439  %2 = load i32, ptr %p2.addr, align 440  %dx.umad = call i32 @llvm.dx.umad.i32(i32 %0, i32 %1, i32 %2)41  ret i32 %dx.umad42}43 44; Function Attrs: nocallback nofree nosync nounwind willreturn45declare i32 @llvm.dx.umad.i32(i32, i32, i32) #146 47; Function Attrs: noinline nounwind optnone48define noundef i64 @umad_uint64(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) #0 {49entry:50  ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]51  %p2.addr = alloca i64, align 852  %p1.addr = alloca i64, align 853  %p0.addr = alloca i64, align 854  store i64 %p2, ptr %p2.addr, align 855  store i64 %p1, ptr %p1.addr, align 856  store i64 %p0, ptr %p0.addr, align 857  %0 = load i64, ptr %p0.addr, align 858  %1 = load i64, ptr %p1.addr, align 859  %2 = load i64, ptr %p2.addr, align 860  %dx.umad = call i64 @llvm.dx.umad.i64(i64 %0, i64 %1, i64 %2)61  ret i64 %dx.umad62}63 64; Function Attrs: nocallback nofree nosync nounwind willreturn65declare i64 @llvm.dx.umad.i64(i64, i64, i64) #166 67; Function Attrs: noinline nounwind optnone68define noundef <4 x i16> @umad_uint16_t4(<4 x i16> noundef %p0, <4 x i16> noundef %p1, <4 x i16> noundef %p2) #0 {69entry:70  ; CHECK: extractelement <4 x i16> %p0, i64 071  ; CHECK: extractelement <4 x i16> %p1, i64 072  ; CHECK: extractelement <4 x i16> %p2, i64 073  ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]74  ; CHECK: extractelement <4 x i16> %p0, i64 175  ; CHECK: extractelement <4 x i16> %p1, i64 176  ; CHECK: extractelement <4 x i16> %p2, i64 177  ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]78  ; CHECK: extractelement <4 x i16> %p0, i64 279  ; CHECK: extractelement <4 x i16> %p1, i64 280  ; CHECK: extractelement <4 x i16> %p2, i64 281  ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]82  ; CHECK: extractelement <4 x i16> %p0, i64 383  ; CHECK: extractelement <4 x i16> %p1, i64 384  ; CHECK: extractelement <4 x i16> %p2, i64 385  ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]86  ; CHECK: insertelement <4 x i16> poison, i16 %{{.*}}, i64 087  ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 188  ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 289  ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 390  %dx.umad = call <4 x i16> @llvm.dx.umad.v4i16(<4 x i16> %p0, <4 x i16> %p1, <4 x i16> %p2)91  ret <4 x i16> %dx.umad92}93 94; Function Attrs: nocallback nofree nosync nounwind willreturn95declare <4 x i16> @llvm.dx.umad.v4i16(<4 x i16>, <4 x i16>, <4 x i16>) #196 97; Function Attrs: noinline nounwind optnone98define noundef <4 x i32> @umad_uint4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) #0 {99entry:100  ; CHECK: extractelement <4 x i32> %p0, i64 0101  ; CHECK: extractelement <4 x i32> %p1, i64 0102  ; CHECK: extractelement <4 x i32> %p2, i64 0103  ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]104  ; CHECK: extractelement <4 x i32> %p0, i64 1105  ; CHECK: extractelement <4 x i32> %p1, i64 1106  ; CHECK: extractelement <4 x i32> %p2, i64 1107  ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]108  ; CHECK: extractelement <4 x i32> %p0, i64 2109  ; CHECK: extractelement <4 x i32> %p1, i64 2110  ; CHECK: extractelement <4 x i32> %p2, i64 2111  ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]112  ; CHECK: extractelement <4 x i32> %p0, i64 3113  ; CHECK: extractelement <4 x i32> %p1, i64 3114  ; CHECK: extractelement <4 x i32> %p2, i64 3115  ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]116  ; CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i64 0117  ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 1118  ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 2119  ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 3120  %dx.umad = call <4 x i32> @llvm.dx.umad.v4i32(<4 x i32> %p0, <4 x i32> %p1, <4 x i32> %p2)121  ret <4 x i32> %dx.umad122}123 124; Function Attrs: nocallback nofree nosync nounwind willreturn125declare <4 x i32> @llvm.dx.umad.v4i32(<4 x i32>, <4 x i32>, <4 x i32>) #1126 127; Function Attrs: noinline nounwind optnone128define noundef <4 x i64> @umad_uint64_t4(<4 x i64> noundef %p0, <4 x i64> noundef %p1, <4 x i64> noundef %p2) #0 {129entry:130  ; CHECK: extractelement <4 x i64> %p0, i64 0131  ; CHECK: extractelement <4 x i64> %p1, i64 0132  ; CHECK: extractelement <4 x i64> %p2, i64 0133  ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]134  ; CHECK: extractelement <4 x i64> %p0, i64 1135  ; CHECK: extractelement <4 x i64> %p1, i64 1136  ; CHECK: extractelement <4 x i64> %p2, i64 1137  ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]138  ; CHECK: extractelement <4 x i64> %p0, i64 2139  ; CHECK: extractelement <4 x i64> %p1, i64 2140  ; CHECK: extractelement <4 x i64> %p2, i64 2141  ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]142  ; CHECK: extractelement <4 x i64> %p0, i64 3143  ; CHECK: extractelement <4 x i64> %p1, i64 3144  ; CHECK: extractelement <4 x i64> %p2, i64 3145  ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]146  ; CHECK: insertelement <4 x i64> poison, i64 %{{.*}}, i64 0147  ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 1148  ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 2149  ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 3150  %dx.umad = call <4 x i64> @llvm.dx.umad.v4i64(<4 x i64> %p0, <4 x i64> %p1, <4 x i64> %p2)151  ret <4 x i64> %dx.umad152}153 154; Function Attrs: nocallback nofree nosync nounwind willreturn155declare <4 x i64> @llvm.dx.umad.v4i64(<4 x i64>, <4 x i64>, <4 x i64>) #1156 157; CHECK: attributes #[[#ATTR]] = {{{.*}} memory(none) {{.*}}}158