Sync from rust e0d7ed1f45
This commit is contained in:
commit
aeeed8a683
@ -100,9 +100,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
stack = &stack[..index + ENCODE_METADATA.len()];
|
stack = &stack[..index + ENCODE_METADATA.len()];
|
||||||
}
|
}
|
||||||
|
|
||||||
const SUBST_AND_NORMALIZE_ERASING_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::subst_and_normalize_erasing_regions";
|
const INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::instantiate_and_normalize_erasing_regions";
|
||||||
if let Some(index) = stack.find(SUBST_AND_NORMALIZE_ERASING_REGIONS) {
|
if let Some(index) = stack.find(INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS) {
|
||||||
stack = &stack[..index + SUBST_AND_NORMALIZE_ERASING_REGIONS.len()];
|
stack = &stack[..index + INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS.len()];
|
||||||
}
|
}
|
||||||
|
|
||||||
const NORMALIZE_ERASING_LATE_BOUND_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::normalize_erasing_late_bound_regions";
|
const NORMALIZE_ERASING_LATE_BOUND_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::normalize_erasing_late_bound_regions";
|
||||||
|
@ -874,7 +874,7 @@ pub(crate) fn codegen_place<'tcx>(
|
|||||||
PlaceElem::Deref => {
|
PlaceElem::Deref => {
|
||||||
cplace = cplace.place_deref(fx);
|
cplace = cplace.place_deref(fx);
|
||||||
}
|
}
|
||||||
PlaceElem::OpaqueCast(ty) => cplace = cplace.place_opaque_cast(fx, ty),
|
PlaceElem::OpaqueCast(ty) => bug!("encountered OpaqueCast({ty}) in codegen"),
|
||||||
PlaceElem::Field(field, _ty) => {
|
PlaceElem::Field(field, _ty) => {
|
||||||
cplace = cplace.place_field(fx, field);
|
cplace = cplace.place_field(fx, field);
|
||||||
}
|
}
|
||||||
|
@ -358,7 +358,7 @@ pub(crate) fn monomorphize<T>(&self, value: T) -> T
|
|||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
||||||
{
|
{
|
||||||
self.instance.subst_mir_and_normalize_erasing_regions(
|
self.instance.instantiate_mir_and_normalize_erasing_regions(
|
||||||
self.tcx,
|
self.tcx,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
ty::EarlyBinder::bind(value),
|
ty::EarlyBinder::bind(value),
|
||||||
|
@ -21,7 +21,7 @@ fn report_simd_type_validation_error(
|
|||||||
pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
intrinsic: Symbol,
|
intrinsic: Symbol,
|
||||||
_args: GenericArgsRef<'tcx>,
|
generic_args: GenericArgsRef<'tcx>,
|
||||||
args: &[mir::Operand<'tcx>],
|
args: &[mir::Operand<'tcx>],
|
||||||
ret: CPlace<'tcx>,
|
ret: CPlace<'tcx>,
|
||||||
target: BasicBlock,
|
target: BasicBlock,
|
||||||
@ -117,6 +117,54 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// simd_shuffle_generic<T, U, const I: &[u32]>(x: T, y: T) -> U
|
||||||
|
sym::simd_shuffle_generic => {
|
||||||
|
let [x, y] = args else {
|
||||||
|
bug!("wrong number of args for intrinsic {intrinsic}");
|
||||||
|
};
|
||||||
|
let x = codegen_operand(fx, x);
|
||||||
|
let y = codegen_operand(fx, y);
|
||||||
|
|
||||||
|
if !x.layout().ty.is_simd() {
|
||||||
|
report_simd_type_validation_error(fx, intrinsic, span, x.layout().ty);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let idx = generic_args[2]
|
||||||
|
.expect_const()
|
||||||
|
.eval(fx.tcx, ty::ParamEnv::reveal_all(), Some(span))
|
||||||
|
.unwrap()
|
||||||
|
.unwrap_branch();
|
||||||
|
|
||||||
|
assert_eq!(x.layout(), y.layout());
|
||||||
|
let layout = x.layout();
|
||||||
|
|
||||||
|
let (lane_count, lane_ty) = layout.ty.simd_size_and_type(fx.tcx);
|
||||||
|
let (ret_lane_count, ret_lane_ty) = ret.layout().ty.simd_size_and_type(fx.tcx);
|
||||||
|
|
||||||
|
assert_eq!(lane_ty, ret_lane_ty);
|
||||||
|
assert_eq!(idx.len() as u64, ret_lane_count);
|
||||||
|
|
||||||
|
let total_len = lane_count * 2;
|
||||||
|
|
||||||
|
let indexes =
|
||||||
|
idx.iter().map(|idx| idx.unwrap_leaf().try_to_u16().unwrap()).collect::<Vec<u16>>();
|
||||||
|
|
||||||
|
for &idx in &indexes {
|
||||||
|
assert!(u64::from(idx) < total_len, "idx {} out of range 0..{}", idx, total_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (out_idx, in_idx) in indexes.into_iter().enumerate() {
|
||||||
|
let in_lane = if u64::from(in_idx) < lane_count {
|
||||||
|
x.value_lane(fx, in_idx.into())
|
||||||
|
} else {
|
||||||
|
y.value_lane(fx, u64::from(in_idx) - lane_count)
|
||||||
|
};
|
||||||
|
let out_lane = ret.place_lane(fx, u64::try_from(out_idx).unwrap());
|
||||||
|
out_lane.write_cvalue(fx, in_lane);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U
|
// simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U
|
||||||
sym::simd_shuffle => {
|
sym::simd_shuffle => {
|
||||||
let (x, y, idx) = match args {
|
let (x, y, idx) = match args {
|
||||||
|
@ -674,14 +674,6 @@ fn transmute_scalar<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn place_opaque_cast(
|
|
||||||
self,
|
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
|
||||||
ty: Ty<'tcx>,
|
|
||||||
) -> CPlace<'tcx> {
|
|
||||||
CPlace { inner: self.inner, layout: fx.layout_of(ty) }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn place_field(
|
pub(crate) fn place_field(
|
||||||
self,
|
self,
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
|
Loading…
Reference in New Issue
Block a user