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++;