KleidiCV Coverage Report


Directory: ./
File: kleidicv/src/analysis/min_max_neon.cpp
Date: 2026-01-20 20:58:59
Exec Total Coverage
Lines: 34 34 100.0%
Functions: 36 36 100.0%
Branches: 108 108 100.0%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2023 - 2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 #include <limits>
6
7 #include "kleidicv/kleidicv.h"
8 #include "kleidicv/neon.h"
9
10 namespace kleidicv::neon {
11
12 template <typename ScalarType>
13 class MinMax final : public UnrollTwice {
14 public:
15 using VecTraits = neon::VecTraits<ScalarType>;
16 using VectorType = typename VecTraits::VectorType;
17
18 978 MinMax()
19 978 : vmin_(vdupq_n(std::numeric_limits<ScalarType>::max())),
20 978 vmax_(vdupq_n(std::numeric_limits<ScalarType>::lowest())),
21 978 min_(std::numeric_limits<ScalarType>::max()),
22 978 max_(std::numeric_limits<ScalarType>::lowest()) {}
23
24 3664 void vector_path(VectorType src) {
25 3664 vmin_ = vminq(vmin_, src);
26 3664 vmax_ = vmaxq(vmax_, src);
27 3664 }
28
29 13104 void scalar_path(ScalarType src) {
30 13104 min_ = std::min(min_, src);
31 13104 max_ = std::max(max_, src);
32 13104 }
33
34 594 ScalarType get_min() const {
35 594 return std::min<ScalarType>(min_, vminvq(vmin_));
36 }
37
38 594 ScalarType get_max() const {
39 594 return std::max<ScalarType>(max_, vmaxvq(vmax_));
40 }
41
42 private:
43 VectorType vmin_, vmax_;
44 ScalarType min_, max_;
45 }; // end of class MinMax<T>
46
47 template <typename ScalarType>
48 1186 kleidicv_error_t min_max(const ScalarType *src, size_t src_stride, size_t width,
49 size_t height, ScalarType *min_value,
50 ScalarType *max_value) {
51
24/24
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 166 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 166 times.
✓ Branch 4 taken 30 times.
✓ Branch 5 taken 166 times.
✓ Branch 6 taken 30 times.
✓ Branch 7 taken 166 times.
✓ Branch 8 taken 31 times.
✓ Branch 9 taken 166 times.
✓ Branch 10 taken 31 times.
✓ Branch 11 taken 166 times.
✓ Branch 12 taken 31 times.
✓ Branch 13 taken 166 times.
✓ Branch 14 taken 31 times.
✓ Branch 15 taken 166 times.
✓ Branch 16 taken 31 times.
✓ Branch 17 taken 166 times.
✓ Branch 18 taken 31 times.
✓ Branch 19 taken 166 times.
✓ Branch 20 taken 31 times.
✓ Branch 21 taken 172 times.
✓ Branch 22 taken 31 times.
✓ Branch 23 taken 172 times.
1186 CHECK_POINTER_AND_STRIDE(src, src_stride, height);
52
36/36
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 165 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 164 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 164 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 165 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 164 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 164 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 165 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 164 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 164 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 165 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 164 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 164 times.
✓ Branch 24 taken 1 times.
✓ Branch 25 taken 165 times.
✓ Branch 26 taken 1 times.
✓ Branch 27 taken 164 times.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 164 times.
✓ Branch 30 taken 1 times.
✓ Branch 31 taken 171 times.
✓ Branch 32 taken 1 times.
✓ Branch 33 taken 170 times.
✓ Branch 34 taken 2 times.
✓ Branch 35 taken 170 times.
1002 CHECK_IMAGE_SIZE(width, height);
53
54
24/24
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 163 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 162 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 163 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 162 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 163 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 162 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 163 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 162 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 163 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 162 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 169 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 168 times.
990 if (KLEIDICV_UNLIKELY(width == 0 || height == 0)) {
55 12 return KLEIDICV_ERROR_RANGE;
56 }
57
58 978 Rectangle rect{width, height};
59 978 Rows<const ScalarType> src_rows{src, src_stride};
60 978 MinMax<ScalarType> operation;
61 978 apply_operation_by_rows(operation, rect, src_rows);
62
12/12
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 98 times.
✓ Branch 2 taken 64 times.
✓ Branch 3 taken 98 times.
✓ Branch 4 taken 64 times.
✓ Branch 5 taken 98 times.
✓ Branch 6 taken 64 times.
✓ Branch 7 taken 98 times.
✓ Branch 8 taken 64 times.
✓ Branch 9 taken 98 times.
✓ Branch 10 taken 64 times.
✓ Branch 11 taken 104 times.
978 if (min_value) {
63 594 *min_value = operation.get_min();
64 594 }
65
12/12
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 98 times.
✓ Branch 2 taken 64 times.
✓ Branch 3 taken 98 times.
✓ Branch 4 taken 64 times.
✓ Branch 5 taken 98 times.
✓ Branch 6 taken 64 times.
✓ Branch 7 taken 98 times.
✓ Branch 8 taken 64 times.
✓ Branch 9 taken 98 times.
✓ Branch 10 taken 64 times.
✓ Branch 11 taken 104 times.
978 if (max_value) {
66 594 *max_value = operation.get_max();
67 594 }
68 978 return KLEIDICV_OK;
69 1186 }
70
71 #define KLEIDICV_INSTANTIATE_TEMPLATE(type) \
72 template KLEIDICV_TARGET_FN_ATTRS kleidicv_error_t min_max<type>( \
73 const type *src, size_t src_stride, size_t width, size_t height, \
74 type *min_value, type *max_value)
75
76 KLEIDICV_INSTANTIATE_TEMPLATE(int8_t);
77 KLEIDICV_INSTANTIATE_TEMPLATE(uint8_t);
78 KLEIDICV_INSTANTIATE_TEMPLATE(int16_t);
79 KLEIDICV_INSTANTIATE_TEMPLATE(uint16_t);
80 KLEIDICV_INSTANTIATE_TEMPLATE(int32_t);
81 KLEIDICV_INSTANTIATE_TEMPLATE(float);
82
83 } // namespace kleidicv::neon
84