test: Split binary_expressions into separate tests
Tests should be as fine-grained as possible.
Not all the permutations were covered.
Not all the backends were actually generating anything useful, as the
functions were not called by an entry point.
Change-Id: I76658533d3112d202f7482a19531079550e66f83
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58392
Auto-Submit: Ben Clayton <bclayton@google.com>
Commit-Queue: David Neto <dneto@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl
new file mode 100644
index 0000000..403b87f
--- /dev/null
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>( 1., 2., 3.), vec3<f32>( 4., 5., 6.), vec3<f32>( 7., 8., 9.));
+ let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
+ let r : mat3x3<f32> = a + b;
+}
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.hlsl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e20dd07
--- /dev/null
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3x3 a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ const float3x3 b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ const float3x3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.msl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..4c6ced5
--- /dev/null
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3x3 const a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ float3x3 const b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ float3x3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.spvasm b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..12f96a5
--- /dev/null
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.spvasm
@@ -0,0 +1,55 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %15 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %float_7 = OpConstant %float 7
+ %float_8 = OpConstant %float 8
+ %float_9 = OpConstant %float 9
+ %19 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+ %20 = OpConstantComposite %mat3v3float %11 %15 %19
+ %float_n1 = OpConstant %float -1
+ %float_n2 = OpConstant %float -2
+ %float_n3 = OpConstant %float -3
+ %24 = OpConstantComposite %v3float %float_n1 %float_n2 %float_n3
+ %float_n4 = OpConstant %float -4
+ %float_n5 = OpConstant %float -5
+ %float_n6 = OpConstant %float -6
+ %28 = OpConstantComposite %v3float %float_n4 %float_n5 %float_n6
+ %float_n7 = OpConstant %float -7
+ %float_n8 = OpConstant %float -8
+ %float_n9 = OpConstant %float -9
+ %32 = OpConstantComposite %v3float %float_n7 %float_n8 %float_n9
+ %33 = OpConstantComposite %mat3v3float %24 %28 %32
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %35 = OpCompositeExtract %v3float %20 0
+ %36 = OpCompositeExtract %v3float %33 0
+ %37 = OpFAdd %v3float %35 %36
+ %38 = OpCompositeExtract %v3float %20 1
+ %39 = OpCompositeExtract %v3float %33 1
+ %40 = OpFAdd %v3float %38 %39
+ %41 = OpCompositeExtract %v3float %20 2
+ %42 = OpCompositeExtract %v3float %33 2
+ %43 = OpFAdd %v3float %41 %42
+ %44 = OpCompositeConstruct %mat3v3float %37 %40 %43
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..9113851
--- /dev/null
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
+ let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
+ let r : mat3x3<f32> = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl b/test/expressions/binary/add/scalar-scalar/f32.wgsl
new file mode 100644
index 0000000..25bf677
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.;
+ let b = 2.;
+ let r : f32 = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..7d73fa9
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float r = (1.0f + 2.0f);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.msl b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..bcb61ac
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 1.0f;
+ float const b = 2.0f;
+ float const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5f1590d
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpFAdd %float %float_1 %float_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3db4790
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.0;
+ let b = 2.0;
+ let r : f32 = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl b/test/expressions/binary/add/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..bb39f2e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..9a9dd1f
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 + 2);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..062cf47
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..41bc067
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpIAdd %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..7022af1
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl b/test/expressions/binary/add/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..9f5be35
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f540a81
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u + 2u);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..ca9e441
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..88c551f
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpIAdd %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..fc83a3e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl b/test/expressions/binary/add/scalar-vec3/f32.wgsl
new file mode 100644
index 0000000..8adb291
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.;
+ let b = vec3<f32>(1., 2., 3.);
+ let r : vec3<f32> = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..bab272b
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float a = 4.0f;
+ const float3 b = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.msl b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..aad4aba
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 4.0f;
+ float3 const b = float3(1.0f, 2.0f, 3.0f);
+ float3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..1c59243
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_4 = OpConstant %float 4
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFAdd %v3float %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..f113f0e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.0;
+ let b = vec3<f32>(1.0, 2.0, 3.0);
+ let r : vec3<f32> = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl b/test/expressions/binary/add/scalar-vec3/i32.wgsl
new file mode 100644
index 0000000..327473e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..1b2562e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int a = 4;
+ const int3 b = int3(1, 2, 3);
+ const int3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.msl b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..f46975e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 4;
+ int3 const b = int3(1, 2, 3);
+ int3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..51975b7
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_4 = OpConstant %int 4
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %11 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpIAdd %v3int %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6123ca1
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = (a + b);
+}
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl b/test/expressions/binary/add/scalar-vec3/u32.wgsl
new file mode 100644
index 0000000..e36d881
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = a + b;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..5b43e9e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint a = 4u;
+ const uint3 b = uint3(1u, 2u, 3u);
+ const uint3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.msl b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..71345d5
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 4u;
+ uint3 const b = uint3(1u, 2u, 3u);
+ uint3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9fd4b14
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_4 = OpConstant %uint 4
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %11 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpIAdd %v3uint %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..457841e
--- /dev/null
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl b/test/expressions/binary/add/vec3-scalar/f32.wgsl
new file mode 100644
index 0000000..dd38642
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = 4.;
+ let r : vec3<f32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..a7fe143
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a + 4.0f);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.msl b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..e156063
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float const b = 4.0f;
+ float3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c7169bc
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFAdd %v3float %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..62aa160
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = 4.0;
+ let r : vec3<f32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl b/test/expressions/binary/add/vec3-scalar/i32.wgsl
new file mode 100644
index 0000000..1e4324a
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..5875ef7
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 r = (a + 4);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.msl b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..ba1fdc5
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int const b = 4;
+ int3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..0cb5e23
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpIAdd %v3int %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..378b1d2
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl b/test/expressions/binary/add/vec3-scalar/u32.wgsl
new file mode 100644
index 0000000..cfff6f1
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..056ee37
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 r = (a + 4u);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.msl b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..830bcdd
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint const b = 4u;
+ uint3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f5f979a
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpIAdd %v3uint %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..df0f990
--- /dev/null
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl b/test/expressions/binary/add/vec3-vec3/f32.wgsl
new file mode 100644
index 0000000..4f71797
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = vec3<f32>(4., 5., 6.);
+ let r : vec3<f32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..2fa34ec
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 b = float3(4.0f, 5.0f, 6.0f);
+ const float3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.msl b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..011652a
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float3 const b = float3(4.0f, 5.0f, 6.0f);
+ float3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..d52cc80
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %14 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpFAdd %v3float %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..54d52b1
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = vec3<f32>(4.0, 5.0, 6.0);
+ let r : vec3<f32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl b/test/expressions/binary/add/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..dd170f5
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..3ff77a0
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..2f4fbae
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..8111e5f
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpIAdd %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5f1226d
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a + b);
+}
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl b/test/expressions/binary/add/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..433e52d
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a + b;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..5bf8554
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a + b);
+ return;
+}
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..5299d8a
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a + b);
+ return;
+}
+
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..faa656e
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpIAdd %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..85dad76
--- /dev/null
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a + b);
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..9ad0a83
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a & b;
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..632b46c
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 & 2);
+ return;
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..bb30c81
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a & b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ad7063e
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseAnd %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ce96c2d
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a & b);
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..ee0fb0a
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a & b;
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..0024712
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u & 2u);
+ return;
+}
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..b3ca220
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a & b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..e91daf8
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseAnd %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e5c60f1
--- /dev/null
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a & b);
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..5dc71ef
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a & b;
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..34f8f47
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a & b);
+ return;
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..22dbd49
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a & b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..e0cab84
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseAnd %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..a30b1f5
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a & b);
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..c520bc3
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a & b;
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..8e74758
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a & b);
+ return;
+}
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..f0aefd1
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a & b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3d3deac
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseAnd %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b9c2d80
--- /dev/null
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a & b);
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..9e2d99c
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a | b;
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4818fbd
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 | 2);
+ return;
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..b3bbf94
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a | b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9823f65
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseOr %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3a13163
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a | b);
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..edf8a70
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a | b;
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..90fd8af
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u | 2u);
+ return;
+}
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..ca18514
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a | b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..0dd9b04
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseOr %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..231ecb5
--- /dev/null
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a | b);
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..dc5ed1c
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a | b;
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..6d95413
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a | b);
+ return;
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..5096a8c
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a | b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3721f59
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseOr %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8941e04
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a | b);
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..e1adda8
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a | b;
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4e2c7a5
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a | b);
+ return;
+}
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..f2f90d0
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a | b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9a82d90
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseOr %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..800d5d0
--- /dev/null
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a | b);
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..c0112a3
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a ^ b;
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f3a33ad
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 ^ 2);
+ return;
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..62360a8
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a ^ b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..32398d0
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseXor %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..860a11d
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a ^ b);
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..32d3b95
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a ^ b;
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..5e4b909
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u ^ 2u);
+ return;
+}
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..8093c0c
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a ^ b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5855aa7
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpBitwiseXor %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..26dda45
--- /dev/null
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a ^ b);
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..c4972f7
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a ^ b;
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..db0a3c1
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a ^ b);
+ return;
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..82c280b
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a ^ b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..51e7ba8
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseXor %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2811f15
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a ^ b);
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..2e62570
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a ^ b;
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e29687a
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a ^ b);
+ return;
+}
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..d77b0b5
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a ^ b);
+ return;
+}
+
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..844d22d
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpBitwiseXor %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..4ba52c5
--- /dev/null
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a ^ b);
+}
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl b/test/expressions/binary/div/scalar-scalar/f32.wgsl
new file mode 100644
index 0000000..50cabd0
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.;
+ let b = 2.;
+ let r : f32 = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e9f00ff
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float r = (1.0f / 2.0f);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.msl b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..5268a5e
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 1.0f;
+ float const b = 2.0f;
+ float const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..827625e
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpFDiv %float %float_1 %float_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5bc760d
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.0;
+ let b = 2.0;
+ let r : f32 = (a / b);
+}
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl b/test/expressions/binary/div/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..1192d80
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..8fe265a
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 / 2);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..17d1709
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b5a41dc
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpSDiv %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6ecb865
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a / b);
+}
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl b/test/expressions/binary/div/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..6e18ad7
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f1d7c0c
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u / 2u);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..fa9d9e7
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..012fb2b
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpUDiv %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b5d2f7e
--- /dev/null
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a / b);
+}
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl b/test/expressions/binary/div/scalar-vec3/f32.wgsl
new file mode 100644
index 0000000..a9cab92
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.;
+ let b = vec3<f32>(1., 2., 3.);
+ let r : vec3<f32> = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..3eabba0
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float a = 4.0f;
+ const float3 b = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.msl b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..1fed91b
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 4.0f;
+ float3 const b = float3(1.0f, 2.0f, 3.0f);
+ float3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..aed0688
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_4 = OpConstant %float 4
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFDiv %v3float %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..bd9de59
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.0;
+ let b = vec3<f32>(1.0, 2.0, 3.0);
+ let r : vec3<f32> = (a / b);
+}
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl b/test/expressions/binary/div/scalar-vec3/i32.wgsl
new file mode 100644
index 0000000..ae9daea
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..cb4a95b
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int a = 4;
+ const int3 b = int3(1, 2, 3);
+ const int3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.msl b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..4124223
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 4;
+ int3 const b = int3(1, 2, 3);
+ int3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c52ce21
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_4 = OpConstant %int 4
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %11 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpSDiv %v3int %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6d7e7a4
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = (a / b);
+}
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl b/test/expressions/binary/div/scalar-vec3/u32.wgsl
new file mode 100644
index 0000000..0923fb2
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = a / b;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..8942ff8
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint a = 4u;
+ const uint3 b = uint3(1u, 2u, 3u);
+ const uint3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.msl b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..aa59c35
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 4u;
+ uint3 const b = uint3(1u, 2u, 3u);
+ uint3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3bf5436
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_4 = OpConstant %uint 4
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %11 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpUDiv %v3uint %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5c678e8
--- /dev/null
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl b/test/expressions/binary/div/vec3-scalar/f32.wgsl
new file mode 100644
index 0000000..247abdf
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = 4.;
+ let r : vec3<f32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f1645a2
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a / 4.0f);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.msl b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..8c1ca16
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float const b = 4.0f;
+ float3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3328802
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFDiv %v3float %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..df8a3df
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = 4.0;
+ let r : vec3<f32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl b/test/expressions/binary/div/vec3-scalar/i32.wgsl
new file mode 100644
index 0000000..7e730df
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..672f46e
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 r = (a / 4);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.msl b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..73678c8
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int const b = 4;
+ int3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..be6616a
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpSDiv %v3int %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..fa76ca6
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl b/test/expressions/binary/div/vec3-scalar/u32.wgsl
new file mode 100644
index 0000000..5eadf33
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..2f4dc9c
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 r = (a / 4u);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.msl b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..749829b
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint const b = 4u;
+ uint3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..9a52fdc
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpUDiv %v3uint %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8e60c28
--- /dev/null
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl b/test/expressions/binary/div/vec3-vec3/f32.wgsl
new file mode 100644
index 0000000..f779554
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = vec3<f32>(4., 5., 6.);
+ let r : vec3<f32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..7ae0123
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 b = float3(4.0f, 5.0f, 6.0f);
+ const float3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.msl b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..a2c6698
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float3 const b = float3(4.0f, 5.0f, 6.0f);
+ float3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..842bcd7
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %14 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpFDiv %v3float %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e824aa5
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = vec3<f32>(4.0, 5.0, 6.0);
+ let r : vec3<f32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl b/test/expressions/binary/div/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..40e6d7a
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..33a4443
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..bb0f942
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f0115f7
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpSDiv %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..940e6d9
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a / b);
+}
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl b/test/expressions/binary/div/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..39fdc1d
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a / b;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..815ad9b
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a / b);
+ return;
+}
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..bfddf5a
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a / b);
+ return;
+}
+
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..116085e
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpUDiv %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..cbf76b7
--- /dev/null
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a / b);
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl
new file mode 100644
index 0000000..4ab4923
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.;
+ let b = 2.;
+ let r : f32 = a % b;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..2d9e671
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float r = (1.0f % 2.0f);
+ return;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.msl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..111652a
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 1.0f;
+ float const b = 2.0f;
+ float const r = (a % b);
+ return;
+}
+
+Compilation failed:
+
+program_source:7:22: error: invalid operands to binary expression ('const float' and 'const float')
+ float const r = (a % b);
+ ~ ^ ~
+
+
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2be0b7e
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpFMod %float %float_1 %float_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..66c2041
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.0;
+ let b = 2.0;
+ let r : f32 = (a % b);
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..f186706
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a % b;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..9088e51
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 % 2);
+ return;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..a67d6fe
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a % b);
+ return;
+}
+
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3e9f944
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpSMod %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..f692f9e
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a % b);
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..d1b56f7
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a % b;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e5e11c5
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u % 2u);
+ return;
+}
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..5d4b949
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a % b);
+ return;
+}
+
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..57f2d38
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpUMod %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..e3da2c7
--- /dev/null
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a % b);
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl
new file mode 100644
index 0000000..d7cebb2
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = vec3<f32>(4., 5., 6.);
+ let r : vec3<f32> = a % b;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..87e4dd4
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 b = float3(4.0f, 5.0f, 6.0f);
+ const float3 r = (a % b);
+ return;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.msl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..53894a9
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float3 const b = float3(4.0f, 5.0f, 6.0f);
+ float3 const r = (a % b);
+ return;
+}
+
+Compilation failed:
+
+program_source:7:23: error: invalid operands to binary expression ('const float3' (vector of 3 'float' values) and 'const float3')
+ float3 const r = (a % b);
+ ~ ^ ~
+
+
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..83be413
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %14 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpFMod %v3float %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d0ef8c9
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = vec3<f32>(4.0, 5.0, 6.0);
+ let r : vec3<f32> = (a % b);
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..b26013f
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a % b;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f39516d
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a % b);
+ return;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..2bd4b5f
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a % b);
+ return;
+}
+
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..af8e454
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpSMod %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..553af2b
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a % b);
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..2ad96bc
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a % b;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..33e6b96
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a % b);
+ return;
+}
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..954924c
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a % b);
+ return;
+}
+
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..6f69999
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpUMod %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ca63195
--- /dev/null
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a % b);
+}
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl
new file mode 100644
index 0000000..ade50cb
--- /dev/null
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat2x4<f32>(vec4<f32>(1., 2., 3., 4.), vec4<f32>(5., 6., 7., 8.));
+ let b = mat4x2<f32>(vec2<f32>(-1., -2.), vec2<f32>(-3., -4.), vec2<f32>(-5., -6.), vec2<f32>(-7., -8.));
+ let r : mat4x4<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..c502b09
--- /dev/null
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float2x4 a = float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
+ const float4x2 b = float4x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f), float2(-5.0f, -6.0f), float2(-7.0f, -8.0f));
+ const float4x4 r = mul(b, a);
+ return;
+}
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.msl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.msl
new file mode 100644
index 0000000..b706400
--- /dev/null
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float2x4 const a = float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
+ float4x2 const b = float4x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f), float2(-5.0f, -6.0f), float2(-7.0f, -8.0f));
+ float4x4 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7f475dc
--- /dev/null
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%mat2v4float = OpTypeMatrix %v4float 2
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %float_4 = OpConstant %float 4
+ %12 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %float_7 = OpConstant %float 7
+ %float_8 = OpConstant %float 8
+ %17 = OpConstantComposite %v4float %float_5 %float_6 %float_7 %float_8
+ %18 = OpConstantComposite %mat2v4float %12 %17
+ %v2float = OpTypeVector %float 2
+%mat4v2float = OpTypeMatrix %v2float 4
+ %float_n1 = OpConstant %float -1
+ %float_n2 = OpConstant %float -2
+ %23 = OpConstantComposite %v2float %float_n1 %float_n2
+ %float_n3 = OpConstant %float -3
+ %float_n4 = OpConstant %float -4
+ %26 = OpConstantComposite %v2float %float_n3 %float_n4
+ %float_n5 = OpConstant %float -5
+ %float_n6 = OpConstant %float -6
+ %29 = OpConstantComposite %v2float %float_n5 %float_n6
+ %float_n7 = OpConstant %float -7
+ %float_n8 = OpConstant %float -8
+ %32 = OpConstantComposite %v2float %float_n7 %float_n8
+ %33 = OpConstantComposite %mat4v2float %23 %26 %29 %32
+%mat4v4float = OpTypeMatrix %v4float 4
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %34 = OpMatrixTimesMatrix %mat4v4float %18 %33
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..794ec9b
--- /dev/null
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat2x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0));
+ let b = mat4x2<f32>(vec2<f32>(-1.0, -2.0), vec2<f32>(-3.0, -4.0), vec2<f32>(-5.0, -6.0), vec2<f32>(-7.0, -8.0));
+ let r : mat4x4<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl
new file mode 100644
index 0000000..06744d7
--- /dev/null
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>( 1., 2., 3.), vec3<f32>( 4., 5., 6.), vec3<f32>( 7., 8., 9.));
+ let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
+ let r : mat3x3<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..22af87e
--- /dev/null
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3x3 a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ const float3x3 b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ const float3x3 r = mul(b, a);
+ return;
+}
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.msl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..d51ecb1
--- /dev/null
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3x3 const a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ float3x3 const b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ float3x3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5aafd7f
--- /dev/null
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %15 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %float_7 = OpConstant %float 7
+ %float_8 = OpConstant %float 8
+ %float_9 = OpConstant %float 9
+ %19 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+ %20 = OpConstantComposite %mat3v3float %11 %15 %19
+ %float_n1 = OpConstant %float -1
+ %float_n2 = OpConstant %float -2
+ %float_n3 = OpConstant %float -3
+ %24 = OpConstantComposite %v3float %float_n1 %float_n2 %float_n3
+ %float_n4 = OpConstant %float -4
+ %float_n5 = OpConstant %float -5
+ %float_n6 = OpConstant %float -6
+ %28 = OpConstantComposite %v3float %float_n4 %float_n5 %float_n6
+ %float_n7 = OpConstant %float -7
+ %float_n8 = OpConstant %float -8
+ %float_n9 = OpConstant %float -9
+ %32 = OpConstantComposite %v3float %float_n7 %float_n8 %float_n9
+ %33 = OpConstantComposite %mat3v3float %24 %28 %32
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %34 = OpMatrixTimesMatrix %mat3v3float %20 %33
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2dd4a96
--- /dev/null
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
+ let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
+ let r : mat3x3<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl
new file mode 100644
index 0000000..236146e
--- /dev/null
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat4x2<f32>(vec2<f32>(-1., -2.), vec2<f32>(-3., -4.), vec2<f32>(-5., -6.), vec2<f32>(-7., -8.));
+ let b = mat2x4<f32>(vec4<f32>(1., 2., 3., 4.), vec4<f32>(5., 6., 7., 8.));
+ let r : mat2x2<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..9f4028a
--- /dev/null
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float4x2 a = float4x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f), float2(-5.0f, -6.0f), float2(-7.0f, -8.0f));
+ const float2x4 b = float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
+ const float2x2 r = mul(b, a);
+ return;
+}
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.msl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.msl
new file mode 100644
index 0000000..7b95ad6
--- /dev/null
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float4x2 const a = float4x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f), float2(-5.0f, -6.0f), float2(-7.0f, -8.0f));
+ float2x4 const b = float2x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f));
+ float2x2 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..dd96804
--- /dev/null
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%mat4v2float = OpTypeMatrix %v2float 4
+ %float_n1 = OpConstant %float -1
+ %float_n2 = OpConstant %float -2
+ %10 = OpConstantComposite %v2float %float_n1 %float_n2
+ %float_n3 = OpConstant %float -3
+ %float_n4 = OpConstant %float -4
+ %13 = OpConstantComposite %v2float %float_n3 %float_n4
+ %float_n5 = OpConstant %float -5
+ %float_n6 = OpConstant %float -6
+ %16 = OpConstantComposite %v2float %float_n5 %float_n6
+ %float_n7 = OpConstant %float -7
+ %float_n8 = OpConstant %float -8
+ %19 = OpConstantComposite %v2float %float_n7 %float_n8
+ %20 = OpConstantComposite %mat4v2float %10 %13 %16 %19
+ %v4float = OpTypeVector %float 4
+%mat2v4float = OpTypeMatrix %v4float 2
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %float_4 = OpConstant %float 4
+ %27 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %float_7 = OpConstant %float 7
+ %float_8 = OpConstant %float 8
+ %32 = OpConstantComposite %v4float %float_5 %float_6 %float_7 %float_8
+ %33 = OpConstantComposite %mat2v4float %27 %32
+%mat2v2float = OpTypeMatrix %v2float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %34 = OpMatrixTimesMatrix %mat2v2float %20 %33
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b4803d4
--- /dev/null
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat4x2<f32>(vec2<f32>(-1.0, -2.0), vec2<f32>(-3.0, -4.0), vec2<f32>(-5.0, -6.0), vec2<f32>(-7.0, -8.0));
+ let b = mat2x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0));
+ let r : mat2x2<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl
new file mode 100644
index 0000000..23d7371
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.;
+ let b = 2.;
+ let r : f32 = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..a2d27f9
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float r = (1.0f * 2.0f);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..daaade6
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 1.0f;
+ float const b = 2.0f;
+ float const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..faae711
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpFMul %float %float_1 %float_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..6f874935
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.0;
+ let b = 2.0;
+ let r : f32 = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..ea58328
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4b93ecb
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 * 2);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..1bd365e
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..0f753ea
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpIMul %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5f53be8
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..ec6a61d
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4623783
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u * 2u);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..7e9738a
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..a014353
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpIMul %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..92cffef
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl
new file mode 100644
index 0000000..cd19d3b
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.;
+ let b = vec3<f32>(1., 2., 3.);
+ let r : vec3<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..ab39cdc
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float a = 4.0f;
+ const float3 b = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..5ea4340
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 4.0f;
+ float3 const b = float3(1.0f, 2.0f, 3.0f);
+ float3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..3dd13a7
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_4 = OpConstant %float 4
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %12 = OpVectorTimesScalar %v3float %11 %float_4
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..65ac8cc
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.0;
+ let b = vec3<f32>(1.0, 2.0, 3.0);
+ let r : vec3<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl
new file mode 100644
index 0000000..8d1bf3f
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..6d7c62a
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int a = 4;
+ const int3 b = int3(1, 2, 3);
+ const int3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..733799e
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 4;
+ int3 const b = int3(1, 2, 3);
+ int3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..42c9b54
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_4 = OpConstant %int 4
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %11 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpIMul %v3int %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..c5744b7
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl
new file mode 100644
index 0000000..d5f432e6
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = a * b;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..73ec042
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint a = 4u;
+ const uint3 b = uint3(1u, 2u, 3u);
+ const uint3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.msl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..6ff7ae2
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 4u;
+ uint3 const b = uint3(1u, 2u, 3u);
+ uint3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..4877ed6
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_4 = OpConstant %uint 4
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %11 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpIMul %v3uint %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..60505a4
--- /dev/null
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl
new file mode 100644
index 0000000..34a7b70
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = 4.;
+ let r : vec3<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..646399d
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a * 4.0f);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..2779faf
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float const b = 4.0f;
+ float3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..eb84b87
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 13
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %12 = OpVectorTimesScalar %v3float %10 %float_4
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..712df51
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = 4.0;
+ let r : vec3<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl
new file mode 100644
index 0000000..a8f8d1e
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e86c189
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 r = (a * 4);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..afabaf3
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int const b = 4;
+ int3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb4153b
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpIMul %v3int %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d8f7e63
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl
new file mode 100644
index 0000000..a63cb22
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..d61b59a
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 r = (a * 4u);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..b0b38b0
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint const b = 4u;
+ uint3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..cecab21
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpIMul %v3uint %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..995a6a3
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl
new file mode 100644
index 0000000..184a9fb
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = vec3<f32>(4., 5., 6.);
+ let r : vec3<f32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..8a51b14
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 b = float3(4.0f, 5.0f, 6.0f);
+ const float3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..2c70f56
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float3 const b = float3(4.0f, 5.0f, 6.0f);
+ float3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..0983487
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %14 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpFMul %v3float %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..fff2a26
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = vec3<f32>(4.0, 5.0, 6.0);
+ let r : vec3<f32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..dc812d8
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..d532aaf
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..91d1b9f
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..98d2734
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpIMul %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..3ca04ae
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a * b);
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..d1e2219
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a * b;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..5db3034
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a * b);
+ return;
+}
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..3bdad2d
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a * b);
+ return;
+}
+
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..2e60fba
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpIMul %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..4392855
--- /dev/null
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a * b);
+}
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl
new file mode 100644
index 0000000..4dec34d
--- /dev/null
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>( 1., 2., 3.), vec3<f32>( 4., 5., 6.), vec3<f32>( 7., 8., 9.));
+ let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
+ let r : mat3x3<f32> = a - b;
+}
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.hlsl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..9d1b2b3
--- /dev/null
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3x3 a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ const float3x3 b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ const float3x3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.msl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..bcf7b16
--- /dev/null
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3x3 const a = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ float3x3 const b = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ float3x3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.spvasm b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..bfec754
--- /dev/null
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.spvasm
@@ -0,0 +1,55 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %15 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %float_7 = OpConstant %float 7
+ %float_8 = OpConstant %float 8
+ %float_9 = OpConstant %float 9
+ %19 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+ %20 = OpConstantComposite %mat3v3float %11 %15 %19
+ %float_n1 = OpConstant %float -1
+ %float_n2 = OpConstant %float -2
+ %float_n3 = OpConstant %float -3
+ %24 = OpConstantComposite %v3float %float_n1 %float_n2 %float_n3
+ %float_n4 = OpConstant %float -4
+ %float_n5 = OpConstant %float -5
+ %float_n6 = OpConstant %float -6
+ %28 = OpConstantComposite %v3float %float_n4 %float_n5 %float_n6
+ %float_n7 = OpConstant %float -7
+ %float_n8 = OpConstant %float -8
+ %float_n9 = OpConstant %float -9
+ %32 = OpConstantComposite %v3float %float_n7 %float_n8 %float_n9
+ %33 = OpConstantComposite %mat3v3float %24 %28 %32
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %35 = OpCompositeExtract %v3float %20 0
+ %36 = OpCompositeExtract %v3float %33 0
+ %37 = OpFSub %v3float %35 %36
+ %38 = OpCompositeExtract %v3float %20 1
+ %39 = OpCompositeExtract %v3float %33 1
+ %40 = OpFSub %v3float %38 %39
+ %41 = OpCompositeExtract %v3float %20 2
+ %42 = OpCompositeExtract %v3float %33 2
+ %43 = OpFSub %v3float %41 %42
+ %44 = OpCompositeConstruct %mat3v3float %37 %40 %43
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..5003fea
--- /dev/null
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
+ let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
+ let r : mat3x3<f32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl
new file mode 100644
index 0000000..b0e6359
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.;
+ let b = 2.;
+ let r : f32 = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..04ab363
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float r = (1.0f - 2.0f);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..ae19d6c
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 1.0f;
+ float const b = 2.0f;
+ float const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..59bc3b5
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpFSub %float %float_1 %float_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ffc19e2
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1.0;
+ let b = 2.0;
+ let r : f32 = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl
new file mode 100644
index 0000000..7d396dc
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4f995b5
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int r = (1 - 2);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..7a7adf0
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 1;
+ int const b = 2;
+ int const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..c4489ab
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpISub %int %int_1 %int_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d881d44
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1;
+ let b = 2;
+ let r : i32 = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl
new file mode 100644
index 0000000..5f210c2
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..23719ac
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,5 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint r = (1u - 2u);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..d93a0c7
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 1u;
+ uint const b = 2u;
+ uint const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..a68d4e3
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,20 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 9
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %8 = OpISub %uint %uint_1 %uint_2
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..932d0b7
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 1u;
+ let b = 2u;
+ let r : u32 = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl
new file mode 100644
index 0000000..1b23e49
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.;
+ let b = vec3<f32>(1., 2., 3.);
+ let r : vec3<f32> = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..d714c62
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float a = 4.0f;
+ const float3 b = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..ce03e02
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float const a = 4.0f;
+ float3 const b = float3(1.0f, 2.0f, 3.0f);
+ float3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b7e0f0a
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %float_4 = OpConstant %float 4
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %11 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFSub %v3float %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..69ff882
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4.0;
+ let b = vec3<f32>(1.0, 2.0, 3.0);
+ let r : vec3<f32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl
new file mode 100644
index 0000000..1e024c5
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..1e67f13
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int a = 4;
+ const int3 b = int3(1, 2, 3);
+ const int3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..c6791796
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int const a = 4;
+ int3 const b = int3(1, 2, 3);
+ int3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ab003eb
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_4 = OpConstant %int 4
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %11 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpISub %v3int %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..0efb533
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4;
+ let b = vec3<i32>(1, 2, 3);
+ let r : vec3<i32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl
new file mode 100644
index 0000000..0042cc2
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = a - b;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..90f540d
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint a = 4u;
+ const uint3 b = uint3(1u, 2u, 3u);
+ const uint3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.msl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..ec8b6cf
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint const a = 4u;
+ uint3 const b = uint3(1u, 2u, 3u);
+ uint3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f5ca740
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %uint_4 = OpConstant %uint 4
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %11 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpISub %v3uint %16 %11
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b78efa7
--- /dev/null
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = 4u;
+ let b = vec3<u32>(1u, 2u, 3u);
+ let r : vec3<u32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl
new file mode 100644
index 0000000..0bdf89e
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = 4.;
+ let r : vec3<f32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..0476c62
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 r = (a - 4.0f);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.msl
new file mode 100644
index 0000000..7799789
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float const b = 4.0f;
+ float3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b09055c
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %15 = OpConstantNull %v3float
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3float Function %15
+ %16 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
+ %12 = OpFSub %v3float %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..de0d72d
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = 4.0;
+ let r : vec3<f32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl
new file mode 100644
index 0000000..0fab83f
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..8db37c9
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 r = (a - 4);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.msl
new file mode 100644
index 0000000..9fc724f
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int const b = 4;
+ int3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..05cd87f
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+ %15 = OpConstantNull %v3int
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3int Function %15
+ %16 = OpCompositeConstruct %v3int %int_4 %int_4 %int_4
+ %12 = OpISub %v3int %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..ea16bd4
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = 4;
+ let r : vec3<i32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl
new file mode 100644
index 0000000..0ec4317
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..6a9b7ee
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 r = (a - 4u);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.msl
new file mode 100644
index 0000000..7f76d5a
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint const b = 4u;
+ uint3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..98dc260
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.spvasm
@@ -0,0 +1,28 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 17
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %15 = OpConstantNull %v3uint
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %13 = OpVariable %_ptr_Function_v3uint Function %15
+ %16 = OpCompositeConstruct %v3uint %uint_4 %uint_4 %uint_4
+ %12 = OpISub %v3uint %10 %16
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..2052d8b
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = 4u;
+ let r : vec3<u32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl
new file mode 100644
index 0000000..3bb31cf
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1., 2., 3.);
+ let b = vec3<f32>(4., 5., 6.);
+ let r : vec3<f32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..f4a568e
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const float3 a = float3(1.0f, 2.0f, 3.0f);
+ const float3 b = float3(4.0f, 5.0f, 6.0f);
+ const float3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..5ce4e15
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ float3 const a = float3(1.0f, 2.0f, 3.0f);
+ float3 const b = float3(4.0f, 5.0f, 6.0f);
+ float3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..649b28b
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %float_3 = OpConstant %float 3
+ %10 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+ %float_4 = OpConstant %float 4
+ %float_5 = OpConstant %float 5
+ %float_6 = OpConstant %float 6
+ %14 = OpConstantComposite %v3float %float_4 %float_5 %float_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpFSub %v3float %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..8beb881
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<f32>(1.0, 2.0, 3.0);
+ let b = vec3<f32>(4.0, 5.0, 6.0);
+ let r : vec3<f32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl
new file mode 100644
index 0000000..7ecdc45
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e8a2622
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const int3 a = int3(1, 2, 3);
+ const int3 b = int3(4, 5, 6);
+ const int3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..f611cb2
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ int3 const a = int3(1, 2, 3);
+ int3 const b = int3(4, 5, 6);
+ int3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..1a4031d
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %10 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+ %int_4 = OpConstant %int 4
+ %int_5 = OpConstant %int 5
+ %int_6 = OpConstant %int 6
+ %14 = OpConstantComposite %v3int %int_4 %int_5 %int_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpISub %v3int %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..00ff109
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<i32>(1, 2, 3);
+ let b = vec3<i32>(4, 5, 6);
+ let r : vec3<i32> = (a - b);
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl
new file mode 100644
index 0000000..547383e
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = a - b;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.hlsl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..1a8d03f
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void f() {
+ const uint3 a = uint3(1u, 2u, 3u);
+ const uint3 b = uint3(4u, 5u, 6u);
+ const uint3 r = (a - b);
+ return;
+}
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.msl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..0f6cc4b
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.msl
@@ -0,0 +1,10 @@
+#include <metal_stdlib>
+
+using namespace metal;
+kernel void f() {
+ uint3 const a = uint3(1u, 2u, 3u);
+ uint3 const b = uint3(4u, 5u, 6u);
+ uint3 const r = (a - b);
+ return;
+}
+
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.spvasm b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..8dfb98d
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,27 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 16
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %f "f"
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+ %uint_1 = OpConstant %uint 1
+ %uint_2 = OpConstant %uint 2
+ %uint_3 = OpConstant %uint 3
+ %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_6 = OpConstant %uint 6
+ %14 = OpConstantComposite %v3uint %uint_4 %uint_5 %uint_6
+ %f = OpFunction %void None %1
+ %4 = OpLabel
+ %15 = OpISub %v3uint %10 %14
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..7559a1b
--- /dev/null
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+[[stage(compute), workgroup_size(1)]]
+fn f() {
+ let a = vec3<u32>(1u, 2u, 3u);
+ let b = vec3<u32>(4u, 5u, 6u);
+ let r : vec3<u32> = (a - b);
+}
diff --git a/test/expressions/binary_expressions.wgsl b/test/expressions/binary_expressions.wgsl
deleted file mode 100644
index b377a13..0000000
--- a/test/expressions/binary_expressions.wgsl
+++ /dev/null
@@ -1,113 +0,0 @@
-fn bitwise_i32() {
- var s1 : i32;
- var s2 : i32;
- var v1 : vec3<i32>;
- var v2 : vec3<i32>;
-
- s1 = s1 | s2;
- s1 = s1 & s2;
- s1 = s1 ^ s2;
-
- v1 = v1 | v2;
- v1 = v1 & v2;
- v1 = v1 ^ v2;
-}
-
-fn bitwise_u32() {
- var s1 : u32;
- var s2 : u32;
- var v1 : vec3<u32>;
- var v2 : vec3<u32>;
-
- s1 = s1 | s2;
- s1 = s1 & s2;
- s1 = s1 ^ s2;
-
- v1 = v1 | v2;
- v1 = v1 & v2;
- v1 = v1 ^ v2;
-}
-
-fn vector_scalar_f32() {
- var v : vec3<f32>;
- var s : f32;
- var r : vec3<f32>;
- r = v + s;
- r = v - s;
- r = v * s;
- r = v / s;
- //r = v % s;
-}
-
-fn vector_scalar_i32() {
- var v : vec3<i32>;
- var s : i32;
- var r : vec3<i32>;
- r = v + s;
- r = v - s;
- r = v * s;
- r = v / s;
- r = v % s;
-}
-
-fn vector_scalar_u32() {
- var v : vec3<u32>;
- var s : u32;
- var r : vec3<u32>;
- r = v + s;
- r = v - s;
- r = v * s;
- r = v / s;
- r = v % s;
-}
-
-fn scalar_vector_f32() {
- var v : vec3<f32>;
- var s : f32;
- var r : vec3<f32>;
- r = s + v;
- r = s - v;
- r = s * v;
- r = s / v;
- //r = s % v;
-}
-
-fn scalar_vector_i32() {
- var v : vec3<i32>;
- var s : i32;
- var r : vec3<i32>;
- r = s + v;
- r = s - v;
- r = s * v;
- r = s / v;
- r = s % v;
-}
-
-fn scalar_vector_u32() {
- var v : vec3<u32>;
- var s : u32;
- var r : vec3<u32>;
- r = s + v;
- r = s - v;
- r = s * v;
- r = s / v;
- r = s % v;
-}
-
-fn matrix_matrix_f32() {
- var m34 : mat3x4<f32>;
- var m43 : mat4x3<f32>;
- var m33 : mat3x3<f32>;
- var m44 : mat4x4<f32>;
-
- m34 = m34 + m34;
- m34 = m34 - m34;
-
- m33 = m43 * m34;
- m44 = m34 * m43;
-}
-
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
- return vec4<f32>(0.0,0.0,0.0,0.0);
-}
diff --git a/test/expressions/binary_expressions.wgsl.expected.hlsl b/test/expressions/binary_expressions.wgsl.expected.hlsl
deleted file mode 100644
index 122eaa7..0000000
--- a/test/expressions/binary_expressions.wgsl.expected.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-void bitwise_i32() {
- int s1 = 0;
- int s2 = 0;
- int3 v1 = int3(0, 0, 0);
- int3 v2 = int3(0, 0, 0);
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-void bitwise_u32() {
- uint s1 = 0u;
- uint s2 = 0u;
- uint3 v1 = uint3(0u, 0u, 0u);
- uint3 v2 = uint3(0u, 0u, 0u);
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-void vector_scalar_f32() {
- float3 v = float3(0.0f, 0.0f, 0.0f);
- float s = 0.0f;
- float3 r = float3(0.0f, 0.0f, 0.0f);
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
-}
-
-void vector_scalar_i32() {
- int3 v = int3(0, 0, 0);
- int s = 0;
- int3 r = int3(0, 0, 0);
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-void vector_scalar_u32() {
- uint3 v = uint3(0u, 0u, 0u);
- uint s = 0u;
- uint3 r = uint3(0u, 0u, 0u);
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-void scalar_vector_f32() {
- float3 v = float3(0.0f, 0.0f, 0.0f);
- float s = 0.0f;
- float3 r = float3(0.0f, 0.0f, 0.0f);
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
-}
-
-void scalar_vector_i32() {
- int3 v = int3(0, 0, 0);
- int s = 0;
- int3 r = int3(0, 0, 0);
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-void scalar_vector_u32() {
- uint3 v = uint3(0u, 0u, 0u);
- uint s = 0u;
- uint3 r = uint3(0u, 0u, 0u);
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-void matrix_matrix_f32() {
- float3x4 m34 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
- float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
- float3x3 m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
- float4x4 m44 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
- m34 = (m34 + m34);
- m34 = (m34 - m34);
- m33 = mul(m34, m43);
- m44 = mul(m43, m34);
-}
-
-struct tint_symbol {
- float4 value : SV_Target0;
-};
-
-tint_symbol main() {
- const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
- return tint_symbol_1;
-}
diff --git a/test/expressions/binary_expressions.wgsl.expected.msl b/test/expressions/binary_expressions.wgsl.expected.msl
deleted file mode 100644
index afef456..0000000
--- a/test/expressions/binary_expressions.wgsl.expected.msl
+++ /dev/null
@@ -1,113 +0,0 @@
-#include <metal_stdlib>
-
-using namespace metal;
-struct tint_symbol_1 {
- float4 value [[color(0)]];
-};
-
-void bitwise_i32() {
- int s1 = 0;
- int s2 = 0;
- int3 v1 = 0;
- int3 v2 = 0;
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-void bitwise_u32() {
- uint s1 = 0u;
- uint s2 = 0u;
- uint3 v1 = 0u;
- uint3 v2 = 0u;
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-void vector_scalar_f32() {
- float3 v = 0.0f;
- float s = 0.0f;
- float3 r = 0.0f;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
-}
-
-void vector_scalar_i32() {
- int3 v = 0;
- int s = 0;
- int3 r = 0;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-void vector_scalar_u32() {
- uint3 v = 0u;
- uint s = 0u;
- uint3 r = 0u;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-void scalar_vector_f32() {
- float3 v = 0.0f;
- float s = 0.0f;
- float3 r = 0.0f;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
-}
-
-void scalar_vector_i32() {
- int3 v = 0;
- int s = 0;
- int3 r = 0;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-void scalar_vector_u32() {
- uint3 v = 0u;
- uint s = 0u;
- uint3 r = 0u;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-void matrix_matrix_f32() {
- float3x4 m34 = float3x4(0.0f);
- float4x3 m43 = float4x3(0.0f);
- float3x3 m33 = float3x3(0.0f);
- float4x4 m44 = float4x4(0.0f);
- m34 = (m34 + m34);
- m34 = (m34 - m34);
- m33 = (m43 * m34);
- m44 = (m34 * m43);
-}
-
-fragment tint_symbol_1 tint_symbol() {
- tint_symbol_1 const tint_symbol_2 = {.value=float4(0.0f, 0.0f, 0.0f, 0.0f)};
- return tint_symbol_2;
-}
-
diff --git a/test/expressions/binary_expressions.wgsl.expected.spvasm b/test/expressions/binary_expressions.wgsl.expected.spvasm
deleted file mode 100644
index 9ec4c3e..0000000
--- a/test/expressions/binary_expressions.wgsl.expected.spvasm
+++ /dev/null
@@ -1,415 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 298
-; Schema: 0
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %tint_symbol_1
- OpExecutionMode %main OriginUpperLeft
- OpName %tint_symbol_1 "tint_symbol_1"
- OpName %bitwise_i32 "bitwise_i32"
- OpName %s1 "s1"
- OpName %s2 "s2"
- OpName %v1 "v1"
- OpName %v2 "v2"
- OpName %bitwise_u32 "bitwise_u32"
- OpName %s1_0 "s1"
- OpName %s2_0 "s2"
- OpName %v1_0 "v1"
- OpName %v2_0 "v2"
- OpName %vector_scalar_f32 "vector_scalar_f32"
- OpName %v "v"
- OpName %s "s"
- OpName %r "r"
- OpName %vector_scalar_i32 "vector_scalar_i32"
- OpName %v_0 "v"
- OpName %s_0 "s"
- OpName %r_0 "r"
- OpName %vector_scalar_u32 "vector_scalar_u32"
- OpName %v_1 "v"
- OpName %s_1 "s"
- OpName %r_1 "r"
- OpName %scalar_vector_f32 "scalar_vector_f32"
- OpName %v_2 "v"
- OpName %s_2 "s"
- OpName %r_2 "r"
- OpName %scalar_vector_i32 "scalar_vector_i32"
- OpName %v_3 "v"
- OpName %s_3 "s"
- OpName %r_3 "r"
- OpName %scalar_vector_u32 "scalar_vector_u32"
- OpName %v_4 "v"
- OpName %s_4 "s"
- OpName %r_4 "r"
- OpName %matrix_matrix_f32 "matrix_matrix_f32"
- OpName %m34 "m34"
- OpName %m43 "m43"
- OpName %m33 "m33"
- OpName %m44 "m44"
- OpName %tint_symbol_2 "tint_symbol_2"
- OpName %tint_symbol "tint_symbol"
- OpName %main "main"
- OpDecorate %tint_symbol_1 Location 0
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %5 = OpConstantNull %v4float
-%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
- %void = OpTypeVoid
- %6 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %13 = OpConstantNull %int
- %v3int = OpTypeVector %int 3
-%_ptr_Function_v3int = OpTypePointer Function %v3int
- %18 = OpConstantNull %v3int
- %uint = OpTypeInt 32 0
-%_ptr_Function_uint = OpTypePointer Function %uint
- %43 = OpConstantNull %uint
- %v3uint = OpTypeVector %uint 3
-%_ptr_Function_v3uint = OpTypePointer Function %v3uint
- %48 = OpConstantNull %v3uint
- %v3float = OpTypeVector %float 3
-%_ptr_Function_v3float = OpTypePointer Function %v3float
- %73 = OpConstantNull %v3float
-%_ptr_Function_float = OpTypePointer Function %float
- %76 = OpConstantNull %float
-%mat3v4float = OpTypeMatrix %v4float 3
-%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
- %244 = OpConstantNull %mat3v4float
-%mat4v3float = OpTypeMatrix %v3float 4
-%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
- %248 = OpConstantNull %mat4v3float
-%mat3v3float = OpTypeMatrix %v3float 3
-%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
- %252 = OpConstantNull %mat3v3float
-%mat4v4float = OpTypeMatrix %v4float 4
-%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
- %256 = OpConstantNull %mat4v4float
- %289 = OpTypeFunction %void %v4float
- %float_0 = OpConstant %float 0
- %297 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
-%bitwise_i32 = OpFunction %void None %6
- %9 = OpLabel
- %s1 = OpVariable %_ptr_Function_int Function %13
- %s2 = OpVariable %_ptr_Function_int Function %13
- %v1 = OpVariable %_ptr_Function_v3int Function %18
- %v2 = OpVariable %_ptr_Function_v3int Function %18
- %20 = OpLoad %int %s1
- %21 = OpLoad %int %s2
- %22 = OpBitwiseOr %int %20 %21
- OpStore %s1 %22
- %23 = OpLoad %int %s1
- %24 = OpLoad %int %s2
- %25 = OpBitwiseAnd %int %23 %24
- OpStore %s1 %25
- %26 = OpLoad %int %s1
- %27 = OpLoad %int %s2
- %28 = OpBitwiseXor %int %26 %27
- OpStore %s1 %28
- %29 = OpLoad %v3int %v1
- %30 = OpLoad %v3int %v2
- %31 = OpBitwiseOr %v3int %29 %30
- OpStore %v1 %31
- %32 = OpLoad %v3int %v1
- %33 = OpLoad %v3int %v2
- %34 = OpBitwiseAnd %v3int %32 %33
- OpStore %v1 %34
- %35 = OpLoad %v3int %v1
- %36 = OpLoad %v3int %v2
- %37 = OpBitwiseXor %v3int %35 %36
- OpStore %v1 %37
- OpReturn
- OpFunctionEnd
-%bitwise_u32 = OpFunction %void None %6
- %39 = OpLabel
- %s1_0 = OpVariable %_ptr_Function_uint Function %43
- %s2_0 = OpVariable %_ptr_Function_uint Function %43
- %v1_0 = OpVariable %_ptr_Function_v3uint Function %48
- %v2_0 = OpVariable %_ptr_Function_v3uint Function %48
- %50 = OpLoad %uint %s1_0
- %51 = OpLoad %uint %s2_0
- %52 = OpBitwiseOr %uint %50 %51
- OpStore %s1_0 %52
- %53 = OpLoad %uint %s1_0
- %54 = OpLoad %uint %s2_0
- %55 = OpBitwiseAnd %uint %53 %54
- OpStore %s1_0 %55
- %56 = OpLoad %uint %s1_0
- %57 = OpLoad %uint %s2_0
- %58 = OpBitwiseXor %uint %56 %57
- OpStore %s1_0 %58
- %59 = OpLoad %v3uint %v1_0
- %60 = OpLoad %v3uint %v2_0
- %61 = OpBitwiseOr %v3uint %59 %60
- OpStore %v1_0 %61
- %62 = OpLoad %v3uint %v1_0
- %63 = OpLoad %v3uint %v2_0
- %64 = OpBitwiseAnd %v3uint %62 %63
- OpStore %v1_0 %64
- %65 = OpLoad %v3uint %v1_0
- %66 = OpLoad %v3uint %v2_0
- %67 = OpBitwiseXor %v3uint %65 %66
- OpStore %v1_0 %67
- OpReturn
- OpFunctionEnd
-%vector_scalar_f32 = OpFunction %void None %6
- %69 = OpLabel
- %v = OpVariable %_ptr_Function_v3float Function %73
- %s = OpVariable %_ptr_Function_float Function %76
- %r = OpVariable %_ptr_Function_v3float Function %73
- %81 = OpVariable %_ptr_Function_v3float Function %73
- %86 = OpVariable %_ptr_Function_v3float Function %73
- %94 = OpVariable %_ptr_Function_v3float Function %73
- %78 = OpLoad %v3float %v
- %79 = OpLoad %float %s
- %82 = OpCompositeConstruct %v3float %79 %79 %79
- %80 = OpFAdd %v3float %78 %82
- OpStore %r %80
- %83 = OpLoad %v3float %v
- %84 = OpLoad %float %s
- %87 = OpCompositeConstruct %v3float %84 %84 %84
- %85 = OpFSub %v3float %83 %87
- OpStore %r %85
- %88 = OpLoad %v3float %v
- %89 = OpLoad %float %s
- %90 = OpVectorTimesScalar %v3float %88 %89
- OpStore %r %90
- %91 = OpLoad %v3float %v
- %92 = OpLoad %float %s
- %95 = OpCompositeConstruct %v3float %92 %92 %92
- %93 = OpFDiv %v3float %91 %95
- OpStore %r %93
- OpReturn
- OpFunctionEnd
-%vector_scalar_i32 = OpFunction %void None %6
- %97 = OpLabel
- %v_0 = OpVariable %_ptr_Function_v3int Function %18
- %s_0 = OpVariable %_ptr_Function_int Function %13
- %r_0 = OpVariable %_ptr_Function_v3int Function %18
- %104 = OpVariable %_ptr_Function_v3int Function %18
- %109 = OpVariable %_ptr_Function_v3int Function %18
- %114 = OpVariable %_ptr_Function_v3int Function %18
- %119 = OpVariable %_ptr_Function_v3int Function %18
- %124 = OpVariable %_ptr_Function_v3int Function %18
- %101 = OpLoad %v3int %v_0
- %102 = OpLoad %int %s_0
- %105 = OpCompositeConstruct %v3int %102 %102 %102
- %103 = OpIAdd %v3int %101 %105
- OpStore %r_0 %103
- %106 = OpLoad %v3int %v_0
- %107 = OpLoad %int %s_0
- %110 = OpCompositeConstruct %v3int %107 %107 %107
- %108 = OpISub %v3int %106 %110
- OpStore %r_0 %108
- %111 = OpLoad %v3int %v_0
- %112 = OpLoad %int %s_0
- %115 = OpCompositeConstruct %v3int %112 %112 %112
- %113 = OpIMul %v3int %111 %115
- OpStore %r_0 %113
- %116 = OpLoad %v3int %v_0
- %117 = OpLoad %int %s_0
- %120 = OpCompositeConstruct %v3int %117 %117 %117
- %118 = OpSDiv %v3int %116 %120
- OpStore %r_0 %118
- %121 = OpLoad %v3int %v_0
- %122 = OpLoad %int %s_0
- %125 = OpCompositeConstruct %v3int %122 %122 %122
- %123 = OpSMod %v3int %121 %125
- OpStore %r_0 %123
- OpReturn
- OpFunctionEnd
-%vector_scalar_u32 = OpFunction %void None %6
- %127 = OpLabel
- %v_1 = OpVariable %_ptr_Function_v3uint Function %48
- %s_1 = OpVariable %_ptr_Function_uint Function %43
- %r_1 = OpVariable %_ptr_Function_v3uint Function %48
- %134 = OpVariable %_ptr_Function_v3uint Function %48
- %139 = OpVariable %_ptr_Function_v3uint Function %48
- %144 = OpVariable %_ptr_Function_v3uint Function %48
- %149 = OpVariable %_ptr_Function_v3uint Function %48
- %154 = OpVariable %_ptr_Function_v3uint Function %48
- %131 = OpLoad %v3uint %v_1
- %132 = OpLoad %uint %s_1
- %135 = OpCompositeConstruct %v3uint %132 %132 %132
- %133 = OpIAdd %v3uint %131 %135
- OpStore %r_1 %133
- %136 = OpLoad %v3uint %v_1
- %137 = OpLoad %uint %s_1
- %140 = OpCompositeConstruct %v3uint %137 %137 %137
- %138 = OpISub %v3uint %136 %140
- OpStore %r_1 %138
- %141 = OpLoad %v3uint %v_1
- %142 = OpLoad %uint %s_1
- %145 = OpCompositeConstruct %v3uint %142 %142 %142
- %143 = OpIMul %v3uint %141 %145
- OpStore %r_1 %143
- %146 = OpLoad %v3uint %v_1
- %147 = OpLoad %uint %s_1
- %150 = OpCompositeConstruct %v3uint %147 %147 %147
- %148 = OpUDiv %v3uint %146 %150
- OpStore %r_1 %148
- %151 = OpLoad %v3uint %v_1
- %152 = OpLoad %uint %s_1
- %155 = OpCompositeConstruct %v3uint %152 %152 %152
- %153 = OpUMod %v3uint %151 %155
- OpStore %r_1 %153
- OpReturn
- OpFunctionEnd
-%scalar_vector_f32 = OpFunction %void None %6
- %157 = OpLabel
- %v_2 = OpVariable %_ptr_Function_v3float Function %73
- %s_2 = OpVariable %_ptr_Function_float Function %76
- %r_2 = OpVariable %_ptr_Function_v3float Function %73
- %164 = OpVariable %_ptr_Function_v3float Function %73
- %169 = OpVariable %_ptr_Function_v3float Function %73
- %177 = OpVariable %_ptr_Function_v3float Function %73
- %161 = OpLoad %float %s_2
- %162 = OpLoad %v3float %v_2
- %165 = OpCompositeConstruct %v3float %161 %161 %161
- %163 = OpFAdd %v3float %165 %162
- OpStore %r_2 %163
- %166 = OpLoad %float %s_2
- %167 = OpLoad %v3float %v_2
- %170 = OpCompositeConstruct %v3float %166 %166 %166
- %168 = OpFSub %v3float %170 %167
- OpStore %r_2 %168
- %171 = OpLoad %float %s_2
- %172 = OpLoad %v3float %v_2
- %173 = OpVectorTimesScalar %v3float %172 %171
- OpStore %r_2 %173
- %174 = OpLoad %float %s_2
- %175 = OpLoad %v3float %v_2
- %178 = OpCompositeConstruct %v3float %174 %174 %174
- %176 = OpFDiv %v3float %178 %175
- OpStore %r_2 %176
- OpReturn
- OpFunctionEnd
-%scalar_vector_i32 = OpFunction %void None %6
- %180 = OpLabel
- %v_3 = OpVariable %_ptr_Function_v3int Function %18
- %s_3 = OpVariable %_ptr_Function_int Function %13
- %r_3 = OpVariable %_ptr_Function_v3int Function %18
- %187 = OpVariable %_ptr_Function_v3int Function %18
- %192 = OpVariable %_ptr_Function_v3int Function %18
- %197 = OpVariable %_ptr_Function_v3int Function %18
- %202 = OpVariable %_ptr_Function_v3int Function %18
- %207 = OpVariable %_ptr_Function_v3int Function %18
- %184 = OpLoad %int %s_3
- %185 = OpLoad %v3int %v_3
- %188 = OpCompositeConstruct %v3int %184 %184 %184
- %186 = OpIAdd %v3int %188 %185
- OpStore %r_3 %186
- %189 = OpLoad %int %s_3
- %190 = OpLoad %v3int %v_3
- %193 = OpCompositeConstruct %v3int %189 %189 %189
- %191 = OpISub %v3int %193 %190
- OpStore %r_3 %191
- %194 = OpLoad %int %s_3
- %195 = OpLoad %v3int %v_3
- %198 = OpCompositeConstruct %v3int %194 %194 %194
- %196 = OpIMul %v3int %198 %195
- OpStore %r_3 %196
- %199 = OpLoad %int %s_3
- %200 = OpLoad %v3int %v_3
- %203 = OpCompositeConstruct %v3int %199 %199 %199
- %201 = OpSDiv %v3int %203 %200
- OpStore %r_3 %201
- %204 = OpLoad %int %s_3
- %205 = OpLoad %v3int %v_3
- %208 = OpCompositeConstruct %v3int %204 %204 %204
- %206 = OpSMod %v3int %208 %205
- OpStore %r_3 %206
- OpReturn
- OpFunctionEnd
-%scalar_vector_u32 = OpFunction %void None %6
- %210 = OpLabel
- %v_4 = OpVariable %_ptr_Function_v3uint Function %48
- %s_4 = OpVariable %_ptr_Function_uint Function %43
- %r_4 = OpVariable %_ptr_Function_v3uint Function %48
- %217 = OpVariable %_ptr_Function_v3uint Function %48
- %222 = OpVariable %_ptr_Function_v3uint Function %48
- %227 = OpVariable %_ptr_Function_v3uint Function %48
- %232 = OpVariable %_ptr_Function_v3uint Function %48
- %237 = OpVariable %_ptr_Function_v3uint Function %48
- %214 = OpLoad %uint %s_4
- %215 = OpLoad %v3uint %v_4
- %218 = OpCompositeConstruct %v3uint %214 %214 %214
- %216 = OpIAdd %v3uint %218 %215
- OpStore %r_4 %216
- %219 = OpLoad %uint %s_4
- %220 = OpLoad %v3uint %v_4
- %223 = OpCompositeConstruct %v3uint %219 %219 %219
- %221 = OpISub %v3uint %223 %220
- OpStore %r_4 %221
- %224 = OpLoad %uint %s_4
- %225 = OpLoad %v3uint %v_4
- %228 = OpCompositeConstruct %v3uint %224 %224 %224
- %226 = OpIMul %v3uint %228 %225
- OpStore %r_4 %226
- %229 = OpLoad %uint %s_4
- %230 = OpLoad %v3uint %v_4
- %233 = OpCompositeConstruct %v3uint %229 %229 %229
- %231 = OpUDiv %v3uint %233 %230
- OpStore %r_4 %231
- %234 = OpLoad %uint %s_4
- %235 = OpLoad %v3uint %v_4
- %238 = OpCompositeConstruct %v3uint %234 %234 %234
- %236 = OpUMod %v3uint %238 %235
- OpStore %r_4 %236
- OpReturn
- OpFunctionEnd
-%matrix_matrix_f32 = OpFunction %void None %6
- %240 = OpLabel
- %m34 = OpVariable %_ptr_Function_mat3v4float Function %244
- %m43 = OpVariable %_ptr_Function_mat4v3float Function %248
- %m33 = OpVariable %_ptr_Function_mat3v3float Function %252
- %m44 = OpVariable %_ptr_Function_mat4v4float Function %256
- %257 = OpLoad %mat3v4float %m34
- %258 = OpLoad %mat3v4float %m34
- %260 = OpCompositeExtract %v4float %257 0
- %261 = OpCompositeExtract %v4float %258 0
- %262 = OpFAdd %v4float %260 %261
- %263 = OpCompositeExtract %v4float %257 1
- %264 = OpCompositeExtract %v4float %258 1
- %265 = OpFAdd %v4float %263 %264
- %266 = OpCompositeExtract %v4float %257 2
- %267 = OpCompositeExtract %v4float %258 2
- %268 = OpFAdd %v4float %266 %267
- %269 = OpCompositeConstruct %mat3v4float %262 %265 %268
- OpStore %m34 %269
- %270 = OpLoad %mat3v4float %m34
- %271 = OpLoad %mat3v4float %m34
- %273 = OpCompositeExtract %v4float %270 0
- %274 = OpCompositeExtract %v4float %271 0
- %275 = OpFSub %v4float %273 %274
- %276 = OpCompositeExtract %v4float %270 1
- %277 = OpCompositeExtract %v4float %271 1
- %278 = OpFSub %v4float %276 %277
- %279 = OpCompositeExtract %v4float %270 2
- %280 = OpCompositeExtract %v4float %271 2
- %281 = OpFSub %v4float %279 %280
- %282 = OpCompositeConstruct %mat3v4float %275 %278 %281
- OpStore %m34 %282
- %283 = OpLoad %mat4v3float %m43
- %284 = OpLoad %mat3v4float %m34
- %285 = OpMatrixTimesMatrix %mat3v3float %283 %284
- OpStore %m33 %285
- %286 = OpLoad %mat3v4float %m34
- %287 = OpLoad %mat4v3float %m43
- %288 = OpMatrixTimesMatrix %mat4v4float %286 %287
- OpStore %m44 %288
- OpReturn
- OpFunctionEnd
-%tint_symbol_2 = OpFunction %void None %289
-%tint_symbol = OpFunctionParameter %v4float
- %292 = OpLabel
- OpStore %tint_symbol_1 %tint_symbol
- OpReturn
- OpFunctionEnd
- %main = OpFunction %void None %6
- %294 = OpLabel
- %295 = OpFunctionCall %void %tint_symbol_2 %297
- OpReturn
- OpFunctionEnd
diff --git a/test/expressions/binary_expressions.wgsl.expected.wgsl b/test/expressions/binary_expressions.wgsl.expected.wgsl
deleted file mode 100644
index d0e3da1..0000000
--- a/test/expressions/binary_expressions.wgsl.expected.wgsl
+++ /dev/null
@@ -1,105 +0,0 @@
-fn bitwise_i32() {
- var s1 : i32;
- var s2 : i32;
- var v1 : vec3<i32>;
- var v2 : vec3<i32>;
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-fn bitwise_u32() {
- var s1 : u32;
- var s2 : u32;
- var v1 : vec3<u32>;
- var v2 : vec3<u32>;
- s1 = (s1 | s2);
- s1 = (s1 & s2);
- s1 = (s1 ^ s2);
- v1 = (v1 | v2);
- v1 = (v1 & v2);
- v1 = (v1 ^ v2);
-}
-
-fn vector_scalar_f32() {
- var v : vec3<f32>;
- var s : f32;
- var r : vec3<f32>;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
-}
-
-fn vector_scalar_i32() {
- var v : vec3<i32>;
- var s : i32;
- var r : vec3<i32>;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-fn vector_scalar_u32() {
- var v : vec3<u32>;
- var s : u32;
- var r : vec3<u32>;
- r = (v + s);
- r = (v - s);
- r = (v * s);
- r = (v / s);
- r = (v % s);
-}
-
-fn scalar_vector_f32() {
- var v : vec3<f32>;
- var s : f32;
- var r : vec3<f32>;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
-}
-
-fn scalar_vector_i32() {
- var v : vec3<i32>;
- var s : i32;
- var r : vec3<i32>;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-fn scalar_vector_u32() {
- var v : vec3<u32>;
- var s : u32;
- var r : vec3<u32>;
- r = (s + v);
- r = (s - v);
- r = (s * v);
- r = (s / v);
- r = (s % v);
-}
-
-fn matrix_matrix_f32() {
- var m34 : mat3x4<f32>;
- var m43 : mat4x3<f32>;
- var m33 : mat3x3<f32>;
- var m44 : mat4x4<f32>;
- m34 = (m34 + m34);
- m34 = (m34 - m34);
- m33 = (m43 * m34);
- m44 = (m34 * m43);
-}
-
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
-}