Skip to content

Commit

Permalink
Auto merge of #39094 - nagisa:i128-fix-endianness, r=eddyb
Browse files Browse the repository at this point in the history
(Shot at) Fix endian bugs in i128 intrinsic impls

Attempt to fix the endianness issues on big-endian machines such as power pc. Could not test if it actually makes stuff work on the powerpc, because setting up cross-compiler for ppc seems to be nigh-impossible on arch.
  • Loading branch information
bors committed Jan 16, 2017
2 parents 2d0baa7 + c032bbf commit 45b273a
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions src/libcompiler_builtins/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ pub mod reimpls {
self.wrapping_shr(32) as i32
}
fn from_parts(low: u32, high: i32) -> i64 {
low as i64 | (high as i64).wrapping_shl(32)
u64::from_parts(low, high as u32) as i64
}
}
#[cfg(not(stage0))]
Expand All @@ -404,11 +404,10 @@ pub mod reimpls {
self as u64
}
fn high(self) -> u64 {
unsafe { *(&self as *const u128 as *const u64).offset(1) }
self.wrapping_shr(64) as u64
}
fn from_parts(low: u64, high: u64) -> u128 {
#[repr(C, packed)] struct Parts(u64, u64);
unsafe { ::core::mem::transmute(Parts(low, high)) }
(high as u128).wrapping_shl(64) | low as u128
}
}
#[cfg(not(stage0))]
Expand All @@ -420,7 +419,7 @@ pub mod reimpls {
self as u64
}
fn high(self) -> i64 {
unsafe { *(&self as *const i128 as *const i64).offset(1) }
self.wrapping_shr(64) as i64
}
fn from_parts(low: u64, high: i64) -> i128 {
u128::from_parts(low, high as u64) as i128
Expand Down

0 comments on commit 45b273a

Please sign in to comment.