diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index dc1762fab..b877a6e87 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -456,6 +456,24 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { case IR::Opcode::BitwiseXor32: FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a ^ b; }); return; + case IR::Opcode::BitwiseNot32: + FoldWhenAllImmediates(inst, [](u32 a) { return ~a; }); + return; + case IR::Opcode::BitReverse32: + FoldWhenAllImmediates(inst, [](u32 a) { + u32 res{}; + for (s32 i = 0; i < 32; i++, a >>= 1) { + res = (res << 1) | (a & 1); + } + return res; + }); + return; + case IR::Opcode::BitCount32: + FoldWhenAllImmediates(inst, [](u32 a) { return static_cast(std::popcount(a)); }); + return; + case IR::Opcode::BitCount64: + FoldWhenAllImmediates(inst, [](u64 a) { return static_cast(std::popcount(a)); }); + return; case IR::Opcode::BitFieldUExtract: FoldWhenAllImmediates(inst, [](u32 base, u32 shift, u32 count) { if (static_cast(shift) + static_cast(count) > 32) {