Improve documentation of unsafe optimizations

This commit is contained in:
MerryMage 2020-07-12 12:38:22 +01:00
parent 82417da780
commit d05d95c132
8 changed files with 69 additions and 17 deletions

View file

@ -32,6 +32,10 @@ struct A32EmitContext final : public EmitContext {
bool IsSingleStep() const;
FP::FPCR FPCR(bool fpcr_controlled = true) const override;
bool HasOptimization(OptimizationFlag flag) const override {
return conf.HasOptimization(flag);
}
const A32::UserConfig& conf;
};

View file

@ -29,7 +29,9 @@ struct A64EmitContext final : public EmitContext {
bool IsSingleStep() const;
FP::FPCR FPCR(bool fpcr_controlled = true) const override;
bool UnsafeOptimizations() const override { return conf.unsafe_optimizations; }
bool HasOptimization(OptimizationFlag flag) const override {
return conf.HasOptimization(flag);
}
const A64::UserConfig& conf;
};

View file

@ -28,6 +28,10 @@ class Block;
class Inst;
} // namespace Dynarmic::IR
namespace Dynarmic {
enum class OptimizationFlag : u32;
} // namespace Dynarmic
namespace Dynarmic::Backend::X64 {
class BlockOfCode;
@ -51,7 +55,7 @@ struct EmitContext {
virtual FP::FPCR FPCR(bool fpcr_controlled = true) const = 0;
virtual bool UnsafeOptimizations() const { return false; }
virtual bool HasOptimization(OptimizationFlag flag) const = 0;
RegAlloc& reg_alloc;
IR::Block& block;

View file

@ -14,6 +14,8 @@
#include <mp/typelist/list.h>
#include <mp/typelist/lower_to_tuple.h>
#include <dynarmic/optimization_flags.h>
#include "backend/x64/abi.h"
#include "backend/x64/block_of_code.h"
#include "backend/x64/emit_x64.h"
@ -638,7 +640,7 @@ static void EmitFPMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
return;
}
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_UnfuseFMA)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand1 = ctx.reg_alloc.UseScratchXmm(args[0]);
@ -743,7 +745,7 @@ static void EmitFPRecipEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* i
using FPT = mp::unsigned_integer_of_size<fsize>;
if constexpr (fsize != 16) {
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(args[0]);
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm();
@ -939,7 +941,7 @@ static void EmitFPRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* i
using FPT = mp::unsigned_integer_of_size<fsize>;
if constexpr (fsize != 16) {
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(args[0]);
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm();

View file

@ -17,6 +17,8 @@
#include <mp/typelist/list.h>
#include <mp/typelist/lower_to_tuple.h>
#include <dynarmic/optimization_flags.h>
#include "backend/x64/abi.h"
#include "backend/x64/block_of_code.h"
#include "backend/x64/emit_x64.h"
@ -1022,7 +1024,7 @@ void EmitFPVectorMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
return;
}
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_UnfuseFMA)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand1 = ctx.reg_alloc.UseScratchXmm(args[0]);
@ -1183,7 +1185,7 @@ static void EmitRecipEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* ins
using FPT = mp::unsigned_integer_of_size<fsize>;
if constexpr (fsize != 16) {
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(args[0]);
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm();
@ -1363,7 +1365,7 @@ static void EmitRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* ins
using FPT = mp::unsigned_integer_of_size<fsize>;
if constexpr (fsize != 16) {
if (ctx.UnsafeOptimizations()) {
if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Xmm operand = ctx.reg_alloc.UseXmm(args[0]);
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm();