summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2018-12-21 01:53:05 -0300
committerGravatar ReinUsesLisp2019-01-15 17:54:51 -0300
commit8abe5ba2c8a5eb839849b6554782dfd455e85699 (patch)
treee7242a39f0b4d0e3100954d0b9aa44b7f3ceea7e
parentshader_decode: Implement F2F (diff)
downloadyuzu-8abe5ba2c8a5eb839849b6554782dfd455e85699.tar.gz
yuzu-8abe5ba2c8a5eb839849b6554782dfd455e85699.tar.xz
yuzu-8abe5ba2c8a5eb839849b6554782dfd455e85699.zip
shader_decode: Implement I2F
-rw-r--r--src/video_core/shader/decode/conversion.cpp23
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);