| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Copyright 2021 yuzu Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
- #include "shader_recompiler/backend/glasm/glasm_emit_context.h"
- #include "shader_recompiler/frontend/ir/value.h"
- namespace Shader::Backend::GLASM {
- void EmitSelectU1(EmitContext& ctx, IR::Inst& inst, ScalarS32 cond, ScalarS32 true_value,
- ScalarS32 false_value) {
- ctx.Add("CMP.S {},{},{},{};", inst, cond, true_value, false_value);
- }
- void EmitSelectU8([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarS32 cond,
- [[maybe_unused]] ScalarS32 true_value, [[maybe_unused]] ScalarS32 false_value) {
- throw NotImplementedException("GLASM instruction");
- }
- void EmitSelectU16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarS32 cond,
- [[maybe_unused]] ScalarS32 true_value, [[maybe_unused]] ScalarS32 false_value) {
- throw NotImplementedException("GLASM instruction");
- }
- void EmitSelectU32(EmitContext& ctx, IR::Inst& inst, ScalarS32 cond, ScalarS32 true_value,
- ScalarS32 false_value) {
- ctx.Add("CMP.S {},{},{},{};", inst, cond, true_value, false_value);
- }
- void EmitSelectU64(EmitContext& ctx, IR::Inst& inst, ScalarS32 cond, Register true_value,
- Register false_value) {
- ctx.reg_alloc.InvalidateConditionCodes();
- const Register ret{ctx.reg_alloc.LongDefine(inst)};
- if (ret == true_value) {
- ctx.Add("MOV.S.CC RC.x,{};"
- "MOV.U64 {}.x(EQ.x),{};",
- cond, ret, false_value);
- } else if (ret == false_value) {
- ctx.Add("MOV.S.CC RC.x,{};"
- "MOV.U64 {}.x(NE.x),{};",
- cond, ret, true_value);
- } else {
- ctx.Add("MOV.S.CC RC.x,{};"
- "MOV.U64 {}.x,{};"
- "MOV.U64 {}.x(NE.x),{};",
- cond, ret, false_value, ret, true_value);
- }
- }
- void EmitSelectF16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarS32 cond,
- [[maybe_unused]] Register true_value, [[maybe_unused]] Register false_value) {
- throw NotImplementedException("GLASM instruction");
- }
- void EmitSelectF32(EmitContext& ctx, IR::Inst& inst, ScalarS32 cond, ScalarS32 true_value,
- ScalarS32 false_value) {
- ctx.Add("CMP.S {},{},{},{};", inst, cond, true_value, false_value);
- }
- void EmitSelectF64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarS32 cond,
- [[maybe_unused]] Register true_value, [[maybe_unused]] Register false_value) {
- throw NotImplementedException("GLASM instruction");
- }
- } // namespace Shader::Backend::GLASM
|