rustc_middle: add Scalar::from_i8
and Scalar::from_i16
and use them in Miri
This commit is contained in:
parent
76e59c71e8
commit
68687e2535
@ -266,6 +266,16 @@ pub fn from_int(i: impl Into<i128>, size: Size) -> Self {
|
|||||||
.unwrap_or_else(|| bug!("Signed value {:#x} does not fit in {} bits", i, size.bits()))
|
.unwrap_or_else(|| bug!("Signed value {:#x} does not fit in {} bits", i, size.bits()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn from_i8(i: i8) -> Self {
|
||||||
|
Self::from_int(i, Size::from_bits(8))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn from_i16(i: i16) -> Self {
|
||||||
|
Self::from_int(i, Size::from_bits(16))
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn from_i32(i: i32) -> Self {
|
pub fn from_i32(i: i32) -> Self {
|
||||||
Self::from_int(i, Size::from_bits(32))
|
Self::from_int(i, Size::from_bits(32))
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
use rustc_middle::ty::layout::LayoutOf as _;
|
use rustc_middle::ty::layout::LayoutOf as _;
|
||||||
use rustc_middle::ty::Ty;
|
use rustc_middle::ty::Ty;
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use rustc_target::abi::Size;
|
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
use super::FloatCmpOp;
|
use super::FloatCmpOp;
|
||||||
@ -112,7 +111,7 @@ fn emulate_x86_sse2_intrinsic(
|
|||||||
|
|
||||||
// Values are expanded from i16 to i32, so multiplication cannot overflow.
|
// Values are expanded from i16 to i32, so multiplication cannot overflow.
|
||||||
let res = i32::from(left).checked_mul(i32::from(right)).unwrap() >> 16;
|
let res = i32::from(left).checked_mul(i32::from(right)).unwrap() >> 16;
|
||||||
this.write_scalar(Scalar::from_int(res, Size::from_bits(16)), &dest)?;
|
this.write_scalar(Scalar::from_i16(res.try_into().unwrap()), &dest)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Used to implement the _mm_mulhi_epu16 function.
|
// Used to implement the _mm_mulhi_epu16 function.
|
||||||
@ -431,11 +430,8 @@ enum ShiftOp {
|
|||||||
let right_res =
|
let right_res =
|
||||||
i8::try_from(right).unwrap_or(if right < 0 { i8::MIN } else { i8::MAX });
|
i8::try_from(right).unwrap_or(if right < 0 { i8::MIN } else { i8::MAX });
|
||||||
|
|
||||||
this.write_scalar(Scalar::from_int(left_res, Size::from_bits(8)), &left_dest)?;
|
this.write_scalar(Scalar::from_i8(left_res.try_into().unwrap()), &left_dest)?;
|
||||||
this.write_scalar(
|
this.write_scalar(Scalar::from_i8(right_res.try_into().unwrap()), &right_dest)?;
|
||||||
Scalar::from_int(right_res, Size::from_bits(8)),
|
|
||||||
&right_dest,
|
|
||||||
)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Used to implement the _mm_packus_epi16 function.
|
// Used to implement the _mm_packus_epi16 function.
|
||||||
@ -495,9 +491,9 @@ enum ShiftOp {
|
|||||||
let right_res =
|
let right_res =
|
||||||
i16::try_from(right).unwrap_or(if right < 0 { i16::MIN } else { i16::MAX });
|
i16::try_from(right).unwrap_or(if right < 0 { i16::MIN } else { i16::MAX });
|
||||||
|
|
||||||
this.write_scalar(Scalar::from_int(left_res, Size::from_bits(16)), &left_dest)?;
|
this.write_scalar(Scalar::from_i16(left_res.try_into().unwrap()), &left_dest)?;
|
||||||
this.write_scalar(
|
this.write_scalar(
|
||||||
Scalar::from_int(right_res, Size::from_bits(16)),
|
Scalar::from_i16(right_res.try_into().unwrap()),
|
||||||
&right_dest,
|
&right_dest,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user