// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -fnative-int16-type -emit-llvm -O1 -o - | FileCheck %s // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-vulkan-library %s -fnative-half-type -fnative-int16-type -emit-llvm -O0 -o - | FileCheck %s --check-prefix=SPIRV // CHECK: define {{.*}} <4 x i32> {{.*}}test_mat2x2{{.*}}(<4 x double> {{.*}} [[VALD:%.*]]) // CHECK: [[VALRET:%.*]] = {{.*}} call { <4 x i32>, <4 x i32> } @llvm.dx.splitdouble.v4i32(<4 x double> [[VALD]]) // CHECK-NEXT: extractvalue { <4 x i32>, <4 x i32> } [[VALRET]], 0 // CHECK-NEXT: extractvalue { <4 x i32>, <4 x i32> } [[VALRET]], 1 // // SPIRV: define hidden spir_func {{.*}} <4 x i32> {{.*}}test_mat2x2{{.*}}(<4 x double> {{.*}} [[VALD:%.*]]) // SPIRV-NOT: @llvm.dx.splitdouble // SPIRV: [[LOAD:%.*]] = load <4 x double>, ptr [[VALD]].addr, align {{[0-9]+}} // SPIRV-NEXT: [[CAST:%.*]] = bitcast <4 x double> [[LOAD]] to <8 x i32> // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <8 x i32> [[CAST]], <8 x i32> poison, <4 x i32> // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <8 x i32> [[CAST]], <8 x i32> poison, <4 x i32> uint2x2 test_mat2x2(double2x2 D) { uint2x2 A, B; asuint(D, A, B); return A + B; } // CHECK: define {{.*}} <6 x i32> {{.*}}test_mat2x3{{.*}}(<6 x double> {{.*}} [[VALD:%.*]]) // CHECK: [[VALRET:%.*]] = {{.*}} call { <6 x i32>, <6 x i32> } @llvm.dx.splitdouble.v6i32(<6 x double> [[VALD]]) // CHECK-NEXT: extractvalue { <6 x i32>, <6 x i32> } [[VALRET]], 0 // CHECK-NEXT: extractvalue { <6 x i32>, <6 x i32> } [[VALRET]], 1 // // SPIRV: define hidden spir_func {{.*}} <6 x i32> {{.*}}test_mat2x3{{.*}}(<6 x double> {{.*}} [[VALD:%.*]]) // SPIRV-NOT: @llvm.dx.splitdouble // SPIRV: [[LOAD:%.*]] = load <6 x double>, ptr [[VALD]].addr, align {{[0-9]+}} // SPIRV-NEXT: [[CAST:%.*]] = bitcast <6 x double> [[LOAD]] to <12 x i32> // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <12 x i32> [[CAST]], <12 x i32> poison, <6 x i32> // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <12 x i32> [[CAST]], <12 x i32> poison, <6 x i32> uint2x3 test_mat2x3(double2x3 D) { uint2x3 A, B; asuint(D, A, B); return A + B; } // CHECK: define {{.*}} <9 x i32> {{.*}}test_mat3x3{{.*}}(<9 x double> {{.*}} [[VALD:%.*]]) // CHECK: [[VALRET:%.*]] = {{.*}} call { <9 x i32>, <9 x i32> } @llvm.dx.splitdouble.v9i32(<9 x double> [[VALD]]) // CHECK-NEXT: extractvalue { <9 x i32>, <9 x i32> } [[VALRET]], 0 // CHECK-NEXT: extractvalue { <9 x i32>, <9 x i32> } [[VALRET]], 1 // // SPIRV: define hidden spir_func {{.*}} <9 x i32> {{.*}}test_mat3x3{{.*}}(<9 x double> {{.*}} [[VALD:%.*]]) // SPIRV-NOT: @llvm.dx.splitdouble // SPIRV: [[LOAD:%.*]] = load <9 x double>, ptr [[VALD]].addr, align {{[0-9]+}} // SPIRV-NEXT: [[CAST:%.*]] = bitcast <9 x double> [[LOAD]] to <18 x i32> // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <18 x i32> [[CAST]], <18 x i32> poison, <9 x i32> // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <18 x i32> [[CAST]], <18 x i32> poison, <9 x i32> uint3x3 test_mat3x3(double3x3 D) { uint3x3 A, B; asuint(D, A, B); return A + B; } // CHECK: define {{.*}} <16 x i32> {{.*}}test_mat4x4{{.*}}(<16 x double> {{.*}} [[VALD:%.*]]) // CHECK: [[VALRET:%.*]] = {{.*}} call { <16 x i32>, <16 x i32> } @llvm.dx.splitdouble.v16i32(<16 x double> [[VALD]]) // CHECK-NEXT: extractvalue { <16 x i32>, <16 x i32> } [[VALRET]], 0 // CHECK-NEXT: extractvalue { <16 x i32>, <16 x i32> } [[VALRET]], 1 // // SPIRV: define hidden spir_func {{.*}} <16 x i32> {{.*}}test_mat4x4{{.*}}(<16 x double> {{.*}} [[VALD:%.*]]) // SPIRV-NOT: @llvm.dx.splitdouble // SPIRV: [[LOAD:%.*]] = load <16 x double>, ptr [[VALD]].addr, align {{[0-9]+}} // SPIRV-NEXT: [[CAST:%.*]] = bitcast <16 x double> [[LOAD]] to <32 x i32> // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <32 x i32> [[CAST]], <32 x i32> poison, <16 x i32> // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <32 x i32> [[CAST]], <32 x i32> poison, <16 x i32> uint4x4 test_mat4x4(double4x4 D) { uint4x4 A, B; asuint(D, A, B); return A + B; }