Skip to content

Commit 7483ea8

Browse files
committed
generalize truncate and sign_extend to take a Size
1 parent ad2de8b commit 7483ea8

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

src/librustc_mir/hair/pattern/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,8 +1085,9 @@ pub fn compare_const_vals<'a, 'tcx>(
10851085
},
10861086
ty::TyInt(_) => {
10871087
let layout = tcx.layout_of(ty).ok()?;
1088-
let a = interpret::sign_extend(a, layout);
1089-
let b = interpret::sign_extend(b, layout);
1088+
assert!(layout.abi.is_signed());
1089+
let a = interpret::sign_extend(a, layout.size);
1090+
let b = interpret::sign_extend(b, layout.size);
10901091
Some((a as i128).cmp(&(b as i128)))
10911092
},
10921093
_ => Some(a.cmp(&b)),

src/librustc_mir/interpret/eval_context.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,11 +1020,12 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
10201020
}
10211021

10221022
pub fn sign_extend(&self, value: u128, ty: TyLayout<'_>) -> u128 {
1023-
super::sign_extend(value, ty)
1023+
assert!(ty.abi.is_signed());
1024+
super::sign_extend(value, ty.size)
10241025
}
10251026

10261027
pub fn truncate(&self, value: u128, ty: TyLayout<'_>) -> u128 {
1027-
super::truncate(value, ty)
1028+
super::truncate(value, ty.size)
10281029
}
10291030

10301031
fn dump_field_name(&self, s: &mut String, ty: Ty<'tcx>, i: usize, variant: usize) -> ::std::fmt::Result {
@@ -1095,18 +1096,17 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
10951096
}
10961097
}
10971098

1098-
pub fn sign_extend(value: u128, layout: TyLayout<'_>) -> u128 {
1099-
let size = layout.size.bits();
1100-
assert!(layout.abi.is_signed());
1099+
pub fn sign_extend(value: u128, size: Size) -> u128 {
1100+
let size = size.bits();
11011101
// sign extend
11021102
let shift = 128 - size;
11031103
// shift the unsigned value to the left
11041104
// and back to the right as signed (essentially fills with FF on the left)
11051105
(((value << shift) as i128) >> shift) as u128
11061106
}
11071107

1108-
pub fn truncate(value: u128, layout: TyLayout<'_>) -> u128 {
1109-
let size = layout.size.bits();
1108+
pub fn truncate(value: u128, size: Size) -> u128 {
1109+
let size = size.bits();
11101110
let shift = 128 - size;
11111111
// truncate (shift left to drop out leftover values, shift right to fill with zeroes)
11121112
(value << shift) >> shift

0 commit comments

Comments
 (0)