From 7483ea817648d0b8faa49d49e5df69fb66b2638d Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 14 Aug 2018 20:38:30 +0200 Subject: [PATCH] generalize truncate and sign_extend to take a Size --- src/librustc_mir/hair/pattern/mod.rs | 5 +++-- src/librustc_mir/interpret/eval_context.rs | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs index dda589fd20d..0bb0faf0848 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir/hair/pattern/mod.rs @@ -1085,8 +1085,9 @@ pub fn compare_const_vals<'a, 'tcx>( }, ty::TyInt(_) => { let layout = tcx.layout_of(ty).ok()?; - let a = interpret::sign_extend(a, layout); - let b = interpret::sign_extend(b, layout); + assert!(layout.abi.is_signed()); + let a = interpret::sign_extend(a, layout.size); + let b = interpret::sign_extend(b, layout.size); Some((a as i128).cmp(&(b as i128))) }, _ => Some(a.cmp(&b)), diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index cede6d4b22b..2ccd04370c8 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -1020,11 +1020,12 @@ pub fn generate_stacktrace(&self, explicit_span: Option) -> (Vec) -> u128 { - super::sign_extend(value, ty) + assert!(ty.abi.is_signed()); + super::sign_extend(value, ty.size) } pub fn truncate(&self, value: u128, ty: TyLayout<'_>) -> u128 { - super::truncate(value, ty) + super::truncate(value, ty.size) } fn dump_field_name(&self, s: &mut String, ty: Ty<'tcx>, i: usize, variant: usize) -> ::std::fmt::Result { @@ -1095,9 +1096,8 @@ fn dump_field_name(&self, s: &mut String, ty: Ty<'tcx>, i: usize, variant: usize } } -pub fn sign_extend(value: u128, layout: TyLayout<'_>) -> u128 { - let size = layout.size.bits(); - assert!(layout.abi.is_signed()); +pub fn sign_extend(value: u128, size: Size) -> u128 { + let size = size.bits(); // sign extend let shift = 128 - size; // shift the unsigned value to the left @@ -1105,8 +1105,8 @@ pub fn sign_extend(value: u128, layout: TyLayout<'_>) -> u128 { (((value << shift) as i128) >> shift) as u128 } -pub fn truncate(value: u128, layout: TyLayout<'_>) -> u128 { - let size = layout.size.bits(); +pub fn truncate(value: u128, size: Size) -> u128 { + let size = size.bits(); let shift = 128 - size; // truncate (shift left to drop out leftover values, shift right to fill with zeroes) (value << shift) >> shift -- GitLab