glasm: Implement GLASM fp16 packing and move bitwise insns
This commit is contained in:
		| @@ -139,18 +139,6 @@ void EmitInst(EmitContext& ctx, IR::Inst* inst) { | ||||
|     } | ||||
|     throw LogicError("Invalid opcode {}", inst->GetOpcode()); | ||||
| } | ||||
|  | ||||
| void Alias(IR::Inst& inst, const IR::Value& value) { | ||||
|     if (value.IsImmediate()) { | ||||
|         return; | ||||
|     } | ||||
|     IR::Inst* const value_inst{value.InstRecursive()}; | ||||
|     if (inst.GetOpcode() == IR::Opcode::Identity) { | ||||
|         value_inst->DestructiveAddUsage(inst.UseCount()); | ||||
|         value_inst->DestructiveRemoveUsage(); | ||||
|     } | ||||
|     inst.SetDefinition(value_inst->Definition<Id>()); | ||||
| } | ||||
| } // Anonymous namespace | ||||
|  | ||||
| std::string EmitGLASM(const Profile&, IR::Program& program, Bindings&) { | ||||
| @@ -183,32 +171,4 @@ std::string EmitGLASM(const Profile&, IR::Program& program, Bindings&) { | ||||
|     return ctx.code; | ||||
| } | ||||
|  | ||||
| void EmitIdentity(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU16F16(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU32F32(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU64F64(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF16U16(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF32U32(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF64U64(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| } // namespace Shader::Backend::GLASM | ||||
|   | ||||
| @@ -0,0 +1,75 @@ | ||||
| // 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_context.h" | ||||
| #include "shader_recompiler/backend/glasm/emit_glasm_instructions.h" | ||||
| #include "shader_recompiler/frontend/ir/value.h" | ||||
|  | ||||
| namespace Shader::Backend::GLASM { | ||||
|  | ||||
| static void Alias(IR::Inst& inst, const IR::Value& value) { | ||||
|     if (value.IsImmediate()) { | ||||
|         return; | ||||
|     } | ||||
|     IR::Inst* const value_inst{value.InstRecursive()}; | ||||
|     if (inst.GetOpcode() == IR::Opcode::Identity) { | ||||
|         value_inst->DestructiveAddUsage(inst.UseCount()); | ||||
|         value_inst->DestructiveRemoveUsage(); | ||||
|     } | ||||
|     inst.SetDefinition(value_inst->Definition<Id>()); | ||||
| } | ||||
|  | ||||
| void EmitIdentity(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU16F16(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU32F32(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastU64F64(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF16U16(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF32U32(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitBitCastF64U64(EmitContext&, IR::Inst& inst, const IR::Value& value) { | ||||
|     Alias(inst, value); | ||||
| } | ||||
|  | ||||
| void EmitPackUint2x32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||
|     throw NotImplementedException("GLASM instruction"); | ||||
| } | ||||
|  | ||||
| void EmitUnpackUint2x32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||
|     throw NotImplementedException("GLASM instruction"); | ||||
| } | ||||
|  | ||||
| void EmitPackFloat2x16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||
|     throw NotImplementedException("GLASM instruction"); | ||||
| } | ||||
|  | ||||
| void EmitUnpackFloat2x16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||
|     throw NotImplementedException("GLASM instruction"); | ||||
| } | ||||
|  | ||||
| void EmitPackHalf2x16(EmitContext& ctx, IR::Inst& inst, Register value) { | ||||
|     ctx.Add("PK2H {}.x,{};", inst, value); | ||||
| } | ||||
|  | ||||
| void EmitUnpackHalf2x16(EmitContext& ctx, IR::Inst& inst, Register value) { | ||||
|     ctx.Add("UP2H {}.xy,{}.x;", inst, value); | ||||
| } | ||||
|  | ||||
| } // namespace Shader::Backend::GLASM | ||||
|   | ||||
| @@ -200,8 +200,8 @@ void EmitPackUint2x32(EmitContext& ctx, Register value); | ||||
| void EmitUnpackUint2x32(EmitContext& ctx, Register value); | ||||
| void EmitPackFloat2x16(EmitContext& ctx, Register value); | ||||
| void EmitUnpackFloat2x16(EmitContext& ctx, Register value); | ||||
| void EmitPackHalf2x16(EmitContext& ctx, Register value); | ||||
| void EmitUnpackHalf2x16(EmitContext& ctx, Register value); | ||||
| void EmitPackHalf2x16(EmitContext& ctx, IR::Inst& inst, Register value); | ||||
| void EmitUnpackHalf2x16(EmitContext& ctx, IR::Inst& inst, Register value); | ||||
| void EmitPackDouble2x32(EmitContext& ctx, Register value); | ||||
| void EmitUnpackDouble2x32(EmitContext& ctx, Register value); | ||||
| void EmitGetZeroFromOp(EmitContext& ctx); | ||||
|   | ||||
| @@ -281,30 +281,6 @@ void EmitSelectF64(EmitContext& ctx, ScalarS32 cond, Register true_value, Regist | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitPackUint2x32(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitUnpackUint2x32(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitPackFloat2x16(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitUnpackFloat2x16(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitPackHalf2x16(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitUnpackHalf2x16(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|  | ||||
| void EmitPackDouble2x32(EmitContext& ctx, Register value) { | ||||
|     NotImplemented(); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user