diff --git a/src/cpu/kernels/CpuMulKernel.cpp b/src/cpu/kernels/CpuMulKernel.cpp
index ba086e3..8001482 100644
--- a/src/cpu/kernels/CpuMulKernel.cpp
+++ b/src/cpu/kernels/CpuMulKernel.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2022 Arm Limited.
+ * Copyright (c) 2016-2023 Arm Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -26,12 +26,14 @@
 #include "arm_compute/core/ITensor.h"
 #include "arm_compute/core/TensorInfo.h"
 
+#include "src/core/common/Registrars.h"
 #include "src/core/CPP/Validate.h"
 #include "src/core/helpers/AutoConfiguration.h"
 #include "src/core/helpers/WindowHelpers.h"
 #include "src/core/NEON/NEAsymm.h"
 #include "src/core/NEON/NESymm.h"
 #include "src/core/NEON/wrapper/wrapper.h"
+#include "src/cpu/kernels/mul/generic/neon/list.h"
 
 #include <arm_neon.h>
 
@@ -1170,108 +1172,6 @@
     }
 }
 
-void mul_F32_F32_F32(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, float scale)
-{
-    // Create input windows
-    Window input1_win = window.broadcast_if_dimension_le_one(src1->info()->tensor_shape());
-    Window input2_win = window.broadcast_if_dimension_le_one(src2->info()->tensor_shape());
-
-    // Clear X Dimension on execution window as we handle manually
-    Window win = window;
-    win.set(Window::DimX, Window::Dimension(0, 1, 1));
-
-    constexpr int window_step_x         = 16 / sizeof(float);
-    const auto    window_start_x        = static_cast<int>(window.x().start());
-    const auto    window_end_x          = static_cast<int>(window.x().end());
-    const bool    is_broadcast_across_x = src1->info()->tensor_shape().x() != src2->info()->tensor_shape().x();
-
-    using ExactTagType = typename wrapper::traits::neon_vector<float, window_step_x>::tag_type;
-
-    if (is_broadcast_across_x)
-    {
-        const bool     is_broadcast_input_2 = input2_win.x().step() == 0;
-        Window         broadcast_win        = is_broadcast_input_2 ? input2_win : input1_win;
-        Window         non_broadcast_win    = !is_broadcast_input_2 ? input2_win : input1_win;
-        const ITensor *broadcast_tensor     = is_broadcast_input_2 ? src2 : src1;
-        const ITensor *non_broadcast_tensor = !is_broadcast_input_2 ? src2 : src1;
-
-        // Clear X Dimension on execution window as we handle manually
-        non_broadcast_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-
-        Iterator broadcast_input(broadcast_tensor, broadcast_win);
-        Iterator non_broadcast_input(non_broadcast_tensor, non_broadcast_win);
-        Iterator dst(out, win);
-
-        execute_window_loop(
-            win,
-            [&](const Coordinates &)
-            {
-                const auto non_broadcast_input_ptr = reinterpret_cast<const float *>(non_broadcast_input.ptr());
-                const auto output_ptr              = reinterpret_cast<float *>(dst.ptr());
-
-                const float broadcast_value     = *reinterpret_cast<const float *>(broadcast_input.ptr());
-                const auto  broadcast_value_vec = wrapper::vdup_n(broadcast_value, ExactTagType{});
-                const auto  scale_vec           = wrapper::vdup_n(scale, ExactTagType{});
-
-                // Compute window_step_x elements per iteration
-                int x = window_start_x;
-                for (; x <= (window_end_x - window_step_x); x += window_step_x)
-                {
-                    const auto non_broadcast_v = wrapper::vloadq(non_broadcast_input_ptr + x);
-                    auto       res = wrapper::vmul(wrapper::vmul(broadcast_value_vec, non_broadcast_v), scale_vec);
-                    wrapper::vstore(output_ptr + x, res);
-                }
-
-                // Compute left-over elements
-                for (; x < window_end_x; ++x)
-                {
-                    const auto non_broadcast_v = *(non_broadcast_input_ptr + x);
-                    *(output_ptr + x)          = broadcast_value * non_broadcast_v * scale;
-                }
-            },
-            broadcast_input, non_broadcast_input, dst);
-    }
-    else
-    {
-        // Clear X Dimension on execution window as we handle manually
-        input1_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-        input2_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-
-        Iterator input1(src1, input1_win);
-        Iterator input2(src2, input2_win);
-        Iterator dst(out, win);
-
-        execute_window_loop(
-            win,
-            [&](const Coordinates &)
-            {
-                const auto input1_ptr = reinterpret_cast<const float *>(input1.ptr());
-                const auto input2_ptr = reinterpret_cast<const float *>(input2.ptr());
-                const auto output_ptr = reinterpret_cast<float *>(dst.ptr());
-
-                // Compute window_step_x elements per iteration
-                int x = window_start_x;
-                for (; x <= (window_end_x - window_step_x); x += window_step_x)
-                {
-                    const auto ta1       = wrapper::vloadq(input1_ptr + x);
-                    const auto ta2       = wrapper::vloadq(input2_ptr + x);
-                    const auto scale_vec = wrapper::vdup_n(scale, ExactTagType{});
-                    const auto res       = wrapper::vmul(wrapper::vmul(ta1, ta2), scale_vec);
-                    wrapper::vstore(output_ptr + x, res);
-                }
-
-                // Compute left-over elements
-                for (; x < window_end_x; ++x)
-                {
-                    const auto ta1    = *(input1_ptr + x);
-                    const auto ta2    = *(input2_ptr + x);
-                    *(output_ptr + x) = ta1 * ta2 * scale;
-                }
-            },
-            input1, input2, dst);
-    }
-}
-
 void c_mul_F32_F32_F32_n(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window)
 {
     // Create input windows
@@ -1409,115 +1309,6 @@
     }
 }
 
-#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
-void mul_F16_F16_F16(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, float scale)
-{
-    // Create input windows
-    Window input1_win = window.broadcast_if_dimension_le_one(src1->info()->tensor_shape());
-    Window input2_win = window.broadcast_if_dimension_le_one(src2->info()->tensor_shape());
-
-    // Clear X Dimension on execution window as we handle manually
-    Window win = window;
-    win.set(Window::DimX, Window::Dimension(0, 1, 1));
-    constexpr int window_step_x         = 16;
-    const auto    window_start_x        = static_cast<int>(window.x().start());
-    const auto    window_end_x          = static_cast<int>(window.x().end());
-    const bool    is_broadcast_across_x = src1->info()->tensor_shape().x() != src2->info()->tensor_shape().x();
-    if (is_broadcast_across_x)
-    {
-        const bool     is_broadcast_input_2 = input2_win.x().step() == 0;
-        Window         broadcast_win        = is_broadcast_input_2 ? input2_win : input1_win;
-        Window         non_broadcast_win    = !is_broadcast_input_2 ? input2_win : input1_win;
-        const ITensor *broadcast_tensor     = is_broadcast_input_2 ? src2 : src1;
-        const ITensor *non_broadcast_tensor = !is_broadcast_input_2 ? src2 : src1;
-        // Clear X Dimension on execution window as we handle manually
-        non_broadcast_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-        Iterator broadcast_input(broadcast_tensor, broadcast_win);
-        Iterator non_broadcast_input(non_broadcast_tensor, non_broadcast_win);
-        Iterator dst(out, win);
-        execute_window_loop(
-            win,
-            [&](const Coordinates &)
-            {
-                const auto non_broadcast_input_ptr = reinterpret_cast<const float16_t *>(non_broadcast_input.ptr());
-                const auto output_ptr              = reinterpret_cast<float16_t *>(dst.ptr());
-                const auto broadcast_value         = *reinterpret_cast<const float16_t *>(broadcast_input.ptr());
-                const float16x8x2_t broadcast_value_vec = {{
-                    vdupq_n_f16(broadcast_value),
-                    vdupq_n_f16(broadcast_value),
-                }};
-                const auto          scale_vec           = vdupq_n_f16(scale);
-                // Compute window_step_x elements per iteration
-                int x = window_start_x;
-                for (; x <= (window_end_x - window_step_x); x += window_step_x)
-                {
-                    const float16x8x2_t non_broadcast_v = {{
-                        vld1q_f16(non_broadcast_input_ptr + x),
-                        vld1q_f16(non_broadcast_input_ptr + x + 8),
-                    }};
-                    const float16x8x2_t result          = {{
-                                 vmulq_f16(vmulq_f16(broadcast_value_vec.val[0], non_broadcast_v.val[0]), scale_vec),
-                                 vmulq_f16(vmulq_f16(broadcast_value_vec.val[1], non_broadcast_v.val[1]), scale_vec),
-                    }};
-                    vst1q_f16(output_ptr + x, result.val[0]);
-                    vst1q_f16(output_ptr + x + 8, result.val[1]);
-                }
-                // Compute left-over elements
-                for (; x < window_end_x; ++x)
-                {
-                    const auto non_broadcast_v = *(non_broadcast_input_ptr + x);
-                    *(output_ptr + x)          = broadcast_value * non_broadcast_v * scale;
-                }
-            },
-            broadcast_input, non_broadcast_input, dst);
-    }
-    else
-    {
-        input1_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-        input2_win.set(Window::DimX, Window::Dimension(0, 1, 1));
-        Iterator input1(src1, input1_win);
-        Iterator input2(src2, input2_win);
-        Iterator dst(out, win);
-        execute_window_loop(
-            win,
-            [&](const Coordinates &)
-            {
-                const auto input1_ptr = reinterpret_cast<const float16_t *>(input1.ptr());
-                const auto input2_ptr = reinterpret_cast<const float16_t *>(input2.ptr());
-                const auto output_ptr = reinterpret_cast<float16_t *>(dst.ptr());
-                // Compute window_step_x elements per iteration
-                int x = window_start_x;
-                for (; x <= (window_end_x - window_step_x); x += window_step_x)
-                {
-                    const float16x8x2_t ta1       = {{
-                              vld1q_f16(input1_ptr + x),
-                              vld1q_f16(input1_ptr + x + 8),
-                    }};
-                    const float16x8x2_t ta2       = {{
-                              vld1q_f16(input2_ptr + x),
-                              vld1q_f16(input2_ptr + x + 8),
-                    }};
-                    const float16x8_t   scale_vec = vdupq_n_f16(scale);
-                    const float16x8x2_t result    = {{
-                           vmulq_f16(vmulq_f16(ta1.val[0], ta2.val[0]), scale_vec),
-                           vmulq_f16(vmulq_f16(ta1.val[1], ta2.val[1]), scale_vec),
-                    }};
-                    vst1q_f16(output_ptr + x, result.val[0]);
-                    vst1q_f16(output_ptr + x + 8, result.val[1]);
-                }
-                // Compute left-over elements
-                for (; x < window_end_x; ++x)
-                {
-                    const auto ta1    = *(input1_ptr + x);
-                    const auto ta2    = *(input2_ptr + x);
-                    *(output_ptr + x) = ta1 * ta2 * scale;
-                }
-            },
-            input1, input2, dst);
-    }
-}
-#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
-
 template <bool is_scale255, bool is_sat>
 void mul_U8_U8_S16(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, int n)
 {
@@ -1857,13 +1648,11 @@
                 }
             }
             break;
-#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
         case DataType::F16:
-            _func_float = &mul_F16_F16_F16;
+            _func_float = REGISTER_FP16_NEON(cpu::mul_F16_F16_F16);
             break;
-#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
         case DataType::F32:
-            _func_float = &mul_F32_F32_F32;
+            _func_float = REGISTER_FP32_NEON(cpu::mul_F32_F32_F32);
             break;
         default:
             ARM_COMPUTE_ERROR("You called with the wrong img formats");
diff --git a/src/cpu/kernels/mul/generic/neon/fp16.cpp b/src/cpu/kernels/mul/generic/neon/fp16.cpp
new file mode 100644
index 0000000..920f298
--- /dev/null
+++ b/src/cpu/kernels/mul/generic/neon/fp16.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2023 Arm Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && defined(ENABLE_FP16_KERNELS)
+
+#include "arm_compute/core/ITensor.h"
+#include "arm_compute/core/TensorInfo.h"
+
+#include "src/core/CPP/Validate.h"
+#include "src/core/NEON/wrapper/wrapper.h"
+#include "src/cpu/CpuTypes.h"
+
+namespace arm_compute
+{
+namespace cpu
+{
+void mul_F16_F16_F16(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, float scale)
+{
+    // Create input windows
+    Window input1_win = window.broadcast_if_dimension_le_one(src1->info()->tensor_shape());
+    Window input2_win = window.broadcast_if_dimension_le_one(src2->info()->tensor_shape());
+
+    // Clear X Dimension on execution window as we handle manually
+    Window win = window;
+    win.set(Window::DimX, Window::Dimension(0, 1, 1));
+    constexpr int window_step_x         = 16;
+    const auto    window_start_x        = static_cast<int>(window.x().start());
+    const auto    window_end_x          = static_cast<int>(window.x().end());
+    const bool    is_broadcast_across_x = src1->info()->tensor_shape().x() != src2->info()->tensor_shape().x();
+    if (is_broadcast_across_x)
+    {
+        const bool     is_broadcast_input_2 = input2_win.x().step() == 0;
+        Window         broadcast_win        = is_broadcast_input_2 ? input2_win : input1_win;
+        Window         non_broadcast_win    = !is_broadcast_input_2 ? input2_win : input1_win;
+        const ITensor *broadcast_tensor     = is_broadcast_input_2 ? src2 : src1;
+        const ITensor *non_broadcast_tensor = !is_broadcast_input_2 ? src2 : src1;
+        // Clear X Dimension on execution window as we handle manually
+        non_broadcast_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+        Iterator broadcast_input(broadcast_tensor, broadcast_win);
+        Iterator non_broadcast_input(non_broadcast_tensor, non_broadcast_win);
+        Iterator dst(out, win);
+        execute_window_loop(
+            win,
+            [&](const Coordinates &)
+            {
+                const auto non_broadcast_input_ptr = reinterpret_cast<const float16_t *>(non_broadcast_input.ptr());
+                const auto output_ptr              = reinterpret_cast<float16_t *>(dst.ptr());
+                const auto broadcast_value         = *reinterpret_cast<const float16_t *>(broadcast_input.ptr());
+                const float16x8x2_t broadcast_value_vec = {{
+                    vdupq_n_f16(broadcast_value),
+                    vdupq_n_f16(broadcast_value),
+                }};
+                const auto          scale_vec           = vdupq_n_f16(scale);
+                // Compute window_step_x elements per iteration
+                int x = window_start_x;
+                for (; x <= (window_end_x - window_step_x); x += window_step_x)
+                {
+                    const float16x8x2_t non_broadcast_v = {{
+                        vld1q_f16(non_broadcast_input_ptr + x),
+                        vld1q_f16(non_broadcast_input_ptr + x + 8),
+                    }};
+                    const float16x8x2_t result          = {{
+                                 vmulq_f16(vmulq_f16(broadcast_value_vec.val[0], non_broadcast_v.val[0]), scale_vec),
+                                 vmulq_f16(vmulq_f16(broadcast_value_vec.val[1], non_broadcast_v.val[1]), scale_vec),
+                    }};
+                    vst1q_f16(output_ptr + x, result.val[0]);
+                    vst1q_f16(output_ptr + x + 8, result.val[1]);
+                }
+                // Compute left-over elements
+                for (; x < window_end_x; ++x)
+                {
+                    const auto non_broadcast_v = *(non_broadcast_input_ptr + x);
+                    *(output_ptr + x)          = broadcast_value * non_broadcast_v * scale;
+                }
+            },
+            broadcast_input, non_broadcast_input, dst);
+    }
+    else
+    {
+        input1_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+        input2_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+        Iterator input1(src1, input1_win);
+        Iterator input2(src2, input2_win);
+        Iterator dst(out, win);
+        execute_window_loop(
+            win,
+            [&](const Coordinates &)
+            {
+                const auto input1_ptr = reinterpret_cast<const float16_t *>(input1.ptr());
+                const auto input2_ptr = reinterpret_cast<const float16_t *>(input2.ptr());
+                const auto output_ptr = reinterpret_cast<float16_t *>(dst.ptr());
+                // Compute window_step_x elements per iteration
+                int x = window_start_x;
+                for (; x <= (window_end_x - window_step_x); x += window_step_x)
+                {
+                    const float16x8x2_t ta1       = {{
+                              vld1q_f16(input1_ptr + x),
+                              vld1q_f16(input1_ptr + x + 8),
+                    }};
+                    const float16x8x2_t ta2       = {{
+                              vld1q_f16(input2_ptr + x),
+                              vld1q_f16(input2_ptr + x + 8),
+                    }};
+                    const float16x8_t   scale_vec = vdupq_n_f16(scale);
+                    const float16x8x2_t result    = {{
+                           vmulq_f16(vmulq_f16(ta1.val[0], ta2.val[0]), scale_vec),
+                           vmulq_f16(vmulq_f16(ta1.val[1], ta2.val[1]), scale_vec),
+                    }};
+                    vst1q_f16(output_ptr + x, result.val[0]);
+                    vst1q_f16(output_ptr + x + 8, result.val[1]);
+                }
+                // Compute left-over elements
+                for (; x < window_end_x; ++x)
+                {
+                    const auto ta1    = *(input1_ptr + x);
+                    const auto ta2    = *(input2_ptr + x);
+                    *(output_ptr + x) = ta1 * ta2 * scale;
+                }
+            },
+            input1, input2, dst);
+    }
+}
+} // namespace cpu
+} // namespace arm_compute
+#endif /* defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && defined(ENABLE_FP16_KERNELS) */
diff --git a/src/cpu/kernels/mul/generic/neon/fp32.cpp b/src/cpu/kernels/mul/generic/neon/fp32.cpp
new file mode 100644
index 0000000..3001eb5
--- /dev/null
+++ b/src/cpu/kernels/mul/generic/neon/fp32.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2023 Arm Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "arm_compute/core/ITensor.h"
+#include "arm_compute/core/TensorInfo.h"
+
+#include "src/core/CPP/Validate.h"
+#include "src/core/NEON/wrapper/wrapper.h"
+#include "src/cpu/CpuTypes.h"
+
+namespace arm_compute
+{
+namespace cpu
+{
+void mul_F32_F32_F32(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, float scale)
+{
+    // Create input windows
+    Window input1_win = window.broadcast_if_dimension_le_one(src1->info()->tensor_shape());
+    Window input2_win = window.broadcast_if_dimension_le_one(src2->info()->tensor_shape());
+
+    // Clear X Dimension on execution window as we handle manually
+    Window win = window;
+    win.set(Window::DimX, Window::Dimension(0, 1, 1));
+
+    constexpr int window_step_x         = 16 / sizeof(float);
+    const auto    window_start_x        = static_cast<int>(window.x().start());
+    const auto    window_end_x          = static_cast<int>(window.x().end());
+    const bool    is_broadcast_across_x = src1->info()->tensor_shape().x() != src2->info()->tensor_shape().x();
+
+    using ExactTagType = typename wrapper::traits::neon_vector<float, window_step_x>::tag_type;
+
+    if (is_broadcast_across_x)
+    {
+        const bool     is_broadcast_input_2 = input2_win.x().step() == 0;
+        Window         broadcast_win        = is_broadcast_input_2 ? input2_win : input1_win;
+        Window         non_broadcast_win    = !is_broadcast_input_2 ? input2_win : input1_win;
+        const ITensor *broadcast_tensor     = is_broadcast_input_2 ? src2 : src1;
+        const ITensor *non_broadcast_tensor = !is_broadcast_input_2 ? src2 : src1;
+
+        // Clear X Dimension on execution window as we handle manually
+        non_broadcast_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+
+        Iterator broadcast_input(broadcast_tensor, broadcast_win);
+        Iterator non_broadcast_input(non_broadcast_tensor, non_broadcast_win);
+        Iterator dst(out, win);
+
+        execute_window_loop(
+            win,
+            [&](const Coordinates &)
+            {
+                const auto non_broadcast_input_ptr = reinterpret_cast<const float *>(non_broadcast_input.ptr());
+                const auto output_ptr              = reinterpret_cast<float *>(dst.ptr());
+
+                const float broadcast_value     = *reinterpret_cast<const float *>(broadcast_input.ptr());
+                const auto  broadcast_value_vec = wrapper::vdup_n(broadcast_value, ExactTagType{});
+                const auto  scale_vec           = wrapper::vdup_n(scale, ExactTagType{});
+
+                // Compute window_step_x elements per iteration
+                int x = window_start_x;
+                for (; x <= (window_end_x - window_step_x); x += window_step_x)
+                {
+                    const auto non_broadcast_v = wrapper::vloadq(non_broadcast_input_ptr + x);
+                    auto       res = wrapper::vmul(wrapper::vmul(broadcast_value_vec, non_broadcast_v), scale_vec);
+                    wrapper::vstore(output_ptr + x, res);
+                }
+
+                // Compute left-over elements
+                for (; x < window_end_x; ++x)
+                {
+                    const auto non_broadcast_v = *(non_broadcast_input_ptr + x);
+                    *(output_ptr + x)          = broadcast_value * non_broadcast_v * scale;
+                }
+            },
+            broadcast_input, non_broadcast_input, dst);
+    }
+    else
+    {
+        // Clear X Dimension on execution window as we handle manually
+        input1_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+        input2_win.set(Window::DimX, Window::Dimension(0, 1, 1));
+
+        Iterator input1(src1, input1_win);
+        Iterator input2(src2, input2_win);
+        Iterator dst(out, win);
+
+        execute_window_loop(
+            win,
+            [&](const Coordinates &)
+            {
+                const auto input1_ptr = reinterpret_cast<const float *>(input1.ptr());
+                const auto input2_ptr = reinterpret_cast<const float *>(input2.ptr());
+                const auto output_ptr = reinterpret_cast<float *>(dst.ptr());
+
+                // Compute window_step_x elements per iteration
+                int x = window_start_x;
+                for (; x <= (window_end_x - window_step_x); x += window_step_x)
+                {
+                    const auto ta1       = wrapper::vloadq(input1_ptr + x);
+                    const auto ta2       = wrapper::vloadq(input2_ptr + x);
+                    const auto scale_vec = wrapper::vdup_n(scale, ExactTagType{});
+                    const auto res       = wrapper::vmul(wrapper::vmul(ta1, ta2), scale_vec);
+                    wrapper::vstore(output_ptr + x, res);
+                }
+
+                // Compute left-over elements
+                for (; x < window_end_x; ++x)
+                {
+                    const auto ta1    = *(input1_ptr + x);
+                    const auto ta2    = *(input2_ptr + x);
+                    *(output_ptr + x) = ta1 * ta2 * scale;
+                }
+            },
+            input1, input2, dst);
+    }
+}
+} // namespace cpu
+} // namespace arm_compute
diff --git a/src/cpu/kernels/mul/generic/neon/list.h b/src/cpu/kernels/mul/generic/neon/list.h
new file mode 100644
index 0000000..710cb68
--- /dev/null
+++ b/src/cpu/kernels/mul/generic/neon/list.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023 Arm Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ACL_SRC_CPU_KERNELS_MUL_GENERIC_NEON_LIST_H
+#define ACL_SRC_CPU_KERNELS_MUL_GENERIC_NEON_LIST_H
+namespace arm_compute
+{
+namespace cpu
+{
+#define DECLARE_MUL_KERNEL(func_name) \
+    void func_name(const ITensor *src1, const ITensor *src2, ITensor *out, const Window &window, float scale)
+
+DECLARE_MUL_KERNEL(mul_F32_F32_F32);
+DECLARE_MUL_KERNEL(mul_F16_F16_F16);
+#undef DECLARE_MUL_KERNEL
+} // namespace cpu
+} // namespace arm_compute
+#endif // ACL_SRC_CPU_KERNELS_MUL_GENERIC_NEON_LIST_H
