tint: const eval of insertBits

Bug: tint:1581
Change-Id: Id89530eb90d3c75bd1f99dd67a78cad1c923c6f0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/107924
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
Antonio Maiorano 2022-11-02 20:40:23 +00:00 committed by Dawn LUCI CQ
parent e372511e1b
commit 336f3536e5
46 changed files with 391 additions and 738 deletions

View File

@ -485,8 +485,8 @@ fn frexp<N: num, T: f32_f16>(vec<N, T>) -> __frexp_result_vec<N, T>
@stage("fragment") fn fwidthCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
@stage("fragment") fn fwidthFine(f32) -> f32
@stage("fragment") fn fwidthFine<N: num>(vec<N, f32>) -> vec<N, f32>
fn insertBits<T: iu32>(T, T, u32, u32) -> T
fn insertBits<N: num, T: iu32>(vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
@const fn insertBits<T: iu32>(T, T, u32, u32) -> T
@const fn insertBits<N: num, T: iu32>(vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
fn inverseSqrt<T: f32_f16>(T) -> T
fn inverseSqrt<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
fn ldexp<T: f32_f16>(T, i32) -> T

View File

@ -1790,6 +1790,58 @@ ConstEval::Result ConstEval::firstTrailingBit(const sem::Type* ty,
return TransformElements(builder, ty, transform, args[0]);
}
ConstEval::Result ConstEval::insertBits(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args,
const Source& source) {
auto transform = [&](const sem::Constant* c0, const sem::Constant* c1) {
auto create = [&](auto in_e, auto in_newbits) -> ImplResult {
using NumberT = decltype(in_e);
using T = UnwrapNumber<NumberT>;
using UT = std::make_unsigned_t<T>;
using NumberUT = Number<UT>;
// Read args that are always scalar
NumberUT in_offset = args[2]->As<NumberUT>();
NumberUT in_count = args[3]->As<NumberUT>();
constexpr UT w = sizeof(UT) * 8;
if ((in_offset + in_count) > w) {
AddError("'offset + 'count' must be less than or equal to the bit width of 'e'",
source);
return utils::Failure;
}
// Cast all to unsigned
UT e = static_cast<UT>(in_e);
UT newbits = static_cast<UT>(in_newbits);
UT o = static_cast<UT>(in_offset);
UT c = static_cast<UT>(in_count);
NumberT result;
if (c == UT{0}) {
// The result is e if c is 0
result = NumberT{e};
} else if (c == w) {
// The result is newbits if c is w
result = NumberT{newbits};
} else {
// Otherwise, bits o..o + c - 1 of the result are copied from bits 0..c - 1 of
// newbits. Other bits of the result are copied from e.
UT from = newbits << o;
UT mask = ((UT{1} << c) - UT{1}) << UT{o};
auto r = e; // Start with 'e' as the result
r = r & ~mask; // Zero the bits in 'e' we're overwriting
r = r | (from & mask); // Overwrite from 'newbits' (shifted into position)
result = NumberT{r};
}
return CreateElement(builder, c0->Type(), result);
};
return Dispatch_iu32(create, c0, c1);
};
return TransformElements(builder, ty, transform, args[0], args[1]);
}
ConstEval::Result ConstEval::saturate(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args,
const Source&) {

View File

@ -485,6 +485,15 @@ class ConstEval {
utils::VectorRef<const sem::Constant*> args,
const Source& source);
/// insertBits builtin
/// @param ty the expression type
/// @param args the input arguments
/// @param source the source location of the conversion
/// @return the result value, or null if the value cannot be calculated
Result insertBits(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args,
const Source& source);
/// saturate builtin
/// @param ty the expression type
/// @param args the input arguments

View File

@ -713,6 +713,94 @@ INSTANTIATE_TEST_SUITE_P( //
testing::ValuesIn(Concat(FirstTrailingBitCases<i32>(), //
FirstTrailingBitCases<u32>()))));
template <typename T>
std::vector<Case> InsertBitsCases() {
using UT = Number<std::make_unsigned_t<UnwrapNumber<T>>>;
auto e = /* */ T(0b0101'1100'0011'1010'0101'1100'0011'1010);
auto newbits = T{0b1010'0011'1100'0101'1010'0011'1100'0101};
auto r = std::vector<Case>{
// args: e, newbits, offset, count
// If count is 0, result is e
C({e, newbits, UT(0), UT(0)}, e), //
C({e, newbits, UT(1), UT(0)}, e), //
C({e, newbits, UT(2), UT(0)}, e), //
C({e, newbits, UT(3), UT(0)}, e), //
// ...
C({e, newbits, UT(29), UT(0)}, e), //
C({e, newbits, UT(30), UT(0)}, e), //
C({e, newbits, UT(31), UT(0)}, e),
// Copy 1 to 32 bits of newbits to e at offset 0
C({e, newbits, UT(0), UT(1)}, T(0b0101'1100'0011'1010'0101'1100'0011'1011)),
C({e, newbits, UT(0), UT(2)}, T(0b0101'1100'0011'1010'0101'1100'0011'1001)),
C({e, newbits, UT(0), UT(3)}, T(0b0101'1100'0011'1010'0101'1100'0011'1101)),
C({e, newbits, UT(0), UT(4)}, T(0b0101'1100'0011'1010'0101'1100'0011'0101)),
C({e, newbits, UT(0), UT(5)}, T(0b0101'1100'0011'1010'0101'1100'0010'0101)),
C({e, newbits, UT(0), UT(6)}, T(0b0101'1100'0011'1010'0101'1100'0000'0101)),
// ...
C({e, newbits, UT(0), UT(29)}, T(0b0100'0011'1100'0101'1010'0011'1100'0101)),
C({e, newbits, UT(0), UT(30)}, T(0b0110'0011'1100'0101'1010'0011'1100'0101)),
C({e, newbits, UT(0), UT(31)}, T(0b0010'0011'1100'0101'1010'0011'1100'0101)),
C({e, newbits, UT(0), UT(32)}, T(0b1010'0011'1100'0101'1010'0011'1100'0101)),
// Copy at varying offsets and counts
C({e, newbits, UT(3), UT(8)}, T(0b0101'1100'0011'1010'0101'1110'0010'1010)),
C({e, newbits, UT(8), UT(8)}, T(0b0101'1100'0011'1010'1100'0101'0011'1010)),
C({e, newbits, UT(15), UT(1)}, T(0b0101'1100'0011'1010'1101'1100'0011'1010)),
C({e, newbits, UT(16), UT(16)}, T(0b1010'0011'1100'0101'0101'1100'0011'1010)),
// Vector tests
C({Vec(T(0b1111'0000'1111'0000'1111'0000'1111'0000), //
T(0b0000'1111'0000'1111'0000'1111'0000'1111), //
T(0b1010'0101'1010'0101'1010'0101'1010'0101)),
Vec(T(0b1111'1111'1111'1111'1111'1111'1111'1111), //
T(0b1111'1111'1111'1111'1111'1111'1111'1111), //
T(0b1111'1111'1111'1111'1111'1111'1111'1111)),
Val(UT(3)), Val(UT(8))},
Vec(T(0b1111'0000'1111'0000'1111'0111'1111'1000), //
T(0b0000'1111'0000'1111'0000'1111'1111'1111), //
T(0b1010'0101'1010'0101'1010'0111'1111'1101))),
};
return r;
}
INSTANTIATE_TEST_SUITE_P( //
InsertBits,
ResolverConstEvalBuiltinTest,
testing::Combine(testing::Values(sem::BuiltinType::kInsertBits),
testing::ValuesIn(Concat(InsertBitsCases<i32>(), //
InsertBitsCases<u32>()))));
using ResolverConstEvalBuiltinTest_InsertBits_InvalidOffsetAndCount =
ResolverTestWithParam<std::tuple<size_t, size_t>>;
TEST_P(ResolverConstEvalBuiltinTest_InsertBits_InvalidOffsetAndCount, Test) {
auto& p = GetParam();
auto* expr = Call(Source{{12, 24}}, sem::str(sem::BuiltinType::kInsertBits), Expr(1_u),
Expr(1_u), Expr(u32(std::get<0>(p))), Expr(u32(std::get<1>(p))));
GlobalConst("C", expr);
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
"12:24 error: 'offset + 'count' must be less than or equal to the bit width of 'e'");
}
INSTANTIATE_TEST_SUITE_P(InsertBits,
ResolverConstEvalBuiltinTest_InsertBits_InvalidOffsetAndCount,
testing::Values( //
std::make_tuple(33, 0), //
std::make_tuple(34, 0), //
std::make_tuple(1000, 0), //
std::make_tuple(u32::Highest(), 0), //
std::make_tuple(0, 33), //
std::make_tuple(0, 34), //
std::make_tuple(0, 1000), //
std::make_tuple(0, u32::Highest()), //
std::make_tuple(33, 33), //
std::make_tuple(34, 34), //
std::make_tuple(1000, 1000), //
std::make_tuple(u32::Highest(), u32::Highest())));
template <typename T>
std::vector<Case> SaturateCases() {
return {

View File

@ -11894,7 +11894,7 @@ constexpr OverloadInfo kOverloads[] = {
/* parameters */ &kParameters[423],
/* return matcher indices */ &kMatcherIndices[1],
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
/* const eval */ nullptr,
/* const eval */ &ConstEval::insertBits,
},
{
/* [297] */
@ -11906,7 +11906,7 @@ constexpr OverloadInfo kOverloads[] = {
/* parameters */ &kParameters[427],
/* return matcher indices */ &kMatcherIndices[30],
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
/* const eval */ nullptr,
/* const eval */ &ConstEval::insertBits,
},
{
/* [298] */

View File

@ -1,12 +1,5 @@
uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint2((s).xx)) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
}
void insertBits_3c7ba5() {
uint2 res = tint_insert_bits((1u).xx, (1u).xx, 1u, 1u);
uint2 res = (3u).xx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint2((s).xx)) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
}
void insertBits_3c7ba5() {
uint2 res = tint_insert_bits((1u).xx, (1u).xx, 1u, 1u);
uint2 res = (3u).xx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
uvec2 tint_insert_bits(uvec2 v, uvec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_3c7ba5() {
uvec2 res = tint_insert_bits(uvec2(1u), uvec2(1u), 1u, 1u);
uvec2 res = uvec2(3u);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
uvec2 tint_insert_bits(uvec2 v, uvec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_3c7ba5() {
uvec2 res = tint_insert_bits(uvec2(1u), uvec2(1u), 1u, 1u);
uvec2 res = uvec2(3u);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
uvec2 tint_insert_bits(uvec2 v, uvec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_3c7ba5() {
uvec2 res = tint_insert_bits(uvec2(1u), uvec2(1u), 1u, 1u);
uvec2 res = uvec2(3u);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_3c7ba5() {
uint2 res = tint_insert_bits(uint2(1u), uint2(1u), 1u, 1u);
uint2 res = uint2(3u);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 49
; Bound: 34
; Schema: 0
OpCapability Shader
%19 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_3c7ba5 "insertBits_3c7ba5"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,57 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v2uint = OpTypeVector %uint 2
%9 = OpTypeFunction %v2uint %v2uint %v2uint %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%25 = OpTypeFunction %void
%uint_1 = OpConstant %uint 1
%31 = OpConstantComposite %v2uint %uint_1 %uint_1
%uint_3 = OpConstant %uint 3
%16 = OpConstantComposite %v2uint %uint_3 %uint_3
%_ptr_Function_v2uint = OpTypePointer Function %v2uint
%34 = OpConstantNull %v2uint
%35 = OpTypeFunction %v4float
%19 = OpConstantNull %v2uint
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v2uint None %9
%v = OpFunctionParameter %v2uint
%n = OpFunctionParameter %v2uint
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%17 = OpLabel
%18 = OpExtInst %uint %19 UMin %offset %uint_32
%22 = OpIAdd %uint %18 %count
%21 = OpExtInst %uint %19 UMin %uint_32 %22
%24 = OpISub %uint %21 %18
%23 = OpBitFieldInsert %v2uint %v %n %18 %24
OpReturnValue %23
OpFunctionEnd
%insertBits_3c7ba5 = OpFunction %void None %25
%28 = OpLabel
%res = OpVariable %_ptr_Function_v2uint Function %34
%29 = OpFunctionCall %v2uint %tint_insert_bits %31 %31 %uint_1 %uint_1
OpStore %res %29
%insertBits_3c7ba5 = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v2uint Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %35
%37 = OpLabel
%38 = OpFunctionCall %void %insertBits_3c7ba5
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_3c7ba5
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %25
%40 = OpLabel
%41 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %41
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %25
%44 = OpLabel
%45 = OpFunctionCall %void %insertBits_3c7ba5
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_3c7ba5
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %25
%47 = OpLabel
%48 = OpFunctionCall %void %insertBits_3c7ba5
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_3c7ba5
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
}
void insertBits_428b0b() {
int3 res = tint_insert_bits((1).xxx, (1).xxx, 1u, 1u);
int3 res = (3).xxx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
}
void insertBits_428b0b() {
int3 res = tint_insert_bits((1).xxx, (1).xxx, 1u, 1u);
int3 res = (3).xxx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
ivec3 tint_insert_bits(ivec3 v, ivec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_428b0b() {
ivec3 res = tint_insert_bits(ivec3(1), ivec3(1), 1u, 1u);
ivec3 res = ivec3(3);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
ivec3 tint_insert_bits(ivec3 v, ivec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_428b0b() {
ivec3 res = tint_insert_bits(ivec3(1), ivec3(1), 1u, 1u);
ivec3 res = ivec3(3);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
ivec3 tint_insert_bits(ivec3 v, ivec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_428b0b() {
ivec3 res = tint_insert_bits(ivec3(1), ivec3(1), 1u, 1u);
ivec3 res = ivec3(3);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_428b0b() {
int3 res = tint_insert_bits(int3(1), int3(1), 1u, 1u);
int3 res = int3(3);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 51
; Bound: 34
; Schema: 0
OpCapability Shader
%20 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_428b0b "insertBits_428b0b"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,59 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%int = OpTypeInt 32 1
%v3int = OpTypeVector %int 3
%uint = OpTypeInt 32 0
%9 = OpTypeFunction %v3int %v3int %v3int %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%26 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%32 = OpConstantComposite %v3int %int_1 %int_1 %int_1
%uint_1 = OpConstant %uint 1
%int_3 = OpConstant %int 3
%16 = OpConstantComposite %v3int %int_3 %int_3 %int_3
%_ptr_Function_v3int = OpTypePointer Function %v3int
%36 = OpConstantNull %v3int
%37 = OpTypeFunction %v4float
%19 = OpConstantNull %v3int
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v3int None %9
%v = OpFunctionParameter %v3int
%n = OpFunctionParameter %v3int
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%18 = OpLabel
%19 = OpExtInst %uint %20 UMin %offset %uint_32
%23 = OpIAdd %uint %19 %count
%22 = OpExtInst %uint %20 UMin %uint_32 %23
%25 = OpISub %uint %22 %19
%24 = OpBitFieldInsert %v3int %v %n %19 %25
OpReturnValue %24
OpFunctionEnd
%insertBits_428b0b = OpFunction %void None %26
%29 = OpLabel
%res = OpVariable %_ptr_Function_v3int Function %36
%30 = OpFunctionCall %v3int %tint_insert_bits %32 %32 %uint_1 %uint_1
OpStore %res %30
%insertBits_428b0b = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v3int Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %37
%39 = OpLabel
%40 = OpFunctionCall %void %insertBits_428b0b
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_428b0b
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %26
%42 = OpLabel
%43 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %43
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %26
%46 = OpLabel
%47 = OpFunctionCall %void %insertBits_428b0b
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_428b0b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %26
%49 = OpLabel
%50 = OpFunctionCall %void %insertBits_428b0b
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_428b0b
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
uint4 tint_insert_bits(uint4 v, uint4 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint4((s).xxxx)) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
}
void insertBits_51ede1() {
uint4 res = tint_insert_bits((1u).xxxx, (1u).xxxx, 1u, 1u);
uint4 res = (3u).xxxx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
uint4 tint_insert_bits(uint4 v, uint4 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint4((s).xxxx)) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
}
void insertBits_51ede1() {
uint4 res = tint_insert_bits((1u).xxxx, (1u).xxxx, 1u, 1u);
uint4 res = (3u).xxxx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
uvec4 tint_insert_bits(uvec4 v, uvec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_51ede1() {
uvec4 res = tint_insert_bits(uvec4(1u), uvec4(1u), 1u, 1u);
uvec4 res = uvec4(3u);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
uvec4 tint_insert_bits(uvec4 v, uvec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_51ede1() {
uvec4 res = tint_insert_bits(uvec4(1u), uvec4(1u), 1u, 1u);
uvec4 res = uvec4(3u);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
uvec4 tint_insert_bits(uvec4 v, uvec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_51ede1() {
uvec4 res = tint_insert_bits(uvec4(1u), uvec4(1u), 1u, 1u);
uvec4 res = uvec4(3u);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
uint4 tint_insert_bits(uint4 v, uint4 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_51ede1() {
uint4 res = tint_insert_bits(uint4(1u), uint4(1u), 1u, 1u);
uint4 res = uint4(3u);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 49
; Bound: 34
; Schema: 0
OpCapability Shader
%19 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_51ede1 "insertBits_51ede1"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,57 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%9 = OpTypeFunction %v4uint %v4uint %v4uint %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%25 = OpTypeFunction %void
%uint_1 = OpConstant %uint 1
%31 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
%uint_3 = OpConstant %uint 3
%16 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3
%_ptr_Function_v4uint = OpTypePointer Function %v4uint
%34 = OpConstantNull %v4uint
%35 = OpTypeFunction %v4float
%19 = OpConstantNull %v4uint
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v4uint None %9
%v = OpFunctionParameter %v4uint
%n = OpFunctionParameter %v4uint
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%17 = OpLabel
%18 = OpExtInst %uint %19 UMin %offset %uint_32
%22 = OpIAdd %uint %18 %count
%21 = OpExtInst %uint %19 UMin %uint_32 %22
%24 = OpISub %uint %21 %18
%23 = OpBitFieldInsert %v4uint %v %n %18 %24
OpReturnValue %23
OpFunctionEnd
%insertBits_51ede1 = OpFunction %void None %25
%28 = OpLabel
%res = OpVariable %_ptr_Function_v4uint Function %34
%29 = OpFunctionCall %v4uint %tint_insert_bits %31 %31 %uint_1 %uint_1
OpStore %res %29
%insertBits_51ede1 = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v4uint Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %35
%37 = OpLabel
%38 = OpFunctionCall %void %insertBits_51ede1
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_51ede1
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %25
%40 = OpLabel
%41 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %41
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %25
%44 = OpLabel
%45 = OpFunctionCall %void %insertBits_51ede1
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_51ede1
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %25
%47 = OpLabel
%48 = OpFunctionCall %void %insertBits_51ede1
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_51ede1
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
int tint_insert_bits(int v, int n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << s) & int(mask)) | (v & int(~(mask))));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
int tint_insert_bits(int v, int n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << s) & int(mask)) | (v & int(~(mask))));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
int tint_insert_bits(int v, int n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
int tint_insert_bits(int v, int n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
int tint_insert_bits(int v, int n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
int tint_insert_bits(int v, int n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_65468b() {
int res = tint_insert_bits(1, 1, 1u, 1u);
int res = 3;
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 49
; Bound: 32
; Schema: 0
OpCapability Shader
%19 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_65468b "insertBits_65468b"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,57 +28,39 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%int = OpTypeInt 32 1
%uint = OpTypeInt 32 0
%9 = OpTypeFunction %int %int %int %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%25 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%uint_1 = OpConstant %uint 1
%9 = OpTypeFunction %void
%int = OpTypeInt 32 1
%int_3 = OpConstant %int 3
%_ptr_Function_int = OpTypePointer Function %int
%34 = OpConstantNull %int
%35 = OpTypeFunction %v4float
%17 = OpConstantNull %int
%18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %int None %9
%v = OpFunctionParameter %int
%n = OpFunctionParameter %int
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%17 = OpLabel
%18 = OpExtInst %uint %19 UMin %offset %uint_32
%22 = OpIAdd %uint %18 %count
%21 = OpExtInst %uint %19 UMin %uint_32 %22
%24 = OpISub %uint %21 %18
%23 = OpBitFieldInsert %int %v %n %18 %24
OpReturnValue %23
OpFunctionEnd
%insertBits_65468b = OpFunction %void None %25
%28 = OpLabel
%res = OpVariable %_ptr_Function_int Function %34
%29 = OpFunctionCall %int %tint_insert_bits %int_1 %int_1 %uint_1 %uint_1
OpStore %res %29
%insertBits_65468b = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_int Function %17
OpStore %res %int_3
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %35
%37 = OpLabel
%38 = OpFunctionCall %void %insertBits_65468b
%vertex_main_inner = OpFunction %v4float None %18
%20 = OpLabel
%21 = OpFunctionCall %void %insertBits_65468b
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %25
%40 = OpLabel
%41 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %41
%vertex_main = OpFunction %void None %9
%23 = OpLabel
%24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %24
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %25
%44 = OpLabel
%45 = OpFunctionCall %void %insertBits_65468b
%fragment_main = OpFunction %void None %9
%27 = OpLabel
%28 = OpFunctionCall %void %insertBits_65468b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %25
%47 = OpLabel
%48 = OpFunctionCall %void %insertBits_65468b
%compute_main = OpFunction %void None %9
%30 = OpLabel
%31 = OpFunctionCall %void %insertBits_65468b
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
}
void insertBits_87826b() {
uint3 res = tint_insert_bits((1u).xxx, (1u).xxx, 1u, 1u);
uint3 res = (3u).xxx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
}
void insertBits_87826b() {
uint3 res = tint_insert_bits((1u).xxx, (1u).xxx, 1u, 1u);
uint3 res = (3u).xxx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
uvec3 tint_insert_bits(uvec3 v, uvec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_87826b() {
uvec3 res = tint_insert_bits(uvec3(1u), uvec3(1u), 1u, 1u);
uvec3 res = uvec3(3u);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
uvec3 tint_insert_bits(uvec3 v, uvec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_87826b() {
uvec3 res = tint_insert_bits(uvec3(1u), uvec3(1u), 1u, 1u);
uvec3 res = uvec3(3u);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
uvec3 tint_insert_bits(uvec3 v, uvec3 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_87826b() {
uvec3 res = tint_insert_bits(uvec3(1u), uvec3(1u), 1u, 1u);
uvec3 res = uvec3(3u);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_87826b() {
uint3 res = tint_insert_bits(uint3(1u), uint3(1u), 1u, 1u);
uint3 res = uint3(3u);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 49
; Bound: 34
; Schema: 0
OpCapability Shader
%19 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_87826b "insertBits_87826b"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,57 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%9 = OpTypeFunction %v3uint %v3uint %v3uint %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%25 = OpTypeFunction %void
%uint_1 = OpConstant %uint 1
%31 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
%uint_3 = OpConstant %uint 3
%16 = OpConstantComposite %v3uint %uint_3 %uint_3 %uint_3
%_ptr_Function_v3uint = OpTypePointer Function %v3uint
%34 = OpConstantNull %v3uint
%35 = OpTypeFunction %v4float
%19 = OpConstantNull %v3uint
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v3uint None %9
%v = OpFunctionParameter %v3uint
%n = OpFunctionParameter %v3uint
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%17 = OpLabel
%18 = OpExtInst %uint %19 UMin %offset %uint_32
%22 = OpIAdd %uint %18 %count
%21 = OpExtInst %uint %19 UMin %uint_32 %22
%24 = OpISub %uint %21 %18
%23 = OpBitFieldInsert %v3uint %v %n %18 %24
OpReturnValue %23
OpFunctionEnd
%insertBits_87826b = OpFunction %void None %25
%28 = OpLabel
%res = OpVariable %_ptr_Function_v3uint Function %34
%29 = OpFunctionCall %v3uint %tint_insert_bits %31 %31 %uint_1 %uint_1
OpStore %res %29
%insertBits_87826b = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v3uint Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %35
%37 = OpLabel
%38 = OpFunctionCall %void %insertBits_87826b
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_87826b
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %25
%40 = OpLabel
%41 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %41
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %25
%44 = OpLabel
%45 = OpFunctionCall %void %insertBits_87826b
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_87826b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %25
%47 = OpLabel
%48 = OpFunctionCall %void %insertBits_87826b
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_87826b
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
int4 tint_insert_bits(int4 v, int4 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint4((s).xxxx)) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
}
void insertBits_d86978() {
int4 res = tint_insert_bits((1).xxxx, (1).xxxx, 1u, 1u);
int4 res = (3).xxxx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
int4 tint_insert_bits(int4 v, int4 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint4((s).xxxx)) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
}
void insertBits_d86978() {
int4 res = tint_insert_bits((1).xxxx, (1).xxxx, 1u, 1u);
int4 res = (3).xxxx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
ivec4 tint_insert_bits(ivec4 v, ivec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_d86978() {
ivec4 res = tint_insert_bits(ivec4(1), ivec4(1), 1u, 1u);
ivec4 res = ivec4(3);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
ivec4 tint_insert_bits(ivec4 v, ivec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_d86978() {
ivec4 res = tint_insert_bits(ivec4(1), ivec4(1), 1u, 1u);
ivec4 res = ivec4(3);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
ivec4 tint_insert_bits(ivec4 v, ivec4 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_d86978() {
ivec4 res = tint_insert_bits(ivec4(1), ivec4(1), 1u, 1u);
ivec4 res = ivec4(3);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
int4 tint_insert_bits(int4 v, int4 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_d86978() {
int4 res = tint_insert_bits(int4(1), int4(1), 1u, 1u);
int4 res = int4(3);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 51
; Bound: 34
; Schema: 0
OpCapability Shader
%20 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_d86978 "insertBits_d86978"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,59 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%int = OpTypeInt 32 1
%v4int = OpTypeVector %int 4
%uint = OpTypeInt 32 0
%9 = OpTypeFunction %v4int %v4int %v4int %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%26 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%32 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
%uint_1 = OpConstant %uint 1
%int_3 = OpConstant %int 3
%16 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
%_ptr_Function_v4int = OpTypePointer Function %v4int
%36 = OpConstantNull %v4int
%37 = OpTypeFunction %v4float
%19 = OpConstantNull %v4int
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v4int None %9
%v = OpFunctionParameter %v4int
%n = OpFunctionParameter %v4int
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%18 = OpLabel
%19 = OpExtInst %uint %20 UMin %offset %uint_32
%23 = OpIAdd %uint %19 %count
%22 = OpExtInst %uint %20 UMin %uint_32 %23
%25 = OpISub %uint %22 %19
%24 = OpBitFieldInsert %v4int %v %n %19 %25
OpReturnValue %24
OpFunctionEnd
%insertBits_d86978 = OpFunction %void None %26
%29 = OpLabel
%res = OpVariable %_ptr_Function_v4int Function %36
%30 = OpFunctionCall %v4int %tint_insert_bits %32 %32 %uint_1 %uint_1
OpStore %res %30
%insertBits_d86978 = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v4int Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %37
%39 = OpLabel
%40 = OpFunctionCall %void %insertBits_d86978
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_d86978
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %26
%42 = OpLabel
%43 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %43
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %26
%46 = OpLabel
%47 = OpFunctionCall %void %insertBits_d86978
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_d86978
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %26
%49 = OpLabel
%50 = OpFunctionCall %void %insertBits_d86978
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_d86978
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << s) & mask) | (v & ~(mask)));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << s) & mask) | (v & ~(mask)));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_e3e3a2() {
uint res = tint_insert_bits(1u, 1u, 1u, 1u);
uint res = 3u;
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 47
; Bound: 32
; Schema: 0
OpCapability Shader
%18 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_e3e3a2 "insertBits_e3e3a2"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,55 +28,39 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%uint = OpTypeInt 32 0
%9 = OpTypeFunction %uint %uint %uint %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%24 = OpTypeFunction %void
%uint_1 = OpConstant %uint 1
%9 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%uint_3 = OpConstant %uint 3
%_ptr_Function_uint = OpTypePointer Function %uint
%32 = OpConstantNull %uint
%33 = OpTypeFunction %v4float
%17 = OpConstantNull %uint
%18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %uint None %9
%v = OpFunctionParameter %uint
%n = OpFunctionParameter %uint
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%16 = OpLabel
%17 = OpExtInst %uint %18 UMin %offset %uint_32
%21 = OpIAdd %uint %17 %count
%20 = OpExtInst %uint %18 UMin %uint_32 %21
%23 = OpISub %uint %20 %17
%22 = OpBitFieldInsert %uint %v %n %17 %23
OpReturnValue %22
OpFunctionEnd
%insertBits_e3e3a2 = OpFunction %void None %24
%27 = OpLabel
%res = OpVariable %_ptr_Function_uint Function %32
%28 = OpFunctionCall %uint %tint_insert_bits %uint_1 %uint_1 %uint_1 %uint_1
OpStore %res %28
%insertBits_e3e3a2 = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_uint Function %17
OpStore %res %uint_3
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %33
%35 = OpLabel
%36 = OpFunctionCall %void %insertBits_e3e3a2
%vertex_main_inner = OpFunction %v4float None %18
%20 = OpLabel
%21 = OpFunctionCall %void %insertBits_e3e3a2
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %24
%38 = OpLabel
%39 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %39
%vertex_main = OpFunction %void None %9
%23 = OpLabel
%24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %24
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %24
%42 = OpLabel
%43 = OpFunctionCall %void %insertBits_e3e3a2
%fragment_main = OpFunction %void None %9
%27 = OpLabel
%28 = OpFunctionCall %void %insertBits_e3e3a2
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %24
%45 = OpLabel
%46 = OpFunctionCall %void %insertBits_e3e3a2
%compute_main = OpFunction %void None %9
%30 = OpLabel
%31 = OpFunctionCall %void %insertBits_e3e3a2
OpReturn
OpFunctionEnd

View File

@ -1,12 +1,5 @@
int2 tint_insert_bits(int2 v, int2 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint2((s).xx)) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
}
void insertBits_fe6ba6() {
int2 res = tint_insert_bits((1).xx, (1).xx, 1u, 1u);
int2 res = (3).xx;
}
struct tint_symbol {

View File

@ -1,12 +1,5 @@
int2 tint_insert_bits(int2 v, int2 n, uint offset, uint count) {
const uint s = min(offset, 32u);
const uint e = min(32u, (s + count));
const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
return (((n << uint2((s).xx)) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
}
void insertBits_fe6ba6() {
int2 res = tint_insert_bits((1).xx, (1).xx, 1u, 1u);
int2 res = (3).xx;
}
struct tint_symbol {

View File

@ -1,13 +1,7 @@
#version 310 es
ivec2 tint_insert_bits(ivec2 v, ivec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_fe6ba6() {
ivec2 res = tint_insert_bits(ivec2(1), ivec2(1), 1u, 1u);
ivec2 res = ivec2(3);
}
vec4 vertex_main() {
@ -26,14 +20,8 @@ void main() {
#version 310 es
precision mediump float;
ivec2 tint_insert_bits(ivec2 v, ivec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_fe6ba6() {
ivec2 res = tint_insert_bits(ivec2(1), ivec2(1), 1u, 1u);
ivec2 res = ivec2(3);
}
void fragment_main() {
@ -46,14 +34,8 @@ void main() {
}
#version 310 es
ivec2 tint_insert_bits(ivec2 v, ivec2 n, uint offset, uint count) {
uint s = min(offset, 32u);
uint e = min(32u, (s + count));
return bitfieldInsert(v, n, int(s), int((e - s)));
}
void insertBits_fe6ba6() {
ivec2 res = tint_insert_bits(ivec2(1), ivec2(1), 1u, 1u);
ivec2 res = ivec2(3);
}
void compute_main() {

View File

@ -1,14 +1,8 @@
#include <metal_stdlib>
using namespace metal;
int2 tint_insert_bits(int2 v, int2 n, uint offset, uint count) {
uint const s = min(offset, 32u);
uint const e = min(32u, (s + count));
return insert_bits(v, n, s, (e - s));
}
void insertBits_fe6ba6() {
int2 res = tint_insert_bits(int2(1), int2(1), 1u, 1u);
int2 res = int2(3);
}
struct tint_symbol {

View File

@ -1,10 +1,9 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 51
; Bound: 34
; Schema: 0
OpCapability Shader
%20 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
OpEntryPoint Fragment %fragment_main "fragment_main"
@ -13,11 +12,6 @@
OpExecutionMode %compute_main LocalSize 1 1 1
OpName %value "value"
OpName %vertex_point_size "vertex_point_size"
OpName %tint_insert_bits "tint_insert_bits"
OpName %v "v"
OpName %n "n"
OpName %offset "offset"
OpName %count "count"
OpName %insertBits_fe6ba6 "insertBits_fe6ba6"
OpName %res "res"
OpName %vertex_main_inner "vertex_main_inner"
@ -34,59 +28,41 @@
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%vertex_point_size = OpVariable %_ptr_Output_float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%uint = OpTypeInt 32 0
%9 = OpTypeFunction %v2int %v2int %v2int %uint %uint
%uint_32 = OpConstant %uint 32
%void = OpTypeVoid
%26 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%32 = OpConstantComposite %v2int %int_1 %int_1
%uint_1 = OpConstant %uint 1
%int_3 = OpConstant %int 3
%16 = OpConstantComposite %v2int %int_3 %int_3
%_ptr_Function_v2int = OpTypePointer Function %v2int
%36 = OpConstantNull %v2int
%37 = OpTypeFunction %v4float
%19 = OpConstantNull %v2int
%20 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1
%tint_insert_bits = OpFunction %v2int None %9
%v = OpFunctionParameter %v2int
%n = OpFunctionParameter %v2int
%offset = OpFunctionParameter %uint
%count = OpFunctionParameter %uint
%18 = OpLabel
%19 = OpExtInst %uint %20 UMin %offset %uint_32
%23 = OpIAdd %uint %19 %count
%22 = OpExtInst %uint %20 UMin %uint_32 %23
%25 = OpISub %uint %22 %19
%24 = OpBitFieldInsert %v2int %v %n %19 %25
OpReturnValue %24
OpFunctionEnd
%insertBits_fe6ba6 = OpFunction %void None %26
%29 = OpLabel
%res = OpVariable %_ptr_Function_v2int Function %36
%30 = OpFunctionCall %v2int %tint_insert_bits %32 %32 %uint_1 %uint_1
OpStore %res %30
%insertBits_fe6ba6 = OpFunction %void None %9
%12 = OpLabel
%res = OpVariable %_ptr_Function_v2int Function %19
OpStore %res %16
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %37
%39 = OpLabel
%40 = OpFunctionCall %void %insertBits_fe6ba6
%vertex_main_inner = OpFunction %v4float None %20
%22 = OpLabel
%23 = OpFunctionCall %void %insertBits_fe6ba6
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %26
%42 = OpLabel
%43 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %43
%vertex_main = OpFunction %void None %9
%25 = OpLabel
%26 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %26
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %26
%46 = OpLabel
%47 = OpFunctionCall %void %insertBits_fe6ba6
%fragment_main = OpFunction %void None %9
%29 = OpLabel
%30 = OpFunctionCall %void %insertBits_fe6ba6
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %26
%49 = OpLabel
%50 = OpFunctionCall %void %insertBits_fe6ba6
%compute_main = OpFunction %void None %9
%32 = OpLabel
%33 = OpFunctionCall %void %insertBits_fe6ba6
OpReturn
OpFunctionEnd

View File

@ -455,14 +455,6 @@ crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,fract:f32:in
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,fract:f32:inputSource="const";vectorize=2 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,fract:f32:inputSource="const";vectorize=3 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,fract:f32:inputSource="const";vectorize=4 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=false;width=1 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=false;width=2 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=false;width=3 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=false;width=4 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=true;width=1 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=true;width=2 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=true;width=3 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,insertBits:integer:inputSource="const";signed=true;width=4 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,inversesqrt:f32:inputSource="const";vectorize="_undef_" [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,inversesqrt:f32:inputSource="const";vectorize=2 [ Failure ]
crbug.com/tint/1613 webgpu:shader,execution,expression,call,builtin,inversesqrt:f32:inputSource="const";vectorize=3 [ Failure ]