| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes='function(scalarizer)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,NOLOWER |
| ; RUN: opt -passes='function(scalarizer),module(dxil-op-lower)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,WITHLOWER |
| |
| ; Matrices are flattened to vectors in DXIL, so each matrix shape is exercised |
| ; through its flattened <N x double> form (e.g. double2x2 -> <4 x double>). |
| |
| define noundef <4 x i32> @test_mat2x2(<4 x double> noundef %d) { |
| ; NOLOWER-LABEL: define noundef <4 x i32> @test_mat2x2( |
| ; NOLOWER-SAME: <4 x double> noundef [[D:%.*]]) { |
| ; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <4 x double> [[D]], i64 0 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]]) |
| ; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <4 x double> [[D]], i64 1 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]]) |
| ; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <4 x double> [[D]], i64 2 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]]) |
| ; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <4 x double> [[D]], i64 3 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]]) |
| ; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM14:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM15:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1 |
| ; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM14]] |
| ; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM15]] |
| ; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM16]] |
| ; NOLOWER-NEXT: [[DOTUPTO021:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; NOLOWER-NEXT: [[DOTUPTO122:%.*]] = insertelement <4 x i32> [[DOTUPTO021]], i32 [[DOTI1]], i64 1 |
| ; NOLOWER-NEXT: [[DOTUPTO223:%.*]] = insertelement <4 x i32> [[DOTUPTO122]], i32 [[DOTI2]], i64 2 |
| ; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[DOTUPTO223]], i32 [[DOTI3]], i64 3 |
| ; NOLOWER-NEXT: ret <4 x i32> [[TMP1]] |
| ; |
| ; WITHLOWER-LABEL: define noundef <4 x i32> @test_mat2x2( |
| ; WITHLOWER-SAME: <4 x double> noundef [[D:%.*]]) { |
| ; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <4 x double> [[D]], i64 0 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I027:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]](i32 102, double [[D_I0]]) |
| ; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <4 x double> [[D]], i64 1 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I126:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]]) |
| ; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <4 x double> [[D]], i64 2 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I225:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]]) |
| ; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <4 x double> [[D]], i64 3 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I324:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]]) |
| ; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I027]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I126]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I225]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I324]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I027]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM14:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I126]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM15:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I225]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I324]], 1 |
| ; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM14]] |
| ; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM15]] |
| ; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM16]] |
| ; WITHLOWER-NEXT: [[DOTUPTO021:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; WITHLOWER-NEXT: [[DOTUPTO122:%.*]] = insertelement <4 x i32> [[DOTUPTO021]], i32 [[DOTI1]], i64 1 |
| ; WITHLOWER-NEXT: [[DOTUPTO223:%.*]] = insertelement <4 x i32> [[DOTUPTO122]], i32 [[DOTI2]], i64 2 |
| ; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[DOTUPTO223]], i32 [[DOTI3]], i64 3 |
| ; WITHLOWER-NEXT: ret <4 x i32> [[TMP1]] |
| ; |
| %hlsl.asuint = call { <4 x i32>, <4 x i32> } @llvm.dx.splitdouble.v4i32(<4 x double> %d) |
| %1 = extractvalue { <4 x i32>, <4 x i32> } %hlsl.asuint, 0 |
| %2 = extractvalue { <4 x i32>, <4 x i32> } %hlsl.asuint, 1 |
| %3 = add <4 x i32> %1, %2 |
| ret <4 x i32> %3 |
| } |
| |
| define noundef <6 x i32> @test_mat2x3(<6 x double> noundef %d) { |
| ; NOLOWER-LABEL: define noundef <6 x i32> @test_mat2x3( |
| ; NOLOWER-SAME: <6 x double> noundef [[D:%.*]]) { |
| ; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <6 x double> [[D]], i64 0 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]]) |
| ; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <6 x double> [[D]], i64 1 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]]) |
| ; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <6 x double> [[D]], i64 2 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]]) |
| ; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <6 x double> [[D]], i64 3 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]]) |
| ; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <6 x double> [[D]], i64 4 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]]) |
| ; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <6 x double> [[D]], i64 5 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]]) |
| ; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM17:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM18:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1 |
| ; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM16]] |
| ; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM17]] |
| ; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM18]] |
| ; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM19]] |
| ; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM110]] |
| ; NOLOWER-NEXT: [[DOTUPTO033:%.*]] = insertelement <6 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; NOLOWER-NEXT: [[DOTUPTO134:%.*]] = insertelement <6 x i32> [[DOTUPTO033]], i32 [[DOTI1]], i64 1 |
| ; NOLOWER-NEXT: [[DOTUPTO235:%.*]] = insertelement <6 x i32> [[DOTUPTO134]], i32 [[DOTI2]], i64 2 |
| ; NOLOWER-NEXT: [[DOTUPTO336:%.*]] = insertelement <6 x i32> [[DOTUPTO235]], i32 [[DOTI3]], i64 3 |
| ; NOLOWER-NEXT: [[DOTUPTO437:%.*]] = insertelement <6 x i32> [[DOTUPTO336]], i32 [[DOTI4]], i64 4 |
| ; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <6 x i32> [[DOTUPTO437]], i32 [[DOTI5]], i64 5 |
| ; NOLOWER-NEXT: ret <6 x i32> [[TMP1]] |
| ; |
| ; WITHLOWER-LABEL: define noundef <6 x i32> @test_mat2x3( |
| ; WITHLOWER-SAME: <6 x double> noundef [[D:%.*]]) { |
| ; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <6 x double> [[D]], i64 0 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I043:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]]) |
| ; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <6 x double> [[D]], i64 1 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I142:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]]) |
| ; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <6 x double> [[D]], i64 2 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I241:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]]) |
| ; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <6 x double> [[D]], i64 3 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I340:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]]) |
| ; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <6 x double> [[D]], i64 4 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I439:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]]) |
| ; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <6 x double> [[D]], i64 5 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I538:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]]) |
| ; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I043]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I142]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I241]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I340]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I439]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I538]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I043]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I142]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM17:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I241]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM18:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I340]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I439]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I538]], 1 |
| ; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM16]] |
| ; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM17]] |
| ; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM18]] |
| ; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM19]] |
| ; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM110]] |
| ; WITHLOWER-NEXT: [[DOTUPTO033:%.*]] = insertelement <6 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; WITHLOWER-NEXT: [[DOTUPTO134:%.*]] = insertelement <6 x i32> [[DOTUPTO033]], i32 [[DOTI1]], i64 1 |
| ; WITHLOWER-NEXT: [[DOTUPTO235:%.*]] = insertelement <6 x i32> [[DOTUPTO134]], i32 [[DOTI2]], i64 2 |
| ; WITHLOWER-NEXT: [[DOTUPTO336:%.*]] = insertelement <6 x i32> [[DOTUPTO235]], i32 [[DOTI3]], i64 3 |
| ; WITHLOWER-NEXT: [[DOTUPTO437:%.*]] = insertelement <6 x i32> [[DOTUPTO336]], i32 [[DOTI4]], i64 4 |
| ; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <6 x i32> [[DOTUPTO437]], i32 [[DOTI5]], i64 5 |
| ; WITHLOWER-NEXT: ret <6 x i32> [[TMP1]] |
| ; |
| %hlsl.asuint = call { <6 x i32>, <6 x i32> } @llvm.dx.splitdouble.v6i32(<6 x double> %d) |
| %1 = extractvalue { <6 x i32>, <6 x i32> } %hlsl.asuint, 0 |
| %2 = extractvalue { <6 x i32>, <6 x i32> } %hlsl.asuint, 1 |
| %3 = add <6 x i32> %1, %2 |
| ret <6 x i32> %3 |
| } |
| |
| define noundef <9 x i32> @test_mat3x3(<9 x double> noundef %d) { |
| ; NOLOWER-LABEL: define noundef <9 x i32> @test_mat3x3( |
| ; NOLOWER-SAME: <9 x double> noundef [[D:%.*]]) { |
| ; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <9 x double> [[D]], i64 0 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]]) |
| ; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <9 x double> [[D]], i64 1 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]]) |
| ; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <9 x double> [[D]], i64 2 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]]) |
| ; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <9 x double> [[D]], i64 3 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]]) |
| ; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <9 x double> [[D]], i64 4 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]]) |
| ; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <9 x double> [[D]], i64 5 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]]) |
| ; NOLOWER-NEXT: [[D_I6:%.*]] = extractelement <9 x double> [[D]], i64 6 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I6:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I6]]) |
| ; NOLOWER-NEXT: [[D_I7:%.*]] = extractelement <9 x double> [[D]], i64 7 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I7:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I7]]) |
| ; NOLOWER-NEXT: [[D_I8:%.*]] = extractelement <9 x double> [[D]], i64 8 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I8:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I8]]) |
| ; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM111:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM112:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM113:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM114:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM115:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 1 |
| ; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM19]] |
| ; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM110]] |
| ; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM111]] |
| ; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM112]] |
| ; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM113]] |
| ; NOLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM114]] |
| ; NOLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM115]] |
| ; NOLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM116]] |
| ; NOLOWER-NEXT: [[DOTUPTO051:%.*]] = insertelement <9 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; NOLOWER-NEXT: [[DOTUPTO152:%.*]] = insertelement <9 x i32> [[DOTUPTO051]], i32 [[DOTI1]], i64 1 |
| ; NOLOWER-NEXT: [[DOTUPTO253:%.*]] = insertelement <9 x i32> [[DOTUPTO152]], i32 [[DOTI2]], i64 2 |
| ; NOLOWER-NEXT: [[DOTUPTO354:%.*]] = insertelement <9 x i32> [[DOTUPTO253]], i32 [[DOTI3]], i64 3 |
| ; NOLOWER-NEXT: [[DOTUPTO455:%.*]] = insertelement <9 x i32> [[DOTUPTO354]], i32 [[DOTI4]], i64 4 |
| ; NOLOWER-NEXT: [[DOTUPTO556:%.*]] = insertelement <9 x i32> [[DOTUPTO455]], i32 [[DOTI5]], i64 5 |
| ; NOLOWER-NEXT: [[DOTUPTO657:%.*]] = insertelement <9 x i32> [[DOTUPTO556]], i32 [[DOTI6]], i64 6 |
| ; NOLOWER-NEXT: [[DOTUPTO758:%.*]] = insertelement <9 x i32> [[DOTUPTO657]], i32 [[DOTI7]], i64 7 |
| ; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <9 x i32> [[DOTUPTO758]], i32 [[DOTI8]], i64 8 |
| ; NOLOWER-NEXT: ret <9 x i32> [[TMP1]] |
| ; |
| ; WITHLOWER-LABEL: define noundef <9 x i32> @test_mat3x3( |
| ; WITHLOWER-SAME: <9 x double> noundef [[D:%.*]]) { |
| ; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <9 x double> [[D]], i64 0 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I067:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]]) |
| ; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <9 x double> [[D]], i64 1 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I166:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]]) |
| ; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <9 x double> [[D]], i64 2 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I265:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]]) |
| ; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <9 x double> [[D]], i64 3 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I364:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]]) |
| ; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <9 x double> [[D]], i64 4 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I463:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]]) |
| ; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <9 x double> [[D]], i64 5 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I562:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]]) |
| ; WITHLOWER-NEXT: [[D_I6:%.*]] = extractelement <9 x double> [[D]], i64 6 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I661:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I6]]) |
| ; WITHLOWER-NEXT: [[D_I7:%.*]] = extractelement <9 x double> [[D]], i64 7 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I760:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I7]]) |
| ; WITHLOWER-NEXT: [[D_I8:%.*]] = extractelement <9 x double> [[D]], i64 8 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I859:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I8]]) |
| ; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I067]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I166]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I265]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I364]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I463]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I562]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I661]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I760]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I859]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I067]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I166]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I265]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM111:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I364]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM112:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I463]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM113:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I562]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM114:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I661]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM115:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I760]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I859]], 1 |
| ; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM19]] |
| ; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM110]] |
| ; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM111]] |
| ; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM112]] |
| ; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM113]] |
| ; WITHLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM114]] |
| ; WITHLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM115]] |
| ; WITHLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM116]] |
| ; WITHLOWER-NEXT: [[DOTUPTO051:%.*]] = insertelement <9 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; WITHLOWER-NEXT: [[DOTUPTO152:%.*]] = insertelement <9 x i32> [[DOTUPTO051]], i32 [[DOTI1]], i64 1 |
| ; WITHLOWER-NEXT: [[DOTUPTO253:%.*]] = insertelement <9 x i32> [[DOTUPTO152]], i32 [[DOTI2]], i64 2 |
| ; WITHLOWER-NEXT: [[DOTUPTO354:%.*]] = insertelement <9 x i32> [[DOTUPTO253]], i32 [[DOTI3]], i64 3 |
| ; WITHLOWER-NEXT: [[DOTUPTO455:%.*]] = insertelement <9 x i32> [[DOTUPTO354]], i32 [[DOTI4]], i64 4 |
| ; WITHLOWER-NEXT: [[DOTUPTO556:%.*]] = insertelement <9 x i32> [[DOTUPTO455]], i32 [[DOTI5]], i64 5 |
| ; WITHLOWER-NEXT: [[DOTUPTO657:%.*]] = insertelement <9 x i32> [[DOTUPTO556]], i32 [[DOTI6]], i64 6 |
| ; WITHLOWER-NEXT: [[DOTUPTO758:%.*]] = insertelement <9 x i32> [[DOTUPTO657]], i32 [[DOTI7]], i64 7 |
| ; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <9 x i32> [[DOTUPTO758]], i32 [[DOTI8]], i64 8 |
| ; WITHLOWER-NEXT: ret <9 x i32> [[TMP1]] |
| ; |
| %hlsl.asuint = call { <9 x i32>, <9 x i32> } @llvm.dx.splitdouble.v9i32(<9 x double> %d) |
| %1 = extractvalue { <9 x i32>, <9 x i32> } %hlsl.asuint, 0 |
| %2 = extractvalue { <9 x i32>, <9 x i32> } %hlsl.asuint, 1 |
| %3 = add <9 x i32> %1, %2 |
| ret <9 x i32> %3 |
| } |
| |
| define noundef <16 x i32> @test_mat4x4(<16 x double> noundef %d) { |
| ; NOLOWER-LABEL: define noundef <16 x i32> @test_mat4x4( |
| ; NOLOWER-SAME: <16 x double> noundef [[D:%.*]]) { |
| ; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <16 x double> [[D]], i64 0 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]]) |
| ; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <16 x double> [[D]], i64 1 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]]) |
| ; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <16 x double> [[D]], i64 2 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]]) |
| ; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <16 x double> [[D]], i64 3 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]]) |
| ; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <16 x double> [[D]], i64 4 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]]) |
| ; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <16 x double> [[D]], i64 5 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]]) |
| ; NOLOWER-NEXT: [[D_I6:%.*]] = extractelement <16 x double> [[D]], i64 6 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I6:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I6]]) |
| ; NOLOWER-NEXT: [[D_I7:%.*]] = extractelement <16 x double> [[D]], i64 7 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I7:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I7]]) |
| ; NOLOWER-NEXT: [[D_I8:%.*]] = extractelement <16 x double> [[D]], i64 8 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I8:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I8]]) |
| ; NOLOWER-NEXT: [[D_I9:%.*]] = extractelement <16 x double> [[D]], i64 9 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I9:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I9]]) |
| ; NOLOWER-NEXT: [[D_I10:%.*]] = extractelement <16 x double> [[D]], i64 10 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I10:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I10]]) |
| ; NOLOWER-NEXT: [[D_I11:%.*]] = extractelement <16 x double> [[D]], i64 11 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I11:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I11]]) |
| ; NOLOWER-NEXT: [[D_I12:%.*]] = extractelement <16 x double> [[D]], i64 12 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I12:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I12]]) |
| ; NOLOWER-NEXT: [[D_I13:%.*]] = extractelement <16 x double> [[D]], i64 13 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I13:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I13]]) |
| ; NOLOWER-NEXT: [[D_I14:%.*]] = extractelement <16 x double> [[D]], i64 14 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I14:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I14]]) |
| ; NOLOWER-NEXT: [[D_I15:%.*]] = extractelement <16 x double> [[D]], i64 15 |
| ; NOLOWER-NEXT: [[HLSL_ASUINT_I15:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I15]]) |
| ; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM09:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I9]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM010:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I10]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM011:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I11]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM012:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I12]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM013:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I13]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM014:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I14]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM015:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I15]], 0 |
| ; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM117:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM118:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM119:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM120:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM121:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM122:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM123:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM124:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I9]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM125:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I10]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM126:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I11]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM127:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I12]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM128:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I13]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM129:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I14]], 1 |
| ; NOLOWER-NEXT: [[DOTELEM130:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I15]], 1 |
| ; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM116]] |
| ; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM117]] |
| ; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM118]] |
| ; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM119]] |
| ; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM120]] |
| ; NOLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM121]] |
| ; NOLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM122]] |
| ; NOLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM123]] |
| ; NOLOWER-NEXT: [[DOTI9:%.*]] = add i32 [[DOTELEM09]], [[DOTELEM124]] |
| ; NOLOWER-NEXT: [[DOTI10:%.*]] = add i32 [[DOTELEM010]], [[DOTELEM125]] |
| ; NOLOWER-NEXT: [[DOTI11:%.*]] = add i32 [[DOTELEM011]], [[DOTELEM126]] |
| ; NOLOWER-NEXT: [[DOTI12:%.*]] = add i32 [[DOTELEM012]], [[DOTELEM127]] |
| ; NOLOWER-NEXT: [[DOTI13:%.*]] = add i32 [[DOTELEM013]], [[DOTELEM128]] |
| ; NOLOWER-NEXT: [[DOTI14:%.*]] = add i32 [[DOTELEM014]], [[DOTELEM129]] |
| ; NOLOWER-NEXT: [[DOTI15:%.*]] = add i32 [[DOTELEM015]], [[DOTELEM130]] |
| ; NOLOWER-NEXT: [[DOTUPTO093:%.*]] = insertelement <16 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; NOLOWER-NEXT: [[DOTUPTO194:%.*]] = insertelement <16 x i32> [[DOTUPTO093]], i32 [[DOTI1]], i64 1 |
| ; NOLOWER-NEXT: [[DOTUPTO295:%.*]] = insertelement <16 x i32> [[DOTUPTO194]], i32 [[DOTI2]], i64 2 |
| ; NOLOWER-NEXT: [[DOTUPTO396:%.*]] = insertelement <16 x i32> [[DOTUPTO295]], i32 [[DOTI3]], i64 3 |
| ; NOLOWER-NEXT: [[DOTUPTO497:%.*]] = insertelement <16 x i32> [[DOTUPTO396]], i32 [[DOTI4]], i64 4 |
| ; NOLOWER-NEXT: [[DOTUPTO598:%.*]] = insertelement <16 x i32> [[DOTUPTO497]], i32 [[DOTI5]], i64 5 |
| ; NOLOWER-NEXT: [[DOTUPTO699:%.*]] = insertelement <16 x i32> [[DOTUPTO598]], i32 [[DOTI6]], i64 6 |
| ; NOLOWER-NEXT: [[DOTUPTO7100:%.*]] = insertelement <16 x i32> [[DOTUPTO699]], i32 [[DOTI7]], i64 7 |
| ; NOLOWER-NEXT: [[DOTUPTO8101:%.*]] = insertelement <16 x i32> [[DOTUPTO7100]], i32 [[DOTI8]], i64 8 |
| ; NOLOWER-NEXT: [[DOTUPTO9102:%.*]] = insertelement <16 x i32> [[DOTUPTO8101]], i32 [[DOTI9]], i64 9 |
| ; NOLOWER-NEXT: [[DOTUPTO10103:%.*]] = insertelement <16 x i32> [[DOTUPTO9102]], i32 [[DOTI10]], i64 10 |
| ; NOLOWER-NEXT: [[DOTUPTO11104:%.*]] = insertelement <16 x i32> [[DOTUPTO10103]], i32 [[DOTI11]], i64 11 |
| ; NOLOWER-NEXT: [[DOTUPTO12105:%.*]] = insertelement <16 x i32> [[DOTUPTO11104]], i32 [[DOTI12]], i64 12 |
| ; NOLOWER-NEXT: [[DOTUPTO13106:%.*]] = insertelement <16 x i32> [[DOTUPTO12105]], i32 [[DOTI13]], i64 13 |
| ; NOLOWER-NEXT: [[DOTUPTO14107:%.*]] = insertelement <16 x i32> [[DOTUPTO13106]], i32 [[DOTI14]], i64 14 |
| ; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <16 x i32> [[DOTUPTO14107]], i32 [[DOTI15]], i64 15 |
| ; NOLOWER-NEXT: ret <16 x i32> [[TMP1]] |
| ; |
| ; WITHLOWER-LABEL: define noundef <16 x i32> @test_mat4x4( |
| ; WITHLOWER-SAME: <16 x double> noundef [[D:%.*]]) { |
| ; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <16 x double> [[D]], i64 0 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I0123:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]]) |
| ; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <16 x double> [[D]], i64 1 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I1122:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]]) |
| ; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <16 x double> [[D]], i64 2 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I2121:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]]) |
| ; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <16 x double> [[D]], i64 3 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I3120:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]]) |
| ; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <16 x double> [[D]], i64 4 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I4119:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]]) |
| ; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <16 x double> [[D]], i64 5 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I5118:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]]) |
| ; WITHLOWER-NEXT: [[D_I6:%.*]] = extractelement <16 x double> [[D]], i64 6 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I6117:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I6]]) |
| ; WITHLOWER-NEXT: [[D_I7:%.*]] = extractelement <16 x double> [[D]], i64 7 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I7116:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I7]]) |
| ; WITHLOWER-NEXT: [[D_I8:%.*]] = extractelement <16 x double> [[D]], i64 8 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I8115:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I8]]) |
| ; WITHLOWER-NEXT: [[D_I9:%.*]] = extractelement <16 x double> [[D]], i64 9 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I9114:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I9]]) |
| ; WITHLOWER-NEXT: [[D_I10:%.*]] = extractelement <16 x double> [[D]], i64 10 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I10113:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I10]]) |
| ; WITHLOWER-NEXT: [[D_I11:%.*]] = extractelement <16 x double> [[D]], i64 11 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I11112:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I11]]) |
| ; WITHLOWER-NEXT: [[D_I12:%.*]] = extractelement <16 x double> [[D]], i64 12 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I12111:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I12]]) |
| ; WITHLOWER-NEXT: [[D_I13:%.*]] = extractelement <16 x double> [[D]], i64 13 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I13110:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I13]]) |
| ; WITHLOWER-NEXT: [[D_I14:%.*]] = extractelement <16 x double> [[D]], i64 14 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I14109:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I14]]) |
| ; WITHLOWER-NEXT: [[D_I15:%.*]] = extractelement <16 x double> [[D]], i64 15 |
| ; WITHLOWER-NEXT: [[HLSL_ASUINT_I15108:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I15]]) |
| ; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I0123]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I1122]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I2121]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I3120]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I4119]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I5118]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I6117]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I7116]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I8115]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM09:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I9114]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM010:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I10113]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM011:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I11112]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM012:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I12111]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM013:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I13110]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM014:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I14109]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM015:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I15108]], 0 |
| ; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I0123]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I1122]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM117:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I2121]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM118:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I3120]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM119:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I4119]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM120:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I5118]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM121:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I6117]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM122:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I7116]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM123:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I8115]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM124:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I9114]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM125:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I10113]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM126:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I11112]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM127:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I12111]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM128:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I13110]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM129:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I14109]], 1 |
| ; WITHLOWER-NEXT: [[DOTELEM130:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I15108]], 1 |
| ; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]] |
| ; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM116]] |
| ; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM117]] |
| ; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM118]] |
| ; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM119]] |
| ; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM120]] |
| ; WITHLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM121]] |
| ; WITHLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM122]] |
| ; WITHLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM123]] |
| ; WITHLOWER-NEXT: [[DOTI9:%.*]] = add i32 [[DOTELEM09]], [[DOTELEM124]] |
| ; WITHLOWER-NEXT: [[DOTI10:%.*]] = add i32 [[DOTELEM010]], [[DOTELEM125]] |
| ; WITHLOWER-NEXT: [[DOTI11:%.*]] = add i32 [[DOTELEM011]], [[DOTELEM126]] |
| ; WITHLOWER-NEXT: [[DOTI12:%.*]] = add i32 [[DOTELEM012]], [[DOTELEM127]] |
| ; WITHLOWER-NEXT: [[DOTI13:%.*]] = add i32 [[DOTELEM013]], [[DOTELEM128]] |
| ; WITHLOWER-NEXT: [[DOTI14:%.*]] = add i32 [[DOTELEM014]], [[DOTELEM129]] |
| ; WITHLOWER-NEXT: [[DOTI15:%.*]] = add i32 [[DOTELEM015]], [[DOTELEM130]] |
| ; WITHLOWER-NEXT: [[DOTUPTO093:%.*]] = insertelement <16 x i32> poison, i32 [[DOTI0]], i64 0 |
| ; WITHLOWER-NEXT: [[DOTUPTO194:%.*]] = insertelement <16 x i32> [[DOTUPTO093]], i32 [[DOTI1]], i64 1 |
| ; WITHLOWER-NEXT: [[DOTUPTO295:%.*]] = insertelement <16 x i32> [[DOTUPTO194]], i32 [[DOTI2]], i64 2 |
| ; WITHLOWER-NEXT: [[DOTUPTO396:%.*]] = insertelement <16 x i32> [[DOTUPTO295]], i32 [[DOTI3]], i64 3 |
| ; WITHLOWER-NEXT: [[DOTUPTO497:%.*]] = insertelement <16 x i32> [[DOTUPTO396]], i32 [[DOTI4]], i64 4 |
| ; WITHLOWER-NEXT: [[DOTUPTO598:%.*]] = insertelement <16 x i32> [[DOTUPTO497]], i32 [[DOTI5]], i64 5 |
| ; WITHLOWER-NEXT: [[DOTUPTO699:%.*]] = insertelement <16 x i32> [[DOTUPTO598]], i32 [[DOTI6]], i64 6 |
| ; WITHLOWER-NEXT: [[DOTUPTO7100:%.*]] = insertelement <16 x i32> [[DOTUPTO699]], i32 [[DOTI7]], i64 7 |
| ; WITHLOWER-NEXT: [[DOTUPTO8101:%.*]] = insertelement <16 x i32> [[DOTUPTO7100]], i32 [[DOTI8]], i64 8 |
| ; WITHLOWER-NEXT: [[DOTUPTO9102:%.*]] = insertelement <16 x i32> [[DOTUPTO8101]], i32 [[DOTI9]], i64 9 |
| ; WITHLOWER-NEXT: [[DOTUPTO10103:%.*]] = insertelement <16 x i32> [[DOTUPTO9102]], i32 [[DOTI10]], i64 10 |
| ; WITHLOWER-NEXT: [[DOTUPTO11104:%.*]] = insertelement <16 x i32> [[DOTUPTO10103]], i32 [[DOTI11]], i64 11 |
| ; WITHLOWER-NEXT: [[DOTUPTO12105:%.*]] = insertelement <16 x i32> [[DOTUPTO11104]], i32 [[DOTI12]], i64 12 |
| ; WITHLOWER-NEXT: [[DOTUPTO13106:%.*]] = insertelement <16 x i32> [[DOTUPTO12105]], i32 [[DOTI13]], i64 13 |
| ; WITHLOWER-NEXT: [[DOTUPTO14107:%.*]] = insertelement <16 x i32> [[DOTUPTO13106]], i32 [[DOTI14]], i64 14 |
| ; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <16 x i32> [[DOTUPTO14107]], i32 [[DOTI15]], i64 15 |
| ; WITHLOWER-NEXT: ret <16 x i32> [[TMP1]] |
| ; |
| %hlsl.asuint = call { <16 x i32>, <16 x i32> } @llvm.dx.splitdouble.v16i32(<16 x double> %d) |
| %1 = extractvalue { <16 x i32>, <16 x i32> } %hlsl.asuint, 0 |
| %2 = extractvalue { <16 x i32>, <16 x i32> } %hlsl.asuint, 1 |
| %3 = add <16 x i32> %1, %2 |
| ret <16 x i32> %3 |
| } |
| |
| ; WITHLOWER: declare %dx.types.splitdouble @dx.op.splitDouble.f64(i32, double) #[[#ATTR0:]] |
| ; WITHLOWER: attributes #[[#ATTR0]] = { nounwind memory(none) } |
| |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: |
| ; CHECK: {{.*}} |