diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/decode/conversion.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 465c63a9e..7c691982d 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp | |||
| @@ -18,6 +18,29 @@ u32 ShaderIR::DecodeConversion(BasicBlock& bb, u32 pc) { | |||
| 18 | const auto opcode = OpCode::Decode(instr); | 18 | const auto opcode = OpCode::Decode(instr); |
| 19 | 19 | ||
| 20 | switch (opcode->get().GetId()) { | 20 | switch (opcode->get().GetId()) { |
| 21 | case OpCode::Id::I2F_R: | ||
| 22 | case OpCode::Id::I2F_C: { | ||
| 23 | UNIMPLEMENTED_IF(instr.conversion.dest_size != Register::Size::Word); | ||
| 24 | UNIMPLEMENTED_IF(instr.conversion.selector); | ||
| 25 | UNIMPLEMENTED_IF_MSG(instr.generates_cc, | ||
| 26 | "Condition codes generation in I2F is not implemented"); | ||
| 27 | |||
| 28 | Node value = [&]() { | ||
| 29 | if (instr.is_b_gpr) { | ||
| 30 | return GetRegister(instr.gpr20); | ||
| 31 | } else { | ||
| 32 | return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); | ||
| 33 | } | ||
| 34 | }(); | ||
| 35 | const bool input_signed = instr.conversion.is_input_signed; | ||
| 36 | value = ConvertIntegerSize(value, instr.conversion.src_size, input_signed); | ||
| 37 | value = GetOperandAbsNegInteger(value, instr.conversion.abs_a, false, input_signed); | ||
| 38 | value = SignedOperation(OperationCode::FCastInteger, input_signed, PRECISE, value); | ||
| 39 | value = GetOperandAbsNegFloat(value, false, instr.conversion.negate_a); | ||
| 40 | |||
| 41 | SetRegister(bb, instr.gpr0, value); | ||
| 42 | break; | ||
| 43 | } | ||
| 21 | case OpCode::Id::F2F_R: { | 44 | case OpCode::Id::F2F_R: { |
| 22 | UNIMPLEMENTED_IF(instr.conversion.dest_size != Register::Size::Word); | 45 | UNIMPLEMENTED_IF(instr.conversion.dest_size != Register::Size::Word); |
| 23 | UNIMPLEMENTED_IF(instr.conversion.src_size != Register::Size::Word); | 46 | UNIMPLEMENTED_IF(instr.conversion.src_size != Register::Size::Word); |