summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
diff options
context:
space:
mode:
authorFernandoS27 <fsahmkow27@gmail.com>2021-04-01 22:20:57 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:25 +0200
commitecb30c907266921818d5b6b03e341028fa2ea082 (patch)
tree8bf3f0097653fa11b6dae823f79fe671204ad55e /src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
parentshader: Mark SSBOs as written when they are (diff)
downloadyuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.gz
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.bz2
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.lz
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.xz
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.zst
yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.zip
Diffstat (limited to '')
-rw-r--r--src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
index 259233746..7dab33034 100644
--- a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
+++ b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
@@ -38,6 +38,10 @@ struct ZeroFlagTag : FlagTag {};
struct SignFlagTag : FlagTag {};
struct CarryFlagTag : FlagTag {};
struct OverflowFlagTag : FlagTag {};
+struct FCSMFlagTag : FlagTag {};
+struct TAFlagTag : FlagTag {};
+struct TRFlagTag : FlagTag {};
+struct MXFlagTag : FlagTag {};
struct GotoVariable : FlagTag {
GotoVariable() = default;
@@ -53,7 +57,8 @@ struct IndirectBranchVariable {
};
using Variant = std::variant<IR::Reg, IR::Pred, ZeroFlagTag, SignFlagTag, CarryFlagTag,
- OverflowFlagTag, GotoVariable, IndirectBranchVariable>;
+ OverflowFlagTag, FCSMFlagTag, TAFlagTag, TRFlagTag, MXFlagTag,
+ GotoVariable, IndirectBranchVariable>;
using ValueMap = boost::container::flat_map<IR::Block*, IR::Value, std::less<IR::Block*>>;
struct DefTable {
@@ -89,6 +94,22 @@ struct DefTable {
return overflow_flag;
}
+ [[nodiscard]] ValueMap& operator[](FCSMFlagTag) noexcept {
+ return fcsm_flag;
+ }
+
+ [[nodiscard]] ValueMap& operator[](TAFlagTag) noexcept {
+ return ta_flag;
+ }
+
+ [[nodiscard]] ValueMap& operator[](TRFlagTag) noexcept {
+ return tr_flag;
+ }
+
+ [[nodiscard]] ValueMap& operator[](MXFlagTag) noexcept {
+ return mr_flag;
+ }
+
std::array<ValueMap, IR::NUM_USER_REGS> regs;
std::array<ValueMap, IR::NUM_USER_PREDS> preds;
boost::container::flat_map<u32, ValueMap> goto_vars;
@@ -97,6 +118,10 @@ struct DefTable {
ValueMap sign_flag;
ValueMap carry_flag;
ValueMap overflow_flag;
+ ValueMap fcsm_flag;
+ ValueMap ta_flag;
+ ValueMap tr_flag;
+ ValueMap mr_flag;
};
IR::Opcode UndefOpcode(IR::Reg) noexcept {
@@ -247,6 +272,18 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
case IR::Opcode::SetOFlag:
pass.WriteVariable(OverflowFlagTag{}, block, inst.Arg(0));
break;
+ case IR::Opcode::SetFCSMFlag:
+ pass.WriteVariable(FCSMFlagTag{}, block, inst.Arg(0));
+ break;
+ case IR::Opcode::SetTAFlag:
+ pass.WriteVariable(TAFlagTag{}, block, inst.Arg(0));
+ break;
+ case IR::Opcode::SetTRFlag:
+ pass.WriteVariable(TRFlagTag{}, block, inst.Arg(0));
+ break;
+ case IR::Opcode::SetMXFlag:
+ pass.WriteVariable(MXFlagTag{}, block, inst.Arg(0));
+ break;
case IR::Opcode::GetRegister:
if (const IR::Reg reg{inst.Arg(0).Reg()}; reg != IR::Reg::RZ) {
inst.ReplaceUsesWith(pass.ReadVariable(reg, block));
@@ -275,6 +312,18 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
case IR::Opcode::GetOFlag:
inst.ReplaceUsesWith(pass.ReadVariable(OverflowFlagTag{}, block));
break;
+ case IR::Opcode::GetFCSMFlag:
+ inst.ReplaceUsesWith(pass.ReadVariable(FCSMFlagTag{}, block));
+ break;
+ case IR::Opcode::GetTAFlag:
+ inst.ReplaceUsesWith(pass.ReadVariable(TAFlagTag{}, block));
+ break;
+ case IR::Opcode::GetTRFlag:
+ inst.ReplaceUsesWith(pass.ReadVariable(TRFlagTag{}, block));
+ break;
+ case IR::Opcode::GetMXFlag:
+ inst.ReplaceUsesWith(pass.ReadVariable(MXFlagTag{}, block));
+ break;
default:
break;
}