47 #define SIGN_BIT (0x80000000) 56 static uint8 get_shift(uint8 bit, uint8 length)
58 #ifdef WORDS_BIGENDIAN 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++;
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 void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value)
Write specified value into 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_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.
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.