summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glasm/emit_glasm.cpp
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-09 18:03:01 -0300
committerGravatar ameerj2021-07-22 21:51:30 -0400
commit4502595bc2518eecf934110e9393b11bf0c2f75a (patch)
tree3e75e200936bce393152792b9ba90413ea83482c /src/shader_recompiler/backend/glasm/emit_glasm.cpp
parentglasm: Implement GLASM fp16 packing and move bitwise insns (diff)
downloadyuzu-4502595bc2518eecf934110e9393b11bf0c2f75a.tar.gz
yuzu-4502595bc2518eecf934110e9393b11bf0c2f75a.tar.xz
yuzu-4502595bc2518eecf934110e9393b11bf0c2f75a.zip
glasm: Initial GLASM fp64 support
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm.cpp')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index 842ec157d..9db6eb4a0 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
@@ -42,7 +42,11 @@ template <bool scalar>
42struct RegWrapper { 42struct RegWrapper {
43 RegWrapper(EmitContext& ctx, Value value) 43 RegWrapper(EmitContext& ctx, Value value)
44 : reg_alloc{ctx.reg_alloc}, allocated{value.type != Type::Register} { 44 : reg_alloc{ctx.reg_alloc}, allocated{value.type != Type::Register} {
45 reg = allocated ? reg_alloc.AllocReg() : Register{value}; 45 if (allocated) {
46 reg = value.type == Type::F64 ? reg_alloc.AllocLongReg() : reg_alloc.AllocReg();
47 } else {
48 reg = Register{value};
49 }
46 switch (value.type) { 50 switch (value.type) {
47 case Type::Register: 51 case Type::Register:
48 break; 52 break;
@@ -55,6 +59,9 @@ struct RegWrapper {
55 case Type::F32: 59 case Type::F32:
56 ctx.Add("MOV.F {}.x,{};", reg, value.imm_f32); 60 ctx.Add("MOV.F {}.x,{};", reg, value.imm_f32);
57 break; 61 break;
62 case Type::F64:
63 ctx.Add("MOV.F64 {}.x,{};", reg, value.imm_f64);
64 break;
58 } 65 }
59 } 66 }
60 ~RegWrapper() { 67 ~RegWrapper() {
@@ -162,10 +169,12 @@ std::string EmitGLASM(const Profile&, IR::Program& program, Bindings&) {
162 for (size_t index = 0; index < ctx.reg_alloc.NumUsedRegisters(); ++index) { 169 for (size_t index = 0; index < ctx.reg_alloc.NumUsedRegisters(); ++index) {
163 header += fmt::format("R{},", index); 170 header += fmt::format("R{},", index);
164 } 171 }
165 header += "RC;"; 172 header += "RC;"
166 if (!program.info.storage_buffers_descriptors.empty()) { 173 "LONG TEMP ";
167 header += "LONG TEMP LC;"; 174 for (size_t index = 0; index < ctx.reg_alloc.NumUsedLongRegisters(); ++index) {
175 header += fmt::format("D{},", index);
168 } 176 }
177 header += "DC;";
169 ctx.code.insert(0, header); 178 ctx.code.insert(0, header);
170 ctx.code += "END"; 179 ctx.code += "END";
171 return ctx.code; 180 return ctx.code;