Coverage Report

Created: 2025-11-16 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjxl/lib/jxl/simd_util.cc
Line
Count
Source
1
// Copyright (c) the JPEG XL Project Authors. All rights reserved.
2
//
3
// Use of this source code is governed by a BSD-style
4
// license that can be found in the LICENSE file.
5
6
#include "lib/jxl/simd_util.h"
7
8
#include <cstddef>
9
10
#undef HWY_TARGET_INCLUDE
11
#define HWY_TARGET_INCLUDE "lib/jxl/simd_util.cc"
12
#include <hwy/foreach_target.h>
13
#include <hwy/highway.h>
14
15
HWY_BEFORE_NAMESPACE();
16
namespace jxl {
17
namespace HWY_NAMESPACE {
18
19
using hwy::HWY_NAMESPACE::GetLane;
20
using hwy::HWY_NAMESPACE::IfThenElseZero;
21
using hwy::HWY_NAMESPACE::Iota;
22
using hwy::HWY_NAMESPACE::LoadU;
23
using hwy::HWY_NAMESPACE::Lt;
24
using hwy::HWY_NAMESPACE::Max;
25
using hwy::HWY_NAMESPACE::MaxOfLanes;
26
using hwy::HWY_NAMESPACE::Set;
27
28
34.0M
size_t MaxVectorSize() {
29
34.0M
  HWY_FULL(float) df;
30
34.0M
  return Lanes(df) * sizeof(float);
31
34.0M
}
jxl::N_SSE4::MaxVectorSize()
Line
Count
Source
28
980k
size_t MaxVectorSize() {
29
980k
  HWY_FULL(float) df;
30
980k
  return Lanes(df) * sizeof(float);
31
980k
}
jxl::N_AVX2::MaxVectorSize()
Line
Count
Source
28
32.1M
size_t MaxVectorSize() {
29
32.1M
  HWY_FULL(float) df;
30
32.1M
  return Lanes(df) * sizeof(float);
31
32.1M
}
jxl::N_SSE2::MaxVectorSize()
Line
Count
Source
28
890k
size_t MaxVectorSize() {
29
890k
  HWY_FULL(float) df;
30
890k
  return Lanes(df) * sizeof(float);
31
890k
}
32
33
1.57k
uint32_t MaxValue(uint32_t* JXL_RESTRICT data, size_t len) {
34
1.57k
  HWY_FULL(uint32_t) du;
35
1.57k
  size_t last_full = Lanes(du) * (len / Lanes(du));
36
1.57k
  auto max = Set(du, 0);
37
2.09k
  for (size_t i = 0; i < last_full; i += Lanes(du)) {
38
524
    max = Max(max, LoadU(du, data + i));
39
524
  }
40
1.57k
  if (last_full < len) {
41
262
    const auto stop = Set(du, len);
42
262
    const auto fence = Iota(du, last_full);
43
262
    const auto take = Lt(fence, stop);
44
262
    max = Max(max, IfThenElseZero(take, LoadU(du, data + last_full)));
45
262
  }
46
1.57k
  return GetLane(MaxOfLanes(du, max));
47
1.57k
}
Unexecuted instantiation: jxl::N_SSE4::MaxValue(unsigned int*, unsigned long)
jxl::N_AVX2::MaxValue(unsigned int*, unsigned long)
Line
Count
Source
33
1.57k
uint32_t MaxValue(uint32_t* JXL_RESTRICT data, size_t len) {
34
1.57k
  HWY_FULL(uint32_t) du;
35
1.57k
  size_t last_full = Lanes(du) * (len / Lanes(du));
36
1.57k
  auto max = Set(du, 0);
37
2.09k
  for (size_t i = 0; i < last_full; i += Lanes(du)) {
38
524
    max = Max(max, LoadU(du, data + i));
39
524
  }
40
1.57k
  if (last_full < len) {
41
262
    const auto stop = Set(du, len);
42
262
    const auto fence = Iota(du, last_full);
43
262
    const auto take = Lt(fence, stop);
44
262
    max = Max(max, IfThenElseZero(take, LoadU(du, data + last_full)));
45
262
  }
46
1.57k
  return GetLane(MaxOfLanes(du, max));
47
1.57k
}
Unexecuted instantiation: jxl::N_SSE2::MaxValue(unsigned int*, unsigned long)
48
49
// NOLINTNEXTLINE(google-readability-namespace-comments)
50
}  // namespace HWY_NAMESPACE
51
}  // namespace jxl
52
HWY_AFTER_NAMESPACE();
53
54
#if HWY_ONCE
55
namespace jxl {
56
57
HWY_EXPORT(MaxVectorSize);
58
HWY_EXPORT(MaxValue);
59
60
34.0M
size_t MaxVectorSize() {
61
  // Ideally HWY framework should provide us this value.
62
  // Less than ideal is to check all available targets and choose maximal.
63
  // As for now, we just ask current active target, assuming it won't change.
64
34.0M
  return HWY_DYNAMIC_DISPATCH(MaxVectorSize)();
65
34.0M
}
66
67
1.57k
uint32_t MaxValue(uint32_t* JXL_RESTRICT data, size_t len) {
68
1.57k
  return HWY_DYNAMIC_DISPATCH(MaxValue)(data, len);
69
1.57k
}
70
71
}  // namespace jxl
72
#endif