Added int8 support in LeakyRelu/LUT kernel.

* Resolves COMPMID-6292

Change-Id: I15a0ad1c298ff53dd111fda76ef70872aaadac3b
Signed-off-by: Pablo Marquez Tello <pablo.tello@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9740
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Jakub Sujak <jakub.sujak@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Benchmark: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/core/QuantizationInfo.h b/arm_compute/core/QuantizationInfo.h
index ddf1342..98ceec6 100644
--- a/arm_compute/core/QuantizationInfo.h
+++ b/arm_compute/core/QuantizationInfo.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2022 Arm Limited.
+ * Copyright (c) 2019-2023 Arm Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -430,6 +430,17 @@
     return tmp;
 }
 
+inline qasymm8_signed_t qasymm8_signed_leaky_relu(qasymm8_signed_t               in,
+                                                  const UniformQuantizationInfo &qi_in,
+                                                  const UniformQuantizationInfo &qi_out,
+                                                  float                          alpha)
+{
+    float tmp_f         = dequantize_qasymm8_signed(in, qi_in);
+    tmp_f               = tmp_f > 0 ? tmp_f : tmp_f * alpha;
+    const qasymm8_t tmp = quantize_qasymm8_signed(tmp_f, qi_out);
+    return tmp;
+}
+
 inline qasymm8_t qasymm8_logistic(qasymm8_t                      in,
                                   const UniformQuantizationInfo &qi_in,
                                   const UniformQuantizationInfo &qi_out)
diff --git a/arm_compute/core/Types.h b/arm_compute/core/Types.h
index fd45bba..09b77b5 100644
--- a/arm_compute/core/Types.h
+++ b/arm_compute/core/Types.h
@@ -1737,7 +1737,14 @@
         }
         else if(_act == ActivationFunction::LEAKY_RELU)
         {
-            qasymm8_leaky_relu_populate_table(_lut, qi_in, qi_out, _a);
+            if(data_type == DataType::QASYMM8)
+            {
+                qasymm8_leaky_relu_populate_table(_lut, qi_in, qi_out, _a);
+            }
+            else
+            {
+                qasymm8_signed_leaky_relu_populate_table(_lut, qi_in, qi_out, _a);
+            }
         }
         else if(_act == ActivationFunction::LOGISTIC)
         {
@@ -1761,7 +1768,7 @@
             case ActivationFunction::HARD_SWISH:
                 return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED;
             case ActivationFunction::LEAKY_RELU:
-                return data_type == DataType::QASYMM8;
+                return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED;
             case ActivationFunction::LOGISTIC:
                 return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED;
             default:
@@ -1807,6 +1814,14 @@
         }
     }
 
+    static inline void qasymm8_signed_leaky_relu_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out, float alpha)
+    {
+        for(size_t i = 0; i < lut.size(); ++i)
+        {
+            lut[i] = qasymm8_signed_leaky_relu(i, qi_in, qi_out, alpha);
+        }
+    }
+
     static inline void qasymm8_logistic_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out)
     {
         for(size_t i = 0; i < lut.size(); ++i)