summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell
diff options
context:
space:
mode:
authorGravatar Morph2022-01-28 18:24:56 -0500
committerGravatar GitHub2022-01-28 18:24:56 -0500
commit8dea7fa129be96fe12d27fe412ee0df0e5969372 (patch)
treecd6f24de38010e3fdde198912e076f831e5b680a /src/shader_recompiler/frontend/maxwell
parentMerge pull request #7799 from ameerj/amd-xfb (diff)
parentvideo_minimum_maximum: Implement src operand selectors (diff)
downloadyuzu-8dea7fa129be96fe12d27fe412ee0df0e5969372.tar.gz
yuzu-8dea7fa129be96fe12d27fe412ee0df0e5969372.tar.xz
yuzu-8dea7fa129be96fe12d27fe412ee0df0e5969372.zip
Merge pull request #7786 from ameerj/vmnmx-sel
video_minimum_maximum: Implement src operand selectors
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp18
1 files changed, 6 insertions, 12 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp
index 78869601f..4851b0b8d 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp
@@ -57,16 +57,6 @@ void TranslatorVisitor::VMNMX(u64 insn) {
57 if (vmnmx.sat != 0) { 57 if (vmnmx.sat != 0) {
58 throw NotImplementedException("VMNMX SAT"); 58 throw NotImplementedException("VMNMX SAT");
59 } 59 }
60 // Selectors were shown to default to 2 in unit tests
61 if (vmnmx.src_a_selector != 2) {
62 throw NotImplementedException("VMNMX Selector {}", vmnmx.src_a_selector.Value());
63 }
64 if (vmnmx.src_b_selector != 2) {
65 throw NotImplementedException("VMNMX Selector {}", vmnmx.src_b_selector.Value());
66 }
67 if (vmnmx.src_a_width != VideoWidth::Word) {
68 throw NotImplementedException("VMNMX Source Width {}", vmnmx.src_a_width.Value());
69 }
70 60
71 const bool is_b_imm{vmnmx.is_src_b_reg == 0}; 61 const bool is_b_imm{vmnmx.is_src_b_reg == 0};
72 const IR::U32 src_a{GetReg8(insn)}; 62 const IR::U32 src_a{GetReg8(insn)};
@@ -76,10 +66,14 @@ void TranslatorVisitor::VMNMX(u64 insn) {
76 const VideoWidth a_width{vmnmx.src_a_width}; 66 const VideoWidth a_width{vmnmx.src_a_width};
77 const VideoWidth b_width{GetVideoSourceWidth(vmnmx.src_b_width, is_b_imm)}; 67 const VideoWidth b_width{GetVideoSourceWidth(vmnmx.src_b_width, is_b_imm)};
78 68
69 const u32 a_selector{static_cast<u32>(vmnmx.src_a_selector)};
70 // Immediate values can't have a selector
71 const u32 b_selector{is_b_imm ? 0U : static_cast<u32>(vmnmx.src_b_selector)};
72
79 const bool src_a_signed{vmnmx.src_a_sign != 0}; 73 const bool src_a_signed{vmnmx.src_a_sign != 0};
80 const bool src_b_signed{vmnmx.src_b_sign != 0}; 74 const bool src_b_signed{vmnmx.src_b_sign != 0};
81 const IR::U32 op_a{ExtractVideoOperandValue(ir, src_a, a_width, 0, src_a_signed)}; 75 const IR::U32 op_a{ExtractVideoOperandValue(ir, src_a, a_width, a_selector, src_a_signed)};
82 const IR::U32 op_b{ExtractVideoOperandValue(ir, src_b, b_width, 0, src_b_signed)}; 76 const IR::U32 op_b{ExtractVideoOperandValue(ir, src_b, b_width, b_selector, src_b_signed)};
83 77
84 // First operation's sign is only dependent on operand b's sign 78 // First operation's sign is only dependent on operand b's sign
85 const bool op_1_signed{src_b_signed}; 79 const bool op_1_signed{src_b_signed};