summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/frontend')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp
index ad1ed2bd7..5da3262f0 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp
@@ -32,7 +32,14 @@ void TranslatorVisitor::FSWZADD(u64 insn) {
.fmz_mode = (fswzadd.ftz != 0 ? IR::FmzMode::FTZ : IR::FmzMode::None),
};
- const IR::F32 result{ir.FSwizzleAdd(src_a, src_b, swizzle, fp_control)};
+ IR::F32 result;
+ if (fswzadd.ndv != 0) {
+ const IR::F32 neg_recip = ir.FNeg(ir.FDiv(ir.FImm32(1.0f), src_b));
+ result = ir.FSwizzleAdd(src_a, neg_recip, swizzle, fp_control);
+ } else {
+ result = ir.FSwizzleAdd(src_a, src_b, swizzle, fp_control);
+ }
+
F(fswzadd.dest_reg, result);
if (fswzadd.cc != 0) {