Coverage Report

Created: 2024-07-27 06:17

/src/lzma-fuzz/sdk/C/7zCrcOpt.c
Line
Count
Source (jump to first uncovered line)
1
/* 7zCrcOpt.c -- CRC32 calculation
2
2017-04-03 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include "CpuArch.h"
7
8
#ifndef MY_CPU_BE
9
10
343k
#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
11
12
UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table)
13
0
{
14
0
  const Byte *p = (const Byte *)data;
15
0
  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
16
0
    v = CRC_UPDATE_BYTE_2(v, *p);
17
0
  for (; size >= 4; size -= 4, p += 4)
18
0
  {
19
0
    v ^= *(const UInt32 *)p;
20
0
    v =
21
0
          (table + 0x300)[((v      ) & 0xFF)]
22
0
        ^ (table + 0x200)[((v >>  8) & 0xFF)]
23
0
        ^ (table + 0x100)[((v >> 16) & 0xFF)]
24
0
        ^ (table + 0x000)[((v >> 24))];
25
0
  }
26
0
  for (; size > 0; size--, p++)
27
0
    v = CRC_UPDATE_BYTE_2(v, *p);
28
0
  return v;
29
0
}
30
31
UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table)
32
196k
{
33
196k
  const Byte *p = (const Byte *)data;
34
370k
  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)
35
173k
    v = CRC_UPDATE_BYTE_2(v, *p);
36
75.0M
  for (; size >= 8; size -= 8, p += 8)
37
74.8M
  {
38
74.8M
    UInt32 d;
39
74.8M
    v ^= *(const UInt32 *)p;
40
74.8M
    v =
41
74.8M
          (table + 0x700)[((v      ) & 0xFF)]
42
74.8M
        ^ (table + 0x600)[((v >>  8) & 0xFF)]
43
74.8M
        ^ (table + 0x500)[((v >> 16) & 0xFF)]
44
74.8M
        ^ (table + 0x400)[((v >> 24))];
45
74.8M
    d = *((const UInt32 *)p + 1);
46
74.8M
    v ^=
47
74.8M
          (table + 0x300)[((d      ) & 0xFF)]
48
74.8M
        ^ (table + 0x200)[((d >>  8) & 0xFF)]
49
74.8M
        ^ (table + 0x100)[((d >> 16) & 0xFF)]
50
74.8M
        ^ (table + 0x000)[((d >> 24))];
51
74.8M
  }
52
365k
  for (; size > 0; size--, p++)
53
169k
    v = CRC_UPDATE_BYTE_2(v, *p);
54
196k
  return v;
55
196k
}
56
57
#endif
58
59
60
#ifndef MY_CPU_LE
61
62
#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))
63
64
#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8))
65
66
UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table)
67
{
68
  const Byte *p = (const Byte *)data;
69
  table += 0x100;
70
  v = CRC_UINT32_SWAP(v);
71
  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
72
    v = CRC_UPDATE_BYTE_2_BE(v, *p);
73
  for (; size >= 4; size -= 4, p += 4)
74
  {
75
    v ^= *(const UInt32 *)p;
76
    v =
77
          (table + 0x000)[((v      ) & 0xFF)]
78
        ^ (table + 0x100)[((v >>  8) & 0xFF)]
79
        ^ (table + 0x200)[((v >> 16) & 0xFF)]
80
        ^ (table + 0x300)[((v >> 24))];
81
  }
82
  for (; size > 0; size--, p++)
83
    v = CRC_UPDATE_BYTE_2_BE(v, *p);
84
  return CRC_UINT32_SWAP(v);
85
}
86
87
UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table)
88
{
89
  const Byte *p = (const Byte *)data;
90
  table += 0x100;
91
  v = CRC_UINT32_SWAP(v);
92
  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)
93
    v = CRC_UPDATE_BYTE_2_BE(v, *p);
94
  for (; size >= 8; size -= 8, p += 8)
95
  {
96
    UInt32 d;
97
    v ^= *(const UInt32 *)p;
98
    v =
99
          (table + 0x400)[((v      ) & 0xFF)]
100
        ^ (table + 0x500)[((v >>  8) & 0xFF)]
101
        ^ (table + 0x600)[((v >> 16) & 0xFF)]
102
        ^ (table + 0x700)[((v >> 24))];
103
    d = *((const UInt32 *)p + 1);
104
    v ^=
105
          (table + 0x000)[((d      ) & 0xFF)]
106
        ^ (table + 0x100)[((d >>  8) & 0xFF)]
107
        ^ (table + 0x200)[((d >> 16) & 0xFF)]
108
        ^ (table + 0x300)[((d >> 24))];
109
  }
110
  for (; size > 0; size--, p++)
111
    v = CRC_UPDATE_BYTE_2_BE(v, *p);
112
  return CRC_UINT32_SWAP(v);
113
}
114
115
#endif