| // 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}; |
| } |