diff options
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm.cpp | 17 |
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> | |||
| 42 | struct RegWrapper { | 42 | struct 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; |