COMPMID-421: Added FP16 support in Pooling Layer

Change-Id: I6b6119c8770051c1656da40aa073c539c15b493e
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/78985
Reviewed-by: Moritz Pflanzer <moritz.pflanzer@arm.com>
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
diff --git a/arm_compute/core/PixelValue.h b/arm_compute/core/PixelValue.h
index b4912ce..1b1a5a3 100644
--- a/arm_compute/core/PixelValue.h
+++ b/arm_compute/core/PixelValue.h
@@ -26,6 +26,10 @@
 
 #include <cstdint>
 
+#if ARM_COMPUTE_ENABLE_FP16
+#include <arm_fp16.h> // needed for float16_t
+#endif                /* ARM_COMPUTE_ENABLE_FP16 */
+
 namespace arm_compute
 {
 /** Class describing the value of a pixel for any image format. */
@@ -82,6 +86,17 @@
     {
         value.s32 = v;
     }
+#if ARM_COMPUTE_ENABLE_FP16
+    /** Initialize the union with a F16 pixel value
+     *
+     * @param[in] v F16 value.
+     */
+    PixelValue(float16_t v)
+        : PixelValue()
+    {
+        value.f16 = v;
+    }
+#endif /* ARM_COMPUTE_ENABLE_FP16 */
     /** Initialize the union with a F32 pixel value
      *
      * @param[in] v F32 value.
@@ -96,16 +111,19 @@
      */
     union
         {
-            uint8_t  rgb[3];  /**< 3 channels: RGB888 */
-            uint8_t  yuv[3];  /**< 3 channels: Any YUV format */
-            uint8_t  rgbx[4]; /**< 4 channels: RGBX8888 */
-            float    f32;     /**< Single channel float 32 */
-            uint8_t  u8;      /**< Single channel U8 */
-            int8_t   s8;      /**< Single channel S8 */
-            uint16_t u16;     /**< Single channel U16 */
-            int16_t  s16;     /**< Single channel S16 */
-            uint32_t u32;     /**< Single channel U32 */
-            int32_t  s32;     /**< Single channel S32 */
+            uint8_t rgb[3];  /**< 3 channels: RGB888 */
+            uint8_t yuv[3];  /**< 3 channels: Any YUV format */
+            uint8_t rgbx[4]; /**< 4 channels: RGBX8888 */
+            float   f32;     /**< Single channel float 32 */
+#if ARM_COMPUTE_ENABLE_FP16
+            float16_t f16; /**< Single channel F16 */
+#endif                 /* ARM_COMPUTE_ENABLE_FP16 */
+            uint8_t  u8;   /**< Single channel U8 */
+            int8_t   s8;   /**< Single channel S8 */
+            uint16_t u16;  /**< Single channel U16 */
+            int16_t  s16;  /**< Single channel S16 */
+            uint32_t u32;  /**< Single channel U32 */
+            int32_t  s32;  /**< Single channel S32 */
         } value;
     /** Interpret the pixel value as a U8
      *
@@ -155,6 +173,16 @@
     {
         v = value.s32;
     }
+#if ARM_COMPUTE_ENABLE_FP16
+    /** Interpret the pixel value as a F16
+     *
+     * @param[out] v Returned value
+     */
+    void get(float16_t &v) const
+    {
+        v = value.f16;
+    }
+#endif /* ARM_COMPUTE_ENABLE_FP16 */
     /** Interpret the pixel value as a F32
      *
      * @param[out] v Returned value