diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-05-25 22:37:35 +0200 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:33 +0200 |
commit | 48aafe0961a2ddfb52b627c6ba6bce8276330550 (patch) | |
tree | 3a8f1e05bf1a7f0e54301ca20d81c378c250cd7c /src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp | |
parent | glasm: Remove unintentionally committed fmt::prints (diff) | |
download | yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar.gz yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar.bz2 yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar.lz yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar.xz yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.tar.zst yuzu-48aafe0961a2ddfb52b627c6ba6bce8276330550.zip |
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp')
-rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp index 3d7a3ebb4..e9d1e0d6b 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp @@ -17,10 +17,30 @@ namespace Shader::Backend::GLASM { #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) -void EmitPhi(EmitContext& ctx, IR::Inst& inst) { - const size_t num_args{inst.NumArgs()}; +static void DefinePhi(EmitContext& ctx, IR::Inst& phi) { + switch (phi.Arg(0).Type()) { + case IR::Type::U1: + case IR::Type::U32: + case IR::Type::F32: + ctx.reg_alloc.Define(phi); + break; + case IR::Type::U64: + case IR::Type::F64: + ctx.reg_alloc.LongDefine(phi); + break; + default: + throw NotImplementedException("Phi node type {}", phi.Type()); + } +} + +void EmitPhi(EmitContext& ctx, IR::Inst& phi) { + const size_t num_args{phi.NumArgs()}; for (size_t i = 0; i < num_args; ++i) { - ctx.reg_alloc.Consume(inst.Arg(i)); + ctx.reg_alloc.Consume(phi.Arg(i)); + } + if (!phi.Definition<Id>().is_valid) { + // The phi node wasn't forward defined + DefinePhi(ctx, phi); } } @@ -30,14 +50,19 @@ void EmitReference(EmitContext& ctx, const IR::Value& value) { ctx.reg_alloc.Consume(value); } -void EmitPhiMove(EmitContext& ctx, const IR::Value& phi, const IR::Value& value) { - const Register phi_reg{ctx.reg_alloc.Consume(phi)}; +void EmitPhiMove(EmitContext& ctx, const IR::Value& phi_value, const IR::Value& value) { + IR::Inst& phi{RegAlloc::AliasInst(*phi_value.Inst())}; + if (!phi.Definition<Id>().is_valid) { + // The phi node wasn't forward defined + DefinePhi(ctx, phi); + } + const Register phi_reg{ctx.reg_alloc.Consume(IR::Value{&phi})}; const Value eval_value{ctx.reg_alloc.Consume(value)}; - if (phi == value) { + if (phi_reg == eval_value) { return; } - switch (phi.Inst()->Flags<IR::Type>()) { + switch (phi.Flags<IR::Type>()) { case IR::Type::U1: case IR::Type::U32: case IR::Type::F32: |