diff options
| author | 2022-01-28 18:24:56 -0500 | |
|---|---|---|
| committer | 2022-01-28 18:24:56 -0500 | |
| commit | 8dea7fa129be96fe12d27fe412ee0df0e5969372 (patch) | |
| tree | cd6f24de38010e3fdde198912e076f831e5b680a /src | |
| parent | Merge pull request #7799 from ameerj/amd-xfb (diff) | |
| parent | video_minimum_maximum: Implement src operand selectors (diff) | |
| download | yuzu-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 '')
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp | 18 |
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}; |