14#ifndef BITSTREAM_H_MODULE
15#define BITSTREAM_H_MODULE
17#if defined (__cplusplus)
38#ifndef ZSTD_NO_INTRINSICS
39# if defined(__BMI__) && defined(__GNUC__)
40# include <immintrin.h>
41# elif defined(__ICCARM__)
42# include <intrinsics.h>
46#define STREAM_ACCUMULATOR_MIN_32 25
47#define STREAM_ACCUMULATOR_MIN_64 57
48#define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64))
144# if defined(_MSC_VER)
146 return _lzcnt_u32(val) ^ 31;
150 _BitScanReverse(&r, val);
157# elif defined(__GNUC__) && (__GNUC__ >= 3)
158 return __builtin_clz (val) ^ 31;
159# elif defined(__ICCARM__)
160 return 31 - __CLZ(val);
162 static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29,
163 11, 14, 16, 18, 22, 25, 3, 30,
164 8, 12, 20, 28, 15, 17, 24, 7,
165 19, 27, 23, 6, 26, 5, 4, 31 };
172 return DeBruijnClz[ (
U32) (v * 0x07C4ACDDU) >> 27];
178static const unsigned BIT_mask[] = {
179 0, 1, 3, 7, 0xF, 0x1F,
180 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF,
181 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF,
182 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
183 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF,
184 0x3FFFFFFF, 0x7FFFFFFF};
185#define BIT_MASK_SIZE (sizeof(BIT_mask) / sizeof(BIT_mask[0]))
195 void* startPtr,
size_t dstCapacity)
210 size_t value,
unsigned nbBits)
223 size_t value,
unsigned nbBits)
225 assert((value>>nbBits) == 0);
236 size_t const nbBytes = bitC->
bitPos >> 3;
240 bitC->
ptr += nbBytes;
252 size_t const nbBytes = bitC->
bitPos >> 3;
256 bitC->
ptr += nbBytes;
287 bitD->
start = (
const char*)srcBuffer;
295 if (lastByte == 0)
return ERROR(GENERIC); }
310 case 4: bitD->
bitContainer += (size_t)(((
const BYTE*)(srcBuffer))[3]) << 24;
313 case 3: bitD->
bitContainer += (size_t)(((
const BYTE*)(srcBuffer))[2]) << 16;
323 if (lastByte == 0)
return ERROR(corruption_detected);
333 return bitContainer >>
start;
338 U32 const regMask =
sizeof(bitContainer)*8 - 1;
346#if defined(__x86_64__) || defined(_M_X86)
347 return (bitContainer >> (
start & regMask)) & ((((
U64)1) << nbBits) - 1);
349 return (bitContainer >> (
start & regMask)) & BIT_mask[nbBits];
355#if defined(STATIC_BMI2) && STATIC_BMI2 == 1
356 return _bzhi_u64(bitContainer, nbBits);
359 return bitContainer & BIT_mask[nbBits];
455 if (bitD->
ptr - nbBytes < bitD->
start) {
459 bitD->
ptr -= nbBytes;
474#if defined (__cplusplus)
unsigned char BYTE
Definition lz4.c:314
unsigned int U32
Definition lz4.c:316
#define assert(condition)
Definition lz4.c:273
char int srcSize
Definition lz4.h:806
Definition bitstream.h:58
char * ptr
Definition bitstream.h:62
size_t bitContainer
Definition bitstream.h:59
char * endPtr
Definition bitstream.h:63
unsigned bitPos
Definition bitstream.h:60
char * startPtr
Definition bitstream.h:61
Definition bitstream.h:92
size_t bitContainer
Definition bitstream.h:93
const char * ptr
Definition bitstream.h:95
const char * limitPtr
Definition bitstream.h:97
const char * start
Definition bitstream.h:96
unsigned bitsConsumed
Definition bitstream.h:94
#define ZSTD_FALLTHROUGH
Definition compiler.h:239
#define FORCE_INLINE_ATTR
Definition compiler.h:33
#define U64(C)
Definition sha512_k.c:107
MEM_STATIC size_t MEM_readLEST(const void *memPtr)
Definition mem.h:189
MEM_STATIC void MEM_writeLEST(void *memPtr, size_t val)
Definition mem.h:197
#define MEM_STATIC
Definition mem.h:27
#define ZSTD_memset(d, s, n)
Definition zstd_deps.h:34
#define UNLIKELY(x)
Definition Likely.h:27
MEM_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, size_t srcSize)
Definition bitstream.h:283
MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t *bitC)
Definition bitstream.h:265
MEM_STATIC unsigned BIT_highbit32(U32 val)
Definition bitstream.h:140
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t *bitD)
Definition bitstream.h:440
MEM_STATIC size_t BIT_readBits(BIT_DStream_t *bitD, unsigned nbBits)
Definition bitstream.h:401
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
Definition bitstream.h:353
MEM_STATIC void BIT_flushBits(BIT_CStream_t *bitC)
Definition bitstream.h:250
BIT_DStream_status
Definition bitstream.h:100
@ BIT_DStream_endOfBuffer
Definition bitstream.h:101
@ BIT_DStream_overflow
Definition bitstream.h:103
@ BIT_DStream_unfinished
Definition bitstream.h:100
@ BIT_DStream_completed
Definition bitstream.h:102
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_lookBits(const BIT_DStream_t *bitD, U32 nbBits)
Definition bitstream.h:369
MEM_STATIC size_t BIT_initCStream(BIT_CStream_t *bitC, void *dstBuffer, size_t dstCapacity)
Definition bitstream.h:194
MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t *bitD, unsigned nbBits)
Definition bitstream.h:410
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t *bitD)
Definition bitstream.h:469
MEM_STATIC void BIT_addBits(BIT_CStream_t *bitC, size_t value, unsigned nbBits)
Definition bitstream.h:209
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
Definition bitstream.h:336
#define BIT_MASK_SIZE
Definition bitstream.h:185
MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t *bitD, U32 nbBits)
Definition bitstream.h:392
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getUpperBits(size_t bitContainer, U32 const start)
Definition bitstream.h:331
MEM_STATIC void BIT_addBitsFast(BIT_CStream_t *bitC, size_t value, unsigned nbBits)
Definition bitstream.h:222
MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t *bitD, U32 nbBits)
Definition bitstream.h:385
MEM_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t *bitD)
Definition bitstream.h:424
MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t *bitC)
Definition bitstream.h:234
#define DEBUG_STATIC_ASSERT(c)
Definition debug.h:43