constant_propagation_pass: Combine zero-extension folding code into its own function

Separates the behavior from the actual switch statement and gets rid of
duplication, now that we can use the general GetImmediateAsU64()
function.
This commit is contained in:
Lioncash 2018-10-05 17:45:33 -04:00
parent 86539d97d3
commit e0eec323f2
No known key found for this signature in database
GPG Key ID: 4E3C3CC1031BA9C7

View File

@ -113,6 +113,15 @@ void FoldOR(IR::Inst& inst, bool is_32_bit) {
inst.ReplaceUsesWith(lhs);
}
}
void FoldZeroExtendXToWord(IR::Inst& inst) {
if (!inst.AreAllArgsImmediates()) {
return;
}
const u64 value = inst.GetArg(0).GetImmediateAsU64();
inst.ReplaceUsesWith(IR::Value{static_cast<u32>(value)});
}
} // Anonymous namespace
void ConstantPropagation(IR::Block& block) {
@ -154,24 +163,10 @@ void ConstantPropagation(IR::Block& block) {
case IR::Opcode::Not64:
FoldNOT(inst, opcode == IR::Opcode::Not32);
break;
case IR::Opcode::ZeroExtendByteToWord: {
if (!inst.AreAllArgsImmediates())
break;
u8 byte = inst.GetArg(0).GetU8();
u32 value = static_cast<u32>(byte);
inst.ReplaceUsesWith(IR::Value{value});
case IR::Opcode::ZeroExtendByteToWord:
case IR::Opcode::ZeroExtendHalfToWord:
FoldZeroExtendXToWord(inst);
break;
}
case IR::Opcode::ZeroExtendHalfToWord: {
if (!inst.AreAllArgsImmediates())
break;
u16 half = inst.GetArg(0).GetU16();
u32 value = static_cast<u32>(half);
inst.ReplaceUsesWith(IR::Value{value});
break;
}
default:
break;
}