summaryrefslogtreecommitdiff
path: root/src/codegen/bitfield_unit.rs
diff options
context:
space:
mode:
authorPetr Sumbera <petr.sumbera@oracle.com>2018-06-28 08:48:34 +0000
committerPetr Sumbera <petr.sumbera@oracle.com>2018-06-28 08:48:34 +0000
commit9bd4fb405af87917cb48773e12e9bdeb81fef32c (patch)
treeadb861c9eff010bb926a78e2583507f9f963ab89 /src/codegen/bitfield_unit.rs
parent0176a76fbfc861c70f7e93289c1c114de16e7282 (diff)
Fix bitfields on big-endian machines.
Fixes #1340
Diffstat (limited to 'src/codegen/bitfield_unit.rs')
-rwxr-xr-xsrc/codegen/bitfield_unit.rs30
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);
}
}
}