47#define SIGN_BIT (0x80000000)
56static uint8 get_shift(uint8 bit, uint8 length)
59 return 64 - length - bit;
72#if defined(__arm) || defined(__arm__)
74 const uint8 *base_off = (
const uint8 *)(address.base) + (address.offset >> 3);
75 memcpy(&value64, base_off,
sizeof(value64));
78 return *(
const uint64*)((
const uint8 *)(address.base) + (address.offset >> 3));
84 return (read_off(address) >> get_shift(address.offset & 7, length)) & mask;
89#if defined(__arm) || defined(__arm__)
91 uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3);
92 memcpy(&value64, base_off,
sizeof(value64));
93 value64 |= (value << get_shift(address.offset & 7, length));
94 memcpy(base_off, &value64,
sizeof(value64));
96 *(uint64 *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length));
102#if defined(__arm) || defined(__arm__)
104 const uint8 *base_off = (
const uint8*)(address.base) + (address.offset >> 3);
105 memcpy(&value32, base_off,
sizeof(value32));
106 return (value32 >> get_shift(address.offset & 7, length)) & mask;
108 return (*(
const uint32*)((
const uint8*)(address.base) + (address.offset >> 3)) >> get_shift(address.offset & 7, length)) & mask;
114#if defined(__arm) || defined(__arm__)
116 uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3);
117 memcpy(&value32, base_off,
sizeof(value32));
118 value32 |= (value << get_shift(address.offset & 7, length));
119 memcpy(base_off, &value32,
sizeof(value32));
121 *(uint32 *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length));
128 bit_mask->mask = (uint32)((1ULL << bit_mask->bits) - 1);
135 if (!max_value)
return 0;
137 while (max_value >>= 1) res++;
An implementation bit array - memory efficient storage for digit int and float data.
SPHINXBASE_EXPORT void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value)
Write specified value into bit array.
SPHINXBASE_EXPORT uint8 bitarr_required_bits(uint32 max_value)
Computes amount of bits required ti store integers upto value provided.
SPHINXBASE_EXPORT uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask)
Read uint64 value from 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_int25(bitarr_address_t address, uint8 length, uint32 value)
Write specified value into 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.
Structure that stores address of certain value in bit array.
Structure that specifies bits required to efficiently store certain data.