fix saturating-conversion op bug in const prop
This commit is contained in:
parent
7614a382cc
commit
e73ce71519
|
@ -697,44 +697,68 @@ pub fn const_eval(
|
||||||
|
|
||||||
(Operator::I32TruncSatF32S, [ConstVal::F32(a)]) => {
|
(Operator::I32TruncSatF32S, [ConstVal::F32(a)]) => {
|
||||||
let a = f32::from_bits(*a);
|
let a = f32::from_bits(*a);
|
||||||
Some(ConstVal::I32(
|
Some(ConstVal::I32(if a.is_nan() {
|
||||||
a.min(i32::MAX as f32).max(i32::MIN as f32) as i32 as u32,
|
0
|
||||||
))
|
} else {
|
||||||
|
a.min(i32::MAX as f32).max(i32::MIN as f32) as i32 as u32
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I32TruncSatF32U, [ConstVal::F32(a)]) => {
|
(Operator::I32TruncSatF32U, [ConstVal::F32(a)]) => {
|
||||||
let a = f32::from_bits(*a);
|
let a = f32::from_bits(*a);
|
||||||
Some(ConstVal::I32(a.min(u32::MAX as f32) as u32))
|
Some(ConstVal::I32(if a.is_nan() {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
a.min(u32::MAX as f32).max(0.0) as u32
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I32TruncSatF64S, [ConstVal::F64(a)]) => {
|
(Operator::I32TruncSatF64S, [ConstVal::F64(a)]) => {
|
||||||
let a = f64::from_bits(*a);
|
let a = f64::from_bits(*a);
|
||||||
Some(ConstVal::I32(
|
Some(ConstVal::I32(if a.is_nan() {
|
||||||
a.min(i32::MAX as f64).max(i32::MIN as f64) as i32 as u32,
|
0
|
||||||
))
|
} else {
|
||||||
|
a.min(i32::MAX as f64).max(i32::MIN as f64) as i32 as u32
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I32TruncSatF64U, [ConstVal::F64(a)]) => {
|
(Operator::I32TruncSatF64U, [ConstVal::F64(a)]) => {
|
||||||
let a = f64::from_bits(*a);
|
let a = f64::from_bits(*a);
|
||||||
Some(ConstVal::I32(a.min(u32::MAX as f64) as u32))
|
Some(ConstVal::I32(if a.is_nan() {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
a.min(u32::MAX as f64).max(0.0) as u32
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
(Operator::I64TruncSatF32S, [ConstVal::F32(a)]) => {
|
(Operator::I64TruncSatF32S, [ConstVal::F32(a)]) => {
|
||||||
let a = f32::from_bits(*a);
|
let a = f32::from_bits(*a);
|
||||||
Some(ConstVal::I64(
|
Some(ConstVal::I64(if a.is_nan() {
|
||||||
a.min(i64::MAX as f32).max(i64::MIN as f32) as i64 as u64,
|
0
|
||||||
))
|
} else {
|
||||||
|
a.min(i64::MAX as f32).max(i64::MIN as f32) as i64 as u64
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I64TruncSatF32U, [ConstVal::F32(a)]) => {
|
(Operator::I64TruncSatF32U, [ConstVal::F32(a)]) => {
|
||||||
let a = f32::from_bits(*a);
|
let a = f32::from_bits(*a);
|
||||||
Some(ConstVal::I64(a.min(u64::MAX as f32) as u64))
|
Some(ConstVal::I64(if a.is_nan() {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
a.min(u64::MAX as f32).max(0.0) as u64
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I64TruncSatF64S, [ConstVal::F64(a)]) => {
|
(Operator::I64TruncSatF64S, [ConstVal::F64(a)]) => {
|
||||||
let a = f64::from_bits(*a);
|
let a = f64::from_bits(*a);
|
||||||
Some(ConstVal::I64(
|
Some(ConstVal::I64(if a.is_nan() {
|
||||||
a.min(i64::MAX as f64).max(i64::MIN as f64) as i64 as u64,
|
0
|
||||||
))
|
} else {
|
||||||
|
a.min(i64::MAX as f64).max(i64::MIN as f64) as i64 as u64
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
(Operator::I64TruncSatF64U, [ConstVal::F64(a)]) => {
|
(Operator::I64TruncSatF64U, [ConstVal::F64(a)]) => {
|
||||||
let a = f64::from_bits(*a);
|
let a = f64::from_bits(*a);
|
||||||
Some(ConstVal::I64(a.min(u64::MAX as f64) as u64))
|
Some(ConstVal::I64(if a.is_nan() {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
a.min(u64::MAX as f64).max(0.0) as u64
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
(Operator::F32ConvertI32S, [ConstVal::I32(a)]) => {
|
(Operator::F32ConvertI32S, [ConstVal::I32(a)]) => {
|
||||||
|
|
Loading…
Reference in a new issue