Fix IsScaled dynamic indexing reading wrong bit source

This commit is contained in:
MaranBr 2026-03-27 16:06:30 -04:00 committed by crueter
parent ac99ea96da
commit f90e5e43a9

View file

@ -285,8 +285,11 @@ Id IsScaled(EmitContext& ctx, const IR::Value& index, Id member_index, u32 base_
if (base_index != 0) {
index_value = ctx.OpIAdd(ctx.U32[1], index_value, ctx.Const(base_index));
}
const Id word_index{ctx.OpUDiv(ctx.U32[1], index_value, ctx.Const(32u))};
const Id pointer{ctx.OpAccessChain(push_constant_u32, ctx.rescaling_push_constants, member_index, word_index)};
const Id word{ctx.OpLoad(ctx.U32[1], pointer)};
const Id bit_index{ctx.OpBitwiseAnd(ctx.U32[1], index_value, ctx.Const(31u))};
bit = ctx.OpBitFieldUExtract(ctx.U32[1], index_value, bit_index, ctx.Const(1u));
bit = ctx.OpBitFieldUExtract(ctx.U32[1], word, bit_index, ctx.Const(1u));
}
return ctx.OpINotEqual(ctx.U1, bit, ctx.u32_zero_value);
}