14#ifndef BITSTREAM_H_MODULE
15#define BITSTREAM_H_MODULE
17#if defined (__cplusplus)
39#ifndef ZSTD_NO_INTRINSICS
40# if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__)
41# include <immintrin.h>
42# elif defined(__ICCARM__)
43# include <intrinsics.h>
47#define STREAM_ACCUMULATOR_MIN_32 25
48#define STREAM_ACCUMULATOR_MIN_64 57
49#define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64))
95 unsigned bitsConsumed;
137static const unsigned BIT_mask[] = {
138 0, 1, 3, 7, 0xF, 0x1F,
139 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF,
140 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF,
141 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
142 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF,
143 0x3FFFFFFF, 0x7FFFFFFF};
144#define BIT_MASK_SIZE (sizeof(BIT_mask) / sizeof(BIT_mask[0]))
154 void* startPtr,
size_t dstCapacity)
167#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS)
168 return _bzhi_u64(bitContainer, nbBits);
171 return bitContainer & BIT_mask[nbBits];
179 size_t value,
unsigned nbBits)
192 size_t value,
unsigned nbBits)
194 assert((value>>nbBits) == 0);
205 size_t const nbBytes = bitC->
bitPos >> 3;
209 bitC->
ptr += nbBytes;
221 size_t const nbBytes = bitC->
bitPos >> 3;
225 bitC->
ptr += nbBytes;
256 bitD->
start = (
const char*)srcBuffer;
264 if (lastByte == 0)
return ERROR(GENERIC); }
279 case 4: bitD->
bitContainer += (size_t)(((
const BYTE*)(srcBuffer))[3]) << 24;
282 case 3: bitD->
bitContainer += (size_t)(((
const BYTE*)(srcBuffer))[2]) << 16;
292 if (lastByte == 0)
return ERROR(corruption_detected);
302 return bitContainer >>
start;
307 U32 const regMask =
sizeof(bitContainer)*8 - 1;
315#if defined(__x86_64__) || defined(_M_X86)
316 return (bitContainer >> (
start & regMask)) & ((((
U64)1) << nbBits) - 1);
318 return (bitContainer >> (
start & regMask)) & BIT_mask[nbBits];
414 if (bitD->
ptr - nbBytes < bitD->
start) {
418 bitD->
ptr -= nbBytes;
433#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 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
MEM_STATIC U32 ZSTD_highbit32(U32 val)
Definition zstd_internal.h:363