From 556f3a6e9af4973aa72b4848b634ccf2932b614d Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 10:54:37 +0700 Subject: [PATCH 1/4] shader_conversion: add conversion I2F for Short --- src/video_core/shader/decode/conversion.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 0eeb755593..6307d1524c 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -83,16 +83,13 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) { const bool input_signed = instr.conversion.is_input_signed; - if (instr.conversion.src_size == Register::Size::Byte) { - const u32 offset = static_cast(instr.conversion.int_src.selector) * 8; - if (offset > 0) { - value = SignedOperation(OperationCode::ILogicalShiftRight, input_signed, - std::move(value), Immediate(offset)); - } - } else { - UNIMPLEMENTED_IF(instr.conversion.int_src.selector != 0); + if (const u32 offset = instr.conversion.int_src.selector; offset > 0) { + ASSERT(instr.conversion.src_size == Register::Size::Byte || + instr.conversion.src_size == Register::Size::Short); + value = SignedOperation(OperationCode::ILogicalShiftRight, input_signed, + std::move(value), Immediate(offset * 8)); } - + value = ConvertIntegerSize(value, instr.conversion.src_size, input_signed); value = GetOperandAbsNegInteger(value, instr.conversion.abs_a, false, input_signed); value = SignedOperation(OperationCode::FCastInteger, input_signed, PRECISE, value); From a8508f2bc054ba7ec41951b9fd0d638d3c9a8491 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 11:02:59 +0700 Subject: [PATCH 2/4] clang-format fix --- src/video_core/shader/decode/conversion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 6307d1524c..fbbaab5849 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -89,7 +89,7 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) { value = SignedOperation(OperationCode::ILogicalShiftRight, input_signed, std::move(value), Immediate(offset * 8)); } - + value = ConvertIntegerSize(value, instr.conversion.src_size, input_signed); value = GetOperandAbsNegInteger(value, instr.conversion.abs_a, false, input_signed); value = SignedOperation(OperationCode::FCastInteger, input_signed, PRECISE, value); From a2c2c5768f91c8083c4ac0cb0405be3c28e33f8a Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 11:10:26 +0700 Subject: [PATCH 3/4] fix warning --- src/video_core/shader/decode/conversion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index fbbaab5849..7da857af5d 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -83,7 +83,7 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) { const bool input_signed = instr.conversion.is_input_signed; - if (const u32 offset = instr.conversion.int_src.selector; offset > 0) { + if (const u32 offset = static_cast(instr.conversion.int_src.selector); offset > 0) { ASSERT(instr.conversion.src_size == Register::Size::Byte || instr.conversion.src_size == Register::Size::Short); value = SignedOperation(OperationCode::ILogicalShiftRight, input_signed, From 1b6308727ca2cdd256175d90018abd54bbb7921d Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 11:40:35 +0700 Subject: [PATCH 4/4] shader_conversion: I2F : add Assert for case src_size is Short --- src/video_core/shader/decode/conversion.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 7da857af5d..6ead420701 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -86,6 +86,9 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) { if (const u32 offset = static_cast(instr.conversion.int_src.selector); offset > 0) { ASSERT(instr.conversion.src_size == Register::Size::Byte || instr.conversion.src_size == Register::Size::Short); + if (instr.conversion.src_size == Register::Size::Short) { + ASSERT(offset == 0 || offset == 2); + } value = SignedOperation(OperationCode::ILogicalShiftRight, input_signed, std::move(value), Immediate(offset * 8)); }