diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc index 3f9a9dac46..92be75e7f7 100644 --- a/src/resolver/resolver.cc +++ b/src/resolver/resolver.cc @@ -2221,7 +2221,7 @@ bool Resolver::Binary(ast::BinaryExpression* expr) { // Binary bitwise operations if (expr->IsBitwise()) { - if (matching_types && lhs_type->IsAnyOf()) { + if (matching_types && lhs_type->is_integer_scalar_or_vector()) { SetType(expr, lhs_type); return true; } diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc index aa7169240f..ef447485b0 100644 --- a/src/resolver/resolver_test.cc +++ b/src/resolver/resolver_test.cc @@ -1438,9 +1438,6 @@ static constexpr Params all_valid_cases[] = { Params{Op::kGreaterThanEqual, ast_vec3, ast_vec3, sem_vec3}, - // Bit expressions - // https://gpuweb.github.io/gpuweb/wgsl.html#bit-expr - // Binary bitwise operations Params{Op::kOr, ast_i32, ast_i32, sem_i32}, Params{Op::kAnd, ast_i32, ast_i32, sem_i32}, @@ -1450,6 +1447,14 @@ static constexpr Params all_valid_cases[] = { Params{Op::kAnd, ast_u32, ast_u32, sem_u32}, Params{Op::kXor, ast_u32, ast_u32, sem_u32}, + Params{Op::kOr, ast_vec3, ast_vec3, sem_vec3}, + Params{Op::kAnd, ast_vec3, ast_vec3, sem_vec3}, + Params{Op::kXor, ast_vec3, ast_vec3, sem_vec3}, + + Params{Op::kOr, ast_vec3, ast_vec3, sem_vec3}, + Params{Op::kAnd, ast_vec3, ast_vec3, sem_vec3}, + Params{Op::kXor, ast_vec3, ast_vec3, sem_vec3}, + // Bit shift expressions Params{Op::kShiftLeft, ast_i32, ast_u32, sem_i32}, Params{Op::kShiftLeft, ast_vec3, ast_vec3, sem_vec3}, diff --git a/test/expressions/binary_expressions.wgsl b/test/expressions/binary_expressions.wgsl index b7444a0587..b377a13d99 100644 --- a/test/expressions/binary_expressions.wgsl +++ b/test/expressions/binary_expressions.wgsl @@ -1,3 +1,33 @@ +fn bitwise_i32() { + var s1 : i32; + var s2 : i32; + var v1 : vec3; + var v2 : vec3; + + 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; + var v2 : vec3; + + 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; var s : f32; diff --git a/test/expressions/binary_expressions.wgsl.expected.hlsl b/test/expressions/binary_expressions.wgsl.expected.hlsl index c234983590..fd3c3a4584 100644 --- a/test/expressions/binary_expressions.wgsl.expected.hlsl +++ b/test/expressions/binary_expressions.wgsl.expected.hlsl @@ -2,6 +2,32 @@ struct tint_symbol { float4 value : SV_Target0; }; +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; diff --git a/test/expressions/binary_expressions.wgsl.expected.msl b/test/expressions/binary_expressions.wgsl.expected.msl index 8c6995855c..c9fa2eb0f2 100644 --- a/test/expressions/binary_expressions.wgsl.expected.msl +++ b/test/expressions/binary_expressions.wgsl.expected.msl @@ -5,6 +5,32 @@ 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; diff --git a/test/expressions/binary_expressions.wgsl.expected.spvasm b/test/expressions/binary_expressions.wgsl.expected.spvasm index 8052168bfa..9ec4c3e677 100644 --- a/test/expressions/binary_expressions.wgsl.expected.spvasm +++ b/test/expressions/binary_expressions.wgsl.expected.spvasm @@ -1,13 +1,23 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 250 +; 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" @@ -48,294 +58,358 @@ %tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5 %void = OpTypeVoid %6 = OpTypeFunction %void - %v3float = OpTypeVector %float 3 -%_ptr_Function_v3float = OpTypePointer Function %v3float - %13 = OpConstantNull %v3float -%_ptr_Function_float = OpTypePointer Function %float - %16 = OpConstantNull %float %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %13 = OpConstantNull %int %v3int = OpTypeVector %int 3 %_ptr_Function_v3int = OpTypePointer Function %v3int - %42 = OpConstantNull %v3int -%_ptr_Function_int = OpTypePointer Function %int - %45 = OpConstantNull %int + %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 - %78 = OpConstantNull %v3uint -%_ptr_Function_uint = OpTypePointer Function %uint - %81 = OpConstantNull %uint + %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 - %196 = OpConstantNull %mat3v4float + %244 = OpConstantNull %mat3v4float %mat4v3float = OpTypeMatrix %v3float 4 %_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float - %200 = OpConstantNull %mat4v3float + %248 = OpConstantNull %mat4v3float %mat3v3float = OpTypeMatrix %v3float 3 %_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float - %204 = OpConstantNull %mat3v3float + %252 = OpConstantNull %mat3v3float %mat4v4float = OpTypeMatrix %v4float 4 %_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float - %208 = OpConstantNull %mat4v4float - %241 = OpTypeFunction %void %v4float + %256 = OpConstantNull %mat4v4float + %289 = OpTypeFunction %void %v4float %float_0 = OpConstant %float 0 - %249 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 -%vector_scalar_f32 = OpFunction %void None %6 + %297 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%bitwise_i32 = OpFunction %void None %6 %9 = OpLabel - %v = OpVariable %_ptr_Function_v3float Function %13 - %s = OpVariable %_ptr_Function_float Function %16 - %r = OpVariable %_ptr_Function_v3float Function %13 - %21 = OpVariable %_ptr_Function_v3float Function %13 - %26 = OpVariable %_ptr_Function_v3float Function %13 - %34 = OpVariable %_ptr_Function_v3float Function %13 - %18 = OpLoad %v3float %v - %19 = OpLoad %float %s - %22 = OpCompositeConstruct %v3float %19 %19 %19 - %20 = OpFAdd %v3float %18 %22 - OpStore %r %20 - %23 = OpLoad %v3float %v - %24 = OpLoad %float %s - %27 = OpCompositeConstruct %v3float %24 %24 %24 - %25 = OpFSub %v3float %23 %27 - OpStore %r %25 - %28 = OpLoad %v3float %v - %29 = OpLoad %float %s - %30 = OpVectorTimesScalar %v3float %28 %29 - OpStore %r %30 - %31 = OpLoad %v3float %v - %32 = OpLoad %float %s - %35 = OpCompositeConstruct %v3float %32 %32 %32 - %33 = OpFDiv %v3float %31 %35 - OpStore %r %33 + %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 - %37 = OpLabel - %v_0 = OpVariable %_ptr_Function_v3int Function %42 - %s_0 = OpVariable %_ptr_Function_int Function %45 - %r_0 = OpVariable %_ptr_Function_v3int Function %42 - %50 = OpVariable %_ptr_Function_v3int Function %42 - %55 = OpVariable %_ptr_Function_v3int Function %42 - %60 = OpVariable %_ptr_Function_v3int Function %42 - %65 = OpVariable %_ptr_Function_v3int Function %42 - %70 = OpVariable %_ptr_Function_v3int Function %42 - %47 = OpLoad %v3int %v_0 - %48 = OpLoad %int %s_0 - %51 = OpCompositeConstruct %v3int %48 %48 %48 - %49 = OpIAdd %v3int %47 %51 - OpStore %r_0 %49 - %52 = OpLoad %v3int %v_0 - %53 = OpLoad %int %s_0 - %56 = OpCompositeConstruct %v3int %53 %53 %53 - %54 = OpISub %v3int %52 %56 - OpStore %r_0 %54 - %57 = OpLoad %v3int %v_0 - %58 = OpLoad %int %s_0 - %61 = OpCompositeConstruct %v3int %58 %58 %58 - %59 = OpIMul %v3int %57 %61 - OpStore %r_0 %59 - %62 = OpLoad %v3int %v_0 - %63 = OpLoad %int %s_0 - %66 = OpCompositeConstruct %v3int %63 %63 %63 - %64 = OpSDiv %v3int %62 %66 - OpStore %r_0 %64 - %67 = OpLoad %v3int %v_0 - %68 = OpLoad %int %s_0 - %71 = OpCompositeConstruct %v3int %68 %68 %68 - %69 = OpSMod %v3int %67 %71 - OpStore %r_0 %69 + %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 - %73 = OpLabel - %v_1 = OpVariable %_ptr_Function_v3uint Function %78 - %s_1 = OpVariable %_ptr_Function_uint Function %81 - %r_1 = OpVariable %_ptr_Function_v3uint Function %78 - %86 = OpVariable %_ptr_Function_v3uint Function %78 - %91 = OpVariable %_ptr_Function_v3uint Function %78 - %96 = OpVariable %_ptr_Function_v3uint Function %78 - %101 = OpVariable %_ptr_Function_v3uint Function %78 - %106 = OpVariable %_ptr_Function_v3uint Function %78 - %83 = OpLoad %v3uint %v_1 - %84 = OpLoad %uint %s_1 - %87 = OpCompositeConstruct %v3uint %84 %84 %84 - %85 = OpIAdd %v3uint %83 %87 - OpStore %r_1 %85 - %88 = OpLoad %v3uint %v_1 - %89 = OpLoad %uint %s_1 - %92 = OpCompositeConstruct %v3uint %89 %89 %89 - %90 = OpISub %v3uint %88 %92 - OpStore %r_1 %90 - %93 = OpLoad %v3uint %v_1 - %94 = OpLoad %uint %s_1 - %97 = OpCompositeConstruct %v3uint %94 %94 %94 - %95 = OpIMul %v3uint %93 %97 - OpStore %r_1 %95 - %98 = OpLoad %v3uint %v_1 - %99 = OpLoad %uint %s_1 - %102 = OpCompositeConstruct %v3uint %99 %99 %99 - %100 = OpUDiv %v3uint %98 %102 - OpStore %r_1 %100 - %103 = OpLoad %v3uint %v_1 - %104 = OpLoad %uint %s_1 - %107 = OpCompositeConstruct %v3uint %104 %104 %104 - %105 = OpUMod %v3uint %103 %107 - OpStore %r_1 %105 + %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 - %109 = OpLabel - %v_2 = OpVariable %_ptr_Function_v3float Function %13 - %s_2 = OpVariable %_ptr_Function_float Function %16 - %r_2 = OpVariable %_ptr_Function_v3float Function %13 - %116 = OpVariable %_ptr_Function_v3float Function %13 - %121 = OpVariable %_ptr_Function_v3float Function %13 - %129 = OpVariable %_ptr_Function_v3float Function %13 - %113 = OpLoad %float %s_2 - %114 = OpLoad %v3float %v_2 - %117 = OpCompositeConstruct %v3float %113 %113 %113 - %115 = OpFAdd %v3float %117 %114 - OpStore %r_2 %115 - %118 = OpLoad %float %s_2 - %119 = OpLoad %v3float %v_2 - %122 = OpCompositeConstruct %v3float %118 %118 %118 - %120 = OpFSub %v3float %122 %119 - OpStore %r_2 %120 - %123 = OpLoad %float %s_2 - %124 = OpLoad %v3float %v_2 - %125 = OpVectorTimesScalar %v3float %124 %123 - OpStore %r_2 %125 - %126 = OpLoad %float %s_2 - %127 = OpLoad %v3float %v_2 - %130 = OpCompositeConstruct %v3float %126 %126 %126 - %128 = OpFDiv %v3float %130 %127 - OpStore %r_2 %128 + %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 - %132 = OpLabel - %v_3 = OpVariable %_ptr_Function_v3int Function %42 - %s_3 = OpVariable %_ptr_Function_int Function %45 - %r_3 = OpVariable %_ptr_Function_v3int Function %42 - %139 = OpVariable %_ptr_Function_v3int Function %42 - %144 = OpVariable %_ptr_Function_v3int Function %42 - %149 = OpVariable %_ptr_Function_v3int Function %42 - %154 = OpVariable %_ptr_Function_v3int Function %42 - %159 = OpVariable %_ptr_Function_v3int Function %42 - %136 = OpLoad %int %s_3 - %137 = OpLoad %v3int %v_3 - %140 = OpCompositeConstruct %v3int %136 %136 %136 - %138 = OpIAdd %v3int %140 %137 - OpStore %r_3 %138 - %141 = OpLoad %int %s_3 - %142 = OpLoad %v3int %v_3 - %145 = OpCompositeConstruct %v3int %141 %141 %141 - %143 = OpISub %v3int %145 %142 - OpStore %r_3 %143 - %146 = OpLoad %int %s_3 - %147 = OpLoad %v3int %v_3 - %150 = OpCompositeConstruct %v3int %146 %146 %146 - %148 = OpIMul %v3int %150 %147 - OpStore %r_3 %148 - %151 = OpLoad %int %s_3 - %152 = OpLoad %v3int %v_3 - %155 = OpCompositeConstruct %v3int %151 %151 %151 - %153 = OpSDiv %v3int %155 %152 - OpStore %r_3 %153 - %156 = OpLoad %int %s_3 - %157 = OpLoad %v3int %v_3 - %160 = OpCompositeConstruct %v3int %156 %156 %156 - %158 = OpSMod %v3int %160 %157 - OpStore %r_3 %158 + %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 - %162 = OpLabel - %v_4 = OpVariable %_ptr_Function_v3uint Function %78 - %s_4 = OpVariable %_ptr_Function_uint Function %81 - %r_4 = OpVariable %_ptr_Function_v3uint Function %78 - %169 = OpVariable %_ptr_Function_v3uint Function %78 - %174 = OpVariable %_ptr_Function_v3uint Function %78 - %179 = OpVariable %_ptr_Function_v3uint Function %78 - %184 = OpVariable %_ptr_Function_v3uint Function %78 - %189 = OpVariable %_ptr_Function_v3uint Function %78 - %166 = OpLoad %uint %s_4 - %167 = OpLoad %v3uint %v_4 - %170 = OpCompositeConstruct %v3uint %166 %166 %166 - %168 = OpIAdd %v3uint %170 %167 - OpStore %r_4 %168 - %171 = OpLoad %uint %s_4 - %172 = OpLoad %v3uint %v_4 - %175 = OpCompositeConstruct %v3uint %171 %171 %171 - %173 = OpISub %v3uint %175 %172 - OpStore %r_4 %173 - %176 = OpLoad %uint %s_4 - %177 = OpLoad %v3uint %v_4 - %180 = OpCompositeConstruct %v3uint %176 %176 %176 - %178 = OpIMul %v3uint %180 %177 - OpStore %r_4 %178 - %181 = OpLoad %uint %s_4 - %182 = OpLoad %v3uint %v_4 - %185 = OpCompositeConstruct %v3uint %181 %181 %181 - %183 = OpUDiv %v3uint %185 %182 - OpStore %r_4 %183 - %186 = OpLoad %uint %s_4 - %187 = OpLoad %v3uint %v_4 - %190 = OpCompositeConstruct %v3uint %186 %186 %186 - %188 = OpUMod %v3uint %190 %187 - OpStore %r_4 %188 + %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 - %192 = OpLabel - %m34 = OpVariable %_ptr_Function_mat3v4float Function %196 - %m43 = OpVariable %_ptr_Function_mat4v3float Function %200 - %m33 = OpVariable %_ptr_Function_mat3v3float Function %204 - %m44 = OpVariable %_ptr_Function_mat4v4float Function %208 - %209 = OpLoad %mat3v4float %m34 - %210 = OpLoad %mat3v4float %m34 - %212 = OpCompositeExtract %v4float %209 0 - %213 = OpCompositeExtract %v4float %210 0 - %214 = OpFAdd %v4float %212 %213 - %215 = OpCompositeExtract %v4float %209 1 - %216 = OpCompositeExtract %v4float %210 1 - %217 = OpFAdd %v4float %215 %216 - %218 = OpCompositeExtract %v4float %209 2 - %219 = OpCompositeExtract %v4float %210 2 - %220 = OpFAdd %v4float %218 %219 - %221 = OpCompositeConstruct %mat3v4float %214 %217 %220 - OpStore %m34 %221 - %222 = OpLoad %mat3v4float %m34 - %223 = OpLoad %mat3v4float %m34 - %225 = OpCompositeExtract %v4float %222 0 - %226 = OpCompositeExtract %v4float %223 0 - %227 = OpFSub %v4float %225 %226 - %228 = OpCompositeExtract %v4float %222 1 - %229 = OpCompositeExtract %v4float %223 1 - %230 = OpFSub %v4float %228 %229 - %231 = OpCompositeExtract %v4float %222 2 - %232 = OpCompositeExtract %v4float %223 2 - %233 = OpFSub %v4float %231 %232 - %234 = OpCompositeConstruct %mat3v4float %227 %230 %233 - OpStore %m34 %234 - %235 = OpLoad %mat4v3float %m43 - %236 = OpLoad %mat3v4float %m34 - %237 = OpMatrixTimesMatrix %mat3v3float %235 %236 - OpStore %m33 %237 - %238 = OpLoad %mat3v4float %m34 - %239 = OpLoad %mat4v3float %m43 - %240 = OpMatrixTimesMatrix %mat4v4float %238 %239 - OpStore %m44 %240 + %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 %241 +%tint_symbol_2 = OpFunction %void None %289 %tint_symbol = OpFunctionParameter %v4float - %244 = OpLabel + %292 = OpLabel OpStore %tint_symbol_1 %tint_symbol OpReturn OpFunctionEnd %main = OpFunction %void None %6 - %246 = OpLabel - %247 = OpFunctionCall %void %tint_symbol_2 %249 + %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 index cd0bf554b1..d0e3da18e2 100644 --- a/test/expressions/binary_expressions.wgsl.expected.wgsl +++ b/test/expressions/binary_expressions.wgsl.expected.wgsl @@ -1,3 +1,29 @@ +fn bitwise_i32() { + var s1 : i32; + var s2 : i32; + var v1 : vec3; + var v2 : vec3; + 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; + var v2 : vec3; + 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; var s : f32;