reg_alloc: Move implementations out of header

This commit is contained in:
MerryMage 2017-02-26 23:16:41 +00:00
parent 184db36caf
commit 135346eb2e
2 changed files with 57 additions and 36 deletions

View file

@ -71,6 +71,53 @@ static void EmitExchange(BlockOfCode* code, HostLoc a, HostLoc b) {
} }
} }
bool HostLocInfo::IsLocked() const {
return is_being_used;
}
bool HostLocInfo::IsEmpty() const {
return !is_being_used && values.empty();
}
bool HostLocInfo::IsLastUse() const {
return !is_being_used && std::all_of(values.begin(), values.end(), [](const auto& inst) { return !inst->HasUses(); });
}
bool HostLocInfo::ContainsValue(const IR::Inst* inst) const {
return std::find(values.begin(), values.end(), inst) != values.end();
}
void HostLocInfo::ReadLock() {
ASSERT(!is_scratch);
is_being_used = true;
}
void HostLocInfo::WriteLock() {
ASSERT(!is_being_used);
is_being_used = true;
is_scratch = true;
}
void HostLocInfo::AddValue(IR::Inst* inst) {
values.push_back(inst);
}
void HostLocInfo::EndOfAllocScope() {
const auto to_erase = std::remove_if(values.begin(), values.end(), [](const auto& inst) { return !inst->HasUses(); });
values.erase(to_erase, values.end());
is_being_used = false;
is_scratch = false;
}
IR::Type Argument::GetType() const {
return value.GetType();
}
bool Argument::IsImmediate() const {
return value.IsImmediate();
}
bool Argument::GetImmediateU1() const { bool Argument::GetImmediateU1() const {
return value.GetU1(); return value.GetU1();
} }

View file

@ -26,40 +26,18 @@ class RegAlloc;
struct HostLocInfo { struct HostLocInfo {
public: public:
bool IsLocked() const { bool IsLocked() const;
return is_being_used; bool IsEmpty() const;
} bool IsLastUse() const;
bool IsEmpty() const {
return !is_being_used && values.empty();
}
bool IsLastUse() const {
return !is_being_used && std::all_of(values.begin(), values.end(), [](const auto& inst) { return !inst->HasUses(); });
}
bool ContainsValue(const IR::Inst* inst) const { bool ContainsValue(const IR::Inst* inst) const;
return std::find(values.begin(), values.end(), inst) != values.end();
}
void ReadLock() { void ReadLock();
ASSERT(!is_scratch); void WriteLock();
is_being_used = true;
}
void WriteLock() {
ASSERT(!is_being_used);
is_being_used = true;
is_scratch = true;
}
void AddValue(IR::Inst* inst) {
values.push_back(inst);
}
void EndOfAllocScope() { void AddValue(IR::Inst* inst);
const auto to_erase = std::remove_if(values.begin(), values.end(), [](const auto& inst){ return !inst->HasUses(); });
values.erase(to_erase, values.end());
is_being_used = false; void EndOfAllocScope();
is_scratch = false;
}
private: private:
std::vector<IR::Inst*> values; std::vector<IR::Inst*> values;
@ -69,12 +47,8 @@ private:
struct Argument { struct Argument {
public: public:
IR::Type GetType() const { IR::Type GetType() const;
return value.GetType(); bool IsImmediate() const;
}
bool IsImmediate() const {
return value.IsImmediate();
}
bool GetImmediateU1() const; bool GetImmediateU1() const;
u8 GetImmediateU8() const; u8 GetImmediateU8() const;