From 1e56d4446560fef29ecb97a2f0a3348e05cbb63e Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Tue, 20 Feb 2018 13:16:36 -0800 Subject: [PATCH] Remember the positive numbers in expand_fcvt_to_sint. We can get an INT_MIN result when converting a positive number that is too large to fit in an integer too. --- lib/cretonne/src/isa/intel/enc_tables.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/cretonne/src/isa/intel/enc_tables.rs b/lib/cretonne/src/isa/intel/enc_tables.rs index 98de07db48..238088698e 100644 --- a/lib/cretonne/src/isa/intel/enc_tables.rs +++ b/lib/cretonne/src/isa/intel/enc_tables.rs @@ -391,6 +391,15 @@ fn expand_fcvt_to_sint( let overflow = pos.ins().fcmp(overflow_cc, x, flimit); pos.ins().trapnz(overflow, ir::TrapCode::IntegerOverflow); + // Finally, we could have a positive value that is too large. + let fzero = match xty { + ir::types::F32 => pos.ins().f32const(Ieee32::with_float(0.0)), + ir::types::F64 => pos.ins().f64const(Ieee64::with_float(0.0)), + _ => panic!("Can't convert {}", xty), + }; + let overflow = pos.ins().fcmp(FloatCC::GreaterThanOrEqual, x, fzero); + pos.ins().trapnz(overflow, ir::TrapCode::IntegerOverflow); + pos.ins().jump(done, &[]); pos.insert_ebb(done);