Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Changes from 2 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d419a5f
Fix pointing at arg when cause is outside of call
VirrageS Dec 1, 2019
e305bf8
Rename tests and add short test description
VirrageS Dec 3, 2019
3594d8b
make htons const fn
tesuji Dec 15, 2019
6ad0b55
Remove now-redundant range check on u128 -> f32 casts
Dec 15, 2019
720b865
[mir-opt] Fix `Inline` pass to handle inlining into `box` expressions
wesleywiser Dec 15, 2019
b50cee3
Move the rest of the mir-opt inline tests into a folder
wesleywiser Dec 15, 2019
aa0ef5a
Fix handling of wasm import modules and names
alexcrichton Dec 16, 2019
e77a55b
Remove outdated references to @T from comments
Dec 17, 2019
71278cb
Remove some unnecessary `ATTR_*` constants.
nnethercote Oct 28, 2019
5891025
Remove `SO_NOSIGPIPE` dummy variable on platforms that don't use it.
reitermarkus Dec 18, 2019
9ce7f80
Allow -Cllvm-args to override rustc's default LLVM args.
michaelwoerister Dec 18, 2019
58352fd
Remove rarely used -Zdisable_instrumentation_preinliner flag.
michaelwoerister Dec 18, 2019
0595fd8
Rollup merge of #67321 - lzutao:htons, r=dtolnay
Mark-Simulacrum Dec 19, 2019
c4fba08
Rollup merge of #67328 - rkruppe:simplify-u128-f32-cast, r=matthewjasper
Mark-Simulacrum Dec 19, 2019
ddd256b
Rollup merge of #67333 - wesleywiser:fix_inline_into_box_place, r=oli…
Mark-Simulacrum Dec 19, 2019
a12ec2e
Rollup merge of #67354 - VirrageS:blame-wrong-line, r=estebank
Mark-Simulacrum Dec 19, 2019
74b1902
Rollup merge of #67363 - alexcrichton:wasm-import-modules, r=eddyb
Mark-Simulacrum Dec 19, 2019
850bd7b
Rollup merge of #67382 - nnethercote:rm-unnecessary-ATTR-constants, r…
Mark-Simulacrum Dec 19, 2019
821dcb9
Rollup merge of #67389 - reitermarkus:dummy-variable, r=shepmaster
Mark-Simulacrum Dec 19, 2019
2d71753
Rollup merge of #67393 - michaelwoerister:llvm-args-override, r=varkor
Mark-Simulacrum Dec 19, 2019
744cd06
Rollup merge of #67394 - matthew-healy:update-libsyntax-ptr-docs, r=D…
Mark-Simulacrum Dec 19, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 7 additions & 36 deletions src/librustc_codegen_ssa/mir/rvalue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,13 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
llval
}
}
(CastTy::Int(_), CastTy::Float) => {
if signed {
bx.sitofp(llval, ll_t_out)
} else {
bx.uitofp(llval, ll_t_out)
}
}
(CastTy::Ptr(_), CastTy::Ptr(_)) |
(CastTy::FnPtr, CastTy::Ptr(_)) |
(CastTy::RPtr(_), CastTy::Ptr(_)) =>
Expand All @@ -352,8 +359,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let usize_llval = bx.intcast(llval, bx.cx().type_isize(), signed);
bx.inttoptr(usize_llval, ll_t_out)
}
(CastTy::Int(_), CastTy::Float) =>
cast_int_to_float(&mut bx, signed, llval, ll_t_in, ll_t_out),
(CastTy::Float, CastTy::Int(IntTy::I)) =>
cast_float_to_int(&mut bx, true, llval, ll_t_in, ll_t_out),
(CastTy::Float, CastTy::Int(_)) =>
Expand Down Expand Up @@ -720,40 +725,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
}
}

fn cast_int_to_float<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
bx: &mut Bx,
signed: bool,
x: Bx::Value,
int_ty: Bx::Type,
float_ty: Bx::Type
) -> Bx::Value {
// Most integer types, even i128, fit into [-f32::MAX, f32::MAX] after rounding.
// It's only u128 -> f32 that can cause overflows (i.e., should yield infinity).
// LLVM's uitofp produces undef in those cases, so we manually check for that case.
let is_u128_to_f32 = !signed &&
bx.cx().int_width(int_ty) == 128 &&
bx.cx().float_width(float_ty) == 32;
if is_u128_to_f32 {
// All inputs greater or equal to (f32::MAX + 0.5 ULP) are rounded to infinity,
// and for everything else LLVM's uitofp works just fine.
use rustc_apfloat::ieee::Single;
const MAX_F32_PLUS_HALF_ULP: u128 = ((1 << (Single::PRECISION + 1)) - 1)
<< (Single::MAX_EXP - Single::PRECISION as i16);
let max = bx.cx().const_uint_big(int_ty, MAX_F32_PLUS_HALF_ULP);
let overflow = bx.icmp(IntPredicate::IntUGE, x, max);
let infinity_bits = bx.cx().const_u32(ieee::Single::INFINITY.to_bits() as u32);
let infinity = bx.bitcast(infinity_bits, float_ty);
let fp = bx.uitofp(x, float_ty);
bx.select(overflow, infinity, fp)
} else {
if signed {
bx.sitofp(x, float_ty)
} else {
bx.uitofp(x, float_ty)
}
}
}

fn cast_float_to_int<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
bx: &mut Bx,
signed: bool,
Expand Down