GCC Code Coverage Report


Directory: avs_core/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 14.2% 990 / 0 / 6956
Functions: 18.9% 31 / 0 / 164
Branches: 7.1% 153 / 0 / 2170

convert/intel/convert_bits_avx2.cpp
Line Branch Exec Source
1 // Avisynth v2.5. Copyright 2002-2009 Ben Rudiak-Gould et al.
2 // http://avisynth.nl
3
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
17 // http://www.gnu.org/copyleft/gpl.html .
18 //
19 // Linking Avisynth statically or dynamically with other modules is making a
20 // combined work based on Avisynth. Thus, the terms and conditions of the GNU
21 // General Public License cover the whole combination.
22 //
23 // As a special exception, the copyright holders of Avisynth give you
24 // permission to link Avisynth with independent modules that communicate with
25 // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
26 // terms of these independent modules, and to copy and distribute the
27 // resulting combined work under terms of your choice, provided that
28 // every copy of the combined work is accompanied by a complete copy of
29 // the source code of Avisynth (the version of Avisynth used to produce the
30 // combined work), being distributed under the terms of the GNU General
31 // Public License plus this exception. An independent module is a module
32 // which is not derived from or based on Avisynth, such as 3rd-party filters,
33 // import and export plugins, or graphical user interfaces.
34
35
36 #include <avs/alignment.h>
37 #include <avs/minmax.h>
38
39 #ifdef _MSC_VER
40 #include <intrin.h>
41 #else
42 #include <x86intrin.h>
43 #endif
44 #include <immintrin.h>
45
46 #ifndef _mm256_set_m128i
47 #define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1)
48 #endif
49
50 #ifndef _mm256_set_m128
51 #define _mm256_set_m128(v0, v1) _mm256_insertf128_ps(_mm256_castps128_ps256(v1), (v0), 1)
52 #endif
53
54 #include "convert_bits_avx2.h"
55 #include "../convert_bits.h"
56 #include "../convert_helper.h"
57
58 #ifdef _MSC_VER
59 #pragma warning(push)
60 #pragma warning(disable: 4305)
61 #endif
62
63 template<typename pixel_t, bool chroma, bool fulls, bool fulld>
64 5116 void convert_32_to_uintN_avx2(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
65 {
66 5116 const float* srcp0 = reinterpret_cast<const float*>(srcp);
67 5116 pixel_t* dstp0 = reinterpret_cast<pixel_t*>(dstp);
68
69 5116 src_pitch = src_pitch / sizeof(float);
70 5116 dst_pitch = dst_pitch / sizeof(pixel_t);
71
72 5116 const int src_width = src_rowsize / sizeof(float);
73
74 //-----------------------
75
7/32
void convert_32_to_uintN_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_32_to_uintN_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_32_to_uintN_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 5110 times.
void convert_32_to_uintN_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 24 not taken.
void convert_32_to_uintN_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
5116 bits_conv_constants d;
76 get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth);
77
78 5116 auto dst_offset_plus_round = d.dst_offset + 0.5f;
79 5116 constexpr auto dst_pixel_min = 0;
80 5116 const auto dst_pixel_max = (1 << target_bitdepth) - 1;
81
82 5116 auto src_offset_ps = _mm256_set1_ps(d.src_offset);
83 10232 auto factor_ps = _mm256_set1_ps(d.mul_factor);
84 5116 auto dst_offset_plus_round_ps = _mm256_set1_ps(dst_offset_plus_round);
85 5116 auto dst_pixel_min_ps = _mm256_set1_ps((float)dst_pixel_min);
86 5116 auto dst_pixel_max_ps = _mm256_set1_ps((float)dst_pixel_max);
87
88
14/32
void convert_32_to_uintN_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 100 → 65 not taken.
✗ Branch 100 → 101 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 100 → 65 taken 4 times.
✓ Branch 100 → 101 taken 1 time.
void convert_32_to_uintN_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 96 → 65 taken 5 times.
✓ Branch 96 → 97 taken 1 time.
void convert_32_to_uintN_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 96 → 65 not taken.
✗ Branch 96 → 97 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 96 → 65 taken 5 times.
✓ Branch 96 → 97 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 92 → 65 taken 4 times.
✓ Branch 92 → 93 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 92 → 65 taken 5110 times.
✓ Branch 92 → 93 taken 5110 times.
void convert_32_to_uintN_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 92 → 65 not taken.
✗ Branch 92 → 93 not taken.
void convert_32_to_uintN_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 92 → 65 taken 5 times.
✓ Branch 92 → 93 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 92 → 65 taken 5 times.
✓ Branch 92 → 93 taken 1 time.
void convert_32_to_uintN_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 92 → 65 not taken.
✗ Branch 92 → 93 not taken.
10254 for (int y = 0; y < src_height; y++)
89 {
90
14/32
void convert_32_to_uintN_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 98 → 66 not taken.
✗ Branch 98 → 99 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 98 → 66 taken 8 times.
✓ Branch 98 → 99 taken 4 times.
void convert_32_to_uintN_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 94 → 66 taken 5 times.
✓ Branch 94 → 95 taken 5 times.
void convert_32_to_uintN_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 94 → 66 not taken.
✗ Branch 94 → 95 not taken.
void convert_32_to_uintN_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 94 → 66 taken 5 times.
✓ Branch 94 → 95 taken 5 times.
void convert_32_to_uintN_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 90 → 66 taken 8 times.
✓ Branch 90 → 91 taken 4 times.
void convert_32_to_uintN_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 90 → 66 taken 5110 times.
✓ Branch 90 → 91 taken 5110 times.
void convert_32_to_uintN_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 90 → 66 not taken.
✗ Branch 90 → 91 not taken.
void convert_32_to_uintN_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 90 → 66 taken 5 times.
✓ Branch 90 → 91 taken 5 times.
void convert_32_to_uintN_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 90 → 66 taken 5 times.
✓ Branch 90 → 91 taken 5 times.
void convert_32_to_uintN_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 90 → 66 not taken.
✗ Branch 90 → 91 not taken.
10284 for (int x = 0; x < src_width; x += 16) // 16 pixels at a time (64 byte - alignment is OK)
91 {
92 __m256i result;
93 __m256i result_0, result_1;
94 5146 __m256 src_0 = _mm256_load_ps(reinterpret_cast<const float*>(srcp0 + x));
95 10292 __m256 src_1 = _mm256_load_ps(reinterpret_cast<const float*>(srcp0 + x + 8));
96 if constexpr (!chroma && !fulls) {
97 // when offset is different from 0
98 13 src_0 = _mm256_sub_ps(src_0, src_offset_ps);
99 13 src_1 = _mm256_sub_ps(src_1, src_offset_ps);
100 }
101
102 5146 src_0 = _mm256_fmadd_ps(src_0, factor_ps, dst_offset_plus_round_ps);
103 5146 src_1 = _mm256_fmadd_ps(src_1, factor_ps, dst_offset_plus_round_ps);
104
105 10292 src_0 = _mm256_max_ps(_mm256_min_ps(src_0, dst_pixel_max_ps), dst_pixel_min_ps);
106 10292 src_1 = _mm256_max_ps(_mm256_min_ps(src_1, dst_pixel_max_ps), dst_pixel_min_ps);
107 5146 result_0 = _mm256_cvttps_epi32(src_0); // truncate
108 5146 result_1 = _mm256_cvttps_epi32(src_1);
109 if constexpr (sizeof(pixel_t) == 2) {
110 5133 result = _mm256_packus_epi32(result_0, result_1);
111 5133 result = _mm256_permute4x64_epi64(result, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6));
112 5133 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result);
113 }
114 else {
115 13 result = _mm256_packs_epi32(result_0, result_1);
116 13 result = _mm256_permute4x64_epi64(result, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6));
117 13 __m128i result128_lo = _mm256_castsi256_si128(result);
118 13 __m128i result128_hi = _mm256_extractf128_si256(result, 1);
119 13 __m128i result128 = _mm_packus_epi16(result128_lo, result128_hi);
120 13 _mm_store_si128(reinterpret_cast<__m128i*>(dstp0 + x), result128);
121 }
122
123 // c:
124 //const int pixel = (int)((srcp0[x] - src_offset) * mul_factor + dst_offset_plus_round);
125 //dstp0[x] = pixel_t(clamp(pixel, dst_pixel_min, dst_pixel_max));
126 }
127 5138 dstp0 += dst_pitch;
128 5138 srcp0 += src_pitch;
129 }
130 5116 }
131
132 #ifdef _MSC_VER
133 #pragma warning(pop)
134 #endif
135
136 #define convert_32_to_uintN_avx2_functions(type) \
137 template void convert_32_to_uintN_avx2<type, false, true, true>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
138 template void convert_32_to_uintN_avx2<type, true, true, true>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
139 template void convert_32_to_uintN_avx2<type, false, true, false>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
140 template void convert_32_to_uintN_avx2<type, true, true, false>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
141 template void convert_32_to_uintN_avx2<type, false, false, true>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
142 template void convert_32_to_uintN_avx2<type, true, false, true>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
143 template void convert_32_to_uintN_avx2<type, false, false, false>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
144 template void convert_32_to_uintN_avx2<type, true, false, false>(const BYTE *srcp, BYTE *dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
145
146 convert_32_to_uintN_avx2_functions(uint8_t)
147 convert_32_to_uintN_avx2_functions(uint16_t)
148
149 #undef convert_32_to_uintN_avx2_functions
150
151 /*
152 3.7.1 test26: stop using manual _mm256_zeroupper()
153 This warning is left in Avisynth at one single place.
154 1.) compilers do it automatically
155 2.) clang is getting mad and produces suboptimal prologue and epilogue, saving and loading all xmm registers!
156 ** Good (no manual zeroupper) **
157 push rsi
158 .seh_pushreg rsi
159 push rdi
160 .seh_pushreg rdi
161 .seh_endprologue
162 [...]
163 pop rdi
164 pop rsi
165 vzeroupper
166 ret
167
168 ** Bad, manual _mm256_zeroupper() **
169
170 vmovaps xmmword ptr [rsp + 144], xmm15 # 16-byte Spill
171 .seh_savexmm xmm15, 144
172 vmovaps xmmword ptr [rsp + 128], xmm14 # 16-byte Spill
173 .seh_savexmm xmm14, 128
174 vmovaps xmmword ptr [rsp + 112], xmm13 # 16-byte Spill
175 .seh_savexmm xmm13, 112
176 vmovaps xmmword ptr [rsp + 96], xmm12 # 16-byte Spill
177 .seh_savexmm xmm12, 96
178 vmovaps xmmword ptr [rsp + 80], xmm11 # 16-byte Spill
179 .seh_savexmm xmm11, 80
180 vmovaps xmmword ptr [rsp + 64], xmm10 # 16-byte Spill
181 .seh_savexmm xmm10, 64
182 vmovaps xmmword ptr [rsp + 48], xmm9 # 16-byte Spill
183 .seh_savexmm xmm9, 48
184 vmovaps xmmword ptr [rsp + 32], xmm8 # 16-byte Spill
185 .seh_savexmm xmm8, 32
186 vmovaps xmmword ptr [rsp + 16], xmm7 # 16-byte Spill
187 .seh_savexmm xmm7, 16
188 vmovaps xmmword ptr [rsp], xmm6 # 16-byte Spill
189 .seh_savexmm xmm6, 0
190 .seh_endprologue
191 [...]
192 pop rdi
193 pop rsi
194 vzeroupper
195 vmovaps xmm6, xmmword ptr [rsp] # 16-byte Reload
196 vmovaps xmm7, xmmword ptr [rsp + 16] # 16-byte Reload
197 vmovaps xmm8, xmmword ptr [rsp + 32] # 16-byte Reload
198 vmovaps xmm9, xmmword ptr [rsp + 48] # 16-byte Reload
199 vmovaps xmm10, xmmword ptr [rsp + 64] # 16-byte Reload
200 vmovaps xmm11, xmmword ptr [rsp + 80] # 16-byte Reload
201 vmovaps xmm12, xmmword ptr [rsp + 96] # 16-byte Reload
202 vmovaps xmm13, xmmword ptr [rsp + 112] # 16-byte Reload
203 vmovaps xmm14, xmmword ptr [rsp + 128] # 16-byte Reload
204 vmovaps xmm15, xmmword ptr [rsp + 144] # 16-byte Reload
205 ret
206 */
207
208 // YUV: bit shift 8-16 <=> 8-16 bits
209 // shift right or left, depending on expandrange
210 template<typename pixel_t_s, typename pixel_t_d>
211 2 static void convert_uint_limited_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
212 {
213 2 const pixel_t_s* srcp0 = reinterpret_cast<const pixel_t_s*>(srcp);
214 2 pixel_t_d* dstp0 = reinterpret_cast<pixel_t_d*>(dstp);
215
216 2 src_pitch = src_pitch / sizeof(pixel_t_s);
217 2 dst_pitch = dst_pitch / sizeof(pixel_t_d);
218
219 2 const int src_width = src_rowsize / sizeof(pixel_t_s);
220
221
2/8
void convert_uint_limited_avx2<unsigned char, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 23 not taken.
void convert_uint_limited_avx2<unsigned char, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 25 not taken.
void convert_uint_limited_avx2<unsigned short, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 19 taken 1 time.
void convert_uint_limited_avx2<unsigned short, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 21 not taken.
2 if (target_bitdepth > source_bitdepth) // expandrange. pixel_t_d is always uint16_t
222 {
223 1 const int shift_bits = target_bitdepth - source_bitdepth;
224 1 __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits);
225
2/8
void convert_uint_limited_avx2<unsigned char, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 6 not taken.
✗ Branch 22 → 35 not taken.
void convert_uint_limited_avx2<unsigned char, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 24 → 6 taken 5 times.
✓ Branch 24 → 37 taken 1 time.
void convert_uint_limited_avx2<unsigned short, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 18 → 6 not taken.
✗ Branch 18 → 46 not taken.
void convert_uint_limited_avx2<unsigned short, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 6 not taken.
✗ Branch 20 → 47 not taken.
6 for (int y = 0; y < src_height; y++)
226 {
227
2/8
void convert_uint_limited_avx2<unsigned char, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 7 not taken.
✗ Branch 20 → 21 not taken.
void convert_uint_limited_avx2<unsigned char, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 22 → 7 taken 5 times.
✓ Branch 22 → 23 taken 5 times.
void convert_uint_limited_avx2<unsigned short, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 7 not taken.
✗ Branch 16 → 17 not taken.
void convert_uint_limited_avx2<unsigned short, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 18 → 7 not taken.
✗ Branch 18 → 19 not taken.
10 for (int x = 0; x < src_width; x += 32)
228 {
229 __m256i src_lo, src_hi;
230 if constexpr (sizeof(pixel_t_s) == 1) {
231 5 auto src_lo_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x)); // 16* uint8
232 10 auto src_hi_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x + 16)); // 16* uint8
233 5 src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16
234 5 src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16
235 }
236 else {
237 // 64 bytes per cycle. Ok in avs+
238 src_lo = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x)); // 16* uint_16
239 src_hi = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x + 16)); // 16* uint_16
240 }
241 5 src_lo = _mm256_sll_epi16(src_lo, shift);
242 5 src_hi = _mm256_sll_epi16(src_hi, shift);
243 if constexpr (sizeof(pixel_t_d) == 1) {
244 // upconvert always to 2 bytes
245 assert(0);
246 }
247 else {
248 5 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), src_lo);
249 5 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), src_hi);
250 }
251 }
252 5 dstp0 += dst_pitch;
253 5 srcp0 += src_pitch;
254 }
255 }
256 else
257 {
258 // reduce range
259 1 const int shift_bits = source_bitdepth - target_bitdepth;
260 1 const int round = 1 << (shift_bits - 1);
261 1 __m128i shift = _mm_set_epi32(0, 0, 0, shift_bits);
262 1 const auto round_simd = _mm256_set1_epi16(round);
263
264
2/8
void convert_uint_limited_avx2<unsigned char, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 34 → 30 not taken.
✗ Branch 34 → 35 not taken.
void convert_uint_limited_avx2<unsigned char, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 36 → 32 not taken.
✗ Branch 36 → 37 not taken.
void convert_uint_limited_avx2<unsigned short, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 45 → 26 taken 5 times.
✓ Branch 45 → 46 taken 1 time.
void convert_uint_limited_avx2<unsigned short, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 46 → 28 not taken.
✗ Branch 46 → 47 not taken.
6 for (int y = 0; y < src_height; y++)
265 {
266
2/8
void convert_uint_limited_avx2<unsigned char, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 32 → 31 not taken.
✗ Branch 32 → 33 not taken.
void convert_uint_limited_avx2<unsigned char, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 34 → 33 not taken.
✗ Branch 34 → 35 not taken.
void convert_uint_limited_avx2<unsigned short, unsigned char>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 43 → 27 taken 5 times.
✓ Branch 43 → 44 taken 5 times.
void convert_uint_limited_avx2<unsigned short, unsigned short>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 44 → 29 not taken.
✗ Branch 44 → 45 not taken.
10 for (int x = 0; x < src_width; x += 32)
267 {
268 if constexpr (sizeof(pixel_t_s) == 1)
269 assert(0);
270 // downconvert always from 2 bytes
271 // 64 bytes per cycle. Ok in avs+
272 5 auto src_lo = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x)); // 16* uint_16
273 10 auto src_hi = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x + 16)); // 16* uint_16
274 10 src_lo = _mm256_srl_epi16(_mm256_adds_epu16(src_lo, round_simd), shift);
275 10 src_hi = _mm256_srl_epi16(_mm256_adds_epu16(src_hi, round_simd), shift);
276 if constexpr (sizeof(pixel_t_d) == 1) {
277 // to 8 bits
278 5 auto dst = _mm256_packus_epi16(src_lo, src_hi);
279 5 dst = _mm256_permute4x64_epi64(dst, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6));
280 5 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), dst);
281 }
282 else {
283 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), src_lo);
284 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), src_hi);
285 }
286 }
287 5 dstp0 += dst_pitch;
288 5 srcp0 += src_pitch;
289 }
290 }
291 2 }
292
293 template<typename pixel_t_s, typename pixel_t_d, bool chroma, bool fulls, bool fulld>
294 15 void convert_uint_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
295 {
296 // limited to limited is bitshift, see in other function
297 if constexpr (!fulls && !fulld) {
298 2 convert_uint_limited_avx2<pixel_t_s, pixel_t_d>(srcp, dstp, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth);
299 2 return;
300 }
301
302 13 const pixel_t_s* srcp0 = reinterpret_cast<const pixel_t_s*>(srcp);
303 13 pixel_t_d* dstp0 = reinterpret_cast<pixel_t_d*>(dstp);
304
305 13 src_pitch = src_pitch / sizeof(pixel_t_s);
306 13 dst_pitch = dst_pitch / sizeof(pixel_t_d);
307
308 13 const int src_width = src_rowsize / sizeof(pixel_t_s);
309 13 const int wmod32 = (src_width / 32) * 32;
310
311 if constexpr (sizeof(pixel_t_s) == 1 && sizeof(pixel_t_d) == 2) {
312
2/4
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 32 not taken.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 32 not taken.
2 if (fulls && fulld && !chroma && source_bitdepth == 8 && target_bitdepth == 16) {
313 // special case 8->16 bit full scale: * 65535 / 255 = *257
314 2 __m256i multiplier = _mm256_set1_epi16(257);
315
316
2/2
✓ Branch 30 → 9 taken 6 times.
✓ Branch 30 → 31 taken 2 times.
8 for (int y = 0; y < src_height; y++)
317 {
318
2/2
✓ Branch 25 → 10 taken 6 times.
✓ Branch 25 → 26 taken 6 times.
12 for (int x = 0; x < src_width; x += 32)
319 {
320 6 auto src_lo_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x)); // 16* uint8
321 12 auto src_hi_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x + 16)); // 16* uint8
322 6 auto src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16
323 6 auto src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16
324
325 // *257 mullo is faster than x*257 = (x<<8 + x) add/or solution (i7)
326 6 auto res_lo = _mm256_mullo_epi16(src_lo, multiplier); // lower 16 bit of multiplication is enough
327 6 auto res_hi = _mm256_mullo_epi16(src_hi, multiplier);
328 // dstp[x] = srcp0[x] * 257; // RGB: full range 0..255 <-> 0..65535 (257 = 65535 / 255)
329 6 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), res_lo);
330 6 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), res_hi);
331 } // for x
332 // rest
333
2/2
✓ Branch 28 → 27 taken 16 times.
✓ Branch 28 → 29 taken 6 times.
22 for (int x = wmod32; x < src_width; x++)
334 {
335 16 dstp0[x] = (pixel_t_d)(srcp0[x] * 257);
336 }
337 6 dstp0 += dst_pitch;
338 6 srcp0 += src_pitch;
339 } // for y
340 2 return;
341 }
342 }
343
344 11 const int target_max = (1 << target_bitdepth) - 1;
345
346
6/48
void convert_uint_avx2<unsigned char, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 25 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 25 taken 4 times.
void convert_uint_avx2<unsigned char, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 54 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 25 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 25 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 25 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 2 times.
void convert_uint_avx2<unsigned short, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_uint_avx2<unsigned short, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 24 not taken.
void convert_uint_avx2<unsigned short, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
11 bits_conv_constants d;
347 get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth);
348
349 11 auto vect_mul_factor = _mm256_set1_ps(d.mul_factor);
350 11 auto vect_src_offset = _mm256_set1_epi32(d.src_offset_i);
351 11 auto dst_offset_plus_round = d.dst_offset + 0.5f;
352 11 auto vect_dst_offset_plus_round = _mm256_set1_ps(dst_offset_plus_round);
353
354 22 auto vect_target_max = _mm256_set1_epi16(target_max);
355
356 11 auto zero = _mm256_setzero_si256();
357
358
12/48
void convert_uint_avx2<unsigned char, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 67 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 130 → 67 not taken.
✗ Branch 130 → 131 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 130 → 67 not taken.
✗ Branch 130 → 131 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 67 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 138 → 67 taken 5 times.
✓ Branch 138 → 139 taken 1 time.
void convert_uint_avx2<unsigned char, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 67 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 68 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 130 → 68 taken 12 times.
✓ Branch 130 → 131 taken 4 times.
void convert_uint_avx2<unsigned char, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 159 → 97 not taken.
✗ Branch 159 → 160 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 68 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 68 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 138 → 68 not taken.
✗ Branch 138 → 139 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 134 → 67 taken 10 times.
✓ Branch 134 → 135 taken 2 times.
void convert_uint_avx2<unsigned short, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 126 → 67 not taken.
✗ Branch 126 → 127 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 126 → 67 taken 1 time.
✓ Branch 126 → 127 taken 1 time.
void convert_uint_avx2<unsigned short, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 134 → 67 not taken.
✗ Branch 134 → 135 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 134 → 67 not taken.
✗ Branch 134 → 135 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 134 → 67 not taken.
✗ Branch 134 → 135 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 67 not taken.
✗ Branch 133 → 134 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 125 → 67 not taken.
✗ Branch 125 → 126 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 125 → 67 not taken.
✗ Branch 125 → 126 not taken.
void convert_uint_avx2<unsigned short, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 133 → 67 taken 5 times.
✓ Branch 133 → 134 taken 1 time.
void convert_uint_avx2<unsigned short, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 133 → 67 taken 10 times.
✓ Branch 133 → 134 taken 2 times.
void convert_uint_avx2<unsigned short, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 67 not taken.
✗ Branch 133 → 134 not taken.
54 for (int y = 0; y < src_height; y++)
359 {
360
12/48
void convert_uint_avx2<unsigned char, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 68 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 128 → 68 not taken.
✗ Branch 128 → 129 not taken.
void convert_uint_avx2<unsigned char, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 128 → 68 not taken.
✗ Branch 128 → 129 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 68 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 136 → 68 taken 5 times.
✓ Branch 136 → 137 taken 5 times.
void convert_uint_avx2<unsigned char, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 68 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 69 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 128 → 69 taken 12 times.
✓ Branch 128 → 129 taken 12 times.
void convert_uint_avx2<unsigned char, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 157 → 98 not taken.
✗ Branch 157 → 158 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 69 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 69 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned char, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 136 → 69 not taken.
✗ Branch 136 → 137 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 132 → 68 taken 10 times.
✓ Branch 132 → 133 taken 10 times.
void convert_uint_avx2<unsigned short, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 124 → 68 not taken.
✗ Branch 124 → 125 not taken.
void convert_uint_avx2<unsigned short, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 124 → 68 taken 1 time.
✓ Branch 124 → 125 taken 1 time.
void convert_uint_avx2<unsigned short, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 132 → 68 not taken.
✗ Branch 132 → 133 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 132 → 68 not taken.
✗ Branch 132 → 133 not taken.
void convert_uint_avx2<unsigned short, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 132 → 68 not taken.
✗ Branch 132 → 133 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 131 → 68 not taken.
✗ Branch 131 → 132 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 123 → 68 not taken.
✗ Branch 123 → 124 not taken.
void convert_uint_avx2<unsigned short, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 123 → 68 not taken.
✗ Branch 123 → 124 not taken.
void convert_uint_avx2<unsigned short, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 131 → 68 taken 5 times.
✓ Branch 131 → 132 taken 5 times.
void convert_uint_avx2<unsigned short, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 131 → 68 taken 10 times.
✓ Branch 131 → 132 taken 10 times.
void convert_uint_avx2<unsigned short, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 131 → 68 not taken.
✗ Branch 131 → 132 not taken.
86 for (int x = 0; x < src_width; x += 32)
361 {
362 __m256i src_lo, src_hi;
363 if constexpr (sizeof(pixel_t_s) == 1) {
364 17 auto src_lo_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x)); // 16* uint8
365 34 auto src_hi_128 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x + 16)); // 16* uint8
366 17 src_lo = _mm256_cvtepu8_epi16(src_lo_128); // 16* uint16
367 17 src_hi = _mm256_cvtepu8_epi16(src_hi_128); // 16* uint16
368 }
369 else {
370 // 64 bytes per cycle. Ok in avs+
371 26 src_lo = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x)); // 8* uint_16
372 52 src_hi = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x + 16)); // 8* uint_16
373 }
374
375 __m256i result1, result2;
376 {
377 // src: 8*uint16
378 // convert to int32, bias, to float
379 43 auto res_lo_i = _mm256_unpacklo_epi16(src_lo, zero);
380 43 auto res_hi_i = _mm256_unpackhi_epi16(src_lo, zero);
381 if constexpr (chroma || !fulls) {
382 // src_offset is not zero
383 30 res_lo_i = _mm256_sub_epi32(res_lo_i, vect_src_offset);
384 30 res_hi_i = _mm256_sub_epi32(res_hi_i, vect_src_offset);
385 }
386 43 auto res_lo = _mm256_cvtepi32_ps(res_lo_i);
387 43 auto res_hi = _mm256_cvtepi32_ps(res_hi_i);
388 // multiply, bias back+round
389 // avx2 mode: smart fma instruction inserted even from msvc!
390 86 res_lo = _mm256_add_ps(_mm256_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round);
391 86 res_hi = _mm256_add_ps(_mm256_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round);
392 // convert back w/ truncate
393 43 auto result_l = _mm256_cvttps_epi32(res_lo); // no banker's rounding
394 43 auto result_h = _mm256_cvttps_epi32(res_hi);
395 // 0 min is ensured by packus
396 // back to 16 bit
397 43 result1 = _mm256_packus_epi32(result_l, result_h); // 8 * 16 bit pixels
398 43 result1 = _mm256_min_epu16(result1, vect_target_max);
399 }
400
401 // byte target: not yet
402 if constexpr (sizeof(pixel_t_d) == 2)
403 27 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result1);
404
405 {
406 // src: 8*uint16
407 // convert to int32, bias, to float
408 43 auto res_lo_i = _mm256_unpacklo_epi16(src_hi, zero);
409 43 auto res_hi_i = _mm256_unpackhi_epi16(src_hi, zero);
410 if constexpr (chroma || !fulls) {
411 // src_offset is not zero
412 30 res_lo_i = _mm256_sub_epi32(res_lo_i, vect_src_offset);
413 30 res_hi_i = _mm256_sub_epi32(res_hi_i, vect_src_offset);
414 }
415 43 auto res_lo = _mm256_cvtepi32_ps(res_lo_i);
416 43 auto res_hi = _mm256_cvtepi32_ps(res_hi_i);
417 // multiply, bias back+round
418 86 res_lo = _mm256_add_ps(_mm256_mul_ps(res_lo, vect_mul_factor), vect_dst_offset_plus_round);
419 86 res_hi = _mm256_add_ps(_mm256_mul_ps(res_hi, vect_mul_factor), vect_dst_offset_plus_round);
420 // convert back w/ truncate
421 43 auto result_l = _mm256_cvttps_epi32(res_lo);
422 43 auto result_h = _mm256_cvttps_epi32(res_hi);
423 // 0 min is ensured by packus
424 // back to 16 bit
425 43 result2 = _mm256_packus_epi32(result_l, result_h); // 8 * 16 bit pixels
426 43 result2 = _mm256_min_epu16(result2, vect_target_max);
427 }
428
429 if constexpr (sizeof(pixel_t_d) == 2)
430 27 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x + 16), result2);
431 else {
432 // byte target: store both
433 16 auto result12 = _mm256_packus_epi16(result1, result2);
434 16 result12 = _mm256_permute4x64_epi64(result12, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6));
435 16 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp0 + x), result12);
436 }
437 } // for x
438
439 43 dstp0 += dst_pitch;
440 43 srcp0 += src_pitch;
441 }
442 7 }
443
444 // instantiate them all
445 // template<typename pixel_t_s, typename pixel_t_d, bool chroma, bool fulls, bool fulld>
446 // spec: fulld=false, fulls=false
447 #define convert_uint_avx2_functions(uint_X_t, uint_X_dest_t) \
448 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, false, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
449 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, false, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
450 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, false, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
451 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, false, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
452 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, true, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
453 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, true, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
454 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, true, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
455 template void convert_uint_avx2<uint_X_t, uint_X_dest_t, true, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
456
457 convert_uint_avx2_functions(uint8_t, uint8_t)
458 convert_uint_avx2_functions(uint8_t, uint16_t)
459 convert_uint_avx2_functions(uint16_t, uint8_t)
460 convert_uint_avx2_functions(uint16_t, uint16_t)
461
462 #undef convert_uint_avx2_functions
463
464 template<typename pixel_t_s, typename pixel_t_d, bool chroma, bool fulls, bool fulld, bool TEMPLATE_NEED_BACKSCALE, bool TEMPLATE_LOW_DITHER_BITDEPTH>
465 5 static void do_convert_ordered_dither_uint_avx2(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
466 {
467 5 const pixel_t_s* srcp = reinterpret_cast<const pixel_t_s*>(srcp8);
468 5 pixel_t_d* dstp = reinterpret_cast<pixel_t_d*>(dstp8);
469 5 dst_pitch = dst_pitch / sizeof(pixel_t_d);
470
471 5 src_pitch = src_pitch / sizeof(pixel_t_s);
472 // we can safely process whole 16 (8 bit src) / 32 byte (16 bit source) chunks, Avisynth ensures at least 32 byte alignment
473 5 const int src_width = (src_rowsize / sizeof(pixel_t_s) + 15) & ~15;
474
475 // helps compiler optimization
476 if constexpr (sizeof(pixel_t_s) == 1)
477 1 source_bitdepth = 8;
478 if constexpr (sizeof(pixel_t_d) == 1) {
479 3 target_bitdepth = 8;
480 if (!TEMPLATE_NEED_BACKSCALE) {
481 2 dither_target_bitdepth = 8;
482 }
483 }
484
485 5 const int max_pixel_value_target = (1 << target_bitdepth) - 1;
486 5 const int max_pixel_value_dithered = (1 << dither_target_bitdepth) - 1;
487 // precheck ensures:
488 // target_bitdepth >= dither_target_bitdepth
489 // source_bitdepth - dither_target_bitdepth <= 8 (max precalculated table is 16x16)
490 5 const bool odd_diff = (source_bitdepth - dither_target_bitdepth) & 1;
491 5 const int dither_bit_diff = (source_bitdepth - dither_target_bitdepth);
492 5 const int dither_order = (dither_bit_diff + 1) / 2;
493 5 const int dither_mask = (1 << dither_order) - 1; // 9,10=2 11,12=4 13,14=8 15,16=16
494 // 10->8: 0x01 (2x2)
495 // 11->8: 0x03 (4x4)
496 // 12->8: 0x03 (4x4)
497 // 14->8: 0x07 (8x8)
498 // 16->8: 0x0F (16x16)
499 const BYTE* matrix;
500
5/360
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 8 taken 1 time.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 7 taken 1 time.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 3 → 12 not taken.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 20 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✓ Branch 2 → 15 taken 1 time.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✓ Branch 2 → 11 taken 1 time.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 11 not taken.
✗ Branch 2 → 15 not taken.
✗ Branch 2 → 19 not taken.
5 switch (dither_order) {
501
1/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
1 case 1: matrix = reinterpret_cast<const BYTE*>(odd_diff ? dither2x2a_data_sse2 : dither2x2_data_sse2); break;
502
2/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
2 case 2: matrix = reinterpret_cast<const BYTE*>(odd_diff ? dither4x4a_data_sse2 : dither4x4_data_sse2); break;
503
1/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
1 case 3: matrix = reinterpret_cast<const BYTE*>(odd_diff ? dither8x8a_data_sse2 : dither8x8_data_sse2); break;
504
1/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
1 case 4: matrix = reinterpret_cast<const BYTE*>(odd_diff ? dither16x16a_data : dither16x16_data); break; // no spec sse, already 16 bytes long
505 default: return; // n/a
506 }
507
508 5 const int bitdiff_between_dither_and_target = target_bitdepth - dither_target_bitdepth;
509
5/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
5 assert(TEMPLATE_NEED_BACKSCALE == (target_bitdepth != dither_target_bitdepth)); // dither to x, target to y
510
511
5/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
5 assert(TEMPLATE_LOW_DITHER_BITDEPTH == (dither_target_bitdepth < 8));
512 // e.g. instead of 0,1 => -0.5,+0.5; 0,1,2,3 => -1.5,-0.5,0.5,1.5
513 5 const float half_maxcorr_value = ((1 << dither_bit_diff) - 1) / 2.0f;
514
515 5 const int source_max = (1 << source_bitdepth) - 1;
516 //-----------------------
517 // When calculating src_pixel, src and dst are of the same bit depth
518
5/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 47 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 46 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 46 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 47 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 46 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 46 not taken.
5 bits_conv_constants d;
519 get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, source_bitdepth); // both is src_bitdepth
520
521 5 auto dst_offset_plus_round = d.dst_offset + 0.5f;
522 //constexpr auto src_pixel_min = 0;
523 5 const auto src_pixel_max = source_max;
524 5 const float mul_factor_backfromlowdither = (float)max_pixel_value_target / max_pixel_value_dithered;
525 //-----------------------
526
527 10 const auto mul_factor_simd = _mm256_set1_ps(d.mul_factor);
528 5 const auto mul_factor_backfromlowdither_simd = _mm256_set1_ps(mul_factor_backfromlowdither);
529 5 const auto half_maxcorr_value_simd = _mm256_set1_ps(half_maxcorr_value);
530 5 const auto zero = _mm256_setzero_si256();
531 5 const BYTE* matrix_simd16 = matrix;
532 const BYTE* current_matrix_line;
533
534
10/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 106 → 85 not taken.
✗ Branch 106 → 107 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 116 → 86 not taken.
✗ Branch 116 → 117 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 171 → 86 not taken.
✗ Branch 171 → 172 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 142 → 85 not taken.
✗ Branch 142 → 143 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 152 → 86 not taken.
✗ Branch 152 → 153 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 201 → 86 not taken.
✗ Branch 201 → 202 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 142 → 85 not taken.
✗ Branch 142 → 143 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 152 → 86 not taken.
✗ Branch 152 → 153 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 201 → 86 not taken.
✗ Branch 201 → 202 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 106 → 85 not taken.
✗ Branch 106 → 107 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 116 → 86 not taken.
✗ Branch 116 → 117 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 171 → 86 taken 5 times.
✓ Branch 171 → 172 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 106 → 85 not taken.
✗ Branch 106 → 107 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 116 → 86 not taken.
✗ Branch 116 → 117 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 171 → 86 not taken.
✗ Branch 171 → 172 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 142 → 85 not taken.
✗ Branch 142 → 143 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 152 → 86 not taken.
✗ Branch 152 → 153 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 201 → 86 not taken.
✗ Branch 201 → 202 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 142 → 85 not taken.
✗ Branch 142 → 143 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 152 → 86 not taken.
✗ Branch 152 → 153 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 201 → 86 not taken.
✗ Branch 201 → 202 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 106 → 85 not taken.
✗ Branch 106 → 107 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 116 → 86 not taken.
✗ Branch 116 → 117 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 171 → 86 not taken.
✗ Branch 171 → 172 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 119 → 85 taken 7 times.
✓ Branch 119 → 120 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 129 → 86 not taken.
✗ Branch 129 → 130 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 86 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 85 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 159 → 86 not taken.
✗ Branch 159 → 160 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 86 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 85 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 159 → 86 not taken.
✗ Branch 159 → 160 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 86 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 119 → 85 taken 5 times.
✓ Branch 119 → 120 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 129 → 86 not taken.
✗ Branch 129 → 130 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 86 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 85 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 129 → 86 not taken.
✗ Branch 129 → 130 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 86 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 85 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 159 → 86 not taken.
✗ Branch 159 → 160 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 86 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 85 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 159 → 86 not taken.
✗ Branch 159 → 160 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 86 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 85 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 129 → 86 not taken.
✗ Branch 129 → 130 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 86 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 121 → 85 not taken.
✗ Branch 121 → 122 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 130 → 85 not taken.
✗ Branch 130 → 131 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 170 → 85 not taken.
✗ Branch 170 → 171 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 151 → 85 not taken.
✗ Branch 151 → 152 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 160 → 85 not taken.
✗ Branch 160 → 161 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 200 → 85 not taken.
✗ Branch 200 → 201 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 151 → 85 not taken.
✗ Branch 151 → 152 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 160 → 85 not taken.
✗ Branch 160 → 161 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 200 → 85 not taken.
✗ Branch 200 → 201 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 121 → 85 not taken.
✗ Branch 121 → 122 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 130 → 85 taken 17 times.
✓ Branch 130 → 131 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 170 → 85 not taken.
✗ Branch 170 → 171 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 121 → 85 not taken.
✗ Branch 121 → 122 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 130 → 85 not taken.
✗ Branch 130 → 131 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 170 → 85 not taken.
✗ Branch 170 → 171 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 151 → 85 not taken.
✗ Branch 151 → 152 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 160 → 85 not taken.
✗ Branch 160 → 161 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 200 → 85 not taken.
✗ Branch 200 → 201 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 151 → 85 taken 9 times.
✓ Branch 151 → 152 taken 1 time.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 160 → 85 not taken.
✗ Branch 160 → 161 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 200 → 85 not taken.
✗ Branch 200 → 201 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 121 → 85 not taken.
✗ Branch 121 → 122 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 130 → 85 not taken.
✗ Branch 130 → 131 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 170 → 85 not taken.
✗ Branch 170 → 171 not taken.
48 for (int y = 0; y < src_height; y++)
535 {
536 // int _y = (y & dither_mask) << dither_order; // for C version
537 43 current_matrix_line = matrix_simd16 + ((y & dither_mask) << 4); // always 16 byte boundary instead of dither order
538 // load and convert corr to 16 bit
539 43 __m256i corr = _mm256_cvtepu8_epi16(_mm_load_si128(reinterpret_cast<const __m128i*>(current_matrix_line))); // int corr = matrix[_y | (x & dither_mask)];
540
541
10/144
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 104 → 90 not taken.
✗ Branch 104 → 105 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 114 → 91 not taken.
✗ Branch 114 → 115 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 91 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 140 → 90 not taken.
✗ Branch 140 → 141 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 150 → 91 not taken.
✗ Branch 150 → 151 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 91 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 140 → 90 not taken.
✗ Branch 140 → 141 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 150 → 91 not taken.
✗ Branch 150 → 151 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 91 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 104 → 90 not taken.
✗ Branch 104 → 105 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 114 → 91 not taken.
✗ Branch 114 → 115 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 169 → 91 taken 10 times.
✓ Branch 169 → 170 taken 5 times.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 104 → 90 not taken.
✗ Branch 104 → 105 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 114 → 91 not taken.
✗ Branch 114 → 115 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 91 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 140 → 90 not taken.
✗ Branch 140 → 141 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 150 → 91 not taken.
✗ Branch 150 → 151 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 91 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 140 → 90 not taken.
✗ Branch 140 → 141 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 150 → 91 not taken.
✗ Branch 150 → 151 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 199 → 91 not taken.
✗ Branch 199 → 200 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 104 → 90 not taken.
✗ Branch 104 → 105 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 114 → 91 not taken.
✗ Branch 114 → 115 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 169 → 91 not taken.
✗ Branch 169 → 170 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 117 → 90 taken 14 times.
✓ Branch 117 → 118 taken 7 times.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 127 → 91 not taken.
✗ Branch 127 → 128 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 167 → 91 not taken.
✗ Branch 167 → 168 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 147 → 90 not taken.
✗ Branch 147 → 148 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 157 → 91 not taken.
✗ Branch 157 → 158 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 197 → 91 not taken.
✗ Branch 197 → 198 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 147 → 90 not taken.
✗ Branch 147 → 148 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 157 → 91 not taken.
✗ Branch 157 → 158 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 197 → 91 not taken.
✗ Branch 197 → 198 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 117 → 90 taken 10 times.
✓ Branch 117 → 118 taken 5 times.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 127 → 91 not taken.
✗ Branch 127 → 128 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 167 → 91 not taken.
✗ Branch 167 → 168 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 117 → 90 not taken.
✗ Branch 117 → 118 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 127 → 91 not taken.
✗ Branch 127 → 128 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 167 → 91 not taken.
✗ Branch 167 → 168 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 147 → 90 not taken.
✗ Branch 147 → 148 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 157 → 91 not taken.
✗ Branch 157 → 158 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 197 → 91 not taken.
✗ Branch 197 → 198 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 147 → 90 not taken.
✗ Branch 147 → 148 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 157 → 91 not taken.
✗ Branch 157 → 158 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 197 → 91 not taken.
✗ Branch 197 → 198 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 117 → 90 not taken.
✗ Branch 117 → 118 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 127 → 91 not taken.
✗ Branch 127 → 128 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 167 → 91 not taken.
✗ Branch 167 → 168 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 90 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 128 → 90 not taken.
✗ Branch 128 → 129 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 168 → 90 not taken.
✗ Branch 168 → 169 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 90 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 158 → 90 not taken.
✗ Branch 158 → 159 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 198 → 90 not taken.
✗ Branch 198 → 199 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 90 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 158 → 90 not taken.
✗ Branch 158 → 159 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 198 → 90 not taken.
✗ Branch 198 → 199 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 90 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 128 → 90 taken 34 times.
✓ Branch 128 → 129 taken 17 times.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 168 → 90 not taken.
✗ Branch 168 → 169 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 90 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 128 → 90 not taken.
✗ Branch 128 → 129 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 168 → 90 not taken.
✗ Branch 168 → 169 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 149 → 90 not taken.
✗ Branch 149 → 150 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 158 → 90 not taken.
✗ Branch 158 → 159 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 198 → 90 not taken.
✗ Branch 198 → 199 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 149 → 90 taken 18 times.
✓ Branch 149 → 150 taken 9 times.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 158 → 90 not taken.
✗ Branch 158 → 159 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 198 → 90 not taken.
✗ Branch 198 → 199 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 119 → 90 not taken.
✗ Branch 119 → 120 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 128 → 90 not taken.
✗ Branch 128 → 129 not taken.
void do_convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 168 → 90 not taken.
✗ Branch 168 → 169 not taken.
129 for (int x = 0; x < src_width; x += 16)
542 {
543 //const int corr = matrix[_y | (x & dither_mask)];
544
545 //int src_pixel = srcp[x];
546 //__m128i src_lo, src_hi;
547 __m256i src;
548 if constexpr (sizeof(pixel_t_s) == 1) {
549 30 src = _mm256_cvtepu8_epi16(_mm_load_si128(reinterpret_cast<const __m128i*>(srcp + x))); // 16* uint8->uint16
550 }
551 else {
552 134 src= _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp + x)); // 16* uint16
553 }
554
555 [[maybe_unused]] __m256i src_lo;
556 [[maybe_unused]] __m256i src_hi;
557 if constexpr (fulls != fulld) {
558 // goint to 32 float
559 // const float val = (srcp[x] - src_offset) * mul_factor + dst_offset_plus_round;
560 36 const auto src_offset_simd = _mm256_set1_epi32(d.src_offset_i);
561 18 const auto dst_offset_plus_round_simd = _mm256_set1_ps(dst_offset_plus_round);
562
563 54 auto src_lo_ps = _mm256_cvtepi32_ps(_mm256_sub_epi32(_mm256_unpacklo_epi16(src, zero), src_offset_simd));
564 54 auto src_hi_ps = _mm256_cvtepi32_ps(_mm256_sub_epi32(_mm256_unpackhi_epi16(src, zero), src_offset_simd));
565 36 src_lo_ps = _mm256_add_ps(_mm256_mul_ps(src_lo_ps, mul_factor_simd), dst_offset_plus_round_simd);
566 36 src_hi_ps = _mm256_add_ps(_mm256_mul_ps(src_hi_ps, mul_factor_simd), dst_offset_plus_round_simd);
567
568 // src_pixel = clamp((int)val, src_pixel_min, src_pixel_max);
569 if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) {
570 // Source is 8 bits. This branch is ineffective if we define TEMPLATE_LOW_DITHER_BITDEPTH for all <8 bits, as we do now
571 // We would reach this code for 5-7 bits when lo limit would be e.g. 4 bits
572 // 8 bit source: we can go back from 32 to 16 bit int
573 src = _mm256_packus_epi32(_mm256_cvttps_epi32(src_lo_ps), _mm256_cvttps_epi32(src_hi_ps));
574 // min is 0, which was ensured by packus
575 const auto src_pixel_max_simd = _mm256_set1_epi16(src_pixel_max);
576 src = _mm256_min_epu16(src, src_pixel_max_simd);
577 // tmp result 16 bits in src
578 }
579 else {
580 // go back to int32 only
581 18 src_lo = _mm256_cvttps_epi32(src_lo_ps);
582 18 src_hi = _mm256_cvttps_epi32(src_hi_ps);
583 // min is 0, which was ensured by packus
584 18 const auto src_pixel_max_simd = _mm256_set1_epi32(src_pixel_max);
585 18 src_lo = _mm256_min_epi32(src_lo, src_pixel_max_simd);
586 18 src_hi = _mm256_min_epi32(src_hi, src_pixel_max_simd);
587 // tmp result 32 bits in src_lo, src_hi
588 }
589 }
590 else {
591 // 10-16 bits or preshift: go into 32 bit int
592 if constexpr (sizeof(pixel_t_s) == 2 || TEMPLATE_LOW_DITHER_BITDEPTH) {
593 68 src_lo = _mm256_unpacklo_epi16(src, zero);
594 68 src_hi = _mm256_unpackhi_epi16(src, zero);
595 // tmp result 32 bits in src_lo, src_hi
596 }
597 }
598
599 __m256i new_pixel;
600
601 // scale down after adding dithering noise
602 // int new_pixel = ((src_pixel + corr) >> dither_bit_diff);
603 if constexpr (sizeof(pixel_t_s) == 1 && !TEMPLATE_LOW_DITHER_BITDEPTH) {
604 // when dither_target_bits is 1, then preshift==1 and dither_bit_diff==(7+1) would not fit in 16 bits
605 new_pixel = _mm256_srai_epi16(_mm256_add_epi16(src, corr), dither_bit_diff);
606 // new_pixel is ready with 16 bit data
607 }
608 else {
609 // source bits: >8.
610 // At 16 bit overflow can happen when 0xFFFF it dithered up. This is why we are at 32 bits int
611 // Theoretically fulls == fulld && <16 bit would allow 16 bit int workflow but we do not specialize for that
612 // source bits: >8 or 8 bit but PRESHIFT
613 // At 16 bit overflow can happen when 0xFFFF it dithered up. This is why we are at 32 bits int
614 // Theoretically fulls == fulld && <16 bit would allow 16 bit int workflow but we do not specialize for that
615 // low dither bitdepth is special as well
616
617 /*
618 int new_pixel;
619 if (TEMPLATE_LOW_DITHER_BITDEPTH) {
620 // accurate dither: +/-
621 const float corr_f = corr - half_maxcorr_value;
622 new_pixel = (int)(src_pixel + corr_f) >> dither_bit_diff;
623 }
624 else
625 new_pixel = ((src_pixel + corr) >> dither_bit_diff);
626 */
627 __m256i new_pixel_lo, new_pixel_hi;
628 86 auto corr_lo = _mm256_unpacklo_epi16(corr, zero);
629 86 auto corr_hi = _mm256_unpackhi_epi16(corr, zero);
630 if (TEMPLATE_LOW_DITHER_BITDEPTH) {
631 // accurately positioned to the center
632 20 auto corr_lo_ps = _mm256_sub_ps(_mm256_cvtepi32_ps(corr_lo), half_maxcorr_value_simd);
633 20 auto corr_hi_ps = _mm256_sub_ps(_mm256_cvtepi32_ps(corr_hi), half_maxcorr_value_simd);
634 // accurate dither: +/-
635 40 new_pixel_lo = _mm256_srai_epi32(_mm256_cvttps_epi32(_mm256_add_ps(_mm256_cvtepi32_ps(src_lo), corr_lo_ps)), dither_bit_diff);
636 40 new_pixel_hi = _mm256_srai_epi32(_mm256_cvttps_epi32(_mm256_add_ps(_mm256_cvtepi32_ps(src_hi), corr_hi_ps)), dither_bit_diff);
637 }
638 else {
639 // Arrgh. If dither_bit_diff would be an immediate constant (e.g. template parameter) then we get 2390 fps vs 1378 even for sse4.1!
640 // for a simple Vide16bit.ConvertBits(8, dither=0, dither_bits=8)
641 // const auto dither_bit_diff = 8;
642 152 new_pixel_lo = _mm256_srai_epi32(_mm256_add_epi32(src_lo, corr_lo), dither_bit_diff);
643 152 new_pixel_hi = _mm256_srai_epi32(_mm256_add_epi32(src_hi, corr_hi), dither_bit_diff);
644 }
645 86 new_pixel = _mm256_packus_epi32(new_pixel_lo, new_pixel_hi);
646 // new_pixel is ready with 16 bit data
647 }
648
649 // scale back to the required bit depth
650 // dither to x, target to y
651 if constexpr (TEMPLATE_NEED_BACKSCALE) {
652 /*
653 new_pixel = min(new_pixel, max_pixel_value_dithered);
654 if (TEMPLATE_LOW_DITHER_BITDEPTH) {
655 new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f);
656 }
657 else {
658 new_pixel = new_pixel << bitdiff_between_dither_and_target;
659 }
660 */
661 88 const auto max_pixel_value_dithered_simd = _mm256_set1_epi16(max_pixel_value_dithered);
662 44 new_pixel = _mm256_min_epu16(new_pixel, max_pixel_value_dithered_simd);
663 // Interesting problem of dither_bits==1 (or in general at small dither_bits)
664 // After simple slli 0,1 becomes 0,128, we'd expect 0,255 instead. So we make cosmetics.
665 // dither_bits
666 // 1 0,1 => 0,128 => 0,255
667 // 2 0,1,2,3 => 0,64,128,192 => 0,85,170,255
668 // 3 0,...,7 => 0,32,...,224 => 0,....255
669 // 4 0,..,15 => 0,16,...,240 => 0,....255
670 // 5 0,..,31 => 0,8,....,248 => 0,....255
671 // 6 0,..,63 => 0,4,....,252 => 0,....255
672 // 7 0,.,127 => 0,2. ..,254 => 0,?,?,255
673 if (TEMPLATE_LOW_DITHER_BITDEPTH) {
674 // new_pixel = (int)(new_pixel * mul_factor_backfromlowdither + 0.5f);
675 10 auto rounder_half_simd = _mm256_set1_ps(0.5f);
676
677 20 auto new_pixel_lo_ps = _mm256_cvtepi32_ps(_mm256_unpacklo_epi16(new_pixel, zero));
678 20 auto new_pixel_hi_ps = _mm256_cvtepi32_ps(_mm256_unpackhi_epi16(new_pixel, zero));
679 70 new_pixel = _mm256_packus_epi32(
680 _mm256_cvttps_epi32(_mm256_add_ps(_mm256_mul_ps(new_pixel_lo_ps, mul_factor_backfromlowdither_simd), rounder_half_simd)),
681 _mm256_cvttps_epi32(_mm256_add_ps(_mm256_mul_ps(new_pixel_hi_ps, mul_factor_backfromlowdither_simd), rounder_half_simd))
682 );
683 }
684 else {
685 34 new_pixel = _mm256_slli_epi16(new_pixel, bitdiff_between_dither_and_target);
686 }
687 }
688
689 // dstp[x] = (pixel_t_d)(min((int)new_pixel, max_pixel_value_target));
690 if constexpr (sizeof(pixel_t_d) == 1)
691 {
692 // byte target: 16x 2bytes -> 16x 1 bytes like cvtepu16->epu8
693 34 auto result12 = _mm256_packus_epi16(new_pixel, new_pixel);
694 34 result12 = _mm256_permute4x64_epi64(result12, (0 << 0) | (2 << 2) | (1 << 4) | (3 << 6));
695 34 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x), _mm256_castsi256_si128(result12));
696 }
697 else {
698 104 const auto max_pixel_value_target_simd = _mm256_set1_epi16(max_pixel_value_target);
699 // max is unnecessary for exact 16 bit pixel type but we are not specialized for that case
700 52 new_pixel = _mm256_min_epu16(new_pixel, max_pixel_value_target_simd);
701 52 _mm256_store_si256(reinterpret_cast<__m256i*>(dstp + x), new_pixel);
702 }
703 }
704 43 dstp += dst_pitch;
705 43 srcp += src_pitch;
706 }
707 }
708
709 template<typename pixel_t_s, typename pixel_t_d, bool chroma, bool fulls, bool fulld>
710 5 void convert_ordered_dither_uint_avx2(const BYTE* srcp8, BYTE* dstp8, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
711 {
712 5 const bool need_backscale = target_bitdepth != dither_target_bitdepth; // dither to x, target to y
713 5 const bool low_dither_bitdepth = dither_target_bitdepth < 8; // 1-7 bits dither targets, need_backscale is always true, since 8 bit format is the minimum
714
5/48
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 1 time.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 1 time.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 1 time.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
5 if (need_backscale) {
715
2/48
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned char, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 1 time.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_ordered_dither_uint_avx2<unsigned short, unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
2 if (low_dither_bitdepth)
716 1 do_convert_ordered_dither_uint_avx2<pixel_t_s, pixel_t_d, chroma, fulls, fulld, true, true>(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth);
717 else
718 1 do_convert_ordered_dither_uint_avx2<pixel_t_s, pixel_t_d, chroma, fulls, fulld, true, false>(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth);
719 }
720 else {
721 3 do_convert_ordered_dither_uint_avx2<pixel_t_s, pixel_t_d, chroma, fulls, fulld, false, false>(srcp8, dstp8, src_rowsize, src_height, src_pitch, dst_pitch, source_bitdepth, target_bitdepth, dither_target_bitdepth);
722 }
723 5 }
724
725 // instantiate them all
726 // template<typename pixel_t_s, typename pixel_t_d, bool chroma, bool fulls, bool fulld>
727 // spec: fulld=false, fulls=false
728 #define convert_ordered_dither_uint_sse4_functions(uint_X_t, uint_X_dest_t) \
729 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, false, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
730 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, false, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
731 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, false, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
732 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, false, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
733 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, true, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
734 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, true, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
735 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, true, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth); \
736 template void convert_ordered_dither_uint_avx2<uint_X_t, uint_X_dest_t, true, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
737
738 // dither only same of less bit depth
739 convert_ordered_dither_uint_sse4_functions(uint8_t, uint8_t)
740 convert_ordered_dither_uint_sse4_functions(uint16_t, uint8_t)
741 convert_ordered_dither_uint_sse4_functions(uint16_t, uint16_t)
742
743 #undef convert_ordered_dither_uint_sse4_functions
744
745 template<typename pixel_t, bool chroma, bool fulls, bool fulld>
746 3 void convert_uintN_to_float_avx2(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth)
747 {
748 3 const pixel_t* srcp0 = reinterpret_cast<const pixel_t*>(srcp);
749 3 float* dstp0 = reinterpret_cast<float*>(dstp);
750
751 3 src_pitch = src_pitch / sizeof(pixel_t);
752 3 dst_pitch = dst_pitch / sizeof(float);
753
754 3 const int src_width = src_rowsize / sizeof(pixel_t);
755 // write 32 floats (128 bytes) only if valid, scanline alignment is only 64 bytes (16 floats).
756 // Alignment, write-limited, 16 floats (64 bytes) is guaranteed by AviSynth
757 3 const int w16 = (src_width + 15) & ~15;
758 //-----------------------
759
3/32
void convert_uintN_to_float_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_uintN_to_float_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_uintN_to_float_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 24 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
3 bits_conv_constants d;
760 get_bits_conv_constants(d, chroma, fulls, fulld, source_bitdepth, target_bitdepth);
761
762 3 const __m256i m256_src_offset_epi32 = _mm256_set1_epi32(d.src_offset_i);
763 3 const __m256 m256_mul_factor = _mm256_set1_ps(d.mul_factor);
764 3 const __m256 m256_dst_offset = _mm256_set1_ps(d.dst_offset);
765
766
6/32
void convert_uintN_to_float_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 133 → 61 taken 5 times.
✓ Branch 133 → 134 taken 1 time.
void convert_uintN_to_float_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 133 → 61 taken 4 times.
✓ Branch 133 → 134 taken 1 time.
void convert_uintN_to_float_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 133 → 61 taken 5 times.
✓ Branch 133 → 134 taken 1 time.
void convert_uintN_to_float_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 133 → 61 not taken.
✗ Branch 133 → 134 not taken.
17 for (int y = 0; y < src_height; y++)
767 {
768 // rows are 64 bytes - 16 float pixels - aligned we have a write constraint
769 int x;
770
6/32
void convert_uintN_to_float_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 109 → 62 taken 5 times.
✓ Branch 109 → 110 taken 5 times.
void convert_uintN_to_float_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 109 → 62 not taken.
✗ Branch 109 → 110 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 107 → 62 taken 4 times.
✓ Branch 107 → 108 taken 4 times.
void convert_uintN_to_float_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✓ Branch 107 → 62 taken 5 times.
✓ Branch 107 → 108 taken 5 times.
void convert_uintN_to_float_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 107 → 62 not taken.
✗ Branch 107 → 108 not taken.
28 for (x = 0; x + 32 <= w16; x += 32)
771 {
772 __m256i src_0_32, src_1_32, src_2_32, src_3_32;
773
774 if constexpr (sizeof(pixel_t) == 1) // uint8_t
775 {
776 10 __m256i src_32 = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x));
777 // unpack to 4x64bits
778 5 src_0_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_32)); // bytes 0-7
779
780 5 __m256i src_1 = _mm256_permute4x64_epi64(src_32, 1);
781 5 __m256i src_2 = _mm256_permute4x64_epi64(src_32, 2);
782 5 __m256i src_3 = _mm256_permute4x64_epi64(src_32, 3);
783
784 10 src_1_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_1));
785 10 src_2_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_2));
786 10 src_3_32 = _mm256_cvtepu8_epi32(_mm256_castsi256_si128(src_3));
787 }
788
789 if constexpr (sizeof(pixel_t) == 2) // uint16_t
790 {
791 9 __m256i src_16 = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x));
792 18 __m256i src_16_2 = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x + 16));
793 // unpack to 2x128bits 2x8 uint16
794 9 src_0_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16));
795 18 src_1_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16, 1));
796 9 src_2_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16_2));
797 18 src_3_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16_2, 1));
798 }
799
800 14 src_0_32 = _mm256_sub_epi32(src_0_32, m256_src_offset_epi32);
801 14 src_1_32 = _mm256_sub_epi32(src_1_32, m256_src_offset_epi32);
802 14 src_2_32 = _mm256_sub_epi32(src_2_32, m256_src_offset_epi32);
803 14 src_3_32 = _mm256_sub_epi32(src_3_32, m256_src_offset_epi32);
804
805 14 __m256 src_0_ps = _mm256_cvtepi32_ps(src_0_32);
806 14 __m256 src_1_ps = _mm256_cvtepi32_ps(src_1_32);
807 14 __m256 src_2_ps = _mm256_cvtepi32_ps(src_2_32);
808 14 __m256 src_3_ps = _mm256_cvtepi32_ps(src_3_32);
809
810 14 __m256 out_0_ps = _mm256_fmadd_ps(src_0_ps, m256_mul_factor, m256_dst_offset);
811 14 __m256 out_1_ps = _mm256_fmadd_ps(src_1_ps, m256_mul_factor, m256_dst_offset);
812 14 __m256 out_2_ps = _mm256_fmadd_ps(src_2_ps, m256_mul_factor, m256_dst_offset);
813 14 __m256 out_3_ps = _mm256_fmadd_ps(src_3_ps, m256_mul_factor, m256_dst_offset);
814
815 // process 32 pixels, write 128 bytes
816 14 _mm256_store_ps((dstp0 + x + 0), out_0_ps);
817 14 _mm256_store_ps((dstp0 + x + 8), out_1_ps);
818 14 _mm256_store_ps((dstp0 + x + 16), out_2_ps);
819 14 _mm256_store_ps((dstp0 + x + 24), out_3_ps);
820
821 // const float pixel = (srcp0[x] - d.src_offset_i) * d.mul_factor + d.dst_offset;
822 // dstp0[x] = pixel; // no clamp
823 }
824
825 // second loop: process remaining 1-15 pixels, 16 at a time
826
3/32
void convert_uintN_to_float_avx2<unsigned char, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✓ Branch 110 → 132 taken 5 times.
void convert_uintN_to_float_avx2<unsigned char, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned char, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 132 taken 4 times.
void convert_uintN_to_float_avx2<unsigned short, false, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, false, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, false, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
void convert_uintN_to_float_avx2<unsigned short, true, true, false>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 132 taken 5 times.
void convert_uintN_to_float_avx2<unsigned short, true, true, true>(unsigned char const*, unsigned char*, int, int, int, int, int, int, int):
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 132 not taken.
14 if (x < w16) {
827 __m256i src_0_32, src_1_32;
828
829 if constexpr (sizeof(pixel_t) == 1) // uint8_t
830 {
831 // _m128 enough, 16 pixels
832 __m128i src_16_bytes = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp0 + x));
833 src_0_32 = _mm256_cvtepu8_epi32(src_16_bytes); // 0-7
834 src_1_32 = _mm256_cvtepu8_epi32(_mm_srli_si128(src_16_bytes, 8)); // 8-15, quick permuteless
835 }
836 else // uint16_t
837 {
838 __m256i src_16 = _mm256_load_si256(reinterpret_cast<const __m256i*>(srcp0 + x));
839 src_0_32 = _mm256_cvtepu16_epi32(_mm256_castsi256_si128(src_16)); // 0-7
840 src_1_32 = _mm256_cvtepu16_epi32(_mm256_extracti128_si256(src_16, 1)); // 8-15
841 }
842
843 src_0_32 = _mm256_sub_epi32(src_0_32, m256_src_offset_epi32);
844 src_1_32 = _mm256_sub_epi32(src_1_32, m256_src_offset_epi32);
845
846 __m256 out_0_ps = _mm256_fmadd_ps(_mm256_cvtepi32_ps(src_0_32), m256_mul_factor, m256_dst_offset);
847 __m256 out_1_ps = _mm256_fmadd_ps(_mm256_cvtepi32_ps(src_1_32), m256_mul_factor, m256_dst_offset);
848
849 // 16 floats - 64 bytes always safe
850 _mm256_store_ps((dstp0 + x + 0), out_0_ps);
851 _mm256_store_ps((dstp0 + x + 8), out_1_ps);
852
853 // const float pixel = (srcp0[x] - d.src_offset_i) * d.mul_factor + d.dst_offset;
854 // dstp0[x] = pixel; // no clamp
855 }
856 14 dstp0 += dst_pitch;
857 14 srcp0 += src_pitch;
858 }
859
860 3 }
861
862 // instantinate
863 template void convert_uintN_to_float_avx2<uint8_t, false, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
864 template void convert_uintN_to_float_avx2<uint8_t, false, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
865 template void convert_uintN_to_float_avx2<uint8_t, false, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
866 template void convert_uintN_to_float_avx2<uint8_t, false, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
867 template void convert_uintN_to_float_avx2<uint8_t, true, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
868 template void convert_uintN_to_float_avx2<uint8_t, true, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
869 template void convert_uintN_to_float_avx2<uint8_t, true, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
870 template void convert_uintN_to_float_avx2<uint8_t, true, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
871
872 template void convert_uintN_to_float_avx2<uint16_t, false, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
873 template void convert_uintN_to_float_avx2<uint16_t, false, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
874 template void convert_uintN_to_float_avx2<uint16_t, false, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
875 template void convert_uintN_to_float_avx2<uint16_t, false, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
876 template void convert_uintN_to_float_avx2<uint16_t, true, false, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
877 template void convert_uintN_to_float_avx2<uint16_t, true, false, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
878 template void convert_uintN_to_float_avx2<uint16_t, true, true, false>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
879 template void convert_uintN_to_float_avx2<uint16_t, true, true, true>(const BYTE* srcp, BYTE* dstp, int src_rowsize, int src_height, int src_pitch, int dst_pitch, int source_bitdepth, int target_bitdepth, int dither_target_bitdepth);
880
881