#include "mir/MIR.h"

#include <stdexcept>

#include "utils/Log.h"

namespace mir {
namespace {

bool IsAllowedReg(PhysReg reg) {
  switch (reg) {
    case PhysReg::W0:
    case PhysReg::W8:
    case PhysReg::W9:
    case PhysReg::X29:
    case PhysReg::X30:
    case PhysReg::SP:
      return true;
  }
  return false;
}

}  // namespace

void RunRegAlloc(MachineFunction& function) {
  for (const auto& inst : function.GetEntry().GetInstructions()) {
    for (const auto& operand : inst.GetOperands()) {
      if (operand.GetKind() == Operand::Kind::Reg &&
          !IsAllowedReg(operand.GetReg())) {
        throw std::runtime_error(FormatError("mir", "寄存器分配失败"));
      }
    }
  }
}

}  // namespace mir
