diff options
| author | 2018-12-17 21:14:25 -0300 | |
|---|---|---|
| committer | 2019-01-15 17:54:52 -0300 | |
| commit | e8235c0215d51236c5b968de971435b7cf74dc81 (patch) | |
| tree | 5e9bc0ac44ad3c6e4e0648139f25478444eb5eb2 /src | |
| parent | shader_decode: Implement BRA internal flag (diff) | |
| download | yuzu-e8235c0215d51236c5b968de971435b7cf74dc81.tar.gz yuzu-e8235c0215d51236c5b968de971435b7cf74dc81.tar.xz yuzu-e8235c0215d51236c5b968de971435b7cf74dc81.zip | |
shader_decode: Implement I2I
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/decode/conversion.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 82fe5e21a..b823b6119 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp | |||
| @@ -18,6 +18,32 @@ 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::I2I_R: { | ||
| 22 | UNIMPLEMENTED_IF(instr.conversion.selector); | ||
| 23 | |||
| 24 | const bool input_signed = instr.conversion.is_input_signed; | ||
| 25 | const bool output_signed = instr.conversion.is_output_signed; | ||
| 26 | |||
| 27 | Node value = GetRegister(instr.gpr20); | ||
| 28 | value = ConvertIntegerSize(value, instr.conversion.src_size, input_signed); | ||
| 29 | |||
| 30 | value = GetOperandAbsNegInteger(value, instr.conversion.abs_a, instr.conversion.negate_a, | ||
| 31 | input_signed); | ||
| 32 | if (input_signed != output_signed) { | ||
| 33 | value = SignedOperation(OperationCode::ICastUnsigned, output_signed, NO_PRECISE, value); | ||
| 34 | } | ||
| 35 | |||
| 36 | SetRegister(bb, instr.gpr0, value); | ||
| 37 | |||
| 38 | if (instr.generates_cc) { | ||
| 39 | const Node zero_condition = | ||
| 40 | SignedOperation(OperationCode::LogicalIEqual, output_signed, value, Immediate(0)); | ||
| 41 | SetInternalFlag(bb, InternalFlag::Zero, zero_condition); | ||
| 42 | LOG_WARNING(HW_GPU, "I2I Condition codes implementation is incomplete."); | ||
| 43 | } | ||
| 44 | |||
| 45 | break; | ||
| 46 | } | ||
| 21 | case OpCode::Id::I2F_R: | 47 | case OpCode::Id::I2F_R: |
| 22 | case OpCode::Id::I2F_C: { | 48 | case OpCode::Id::I2F_C: { |
| 23 | UNIMPLEMENTED_IF(instr.conversion.dest_size != Register::Size::Word); | 49 | UNIMPLEMENTED_IF(instr.conversion.dest_size != Register::Size::Word); |