Coverage Report

Created: 2026-09-04 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zlib-ng/adler32_p.h
Line
Count
Source
1
/* adler32_p.h -- Private inline functions and macros shared with
2
 *                different computation of the Adler-32 checksum
3
 *                of a data stream.
4
 * Copyright (C) 1995-2011, 2016 Mark Adler
5
 * For conditions of distribution and use, see copyright notice in zlib.h
6
 */
7
8
#ifndef ADLER32_P_H
9
#define ADLER32_P_H
10
11
#include "zendian.h"
12
13
247k
#define BASE 65521U     /* largest prime smaller than 65536 */
14
28.9k
#define NMAX 5552
15
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
16
#define NMAX_ALIGNED32 (NMAX & ~31)
17
/* NMAX rounded down to a multiple of 32 is 5536 */
18
19
157k
#define ADLER_DO1(sum1, sum2, buf, i)  {(sum1) += buf[(i)]; (sum2) += (sum1);}
20
68.0k
#define ADLER_DO2(sum1, sum2, buf, i)  {ADLER_DO1(sum1, sum2, buf, i); ADLER_DO1(sum1, sum2, buf, i+1);}
21
21.3k
#define ADLER_DO4(sum1, sum2, buf, i)  {ADLER_DO2(sum1, sum2, buf, i); ADLER_DO2(sum1, sum2, buf, i+2);}
22
#define ADLER_DO8(sum1, sum2, buf, i)  {ADLER_DO4(sum1, sum2, buf, i); ADLER_DO4(sum1, sum2, buf, i+4);}
23
#define ADLER_DO16(sum1, sum2, buf)    {ADLER_DO8(sum1, sum2, buf, 0); ADLER_DO8(sum1, sum2, buf, 8);}
24
25
Z_FORCEINLINE static void adler32_copy_align(uint32_t *Z_RESTRICT adler, uint8_t *dst, const uint8_t *buf, size_t len,
26
0
                                             uint32_t *Z_RESTRICT sum2, const int MAX_LEN, const int COPY) {
27
0
    Z_UNUSED(MAX_LEN);
28
0
    if (len & 1) {
29
0
        if (COPY) {
30
0
            *dst = *buf;
31
0
            dst += 1;
32
0
        }
33
0
        ADLER_DO1(*adler, *sum2, buf, 0);
34
0
        buf += 1;
35
0
    }
36
0
    if (len & 2) {
37
0
        if (COPY) {
38
0
            memcpy(dst, buf, 2);
39
0
            dst += 2;
40
0
        }
41
0
        ADLER_DO2(*adler, *sum2, buf, 0);
42
0
        buf += 2;
43
0
    }
44
0
    while (len >= 4) {
45
0
        if (COPY) {
46
0
            memcpy(dst, buf, 4);
47
0
            dst += 4;
48
0
        }
49
0
        len -= 4;
50
0
        ADLER_DO4(*adler, *sum2, buf, 0);
51
0
        buf += 4;
52
0
    }
53
0
}
Unexecuted instantiation: adler32_ssse3.c:adler32_copy_align
Unexecuted instantiation: adler32_sse42.c:adler32_copy_align
Unexecuted instantiation: adler32_avx2.c:adler32_copy_align
Unexecuted instantiation: adler32_avx2_vnni.c:adler32_copy_align
Unexecuted instantiation: adler32_avx512.c:adler32_copy_align
Unexecuted instantiation: adler32_avx512_vnni.c:adler32_copy_align
Unexecuted instantiation: adler32_c.c:adler32_copy_align
54
55
/* SIMD Within A Register (SWAR) scalar adler32. Splits bytes into
56
 * even/odd lanes packed as 4x16-bit in uint64_t, with prefix sums for s2.
57
 * Reduction uses multiply-and-shift with positional weight constants.
58
 *
59
 * Technique pioneered by Michael Niedermayer <michaelni@gmx.at>.
60
 * Max chunk: 23 iterations * 8 bytes = 184 (255*23 = 5865 < 65535). */
61
#define ADLER32_SWAR_MAX_BYTES   (23 * 8)
62
44.7k
#define ADLER32_SWAR_EVEN_MASK   0x00FF00FF00FF00FFULL
63
44.7k
#define ADLER32_SWAR_HSUM        0x1000100010001ULL
64
65
Z_FORCEINLINE static void adler32_swar(uint32_t *adler, uint8_t *dst, const uint8_t *buf, size_t len,
66
22.3k
                                       uint32_t *sum2, const int COPY) {
67
22.3k
    uint64_t sum_even = 0, sum_odd = 0, prefix_even = 0, prefix_odd = 0;
68
69
22.3k
    *sum2 += *adler * (uint32_t)len;
70
71
22.3k
    const uint64_t *src64 = (const uint64_t *)buf;
72
73
22.3k
    while (len >= 16) {
74
0
        uint64_t v0 = src64[0];
75
0
        uint64_t v1 = src64[1];
76
0
        if (COPY) {
77
0
            memcpy(dst, &v0, sizeof(v0));
78
0
            memcpy(dst + 8, &v1, sizeof(v1));
79
0
            dst += 16;
80
0
        }
81
82
0
        prefix_even += sum_even;
83
0
        prefix_odd += sum_odd;
84
0
        sum_even +=  v0       & ADLER32_SWAR_EVEN_MASK;
85
0
        sum_odd  += (v0 >> 8) & ADLER32_SWAR_EVEN_MASK;
86
87
0
        prefix_even += sum_even;
88
0
        prefix_odd += sum_odd;
89
0
        sum_even +=  v1       & ADLER32_SWAR_EVEN_MASK;
90
0
        sum_odd  += (v1 >> 8) & ADLER32_SWAR_EVEN_MASK;
91
92
0
        src64 += 2;
93
0
        len -= 16;
94
0
    }
95
96
    /* Handle remaining 8 bytes if present */
97
22.3k
    if (len >= 8) {
98
22.3k
        uint64_t v = *src64;
99
22.3k
        if (COPY)
100
5.45k
            memcpy(dst, &v, sizeof(v));
101
102
22.3k
        prefix_even += sum_even;
103
22.3k
        prefix_odd += sum_odd;
104
22.3k
        sum_even +=  v       & ADLER32_SWAR_EVEN_MASK;
105
22.3k
        sum_odd  += (v >> 8) & ADLER32_SWAR_EVEN_MASK;
106
22.3k
    }
107
108
    /* Horizontal sum of 4x16-bit lanes for s1 */
109
22.3k
    *adler += (uint32_t)(((sum_even + sum_odd) * ADLER32_SWAR_HSUM) >> 48);
110
111
    /* Widen prefix sums to 32-bit pairs and horizontal sum for s2 */
112
22.3k
    uint64_t pe_lo = prefix_even & 0xFFFF0000FFFFULL;
113
22.3k
    uint64_t pe_hi = (prefix_even >> 16) & 0xFFFF0000FFFFULL;
114
22.3k
    uint64_t po_lo = prefix_odd & 0xFFFF0000FFFFULL;
115
22.3k
    uint64_t po_hi = (prefix_odd >> 16) & 0xFFFF0000FFFFULL;
116
117
22.3k
    *sum2 += (uint32_t)(((pe_lo + po_lo + pe_hi + po_hi) * 0x800000008ULL) >> 32);
118
119
    /* Positional weights [8,7,6,5,4,3,2,1] per 8-byte group for s2.
120
     * On big-endian the even mask captures odd-index memory bytes (b1,b3,b5,b7)
121
     * so HSUM (+1 per odd-index byte) must be applied to sum_even, not sum_odd. */
122
22.3k
#if BYTE_ORDER == LITTLE_ENDIAN
123
22.3k
    *sum2 += 2 * (uint32_t)((sum_even * 0x4000300020001ULL) >> 48)
124
22.3k
           +     (uint32_t)((sum_odd  * ADLER32_SWAR_HSUM) >> 48)
125
22.3k
           + 2 * (uint32_t)((sum_odd  * 0x3000200010000ULL) >> 48);
126
#else
127
    *sum2 += 2 * (uint32_t)((sum_even * 0x0000100020003ULL) >> 48)
128
           +     (uint32_t)((sum_even * ADLER32_SWAR_HSUM) >> 48)
129
           + 2 * (uint32_t)((sum_odd  * 0x1000200030004ULL) >> 48);
130
#endif
131
22.3k
}
adler32_ssse3.c:adler32_swar
Line
Count
Source
66
8.21k
                                       uint32_t *sum2, const int COPY) {
67
8.21k
    uint64_t sum_even = 0, sum_odd = 0, prefix_even = 0, prefix_odd = 0;
68
69
8.21k
    *sum2 += *adler * (uint32_t)len;
70
71
8.21k
    const uint64_t *src64 = (const uint64_t *)buf;
72
73
8.21k
    while (len >= 16) {
74
0
        uint64_t v0 = src64[0];
75
0
        uint64_t v1 = src64[1];
76
0
        if (COPY) {
77
0
            memcpy(dst, &v0, sizeof(v0));
78
0
            memcpy(dst + 8, &v1, sizeof(v1));
79
0
            dst += 16;
80
0
        }
81
82
0
        prefix_even += sum_even;
83
0
        prefix_odd += sum_odd;
84
0
        sum_even +=  v0       & ADLER32_SWAR_EVEN_MASK;
85
0
        sum_odd  += (v0 >> 8) & ADLER32_SWAR_EVEN_MASK;
86
87
0
        prefix_even += sum_even;
88
0
        prefix_odd += sum_odd;
89
0
        sum_even +=  v1       & ADLER32_SWAR_EVEN_MASK;
90
0
        sum_odd  += (v1 >> 8) & ADLER32_SWAR_EVEN_MASK;
91
92
0
        src64 += 2;
93
0
        len -= 16;
94
0
    }
95
96
    /* Handle remaining 8 bytes if present */
97
8.21k
    if (len >= 8) {
98
8.21k
        uint64_t v = *src64;
99
8.21k
        if (COPY)
100
0
            memcpy(dst, &v, sizeof(v));
101
102
8.21k
        prefix_even += sum_even;
103
8.21k
        prefix_odd += sum_odd;
104
8.21k
        sum_even +=  v       & ADLER32_SWAR_EVEN_MASK;
105
8.21k
        sum_odd  += (v >> 8) & ADLER32_SWAR_EVEN_MASK;
106
8.21k
    }
107
108
    /* Horizontal sum of 4x16-bit lanes for s1 */
109
8.21k
    *adler += (uint32_t)(((sum_even + sum_odd) * ADLER32_SWAR_HSUM) >> 48);
110
111
    /* Widen prefix sums to 32-bit pairs and horizontal sum for s2 */
112
8.21k
    uint64_t pe_lo = prefix_even & 0xFFFF0000FFFFULL;
113
8.21k
    uint64_t pe_hi = (prefix_even >> 16) & 0xFFFF0000FFFFULL;
114
8.21k
    uint64_t po_lo = prefix_odd & 0xFFFF0000FFFFULL;
115
8.21k
    uint64_t po_hi = (prefix_odd >> 16) & 0xFFFF0000FFFFULL;
116
117
8.21k
    *sum2 += (uint32_t)(((pe_lo + po_lo + pe_hi + po_hi) * 0x800000008ULL) >> 32);
118
119
    /* Positional weights [8,7,6,5,4,3,2,1] per 8-byte group for s2.
120
     * On big-endian the even mask captures odd-index memory bytes (b1,b3,b5,b7)
121
     * so HSUM (+1 per odd-index byte) must be applied to sum_even, not sum_odd. */
122
8.21k
#if BYTE_ORDER == LITTLE_ENDIAN
123
8.21k
    *sum2 += 2 * (uint32_t)((sum_even * 0x4000300020001ULL) >> 48)
124
8.21k
           +     (uint32_t)((sum_odd  * ADLER32_SWAR_HSUM) >> 48)
125
8.21k
           + 2 * (uint32_t)((sum_odd  * 0x3000200010000ULL) >> 48);
126
#else
127
    *sum2 += 2 * (uint32_t)((sum_even * 0x0000100020003ULL) >> 48)
128
           +     (uint32_t)((sum_even * ADLER32_SWAR_HSUM) >> 48)
129
           + 2 * (uint32_t)((sum_odd  * 0x1000200030004ULL) >> 48);
130
#endif
131
8.21k
}
adler32_sse42.c:adler32_swar
Line
Count
Source
66
2.44k
                                       uint32_t *sum2, const int COPY) {
67
2.44k
    uint64_t sum_even = 0, sum_odd = 0, prefix_even = 0, prefix_odd = 0;
68
69
2.44k
    *sum2 += *adler * (uint32_t)len;
70
71
2.44k
    const uint64_t *src64 = (const uint64_t *)buf;
72
73
2.44k
    while (len >= 16) {
74
0
        uint64_t v0 = src64[0];
75
0
        uint64_t v1 = src64[1];
76
0
        if (COPY) {
77
0
            memcpy(dst, &v0, sizeof(v0));
78
0
            memcpy(dst + 8, &v1, sizeof(v1));
79
0
            dst += 16;
80
0
        }
81
82
0
        prefix_even += sum_even;
83
0
        prefix_odd += sum_odd;
84
0
        sum_even +=  v0       & ADLER32_SWAR_EVEN_MASK;
85
0
        sum_odd  += (v0 >> 8) & ADLER32_SWAR_EVEN_MASK;
86
87
0
        prefix_even += sum_even;
88
0
        prefix_odd += sum_odd;
89
0
        sum_even +=  v1       & ADLER32_SWAR_EVEN_MASK;
90
0
        sum_odd  += (v1 >> 8) & ADLER32_SWAR_EVEN_MASK;
91
92
0
        src64 += 2;
93
0
        len -= 16;
94
0
    }
95
96
    /* Handle remaining 8 bytes if present */
97
2.44k
    if (len >= 8) {
98
2.44k
        uint64_t v = *src64;
99
2.44k
        if (COPY)
100
2.44k
            memcpy(dst, &v, sizeof(v));
101
102
2.44k
        prefix_even += sum_even;
103
2.44k
        prefix_odd += sum_odd;
104
2.44k
        sum_even +=  v       & ADLER32_SWAR_EVEN_MASK;
105
2.44k
        sum_odd  += (v >> 8) & ADLER32_SWAR_EVEN_MASK;
106
2.44k
    }
107
108
    /* Horizontal sum of 4x16-bit lanes for s1 */
109
2.44k
    *adler += (uint32_t)(((sum_even + sum_odd) * ADLER32_SWAR_HSUM) >> 48);
110
111
    /* Widen prefix sums to 32-bit pairs and horizontal sum for s2 */
112
2.44k
    uint64_t pe_lo = prefix_even & 0xFFFF0000FFFFULL;
113
2.44k
    uint64_t pe_hi = (prefix_even >> 16) & 0xFFFF0000FFFFULL;
114
2.44k
    uint64_t po_lo = prefix_odd & 0xFFFF0000FFFFULL;
115
2.44k
    uint64_t po_hi = (prefix_odd >> 16) & 0xFFFF0000FFFFULL;
116
117
2.44k
    *sum2 += (uint32_t)(((pe_lo + po_lo + pe_hi + po_hi) * 0x800000008ULL) >> 32);
118
119
    /* Positional weights [8,7,6,5,4,3,2,1] per 8-byte group for s2.
120
     * On big-endian the even mask captures odd-index memory bytes (b1,b3,b5,b7)
121
     * so HSUM (+1 per odd-index byte) must be applied to sum_even, not sum_odd. */
122
2.44k
#if BYTE_ORDER == LITTLE_ENDIAN
123
2.44k
    *sum2 += 2 * (uint32_t)((sum_even * 0x4000300020001ULL) >> 48)
124
2.44k
           +     (uint32_t)((sum_odd  * ADLER32_SWAR_HSUM) >> 48)
125
2.44k
           + 2 * (uint32_t)((sum_odd  * 0x3000200010000ULL) >> 48);
126
#else
127
    *sum2 += 2 * (uint32_t)((sum_even * 0x0000100020003ULL) >> 48)
128
           +     (uint32_t)((sum_even * ADLER32_SWAR_HSUM) >> 48)
129
           + 2 * (uint32_t)((sum_odd  * 0x1000200030004ULL) >> 48);
130
#endif
131
2.44k
}
adler32_avx2.c:adler32_swar
Line
Count
Source
66
11.7k
                                       uint32_t *sum2, const int COPY) {
67
11.7k
    uint64_t sum_even = 0, sum_odd = 0, prefix_even = 0, prefix_odd = 0;
68
69
11.7k
    *sum2 += *adler * (uint32_t)len;
70
71
11.7k
    const uint64_t *src64 = (const uint64_t *)buf;
72
73
11.7k
    while (len >= 16) {
74
0
        uint64_t v0 = src64[0];
75
0
        uint64_t v1 = src64[1];
76
0
        if (COPY) {
77
0
            memcpy(dst, &v0, sizeof(v0));
78
0
            memcpy(dst + 8, &v1, sizeof(v1));
79
0
            dst += 16;
80
0
        }
81
82
0
        prefix_even += sum_even;
83
0
        prefix_odd += sum_odd;
84
0
        sum_even +=  v0       & ADLER32_SWAR_EVEN_MASK;
85
0
        sum_odd  += (v0 >> 8) & ADLER32_SWAR_EVEN_MASK;
86
87
0
        prefix_even += sum_even;
88
0
        prefix_odd += sum_odd;
89
0
        sum_even +=  v1       & ADLER32_SWAR_EVEN_MASK;
90
0
        sum_odd  += (v1 >> 8) & ADLER32_SWAR_EVEN_MASK;
91
92
0
        src64 += 2;
93
0
        len -= 16;
94
0
    }
95
96
    /* Handle remaining 8 bytes if present */
97
11.7k
    if (len >= 8) {
98
11.7k
        uint64_t v = *src64;
99
11.7k
        if (COPY)
100
3.01k
            memcpy(dst, &v, sizeof(v));
101
102
11.7k
        prefix_even += sum_even;
103
11.7k
        prefix_odd += sum_odd;
104
11.7k
        sum_even +=  v       & ADLER32_SWAR_EVEN_MASK;
105
11.7k
        sum_odd  += (v >> 8) & ADLER32_SWAR_EVEN_MASK;
106
11.7k
    }
107
108
    /* Horizontal sum of 4x16-bit lanes for s1 */
109
11.7k
    *adler += (uint32_t)(((sum_even + sum_odd) * ADLER32_SWAR_HSUM) >> 48);
110
111
    /* Widen prefix sums to 32-bit pairs and horizontal sum for s2 */
112
11.7k
    uint64_t pe_lo = prefix_even & 0xFFFF0000FFFFULL;
113
11.7k
    uint64_t pe_hi = (prefix_even >> 16) & 0xFFFF0000FFFFULL;
114
11.7k
    uint64_t po_lo = prefix_odd & 0xFFFF0000FFFFULL;
115
11.7k
    uint64_t po_hi = (prefix_odd >> 16) & 0xFFFF0000FFFFULL;
116
117
11.7k
    *sum2 += (uint32_t)(((pe_lo + po_lo + pe_hi + po_hi) * 0x800000008ULL) >> 32);
118
119
    /* Positional weights [8,7,6,5,4,3,2,1] per 8-byte group for s2.
120
     * On big-endian the even mask captures odd-index memory bytes (b1,b3,b5,b7)
121
     * so HSUM (+1 per odd-index byte) must be applied to sum_even, not sum_odd. */
122
11.7k
#if BYTE_ORDER == LITTLE_ENDIAN
123
11.7k
    *sum2 += 2 * (uint32_t)((sum_even * 0x4000300020001ULL) >> 48)
124
11.7k
           +     (uint32_t)((sum_odd  * ADLER32_SWAR_HSUM) >> 48)
125
11.7k
           + 2 * (uint32_t)((sum_odd  * 0x3000200010000ULL) >> 48);
126
#else
127
    *sum2 += 2 * (uint32_t)((sum_even * 0x0000100020003ULL) >> 48)
128
           +     (uint32_t)((sum_even * ADLER32_SWAR_HSUM) >> 48)
129
           + 2 * (uint32_t)((sum_odd  * 0x1000200030004ULL) >> 48);
130
#endif
131
11.7k
}
Unexecuted instantiation: adler32_avx2_vnni.c:adler32_swar
Unexecuted instantiation: adler32_avx512.c:adler32_swar
Unexecuted instantiation: adler32_avx512_vnni.c:adler32_swar
Unexecuted instantiation: adler32_c.c:adler32_swar
132
133
Z_FORCEINLINE static uint32_t adler32_copy_tail(uint32_t adler, uint8_t *dst, const uint8_t *buf, size_t len,
134
43.9k
                                                uint32_t sum2, const int REBASE, const int MAX_LEN, const int COPY) {
135
43.9k
    if (len) {
136
43.1k
        Z_UNUSED(MAX_LEN);
137
        /* Process using packed 64-bit arithmetic when source is aligned */
138
65.5k
        while (len >= 8 && ((uintptr_t)buf & 7) == 0) {
139
22.3k
            size_t chunk = MIN(ALIGN_DOWN(len, (size_t)8), (size_t)ADLER32_SWAR_MAX_BYTES);
140
22.3k
            adler32_swar(&adler, dst, buf, chunk, &sum2, COPY);
141
22.3k
            buf += chunk;
142
22.3k
            if (COPY)
143
5.45k
                dst += chunk;
144
22.3k
            len -= chunk;
145
22.3k
        }
146
        /* DO4 loop avoids GCC x86 register pressure from hoisted DO8/DO16 loads. */
147
64.4k
        while (len >= 4) {
148
21.3k
            if (COPY) {
149
6.19k
                memcpy(dst, buf, 4);
150
6.19k
                dst += 4;
151
6.19k
            }
152
21.3k
            len -= 4;
153
21.3k
            ADLER_DO4(adler, sum2, buf, 0);
154
21.3k
            buf += 4;
155
21.3k
        }
156
43.1k
        if (len & 2) {
157
25.3k
            if (COPY) {
158
6.61k
                memcpy(dst, buf, 2);
159
6.61k
                dst += 2;
160
6.61k
            }
161
25.3k
            ADLER_DO2(adler, sum2, buf, 0);
162
25.3k
            buf += 2;
163
25.3k
        }
164
43.1k
        if (len & 1) {
165
21.8k
            if (COPY)
166
5.72k
                *dst = *buf;
167
21.8k
            ADLER_DO1(adler, sum2, buf, 0);
168
21.8k
        }
169
43.1k
    }
170
43.9k
    if (REBASE) {
171
43.4k
        adler %= BASE;
172
43.4k
        sum2 %= BASE;
173
43.4k
    }
174
    /* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
175
43.9k
    return adler | (sum2 << 16);
176
43.9k
}
adler32_ssse3.c:adler32_copy_tail
Line
Count
Source
134
14.4k
                                                uint32_t sum2, const int REBASE, const int MAX_LEN, const int COPY) {
135
14.4k
    if (len) {
136
13.9k
        Z_UNUSED(MAX_LEN);
137
        /* Process using packed 64-bit arithmetic when source is aligned */
138
22.2k
        while (len >= 8 && ((uintptr_t)buf & 7) == 0) {
139
8.21k
            size_t chunk = MIN(ALIGN_DOWN(len, (size_t)8), (size_t)ADLER32_SWAR_MAX_BYTES);
140
8.21k
            adler32_swar(&adler, dst, buf, chunk, &sum2, COPY);
141
8.21k
            buf += chunk;
142
8.21k
            if (COPY)
143
0
                dst += chunk;
144
8.21k
            len -= chunk;
145
8.21k
        }
146
        /* DO4 loop avoids GCC x86 register pressure from hoisted DO8/DO16 loads. */
147
22.1k
        while (len >= 4) {
148
8.19k
            if (COPY) {
149
0
                memcpy(dst, buf, 4);
150
0
                dst += 4;
151
0
            }
152
8.19k
            len -= 4;
153
8.19k
            ADLER_DO4(adler, sum2, buf, 0);
154
8.19k
            buf += 4;
155
8.19k
        }
156
13.9k
        if (len & 2) {
157
9.12k
            if (COPY) {
158
0
                memcpy(dst, buf, 2);
159
0
                dst += 2;
160
0
            }
161
9.12k
            ADLER_DO2(adler, sum2, buf, 0);
162
9.12k
            buf += 2;
163
9.12k
        }
164
13.9k
        if (len & 1) {
165
7.42k
            if (COPY)
166
0
                *dst = *buf;
167
7.42k
            ADLER_DO1(adler, sum2, buf, 0);
168
7.42k
        }
169
13.9k
    }
170
14.4k
    if (REBASE) {
171
13.9k
        adler %= BASE;
172
13.9k
        sum2 %= BASE;
173
13.9k
    }
174
    /* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
175
14.4k
    return adler | (sum2 << 16);
176
14.4k
}
adler32_sse42.c:adler32_copy_tail
Line
Count
Source
134
4.84k
                                                uint32_t sum2, const int REBASE, const int MAX_LEN, const int COPY) {
135
4.84k
    if (len) {
136
4.84k
        Z_UNUSED(MAX_LEN);
137
        /* Process using packed 64-bit arithmetic when source is aligned */
138
7.28k
        while (len >= 8 && ((uintptr_t)buf & 7) == 0) {
139
2.44k
            size_t chunk = MIN(ALIGN_DOWN(len, (size_t)8), (size_t)ADLER32_SWAR_MAX_BYTES);
140
2.44k
            adler32_swar(&adler, dst, buf, chunk, &sum2, COPY);
141
2.44k
            buf += chunk;
142
2.44k
            if (COPY)
143
2.44k
                dst += chunk;
144
2.44k
            len -= chunk;
145
2.44k
        }
146
        /* DO4 loop avoids GCC x86 register pressure from hoisted DO8/DO16 loads. */
147
7.64k
        while (len >= 4) {
148
2.80k
            if (COPY) {
149
2.80k
                memcpy(dst, buf, 4);
150
2.80k
                dst += 4;
151
2.80k
            }
152
2.80k
            len -= 4;
153
2.80k
            ADLER_DO4(adler, sum2, buf, 0);
154
2.80k
            buf += 4;
155
2.80k
        }
156
4.84k
        if (len & 2) {
157
2.95k
            if (COPY) {
158
2.95k
                memcpy(dst, buf, 2);
159
2.95k
                dst += 2;
160
2.95k
            }
161
2.95k
            ADLER_DO2(adler, sum2, buf, 0);
162
2.95k
            buf += 2;
163
2.95k
        }
164
4.84k
        if (len & 1) {
165
2.36k
            if (COPY)
166
2.36k
                *dst = *buf;
167
2.36k
            ADLER_DO1(adler, sum2, buf, 0);
168
2.36k
        }
169
4.84k
    }
170
4.84k
    if (REBASE) {
171
4.84k
        adler %= BASE;
172
4.84k
        sum2 %= BASE;
173
4.84k
    }
174
    /* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
175
4.84k
    return adler | (sum2 << 16);
176
4.84k
}
adler32_avx2.c:adler32_copy_tail
Line
Count
Source
134
24.6k
                                                uint32_t sum2, const int REBASE, const int MAX_LEN, const int COPY) {
135
24.6k
    if (len) {
136
24.3k
        Z_UNUSED(MAX_LEN);
137
        /* Process using packed 64-bit arithmetic when source is aligned */
138
36.0k
        while (len >= 8 && ((uintptr_t)buf & 7) == 0) {
139
11.7k
            size_t chunk = MIN(ALIGN_DOWN(len, (size_t)8), (size_t)ADLER32_SWAR_MAX_BYTES);
140
11.7k
            adler32_swar(&adler, dst, buf, chunk, &sum2, COPY);
141
11.7k
            buf += chunk;
142
11.7k
            if (COPY)
143
3.01k
                dst += chunk;
144
11.7k
            len -= chunk;
145
11.7k
        }
146
        /* DO4 loop avoids GCC x86 register pressure from hoisted DO8/DO16 loads. */
147
34.6k
        while (len >= 4) {
148
10.3k
            if (COPY) {
149
3.39k
                memcpy(dst, buf, 4);
150
3.39k
                dst += 4;
151
3.39k
            }
152
10.3k
            len -= 4;
153
10.3k
            ADLER_DO4(adler, sum2, buf, 0);
154
10.3k
            buf += 4;
155
10.3k
        }
156
24.3k
        if (len & 2) {
157
13.2k
            if (COPY) {
158
3.66k
                memcpy(dst, buf, 2);
159
3.66k
                dst += 2;
160
3.66k
            }
161
13.2k
            ADLER_DO2(adler, sum2, buf, 0);
162
13.2k
            buf += 2;
163
13.2k
        }
164
24.3k
        if (len & 1) {
165
12.0k
            if (COPY)
166
3.36k
                *dst = *buf;
167
12.0k
            ADLER_DO1(adler, sum2, buf, 0);
168
12.0k
        }
169
24.3k
    }
170
24.6k
    if (REBASE) {
171
24.6k
        adler %= BASE;
172
24.6k
        sum2 %= BASE;
173
24.6k
    }
174
    /* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
175
24.6k
    return adler | (sum2 << 16);
176
24.6k
}
Unexecuted instantiation: adler32_avx2_vnni.c:adler32_copy_tail
Unexecuted instantiation: adler32_avx512.c:adler32_copy_tail
Unexecuted instantiation: adler32_avx512_vnni.c:adler32_copy_tail
Unexecuted instantiation: adler32_c.c:adler32_copy_tail
177
178
#endif /* ADLER32_P_H */