Merge commit '97e504549371d7640cf011d266e3c17394fdddac' into sync_cg_clif-2021-12-20
This commit is contained in:
@@ -67,7 +67,34 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
||||
_ if intrinsic.as_str().starts_with("simd_shuffle"), (c x, c y, o idx) {
|
||||
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
|
||||
|
||||
let n: u16 = intrinsic.as_str()["simd_shuffle".len()..].parse().unwrap();
|
||||
// If this intrinsic is the older "simd_shuffleN" form, simply parse the integer.
|
||||
// If there is no suffix, use the index array length.
|
||||
let n: u16 = if intrinsic == sym::simd_shuffle {
|
||||
// Make sure this is actually an array, since typeck only checks the length-suffixed
|
||||
// version of this intrinsic.
|
||||
let idx_ty = fx.monomorphize(idx.ty(fx.mir, fx.tcx));
|
||||
match idx_ty.kind() {
|
||||
ty::Array(ty, len) if matches!(ty.kind(), ty::Uint(ty::UintTy::U32)) => {
|
||||
len.try_eval_usize(fx.tcx, ty::ParamEnv::reveal_all()).unwrap_or_else(|| {
|
||||
span_bug!(span, "could not evaluate shuffle index array length")
|
||||
}).try_into().unwrap()
|
||||
}
|
||||
_ => {
|
||||
fx.tcx.sess.span_err(
|
||||
span,
|
||||
&format!(
|
||||
"simd_shuffle index must be an array of `u32`, got `{}`",
|
||||
idx_ty,
|
||||
),
|
||||
);
|
||||
// Prevent verifier error
|
||||
crate::trap::trap_unreachable(fx, "compilation should not have succeeded");
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
intrinsic.as_str()["simd_shuffle".len()..].parse().unwrap()
|
||||
};
|
||||
|
||||
assert_eq!(x.layout(), y.layout());
|
||||
let layout = x.layout();
|
||||
@@ -378,27 +405,27 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
||||
};
|
||||
|
||||
simd_reduce_min, (c v) {
|
||||
// FIXME support floats
|
||||
validate_simd_type!(fx, intrinsic, span, v.layout().ty);
|
||||
simd_reduce(fx, v, None, ret, |fx, layout, a, b| {
|
||||
let lt = fx.bcx.ins().icmp(if layout.ty.is_signed() {
|
||||
IntCC::SignedLessThan
|
||||
} else {
|
||||
IntCC::UnsignedLessThan
|
||||
}, a, b);
|
||||
let lt = match layout.ty.kind() {
|
||||
ty::Int(_) => fx.bcx.ins().icmp(IntCC::SignedLessThan, a, b),
|
||||
ty::Uint(_) => fx.bcx.ins().icmp(IntCC::UnsignedLessThan, a, b),
|
||||
ty::Float(_) => fx.bcx.ins().fcmp(FloatCC::LessThan, a, b),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
fx.bcx.ins().select(lt, a, b)
|
||||
});
|
||||
};
|
||||
|
||||
simd_reduce_max, (c v) {
|
||||
// FIXME support floats
|
||||
validate_simd_type!(fx, intrinsic, span, v.layout().ty);
|
||||
simd_reduce(fx, v, None, ret, |fx, layout, a, b| {
|
||||
let gt = fx.bcx.ins().icmp(if layout.ty.is_signed() {
|
||||
IntCC::SignedGreaterThan
|
||||
} else {
|
||||
IntCC::UnsignedGreaterThan
|
||||
}, a, b);
|
||||
let gt = match layout.ty.kind() {
|
||||
ty::Int(_) => fx.bcx.ins().icmp(IntCC::SignedGreaterThan, a, b),
|
||||
ty::Uint(_) => fx.bcx.ins().icmp(IntCC::UnsignedGreaterThan, a, b),
|
||||
ty::Float(_) => fx.bcx.ins().fcmp(FloatCC::GreaterThan, a, b),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
fx.bcx.ins().select(gt, a, b)
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user