2016-05-08 14:06:42 -07:00
|
|
|
#include <cstring>
|
2023-08-06 08:36:19 -07:00
|
|
|
#include "Common/Log.h"
|
2016-05-06 23:45:37 +02:00
|
|
|
#include "Core/MIPS/IR/IRRegCache.h"
|
|
|
|
#include "Core/MIPS/IR/IRInst.h"
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::Flush(IRReg rd) {
|
2016-05-06 23:45:37 +02:00
|
|
|
if (rd == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (reg_[rd].isImm) {
|
2023-08-06 08:36:19 -07:00
|
|
|
_assert_((rd > 0 && rd < 32) || (rd >= IRTEMP_0 && rd < IRREG_VFPU_CTRL_BASE));
|
2016-05-06 23:45:37 +02:00
|
|
|
ir_->WriteSetConstant(rd, reg_[rd].immVal);
|
|
|
|
reg_[rd].isImm = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::Discard(IRReg rd) {
|
2016-05-08 01:06:07 +02:00
|
|
|
if (rd == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
reg_[rd].isImm = false;
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
|
|
|
|
2016-05-08 01:06:07 +02:00
|
|
|
IRRegCache::IRRegCache(IRWriter *ir) : ir_(ir) {
|
|
|
|
memset(®_, 0, sizeof(reg_));
|
|
|
|
reg_[0].isImm = true;
|
|
|
|
ir_ = ir;
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
|
|
|
|
2016-05-08 01:06:07 +02:00
|
|
|
void IRRegCache::FlushAll() {
|
|
|
|
for (int i = 0; i < TOTAL_MAPPABLE_MIPSREGS; i++) {
|
2022-07-24 10:37:54 -07:00
|
|
|
Flush(i);
|
2016-05-08 01:06:07 +02:00
|
|
|
}
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapIn(IRReg rd) {
|
2016-05-08 10:36:37 +02:00
|
|
|
Flush(rd);
|
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapDirty(IRReg rd) {
|
2016-05-08 10:36:37 +02:00
|
|
|
Discard(rd);
|
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapInIn(IRReg rs, IRReg rt) {
|
2016-05-08 01:06:07 +02:00
|
|
|
Flush(rs);
|
|
|
|
Flush(rt);
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapInInIn(IRReg rd, IRReg rs, IRReg rt) {
|
2016-05-08 22:54:07 +02:00
|
|
|
Flush(rd);
|
|
|
|
Flush(rs);
|
|
|
|
Flush(rt);
|
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapDirtyIn(IRReg rd, IRReg rs) {
|
2016-05-08 01:06:07 +02:00
|
|
|
if (rs != rd) {
|
|
|
|
Discard(rd);
|
|
|
|
}
|
|
|
|
Flush(rs);
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
|
|
|
|
2023-07-20 19:21:00 -07:00
|
|
|
void IRRegCache::MapDirtyInIn(IRReg rd, IRReg rs, IRReg rt) {
|
2016-05-08 01:06:07 +02:00
|
|
|
if (rs != rd && rt != rd) {
|
|
|
|
Discard(rd);
|
2016-05-07 17:37:19 +02:00
|
|
|
}
|
2016-05-08 01:06:07 +02:00
|
|
|
Flush(rs);
|
|
|
|
Flush(rt);
|
2016-05-06 23:45:37 +02:00
|
|
|
}
|
2016-05-08 01:06:07 +02:00
|
|
|
|