brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · a623321 Raw
104 lines · plain
1; RUN: opt -S  -dxil-intrinsic-expansion -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,EXPCHECK2; RUN: opt -S  -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,DOPCHECK3 4; Make sure dxil operation function calls for dot are generated for float type vectors.5 6; CHECK-LABEL: dot_half27define noundef half @dot_half2(<2 x half> noundef %a, <2 x half> noundef %b) {8entry:9; CHECK: [[A1:%.*]] = extractelement <2 x half> %a, i32 010; CHECK: [[A2:%.*]] = extractelement <2 x half> %a, i32 111; CHECK: [[B1:%.*]] = extractelement <2 x half> %b, i32 012; CHECK: [[B2:%.*]] = extractelement <2 x half> %b, i32 113; DOPCHECK: call half @dx.op.dot2.f16(i32 54, half [[A1]], half [[A2]], half [[B1]], half [[B2]]) #[[#ATTR:]]14; EXPCHECK: call half @llvm.dx.dot2.f16(half [[A1]], half [[A2]], half [[B1]], half [[B2]])15  %dx.dot = call half @llvm.dx.fdot.v2f16(<2 x half> %a, <2 x half> %b)16  ret half %dx.dot17}18 19; CHECK-LABEL: dot_half320define noundef half @dot_half3(<3 x half> noundef %a, <3 x half> noundef %b) {21entry:22; CHECK: extractelement <3 x half> %a, i32 023; CHECK: extractelement <3 x half> %a, i32 124; CHECK: extractelement <3 x half> %a, i32 225; CHECK: extractelement <3 x half> %b, i32 026; CHECK: extractelement <3 x half> %b, i32 127; CHECK: extractelement <3 x half> %b, i32 228; DOPCHECK: call half @dx.op.dot3.f16(i32 55, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}) #[[#ATTR]]29; EXPCHECK: call half @llvm.dx.dot3.f16(half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})30  %dx.dot = call half @llvm.dx.fdot.v3f16(<3 x half> %a, <3 x half> %b)31  ret half %dx.dot32}33 34; CHECK-LABEL: dot_half435define noundef half @dot_half4(<4 x half> noundef %a, <4 x half> noundef %b) {36entry:37; CHECK: extractelement <4 x half> %a, i32 038; CHECK: extractelement <4 x half> %a, i32 139; CHECK: extractelement <4 x half> %a, i32 240; CHECK: extractelement <4 x half> %a, i32 341; CHECK: extractelement <4 x half> %b, i32 042; CHECK: extractelement <4 x half> %b, i32 143; CHECK: extractelement <4 x half> %b, i32 244; CHECK: extractelement <4 x half> %b, i32 345; DOPCHECK: call half @dx.op.dot4.f16(i32 56, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}) #[[#ATTR]]46; EXPCHECK: call half @llvm.dx.dot4.f16(half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})47  %dx.dot = call half @llvm.dx.fdot.v4f16(<4 x half> %a, <4 x half> %b)48  ret half %dx.dot49}50 51; CHECK-LABEL: dot_float252define noundef float @dot_float2(<2 x float> noundef %a, <2 x float> noundef %b) {53entry:54; CHECK: extractelement <2 x float> %a, i32 055; CHECK: extractelement <2 x float> %a, i32 156; CHECK: extractelement <2 x float> %b, i32 057; CHECK: extractelement <2 x float> %b, i32 158; DOPCHECK: call float @dx.op.dot2.f32(i32 54, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}) #[[#ATTR]]59; EXPCHECK: call float @llvm.dx.dot2.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})60  %dx.dot = call float @llvm.dx.fdot.v2f32(<2 x float> %a, <2 x float> %b)61  ret float %dx.dot62}63 64; CHECK-LABEL: dot_float365define noundef float @dot_float3(<3 x float> noundef %a, <3 x float> noundef %b) {66entry:67; CHECK: extractelement <3 x float> %a, i32 068; CHECK: extractelement <3 x float> %a, i32 169; CHECK: extractelement <3 x float> %a, i32 270; CHECK: extractelement <3 x float> %b, i32 071; CHECK: extractelement <3 x float> %b, i32 172; CHECK: extractelement <3 x float> %b, i32 273; DOPCHECK: call float @dx.op.dot3.f32(i32 55, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}) #[[#ATTR]]74; EXPCHECK: call float @llvm.dx.dot3.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})75  %dx.dot = call float @llvm.dx.fdot.v3f32(<3 x float> %a, <3 x float> %b)76  ret float %dx.dot77}78 79; CHECK-LABEL: dot_float480define noundef float @dot_float4(<4 x float> noundef %a, <4 x float> noundef %b) {81entry:82; CHECK: extractelement <4 x float> %a, i32 083; CHECK: extractelement <4 x float> %a, i32 184; CHECK: extractelement <4 x float> %a, i32 285; CHECK: extractelement <4 x float> %a, i32 386; CHECK: extractelement <4 x float> %b, i32 087; CHECK: extractelement <4 x float> %b, i32 188; CHECK: extractelement <4 x float> %b, i32 289; CHECK: extractelement <4 x float> %b, i32 390; DOPCHECK: call float @dx.op.dot4.f32(i32 56, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}) #[[#ATTR]]91; EXPCHECK: call float @llvm.dx.dot4.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})92  %dx.dot = call float @llvm.dx.fdot.v4f32(<4 x float> %a, <4 x float> %b)93  ret float %dx.dot94}95 96; DOPCHECK: attributes #[[#ATTR]] = {{{.*}} memory(none) {{.*}}}97 98declare half  @llvm.dx.fdot.v2f16(<2 x half> , <2 x half> )99declare half  @llvm.dx.fdot.v3f16(<3 x half> , <3 x half> )100declare half  @llvm.dx.fdot.v4f16(<4 x half> , <4 x half> )101declare float @llvm.dx.fdot.v2f32(<2 x float>, <2 x float>)102declare float @llvm.dx.fdot.v3f32(<3 x float>, <3 x float>)103declare float @llvm.dx.fdot.v4f32(<4 x float>, <4 x float>)104