From df628d4e2191248387ec5397ca23d618320fc726 Mon Sep 17 00:00:00 2001 From: Jeremy Johnson Date: Tue, 10 Jan 2023 14:40:54 +0000 Subject: Update for RESCALE spec apply_add clarification Signed-off-by: Jeremy Johnson Change-Id: I6958904c2c8932e9fe03b3092672d62a06e96ee6 --- reference_model/src/ops/type_conversion.cc | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/reference_model/src/ops/type_conversion.cc b/reference_model/src/ops/type_conversion.cc index cb57340..f266675 100644 --- a/reference_model/src/ops/type_conversion.cc +++ b/reference_model/src/ops/type_conversion.cc @@ -159,8 +159,15 @@ int OpRescale::eval() else scaled = TosaReference::QuantUtil::apply_scale_16(input_zp_shifted, channel_multiplier, channel_shift); - scaled = scaled + output_zp; - OutEigenType out_val = static_cast(scaled); + int64_t res_in_64 = static_cast(scaled) + output_zp; + int64_t i32_max_in_64 = static_cast(std::numeric_limits::max()); + int64_t i32_min_in_64 = static_cast(std::numeric_limits::min()); + if (res_in_64 > i32_max_in_64 || res_in_64 < i32_min_in_64) + { + std::string desc = "scaling result [" + std::to_string(scaled) + "] plus output_zp [" + std::to_string(output_zp) + "] not in i32 range"; + throw desc; + } + OutEigenType out_val = static_cast(res_in_64); out_val = std::max(out_val, QMin); out_val = std::min(out_val, QMax); return out_val; @@ -174,7 +181,7 @@ int OpRescale::eval() } catch (std::string desc) { - REQUIRE(false, "OpRescale apply_scale_32/16() fails: %s.", desc.c_str()); + REQUIRE(false, "OpRescale failure: %s.", desc.c_str()); } } else @@ -193,8 +200,16 @@ int OpRescale::eval() else scaled = TosaReference::QuantUtil::apply_scale_16(input_zp_shifted, tensor_multiplier, tensor_shift); - scaled = scaled + output_zp; - OutEigenType out_val = static_cast(scaled); + int64_t res_in_64 = static_cast(scaled) + output_zp; + int64_t i32_max_in_64 = static_cast(std::numeric_limits::max()); + int64_t i32_min_in_64 = static_cast(std::numeric_limits::min()); + if (res_in_64 > i32_max_in_64 || res_in_64 < i32_min_in_64) + { + std::string desc = "scaling result [" + std::to_string(scaled) + "] plus output_zp [" + std::to_string(output_zp) + "] not in i32 range"; + throw desc; + } + + OutEigenType out_val = static_cast(res_in_64); out_val = std::max(out_val, QMin); out_val = std::min(out_val, QMax); return out_val; @@ -202,7 +217,7 @@ int OpRescale::eval() } catch (std::string desc) { - REQUIRE(false, "OpRescale apply_scale_32/16() fails: %s.", desc.c_str()); + REQUIRE(false, "OpRescale failure: %s.", desc.c_str()); } } -- cgit v1.2.1