committed by
ameerj
10 changed files with 1175 additions and 842 deletions
-
21src/shader_recompiler/backend/glasm/emit_context.cpp
-
5src/shader_recompiler/backend/glasm/emit_context.h
-
66src/shader_recompiler/backend/glasm/emit_glasm.cpp
-
125src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
-
421src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp
-
177src/shader_recompiler/backend/glasm/emit_glasm_instructions.h
-
228src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
-
178src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp
-
790src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
-
6src/shader_recompiler/frontend/ir/value.h
@ -0,0 +1,125 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <string_view>
|
||||
|
|
||||
|
#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 { |
||||
|
namespace { |
||||
|
void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset, |
||||
|
std::string_view size) { |
||||
|
if (!binding.IsImmediate()) { |
||||
|
throw NotImplementedException("Indirect constant buffer loading"); |
||||
|
} |
||||
|
const std::string ret{ctx.reg_alloc.Define(inst)}; |
||||
|
ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), ctx.reg_alloc.Consume(offset)); |
||||
|
} |
||||
|
} // Anonymous namespace
|
||||
|
|
||||
|
void EmitGetCbufU8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "U8"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufS8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "S8"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufU16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "U16"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufS16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "S16"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufU32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "U32"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufF32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "F32"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
const IR::Value& offset) { |
||||
|
GetCbuf(ctx, inst, binding, offset, "U32X2"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr, |
||||
|
[[maybe_unused]] std::string_view vertex) { |
||||
|
if (IR::IsGeneric(attr)) { |
||||
|
const u32 index{IR::GenericAttributeIndex(attr)}; |
||||
|
const u32 element{IR::GenericAttributeElement(attr)}; |
||||
|
ctx.Add("MOV.F {},in_attr{}.{};", inst, index, "xyzw"[element]); |
||||
|
return; |
||||
|
} |
||||
|
throw NotImplementedException("Get attribute {}", attr); |
||||
|
} |
||||
|
|
||||
|
void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view value, |
||||
|
[[maybe_unused]] std::string_view vertex) { |
||||
|
const u32 element{static_cast<u32>(attr) % 4}; |
||||
|
const char swizzle{"xyzw"[element]}; |
||||
|
if (IR::IsGeneric(attr)) { |
||||
|
const u32 index{IR::GenericAttributeIndex(attr)}; |
||||
|
ctx.Add("MOV.F out_attr{}.{},{};", index, swizzle, value); |
||||
|
return; |
||||
|
} |
||||
|
switch (attr) { |
||||
|
case IR::Attribute::PositionX: |
||||
|
case IR::Attribute::PositionY: |
||||
|
case IR::Attribute::PositionZ: |
||||
|
case IR::Attribute::PositionW: |
||||
|
ctx.Add("MOV.F result.position.{},{};", swizzle, value); |
||||
|
break; |
||||
|
default: |
||||
|
throw NotImplementedException("Set attribute {}", attr); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void EmitGetAttributeIndexed([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view offset, |
||||
|
[[maybe_unused]] std::string_view vertex) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSetAttributeIndexed([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view offset, |
||||
|
[[maybe_unused]] std::string_view value, |
||||
|
[[maybe_unused]] std::string_view vertex) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitGetPatch([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Patch patch) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSetPatch([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Patch patch, |
||||
|
[[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSetFragColor([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] u32 index, |
||||
|
[[maybe_unused]] u32 component, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSetSampleMask([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSetFragDepth([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
} // namespace Shader::Backend::GLASM
|
||||
@ -0,0 +1,421 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <string_view>
|
||||
|
|
||||
|
#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 { |
||||
|
|
||||
|
void EmitFPAbs16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPAbs32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
||||
|
ctx.Add("MOV.F {},|{}|;", inst, value); |
||||
|
} |
||||
|
|
||||
|
void EmitFPAbs64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPAdd16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { |
||||
|
ctx.Add("ADD.F {},{},{};", inst, a, b); |
||||
|
} |
||||
|
|
||||
|
void EmitFPAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFma16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b, |
||||
|
[[maybe_unused]] std::string_view c) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFma32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b, |
||||
|
std::string_view c) { |
||||
|
ctx.Add("MAD.F {},{},{},{};", inst, a, b, c); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFma64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b, |
||||
|
[[maybe_unused]] std::string_view c) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMax64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMin64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMul16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { |
||||
|
ctx.Add("MUL.F {},{},{};", inst, a, b); |
||||
|
} |
||||
|
|
||||
|
void EmitFPMul64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPNeg16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPNeg32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
||||
|
if (value[0] == '-') { |
||||
|
// Guard against negating a negative immediate
|
||||
|
ctx.Add("MOV.F {},{};", inst, value.substr(1)); |
||||
|
} else { |
||||
|
ctx.Add("MOV.F {},-{};", inst, value); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void EmitFPNeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPSin([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPCos([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPExp2([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPLog2([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRecip32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRecip64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRecipSqrt32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRecipSqrt64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPSqrt([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPSaturate16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPSaturate32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
||||
|
ctx.Add("MOV.F.SAT {},{};", inst, value); |
||||
|
} |
||||
|
|
||||
|
void EmitFPSaturate64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPClamp16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
||||
|
[[maybe_unused]] std::string_view min_value, |
||||
|
[[maybe_unused]] std::string_view max_value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
||||
|
[[maybe_unused]] std::string_view min_value, |
||||
|
[[maybe_unused]] std::string_view max_value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPClamp64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
||||
|
[[maybe_unused]] std::string_view min_value, |
||||
|
[[maybe_unused]] std::string_view max_value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRoundEven16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRoundEven32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPRoundEven64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFloor16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFloor32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPFloor64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPCeil16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPCeil32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPCeil64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPTrunc16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPTrunc32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPTrunc64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
||||
|
std::string_view rhs) { |
||||
|
const std::string ret{ctx.reg_alloc.Define(inst)}; |
||||
|
ctx.Add("SEQ.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
||||
|
std::string_view rhs) { |
||||
|
const std::string ret{ctx.reg_alloc.Define(inst)}; |
||||
|
ctx.Add("SLT.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThan32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThan16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThan32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThan64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThan16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThan32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThan64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThanEqual16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
||||
|
std::string_view rhs) { |
||||
|
const std::string ret{ctx.reg_alloc.Define(inst)}; |
||||
|
ctx.Add("SLE.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdLessThanEqual64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThanEqual16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThanEqual32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordLessThanEqual64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPOrdGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFPUnordGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
} // namespace Shader::Backend::GLASM
|
||||
@ -0,0 +1,228 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <string_view>
|
||||
|
|
||||
|
#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 { |
||||
|
|
||||
|
void EmitIAdd32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitISub32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitISub64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitIMul32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitINeg32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitINeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitIAbs32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitIAbs64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftLeftLogical32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftLeftLogical64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftRightLogical32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftRightLogical64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftRightArithmetic32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitShiftRightArithmetic64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view shift) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitwiseAnd32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitwiseOr32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitwiseXor32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitFieldInsert([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view insert, |
||||
|
[[maybe_unused]] std::string_view offset, |
||||
|
[[maybe_unused]] std::string_view count) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitFieldSExtract([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view offset, |
||||
|
[[maybe_unused]] std::string_view count) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitFieldUExtract([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view base, |
||||
|
[[maybe_unused]] std::string_view offset, |
||||
|
[[maybe_unused]] std::string_view count) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitReverse32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitCount32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitBitwiseNot32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFindSMsb32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitFindUMsb32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitUMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitUMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
||||
|
[[maybe_unused]] std::string_view b) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view value, [[maybe_unused]] std::string_view min, |
||||
|
[[maybe_unused]] std::string_view max) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitUClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
||||
|
[[maybe_unused]] std::string_view value, [[maybe_unused]] std::string_view min, |
||||
|
[[maybe_unused]] std::string_view max) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSLessThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitULessThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitIEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSLessThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitULessThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSGreaterThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitUGreaterThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitINotEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitSGreaterThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitUGreaterThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
||||
|
[[maybe_unused]] std::string_view rhs) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
} // namespace Shader::Backend::GLASM
|
||||
@ -0,0 +1,178 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <string_view>
|
||||
|
|
||||
|
#include "shader_recompiler/backend/glasm/emit_context.h"
|
||||
|
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
||||
|
#include "shader_recompiler/frontend/ir/program.h"
|
||||
|
#include "shader_recompiler/frontend/ir/value.h"
|
||||
|
|
||||
|
namespace Shader::Backend::GLASM { |
||||
|
namespace { |
||||
|
void StorageOp(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view then_expr, std::string_view else_expr = {}) { |
||||
|
// Operate on bindless SSBO, call the expression with bounds checking
|
||||
|
// address = c[binding].xy
|
||||
|
// length = c[binding].z
|
||||
|
const u32 sb_binding{binding.U32()}; |
||||
|
ctx.Add("PK64.U LC,c[{}];" // pointer = address
|
||||
|
"CVT.U64.U32 LC.z,{};" // offset = uint64_t(offset)
|
||||
|
"ADD.U64 LC.x,LC.x,LC.z;" // pointer += offset
|
||||
|
"SLT.U.CC RC.x,{},c[{}].z;", // cc = offset < length
|
||||
|
sb_binding, offset, offset, sb_binding); |
||||
|
if (else_expr.empty()) { |
||||
|
ctx.Add("{}", then_expr); |
||||
|
} else { |
||||
|
ctx.Add("IF NE.x;{}ELSE;{}ENDIF;", then_expr, else_expr); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Store(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value, std::string_view size) { |
||||
|
StorageOp(ctx, binding, offset, fmt::format("STORE.{} {},LC.x;", size, value)); |
||||
|
} |
||||
|
|
||||
|
void Load(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view size) { |
||||
|
const std::string ret{ctx.reg_alloc.Define(inst)}; |
||||
|
StorageOp(ctx, binding, offset, fmt::format("STORE.{} {},LC.x;", size, ret), |
||||
|
fmt::format("MOV.U {},{{0,0,0,0}};", ret)); |
||||
|
} |
||||
|
} // Anonymous namespace
|
||||
|
|
||||
|
void EmitLoadGlobalU8([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobalS8([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobalU16([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobalS16([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobal32([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view address) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobal64([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view address) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadGlobal128([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view address) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobalU8([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobalS8([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobalU16([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobalS16([[maybe_unused]] EmitContext& ctx) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobal32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view address, |
||||
|
[[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobal64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view address, |
||||
|
[[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteGlobal128([[maybe_unused]] EmitContext& ctx, |
||||
|
[[maybe_unused]] std::string_view address, |
||||
|
[[maybe_unused]] std::string_view value) { |
||||
|
throw NotImplementedException("GLASM instruction"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorageU8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "U8"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorageS8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "S8"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorageU16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "U16"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorageS16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "S16"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorage32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "U32"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorage64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "U32X2"); |
||||
|
} |
||||
|
|
||||
|
void EmitLoadStorage128(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
||||
|
std::string_view offset) { |
||||
|
Load(ctx, inst, binding, offset, "U32X4"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "U8"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "S8"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "U16"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "S16"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "U32"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "U32X2"); |
||||
|
} |
||||
|
|
||||
|
void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
||||
|
std::string_view value) { |
||||
|
Store(ctx, binding, offset, value, "U32X4"); |
||||
|
} |
||||
|
|
||||
|
} // namespace Shader::Backend::GLASM
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue