Skip to content

Commit c032bbf

Browse files
committed
Fix endian bugs in i128 intrinsic impls
1 parent 3dcb288 commit c032bbf

File tree

1 file changed

+4
-5
lines changed
  • src/libcompiler_builtins

1 file changed

+4
-5
lines changed

src/libcompiler_builtins/lib.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ pub mod reimpls {
392392
self.wrapping_shr(32) as i32
393393
}
394394
fn from_parts(low: u32, high: i32) -> i64 {
395-
low as i64 | (high as i64).wrapping_shl(32)
395+
u64::from_parts(low, high as u32) as i64
396396
}
397397
}
398398
#[cfg(not(stage0))]
@@ -404,11 +404,10 @@ pub mod reimpls {
404404
self as u64
405405
}
406406
fn high(self) -> u64 {
407-
unsafe { *(&self as *const u128 as *const u64).offset(1) }
407+
self.wrapping_shr(64) as u64
408408
}
409409
fn from_parts(low: u64, high: u64) -> u128 {
410-
#[repr(C, packed)] struct Parts(u64, u64);
411-
unsafe { ::core::mem::transmute(Parts(low, high)) }
410+
(high as u128).wrapping_shl(64) | low as u128
412411
}
413412
}
414413
#[cfg(not(stage0))]
@@ -420,7 +419,7 @@ pub mod reimpls {
420419
self as u64
421420
}
422421
fn high(self) -> i64 {
423-
unsafe { *(&self as *const i128 as *const i64).offset(1) }
422+
self.wrapping_shr(64) as i64
424423
}
425424
fn from_parts(low: u64, high: i64) -> i128 {
426425
u128::from_parts(low, high as u64) as i128

0 commit comments

Comments
 (0)