From bfa5c508ce711554ffbd630d44775e2a1cbec323 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:11:14 -0700 Subject: [PATCH] constant_propagation_pass: Handle a few more bitwise instructions. (#3482) Co-authored-by: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- .../ir/passes/constant_propagation_pass.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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) {