Additional tests for constant array matrix f16

Change-Id: I04b36c5956a7036e3ce84ca16eb4db5c0683aac6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/244174
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/test/tint/const/array/array_matrix_f16.wgsl b/test/tint/const/array/array_matrix_f16.wgsl
new file mode 100644
index 0000000..552d123
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl
@@ -0,0 +1,14 @@
+// flags: --hlsl-shader-model 62
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> s: array<u32>;
+
+@compute @workgroup_size(1u)
+fn main(){
+    const kArray = array(
+                    mat3x2(vec2(0.0h,1.0h),vec2(2.0h,3.0h),vec2(2.0h,3.0h)),
+                     mat3x2(vec2(0.0h,1.0h),vec2(2.0h,3.0h),vec2(2.0h,3.0h)),
+                    );
+    var q = 0u;
+    s[0] = u32(kArray[q][0][0]);
+}
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.dxc.hlsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..49a6ceb
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.dxc.hlsl
@@ -0,0 +1,12 @@
+RWByteAddressBuffer s : register(u0);
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint tint_symbol_1 = 0u;
+  s.GetDimensions(tint_symbol_1);
+  uint tint_symbol_2 = (tint_symbol_1 / 4u);
+  uint q = 0u;
+  matrix<float16_t, 3, 2> tint_symbol_3[2] = {matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h))), matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)))};
+  s.Store((4u * min(0u, (tint_symbol_2 - 1u))), asuint(uint(tint_symbol_3[min(q, 1u)][0][0])));
+  return;
+}
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.fxc.hlsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d79d545
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.fxc.hlsl
@@ -0,0 +1,14 @@
+SKIP: INVALID
+
+RWByteAddressBuffer s : register(u0);
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint tint_symbol_1 = 0u;
+  s.GetDimensions(tint_symbol_1);
+  uint tint_symbol_2 = (tint_symbol_1 / 4u);
+  uint q = 0u;
+  matrix<float16_t, 3, 2> tint_symbol_3[2] = {matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h))), matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)))};
+  s.Store((4u * min(0u, (tint_symbol_2 - 1u))), asuint(uint(tint_symbol_3[min(q, 1u)][0][0])));
+  return;
+}
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.glsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.glsl
new file mode 100644
index 0000000..27821ea
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+
+layout(binding = 0, std430)
+buffer s_block_1_ssbo {
+  uint inner[];
+} v;
+uint tint_f16_to_u32(float16_t value) {
+  return mix(4294967295u, mix(0u, uint(value), (value >= 0.0hf)), (value <= 65504.0hf));
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  uint q = 0u;
+  uint v_1 = (uint(v.inner.length()) - 1u);
+  uint v_2 = min(uint(0), v_1);
+  v.inner[v_2] = tint_f16_to_u32(f16mat3x2[2](f16mat3x2(f16vec2(0.0hf, 1.0hf), f16vec2(2.0hf, 3.0hf), f16vec2(2.0hf, 3.0hf)), f16mat3x2(f16vec2(0.0hf, 1.0hf), f16vec2(2.0hf, 3.0hf), f16vec2(2.0hf, 3.0hf)))[min(q, 1u)][0u].x);
+}
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..2dd5805
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer s : register(u0);
+uint tint_f16_to_u32(float16_t value) {
+  return (((value <= float16_t(65504.0h))) ? ((((value >= float16_t(0.0h))) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint q = 0u;
+  uint v = 0u;
+  s.GetDimensions(v);
+  uint v_1 = ((v / 4u) - 1u);
+  uint v_2 = (min(uint(int(0)), v_1) * 4u);
+  matrix<float16_t, 3, 2> v_3[2] = {matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h))), matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)))};
+  s.Store((0u + v_2), tint_f16_to_u32(v_3[min(q, 1u)][0u].x));
+}
+
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.fxc.hlsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.fxc.hlsl
new file mode 100644
index 0000000..7082472
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: INVALID
+
+RWByteAddressBuffer s : register(u0);
+uint tint_f16_to_u32(float16_t value) {
+  return (((value <= float16_t(65504.0h))) ? ((((value >= float16_t(0.0h))) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  uint q = 0u;
+  uint v = 0u;
+  s.GetDimensions(v);
+  uint v_1 = ((v / 4u) - 1u);
+  uint v_2 = (min(uint(int(0)), v_1) * 4u);
+  matrix<float16_t, 3, 2> v_3[2] = {matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h))), matrix<float16_t, 3, 2>(vector<float16_t, 2>(float16_t(0.0h), float16_t(1.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)), vector<float16_t, 2>(float16_t(2.0h), float16_t(3.0h)))};
+  s.Store((0u + v_2), tint_f16_to_u32(v_3[min(q, 1u)][0u].x));
+}
+
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.msl b/test/tint/const/array/array_matrix_f16.wgsl.expected.msl
new file mode 100644
index 0000000..a84f77f
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
+
+struct tint_module_vars_struct {
+  device tint_array<uint, 1>* s;
+  const constant tint_array<uint4, 1>* tint_storage_buffer_sizes;
+};
+
+uint tint_f16_to_u32(half value) {
+  return select(4294967295u, select(0u, uint(value), (value >= 0.0h)), (value <= 65504.0h));
+}
+
+kernel void v(device tint_array<uint, 1>* s [[buffer(0)]], const constant tint_array<uint4, 1>* tint_storage_buffer_sizes [[buffer(30)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.s=s, .tint_storage_buffer_sizes=tint_storage_buffer_sizes};
+  uint q = 0u;
+  uint const v_1 = (((*tint_module_vars.tint_storage_buffer_sizes)[0u].x / 4u) - 1u);
+  device uint* const v_2 = (&(*tint_module_vars.s)[min(uint(0), v_1)]);
+  (*v_2) = tint_f16_to_u32(tint_array<half3x2, 2>{half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(2.0h, 3.0h)), half3x2(half2(0.0h, 1.0h), half2(2.0h, 3.0h), half2(2.0h, 3.0h))}[min(q, 1u)][0u].x);
+}
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.spvasm b/test/tint/const/array/array_matrix_f16.wgsl.expected.spvasm
new file mode 100644
index 0000000..8ec1c7b
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 60
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+         %37 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpMemberName %s_block_tint_explicit_layout 0 "inner"
+               OpName %s_block_tint_explicit_layout "s_block_tint_explicit_layout"
+               OpName %main "main"
+               OpName %q "q"
+               OpName %tint_f16_to_u32 "tint_f16_to_u32"
+               OpName %value "value"
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %s_block_tint_explicit_layout 0 Offset 0
+               OpDecorate %s_block_tint_explicit_layout Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+               OpDecorate %1 Coherent
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+%s_block_tint_explicit_layout = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_s_block_tint_explicit_layout = OpTypePointer StorageBuffer %s_block_tint_explicit_layout
+          %1 = OpVariable %_ptr_StorageBuffer_s_block_tint_explicit_layout StorageBuffer
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+ %mat3v2half = OpTypeMatrix %v2half 3
+     %uint_2 = OpConstant %uint 2
+%_arr_mat3v2half_uint_2 = OpTypeArray %mat3v2half %uint_2
+%_ptr_Private__arr_mat3v2half_uint_2 = OpTypePointer Private %_arr_mat3v2half_uint_2
+%half_0x0p_0 = OpConstant %half 0x0p+0
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %15 = OpConstantComposite %v2half %half_0x0p_0 %half_0x1p_0
+%half_0x1p_1 = OpConstant %half 0x1p+1
+%half_0x1_8p_1 = OpConstant %half 0x1.8p+1
+         %18 = OpConstantComposite %v2half %half_0x1p_1 %half_0x1_8p_1
+         %14 = OpConstantComposite %mat3v2half %15 %18 %18
+         %13 = OpConstantComposite %_arr_mat3v2half_uint_2 %14 %14
+          %6 = OpVariable %_ptr_Private__arr_mat3v2half_uint_2 Private %13
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer__runtimearr_uint = OpTypePointer StorageBuffer %_runtimearr_uint
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+%_ptr_Private_v2half = OpTypePointer Private %v2half
+%_ptr_Private_half = OpTypePointer Private %half
+         %50 = OpTypeFunction %uint %half
+       %bool = OpTypeBool
+%half_0x1_ffcp_15 = OpConstant %half 0x1.ffcp+15
+%uint_4294967295 = OpConstant %uint 4294967295
+       %main = OpFunction %void None %23
+         %24 = OpLabel
+          %q = OpVariable %_ptr_Function_uint Function
+               OpStore %q %uint_0
+         %28 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %1 %uint_0
+         %30 = OpArrayLength %uint %1 0
+         %31 = OpISub %uint %30 %uint_1
+         %33 = OpBitcast %uint %int_0
+         %36 = OpExtInst %uint %37 UMin %33 %31
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0 %36
+         %40 = OpLoad %uint %q None
+         %41 = OpExtInst %uint %37 UMin %40 %uint_1
+         %42 = OpAccessChain %_ptr_Private_v2half %6 %41 %uint_0
+         %44 = OpAccessChain %_ptr_Private_half %42 %uint_0
+         %46 = OpLoad %half %44 None
+         %47 = OpFunctionCall %uint %tint_f16_to_u32 %46
+               OpStore %38 %47 None
+               OpReturn
+               OpFunctionEnd
+%tint_f16_to_u32 = OpFunction %uint None %50
+      %value = OpFunctionParameter %half
+         %51 = OpLabel
+         %52 = OpConvertFToU %uint %value
+         %53 = OpFOrdGreaterThanEqual %bool %value %half_0x0p_0
+         %55 = OpSelect %uint %53 %52 %uint_0
+         %56 = OpFOrdLessThanEqual %bool %value %half_0x1_ffcp_15
+         %58 = OpSelect %uint %56 %55 %uint_4294967295
+               OpReturnValue %58
+               OpFunctionEnd
diff --git a/test/tint/const/array/array_matrix_f16.wgsl.expected.wgsl b/test/tint/const/array/array_matrix_f16.wgsl.expected.wgsl
new file mode 100644
index 0000000..846076d
--- /dev/null
+++ b/test/tint/const/array/array_matrix_f16.wgsl.expected.wgsl
@@ -0,0 +1,10 @@
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> s : array<u32>;
+
+@compute @workgroup_size(1u)
+fn main() {
+  const kArray = array(mat3x2(vec2(0.0h, 1.0h), vec2(2.0h, 3.0h), vec2(2.0h, 3.0h)), mat3x2(vec2(0.0h, 1.0h), vec2(2.0h, 3.0h), vec2(2.0h, 3.0h)));
+  var q = 0u;
+  s[0] = u32(kArray[q][0][0]);
+}