blob: da4a522ea28ea8211ac7bbc202ca5448e668437b [file]
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -disable-llvm-passes \
// RUN: -emit-llvm -finclude-default-header -o - %s | FileCheck %s --check-prefix=CHECK,COL-CHECK
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -disable-llvm-passes \
// RUN: -emit-llvm -finclude-default-header -fmatrix-memory-layout=row-major -o - %s \
// RUN: | FileCheck %s --check-prefix=CHECK,ROW-CHECK
// Verify that matrix initializer lists store elements in the correct memory
// layout. The initializer list {1,2,3,4,5,6} for a float2x3 (2 rows, 3 cols)
// is in row-major order: row0=[1,2,3], row1=[4,5,6].
//
// With column-major (default) memory layout, the stored vector should be
// reordered to: col0=[1,4], col1=[2,5], col2=[3,6] = <1,4,2,5,3,6>.
//
// With row-major memory layout, the stored vector stays as-is: <1,2,3,4,5,6>.
export float test_row0_col2() {
// CHECK-LABEL: define {{.*}} float @_Z14test_row0_col2v
// COL-CHECK: store <6 x float> <float 1.000000e+00, float 4.000000e+00, float 2.000000e+00, float 5.000000e+00, float 3.000000e+00, float 6.000000e+00>
// COL-CHECK: extractelement <6 x float> %{{.*}}, i32 4
// ROW-CHECK: store <6 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00>
// ROW-CHECK: extractelement <6 x float> %{{.*}}, i32 2
float2x3 M = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
// Row 0, Col 2 in row-major is the 3rd element = 3.0
return M[0][2];
}
export float test_row1_col0() {
// CHECK-LABEL: define {{.*}} float @_Z14test_row1_col0v
// COL-CHECK: store <6 x float> <float 1.000000e+00, float 4.000000e+00, float 2.000000e+00, float 5.000000e+00, float 3.000000e+00, float 6.000000e+00>
// COL-CHECK: extractelement <6 x float> %{{.*}}, i32 1
// ROW-CHECK: store <6 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00>
// ROW-CHECK: extractelement <6 x float> %{{.*}}, i32 3
float2x3 M = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
// Row 1, Col 0 in row-major is the 4th element = 4.0
return M[1][0];
}
// Verify that elements are inserted at the correct positions according to the default matrix memory layout.
export float2x3 test_dynamic(float a, float b, float c,
float d, float e, float f) {
// CHECK-LABEL: define {{.*}} <6 x float> @_Z12test_dynamicffffff
// CHECK: [[A:%.*]] = load float, ptr %a.addr
// CHECK: [[VECINIT0:%.*]] = insertelement <6 x float> poison, float [[A]], i32 0
// CHECK: [[B:%.*]] = load float, ptr %b.addr
// COL-CHECK: [[VECINIT1:%.*]] = insertelement <6 x float> [[VECINIT0]], float [[B]], i32 2
// ROW-CHECK: [[VECINIT1:%.*]] = insertelement <6 x float> [[VECINIT0]], float [[B]], i32 1
// CHECK: [[C:%.*]] = load float, ptr %c.addr
// COL-CHECK: [[VECINIT2:%.*]] = insertelement <6 x float> [[VECINIT1]], float [[C]], i32 4
// ROW-CHECK: [[VECINIT2:%.*]] = insertelement <6 x float> [[VECINIT1]], float [[C]], i32 2
// CHECK: [[D:%.*]] = load float, ptr %d.addr
// COL-CHECK: [[VECINIT3:%.*]] = insertelement <6 x float> [[VECINIT2]], float [[D]], i32 1
// ROW-CHECK: [[VECINIT3:%.*]] = insertelement <6 x float> [[VECINIT2]], float [[D]], i32 3
// CHECK: [[E:%.*]] = load float, ptr %e.addr
// COL-CHECK: [[VECINIT4:%.*]] = insertelement <6 x float> [[VECINIT3]], float [[E]], i32 3
// ROW-CHECK: [[VECINIT4:%.*]] = insertelement <6 x float> [[VECINIT3]], float [[E]], i32 4
// CHECK: [[F:%.*]] = load float, ptr %f.addr
// CHECK: [[VECINIT5:%.*]] = insertelement <6 x float> [[VECINIT4]], float [[F]], i32 5
return (float2x3){a, b, c, d, e, f};
}