43 #include <architecture/byte_order.h> 46 #elif !defined(_WIN32) && !defined(_WIN64) 47 #include <arpa/nameser_compat.h> 60 #define SIGN_BIT (0x80000000) 69 static uint8 get_shift(uint8 bit, uint8 length)
71 #if BYTE_ORDER == LITTLE_ENDIAN 73 #elif BYTE_ORDER == BIG_ENDIAN 74 return 64 - length - bit;
76 #error "Bit packing code isn't written for your byte order." 88 #if defined(__arm) || defined(__arm__) 90 const uint8 *base_off = (
const uint8 *)(address.base) + (address.offset >> 3);
91 memcpy(&value64, base_off,
sizeof(value64));
94 return *(
const uint64*)((
const uint8 *)(address.base) + (address.offset >> 3));
100 return (read_off(address) >> get_shift(address.offset & 7, length)) & mask;
105 #if defined(__arm) || defined(__arm__) 107 uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3);
108 memcpy(&value64, base_off,
sizeof(value64));
109 value64 |= (value << get_shift(address.offset & 7, length));
110 memcpy(base_off, &value64,
sizeof(value64));
112 *(uint64 *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length));
118 #if defined(__arm) || defined(__arm__) 120 const uint8 *base_off = (
const uint8_t*)(address.base) + (address.offset >> 3);
121 memcpy(&value32, base_off,
sizeof(value32));
122 return (value32 >> get_shift(address.offset & 7, length)) & mask;
124 return (*(
const uint32_t*)((
const uint8_t*)(address.base) + (address.offset >> 3)) >> get_shift(address.offset & 7, length)) & mask;
130 #if defined(__arm) || defined(__arm__) 132 uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3);
133 memcpy(&value32, base_off,
sizeof(value32));
134 value32 |= (value << get_shift(address.offset & 7, length));
135 memcpy(base_off, &value32,
sizeof(value32));
137 *(uint32_t *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length));
144 encoded.i = (uint32)(read_off(address) >> get_shift(address.offset & 7, 31));
146 encoded.i |= SIGN_BIT;
154 encoded.i &= ~SIGN_BIT;
161 encoded.i = (uint32)(read_off(address) >> get_shift(address.offset & 7, 32));
175 bit_mask->mask = (uint32)((1ULL << bit_mask->bits) - 1);
182 if (!max_value)
return 0;
184 while (max_value >>= 1) res++;
SPHINXBASE_EXPORT void bitarr_write_negfloat(bitarr_address_t address, float value)
Writes non positive float32 to bit array.
SPHINXBASE_EXPORT void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value)
Fills mask for certain int range according to provided max value.
SPHINXBASE_EXPORT uint8 bitarr_required_bits(uint32 max_value)
Computes amount of bits required ti store integers upto value provided.
SPHINXBASE_EXPORT float bitarr_read_negfloat(bitarr_address_t address)
Read non positive float32 from bit array.
SPHINXBASE_EXPORT void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value)
Write specified value into bit array.
Union to map float to integer to store latter in bit array.
Structure that stores address of certain value in bit array.
SPHINXBASE_EXPORT uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask)
Read uint32 value from bit array.
SPHINXBASE_EXPORT void bitarr_write_float(bitarr_address_t address, float value)
Writes float32 to bit array.
SPHINXBASE_EXPORT void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value)
Write specified value into bit array.
Structure that specifies bits required to efficiently store certain data.
SPHINXBASE_EXPORT float bitarr_read_float(bitarr_address_t address)
Reads float32 from bit array.
An implementation bit array - memory efficient storage for digit int and float data.
SPHINXBASE_EXPORT uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask)
Read uint64 value from bit array.