diff options
author | Petr Sumbera <petr.sumbera@oracle.com> | 2018-06-28 08:48:34 +0000 |
---|---|---|
committer | Petr Sumbera <petr.sumbera@oracle.com> | 2018-06-28 08:48:34 +0000 |
commit | 9bd4fb405af87917cb48773e12e9bdeb81fef32c (patch) | |
tree | adb861c9eff010bb926a78e2583507f9f963ab89 /src/codegen/bitfield_unit.rs | |
parent | 0176a76fbfc861c70f7e93289c1c114de16e7282 (diff) |
Fix bitfields on big-endian machines.
Fixes #1340
Diffstat (limited to 'src/codegen/bitfield_unit.rs')
-rwxr-xr-x | src/codegen/bitfield_unit.rs | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/codegen/bitfield_unit.rs b/src/codegen/bitfield_unit.rs index 3c7c9b7b..5256be07 100755 --- a/src/codegen/bitfield_unit.rs +++ b/src/codegen/bitfield_unit.rs @@ -27,7 +27,12 @@ where let byte_index = index / 8; let byte = self.storage.as_ref()[byte_index]; - let bit_index = index % 8; + let mut bit_index = index % 8; + #[cfg(target_endian = "big")] + { + // Adjust the index for endianness. + bit_index = 7 - bit_index; + } let mask = 1 << bit_index; byte & mask == mask @@ -40,7 +45,12 @@ where let byte_index = index / 8; let byte = &mut self.storage.as_mut()[byte_index]; - let bit_index = index % 8; + let mut bit_index = index % 8; + #[cfg(target_endian = "big")] + { + // Adjust the index for endianness. + bit_index = 7 - bit_index; + } let mask = 1 << bit_index; if val { @@ -60,7 +70,13 @@ where for i in 0..(bit_width as usize) { if self.get_bit(i + bit_offset) { - val |= 1 << i; + let mut index = i; + #[cfg(target_endian = "big")] + { + // Adjust the index for endianness. + index = bit_width as usize - 1 - index; + } + val |= 1 << index; } } @@ -76,7 +92,13 @@ where for i in 0..(bit_width as usize) { let mask = 1 << i; let val_bit_is_set = val & mask == mask; - self.set_bit(i + bit_offset, val_bit_is_set); + let mut index = i; + #[cfg(target_endian = "big")] + { + // Adjust the index for endianness. + index = bit_width as usize - 1 - index; + } + self.set_bit(index + bit_offset, val_bit_is_set); } } } |