From 208c8f58b20650dbfaad521f566ee433b742210a Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Sun, 18 Dec 2016 01:47:38 +0200 Subject: [PATCH] Fix sign-extension in stage1 compiler --- src/librustc_trans/common.rs | 5 +++-- src/librustc_trans/mir/constant.rs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/librustc_trans/common.rs b/src/librustc_trans/common.rs index 79aa56637658..7e7bd15dc6e5 100644 --- a/src/librustc_trans/common.rs +++ b/src/librustc_trans/common.rs @@ -427,13 +427,14 @@ pub fn C_integral(t: Type, u: u64, sign_extend: bool) -> ValueRef { } } -pub fn C_big_integral(t: Type, u: u128) -> ValueRef { +pub fn C_big_integral(t: Type, u: u128, sign_extend: bool) -> ValueRef { if ::std::mem::size_of::() == 16 { unsafe { llvm::LLVMConstIntOfArbitraryPrecision(t.to_ref(), 2, &u as *const u128 as *const u64) } } else { - C_integral(t, u as u64, false) + // SNAP: remove after snapshot + C_integral(t, u as u64, sign_extend) } } diff --git a/src/librustc_trans/mir/constant.rs b/src/librustc_trans/mir/constant.rs index 04f1e4fb8640..700894c255da 100644 --- a/src/librustc_trans/mir/constant.rs +++ b/src/librustc_trans/mir/constant.rs @@ -76,7 +76,7 @@ impl<'tcx> Const<'tcx> { ConstVal::Integral(I16(v)) => C_integral(Type::i16(ccx), v as u64, true), ConstVal::Integral(I32(v)) => C_integral(Type::i32(ccx), v as u64, true), ConstVal::Integral(I64(v)) => C_integral(Type::i64(ccx), v as u64, true), - ConstVal::Integral(I128(v)) => C_big_integral(Type::i128(ccx), v as u128), + ConstVal::Integral(I128(v)) => C_big_integral(Type::i128(ccx), v as u128, true), ConstVal::Integral(Isize(v)) => { let i = v.as_i64(ccx.tcx().sess.target.int_type); C_integral(Type::int(ccx), i as u64, true) @@ -85,7 +85,7 @@ impl<'tcx> Const<'tcx> { ConstVal::Integral(U16(v)) => C_integral(Type::i16(ccx), v as u64, false), ConstVal::Integral(U32(v)) => C_integral(Type::i32(ccx), v as u64, false), ConstVal::Integral(U64(v)) => C_integral(Type::i64(ccx), v, false), - ConstVal::Integral(U128(v)) => C_big_integral(Type::i128(ccx), v), + ConstVal::Integral(U128(v)) => C_big_integral(Type::i128(ccx), v, false), ConstVal::Integral(Usize(v)) => { let u = v.as_u64(ccx.tcx().sess.target.uint_type); C_integral(Type::int(ccx), u, false)