Start of Integer flags implementation

This commit is contained in:
Levi Behunin
2020-09-24 16:40:06 -06:00
parent fa4294cc6f
commit d53b79ff5c
3 changed files with 50 additions and 3 deletions

View File

@ -387,9 +387,49 @@ void ShaderIR::SetInternalFlagsFromInteger(NodeBlock& bb, Node value, bool sets_
if (!sets_cc) {
return;
}
Node zerop = Operation(OperationCode::LogicalIEqual, std::move(value), Immediate(0));
SetInternalFlag(bb, InternalFlag::Zero, std::move(zerop));
LOG_WARNING(HW_GPU, "Condition codes implementation is incomplete");
switch (value->index()) {
case 0:
Iterop(bb, value);
break;
case 2:
if (const auto gpr = std::get_if<GprNode>(value.get())) {
LOG_WARNING(HW_GPU, "GprNode: index={}", gpr->GetIndex());
Node zerop = Operation(OperationCode::LogicalIEqual, std::move(value),
Immediate(gpr->GetIndex()));
SetInternalFlag(bb, InternalFlag::Zero, std::move(zerop));
}
break;
default:
Node zerop = Operation(OperationCode::LogicalIEqual, std::move(value), Immediate(0));
SetInternalFlag(bb, InternalFlag::Zero, std::move(zerop));
LOG_WARNING(HW_GPU, "Node Type: {}", value->index());
break;
}
}
void ShaderIR::Iterop(NodeBlock& nb, Node var) {
if (const auto op = std::get_if<OperationNode>(var.get())) {
if (op->GetOperandsCount() > 0) {
for (auto& opss : op->GetOperands()) {
switch (opss->index()) {
case 0:
return Iterop(nb, opss);
case 2:
if (const auto gpr = std::get_if<GprNode>(opss.get())) {
LOG_WARNING(HW_GPU, "Child GprNode: index={}", gpr->GetIndex());
Node zerop = Operation(OperationCode::LogicalIEqual, std::move(opss),
Immediate(gpr->GetIndex()));
SetInternalFlag(nb, InternalFlag::Zero, std::move(zerop));
}
break;
default:
LOG_WARNING(HW_GPU, "Child Node Type: {}", opss->index());
break;
}
}
}
}
}
Node ShaderIR::BitfieldExtract(Node value, u32 offset, u32 bits) {