COMPMID-2306: CLDepthwiseConvolution: support for QUANT8_PER_CHANNEL_SYMM

Change-Id: I18c886400daa2dcba0b91011bc4e503d807a4732
Signed-off-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Reviewed-on: https://review.mlplatform.org/c/2143
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/src/core/utils/quantization/AsymmHelpers.cpp b/src/core/utils/quantization/AsymmHelpers.cpp
index 42bd84d..cdd4897 100644
--- a/src/core/utils/quantization/AsymmHelpers.cpp
+++ b/src/core/utils/quantization/AsymmHelpers.cpp
@@ -22,6 +22,7 @@
  * SOFTWARE.
  */
 #include "arm_compute/core/utils/quantization/AsymmHelpers.h"
+#include "arm_compute/core/Helpers.h"
 
 #include <cmath>
 #include <limits>
@@ -134,5 +135,26 @@
     }
     return std::make_pair(min_quant_val, max_quant_val);
 }
+void compute_quantized_multipliers_and_shifts(const ITensor *input, const ITensor *weights, const ITensor *output, int32_t *output_multipliers_ptr, int32_t *output_shifts_ptr)
+{
+    const unsigned int idx_c       = get_data_layout_dimension_index(weights->info()->data_layout(), DataLayoutDimension::CHANNEL);
+    const unsigned int num_filters = is_data_type_quantized_per_channel(weights->info()->data_type()) ? weights->info()->dimension(idx_c) : 1;
+
+    const UniformQuantizationInfo iq_info = input->info()->quantization_info().uniform();
+    const QuantizationInfo        wq_info = weights->info()->quantization_info();
+    const UniformQuantizationInfo oq_info = output->info()->quantization_info().uniform();
+
+    for(unsigned int i = 0; i < num_filters; ++i)
+    {
+        int         output_multiplier = 0;
+        int         output_shift      = 0;
+        const float multiplier        = iq_info.scale * wq_info.scale()[i] / oq_info.scale;
+        ARM_COMPUTE_ERROR_ON(multiplier > 1.0f);
+        calculate_quantized_multiplier_less_than_one(multiplier, &output_multiplier, &output_shift);
+
+        output_multipliers_ptr[i] = output_multiplier;
+        output_shifts_ptr[i]      = output_shift;
+    }
+}
 } // quantization
 } // arm_compute