KleidiCV Coverage Report


Directory: ./
File: kleidicv/src/arithmetics/sub_neon.cpp
Date: 2026-03-05 15:57:40
Exec Total Coverage
Lines: 27 27 100.0%
Functions: 24 24 100.0%
Branches: 176 176 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 SaturatingSub final : public UnrollTwice {
14 public:
15 using VecTraits = neon::VecTraits<ScalarType>;
16 using VectorType = typename VecTraits::VectorType;
17
18 14548 VectorType vector_path(VectorType src_a, VectorType src_b) {
19 14548 return vqsubq(src_a, src_b);
20 }
21
22 5904 ScalarType scalar_path(ScalarType src_a, ScalarType src_b) {
23
8/8
✓ Branch 0 taken 1718 times.
✓ Branch 1 taken 418 times.
✓ Branch 2 taken 771 times.
✓ Branch 3 taken 149 times.
✓ Branch 4 taken 315 times.
✓ Branch 5 taken 77 times.
✓ Branch 6 taken 83 times.
✓ Branch 7 taken 45 times.
3576 if (std::numeric_limits<ScalarType>::is_signed && src_b < 0) {
24 689 ScalarType result;
25
8/8
✓ Branch 0 taken 117 times.
✓ Branch 1 taken 301 times.
✓ Branch 2 taken 46 times.
✓ Branch 3 taken 103 times.
✓ Branch 4 taken 24 times.
✓ Branch 5 taken 53 times.
✓ Branch 6 taken 22 times.
✓ Branch 7 taken 23 times.
689 return __builtin_sub_overflow(src_a, src_b, &result)
26 209 ? std::numeric_limits<ScalarType>::max()
27 480 : result;
28 689 }
29
30 5215 ScalarType result;
31
16/16
✓ Branch 0 taken 122 times.
✓ Branch 1 taken 1596 times.
✓ Branch 2 taken 439 times.
✓ Branch 3 taken 989 times.
✓ Branch 4 taken 53 times.
✓ Branch 5 taken 718 times.
✓ Branch 6 taken 163 times.
✓ Branch 7 taken 401 times.
✓ Branch 8 taken 38 times.
✓ Branch 9 taken 277 times.
✓ Branch 10 taken 82 times.
✓ Branch 11 taken 178 times.
✓ Branch 12 taken 25 times.
✓ Branch 13 taken 58 times.
✓ Branch 14 taken 25 times.
✓ Branch 15 taken 51 times.
5215 return __builtin_sub_overflow(src_a, src_b, &result)
32 947 ? std::numeric_limits<ScalarType>::lowest()
33 4268 : result;
34 5904 }
35 }; // end of class SaturatingSub<ScalarType>
36
37 template <typename T>
38 786 kleidicv_error_t saturating_sub(const T *src_a, size_t src_a_stride,
39 const T *src_b, size_t src_b_stride, T *dst,
40 size_t dst_stride, size_t width,
41 size_t height) {
42
32/32
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 95 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 95 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 95 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 95 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 97 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 97 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 97 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 97 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 97 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 97 times.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 97 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 97 times.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 97 times.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 97 times.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 97 times.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 97 times.
786 CHECK_POINTER_AND_STRIDE(src_a, src_a_stride, height);
43
32/32
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 94 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 94 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 94 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 94 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 95 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 95 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 95 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 95 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 95 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 95 times.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 95 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 95 times.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 95 times.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 95 times.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 95 times.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 95 times.
772 CHECK_POINTER_AND_STRIDE(src_b, src_b_stride, height);
44
32/32
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 93 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 93 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 93 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 93 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 93 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 93 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 93 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 93 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 93 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 93 times.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 93 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 93 times.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 93 times.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 93 times.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 93 times.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 93 times.
758 CHECK_POINTER_AND_STRIDE(dst, dst_stride, height);
45
48/48
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 92 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 91 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 91 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 92 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 91 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 91 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 92 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 91 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 91 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 92 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 91 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 91 times.
✓ Branch 24 taken 1 times.
✓ Branch 25 taken 92 times.
✓ Branch 26 taken 1 times.
✓ Branch 27 taken 91 times.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 91 times.
✓ Branch 30 taken 1 times.
✓ Branch 31 taken 92 times.
✓ Branch 32 taken 1 times.
✓ Branch 33 taken 91 times.
✓ Branch 34 taken 2 times.
✓ Branch 35 taken 91 times.
✓ Branch 36 taken 1 times.
✓ Branch 37 taken 92 times.
✓ Branch 38 taken 1 times.
✓ Branch 39 taken 91 times.
✓ Branch 40 taken 2 times.
✓ Branch 41 taken 91 times.
✓ Branch 42 taken 1 times.
✓ Branch 43 taken 92 times.
✓ Branch 44 taken 1 times.
✓ Branch 45 taken 91 times.
✓ Branch 46 taken 2 times.
✓ Branch 47 taken 91 times.
744 CHECK_IMAGE_SIZE(width, height);
46
47 728 SaturatingSub<T> operation;
48 728 Rectangle rect{width, height};
49 728 Rows<const T> src_a_rows{src_a, src_a_stride};
50 728 Rows<const T> src_b_rows{src_b, src_b_stride};
51 728 Rows<T> dst_rows{dst, dst_stride};
52 728 apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows);
53 728 return KLEIDICV_OK;
54 786 }
55
56 #define KLEIDICV_INSTANTIATE_TEMPLATE(type) \
57 template KLEIDICV_TARGET_FN_ATTRS kleidicv_error_t saturating_sub<type>( \
58 const type *src_a, size_t src_a_stride, const type *src_b, \
59 size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \
60 size_t height)
61
62 KLEIDICV_INSTANTIATE_TEMPLATE(int8_t);
63 KLEIDICV_INSTANTIATE_TEMPLATE(uint8_t);
64 KLEIDICV_INSTANTIATE_TEMPLATE(int16_t);
65 KLEIDICV_INSTANTIATE_TEMPLATE(uint16_t);
66 KLEIDICV_INSTANTIATE_TEMPLATE(int32_t);
67 KLEIDICV_INSTANTIATE_TEMPLATE(uint32_t);
68 KLEIDICV_INSTANTIATE_TEMPLATE(int64_t);
69 KLEIDICV_INSTANTIATE_TEMPLATE(uint64_t);
70
71 } // namespace kleidicv::neon
72