glasm: Initial GLASM fp64 support
This commit is contained in:
parent
9f851e3832
commit
4502595bc2
9 changed files with 152 additions and 55 deletions
|
@ -14,12 +14,11 @@
|
|||
namespace Shader::Backend::GLASM {
|
||||
|
||||
Register RegAlloc::Define(IR::Inst& inst) {
|
||||
const Id id{Alloc()};
|
||||
inst.SetDefinition<Id>(id);
|
||||
Register ret;
|
||||
ret.type = Type::Register;
|
||||
ret.id = id;
|
||||
return ret;
|
||||
return Define(inst, false);
|
||||
}
|
||||
|
||||
Register RegAlloc::LongDefine(IR::Inst& inst) {
|
||||
return Define(inst, true);
|
||||
}
|
||||
|
||||
Value RegAlloc::Consume(const IR::Value& value) {
|
||||
|
@ -40,6 +39,10 @@ Value RegAlloc::Consume(const IR::Value& value) {
|
|||
ret.type = Type::F32;
|
||||
ret.imm_f32 = value.F32();
|
||||
break;
|
||||
case IR::Type::F64:
|
||||
ret.type = Type::F64;
|
||||
ret.imm_f64 = value.F64();
|
||||
break;
|
||||
default:
|
||||
throw NotImplementedException("Immediate type {}", value.Type());
|
||||
}
|
||||
|
@ -49,7 +52,14 @@ Value RegAlloc::Consume(const IR::Value& value) {
|
|||
Register RegAlloc::AllocReg() {
|
||||
Register ret;
|
||||
ret.type = Type::Register;
|
||||
ret.id = Alloc();
|
||||
ret.id = Alloc(false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Register RegAlloc::AllocLongReg() {
|
||||
Register ret;
|
||||
ret.type = Type::Register;
|
||||
ret.id = Alloc(true);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -57,6 +67,15 @@ void RegAlloc::FreeReg(Register reg) {
|
|||
Free(reg.id);
|
||||
}
|
||||
|
||||
Register RegAlloc::Define(IR::Inst& inst, bool is_long) {
|
||||
const Id id{Alloc(is_long)};
|
||||
inst.SetDefinition<Id>(id);
|
||||
Register ret;
|
||||
ret.type = Type::Register;
|
||||
ret.id = id;
|
||||
return ret;
|
||||
}
|
||||
|
||||
Value RegAlloc::Consume(IR::Inst& inst) {
|
||||
const Id id{inst.Definition<Id>()};
|
||||
inst.DestructiveRemoveUsage();
|
||||
|
@ -69,18 +88,23 @@ Value RegAlloc::Consume(IR::Inst& inst) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
Id RegAlloc::Alloc() {
|
||||
for (size_t reg = 0; reg < NUM_REGS; ++reg) {
|
||||
if (register_use[reg]) {
|
||||
continue;
|
||||
Id RegAlloc::Alloc(bool is_long) {
|
||||
size_t& num_regs{is_long ? num_used_long_registers : num_used_registers};
|
||||
std::bitset<NUM_REGS>& use{is_long ? long_register_use : register_use};
|
||||
if (num_used_registers + num_used_long_registers < NUM_REGS) {
|
||||
for (size_t reg = 0; reg < NUM_REGS; ++reg) {
|
||||
if (use[reg]) {
|
||||
continue;
|
||||
}
|
||||
num_regs = std::max(num_regs, reg + 1);
|
||||
use[reg] = true;
|
||||
Id ret{};
|
||||
ret.index.Assign(static_cast<u32>(reg));
|
||||
ret.is_long.Assign(is_long ? 1 : 0);
|
||||
ret.is_spill.Assign(0);
|
||||
ret.is_condition_code.Assign(0);
|
||||
return ret;
|
||||
}
|
||||
num_used_registers = std::max(num_used_registers, reg + 1);
|
||||
register_use[reg] = true;
|
||||
Id ret{};
|
||||
ret.index.Assign(static_cast<u32>(reg));
|
||||
ret.is_spill.Assign(0);
|
||||
ret.is_condition_code.Assign(0);
|
||||
return ret;
|
||||
}
|
||||
throw NotImplementedException("Register spilling");
|
||||
}
|
||||
|
@ -89,7 +113,11 @@ void RegAlloc::Free(Id id) {
|
|||
if (id.is_spill != 0) {
|
||||
throw NotImplementedException("Free spill");
|
||||
}
|
||||
register_use[id.index] = false;
|
||||
if (id.is_long != 0) {
|
||||
long_register_use[id.index] = false;
|
||||
} else {
|
||||
register_use[id.index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Shader::Backend::GLASM
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue