Add register reuse + peft scheduler cost model + Useless merger
This commit is contained in:
@@ -588,13 +588,37 @@ void PimCodeGen::emitInstruction(const pim_binary::InstructionRecord& instructio
|
||||
++emittedInstructionCount;
|
||||
if (coreJsonStream)
|
||||
*coreJsonStream << json::Value(pim_binary::makeInstructionJson(instruction)) << ',';
|
||||
updateScalarRegisterCache(instruction);
|
||||
}
|
||||
|
||||
void PimCodeGen::updateScalarRegisterCache(const pim_binary::InstructionRecord& instruction) const {
|
||||
switch (instruction.opcode) {
|
||||
case pim_binary::Opcode::sldi:
|
||||
scalarRegisterValues[instruction.rd] = instruction.r2OrImm;
|
||||
break;
|
||||
case pim_binary::Opcode::sld:
|
||||
case pim_binary::Opcode::sadd:
|
||||
case pim_binary::Opcode::ssub:
|
||||
case pim_binary::Opcode::smul:
|
||||
case pim_binary::Opcode::saddi:
|
||||
case pim_binary::Opcode::smuli:
|
||||
scalarRegisterValues[instruction.rd].reset();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PimCodeGen::genSetRegisterImmediateUnsigned(size_t registerNumber, size_t immediate) const {
|
||||
auto registerIndex = pim::checkedU8OrCrash(registerNumber, "register number");
|
||||
auto immediateValue = pim::checkedI32OrCrash(immediate, "register immediate");
|
||||
if (scalarRegisterValues[registerIndex] == immediateValue)
|
||||
return;
|
||||
|
||||
pim_binary::InstructionRecord instruction;
|
||||
instruction.opcode = pim_binary::Opcode::sldi;
|
||||
instruction.rd = static_cast<uint8_t>(registerNumber);
|
||||
instruction.r2OrImm = pim::checkedI32OrCrash(immediate, "register immediate");
|
||||
instruction.rd = registerIndex;
|
||||
instruction.r2OrImm = immediateValue;
|
||||
emitInstruction(instruction);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user