Rollup merge of #128731 - RalfJung:simd-shuffle-vector, r=workingjubilee
simd_shuffle intrinsic: allow argument to be passed as vector
See https://github.com/rust-lang/rust/issues/128738 for context.
I'd like to get rid of [this hack](6c0b89dfac/compiler/rustc_codegen_ssa/src/mir/block.rs (L922-L935)
). https://github.com/rust-lang/rust/pull/128537 almost lets us do that since constant SIMD vectors will then be passed as immediate arguments. However, simd_shuffle for some reason actually takes an *array* as argument, not a vector, so the hack is still required to ensure that the array becomes an immediate (which then later stages of codegen convert into a vector, as that's what LLVM needs).
This PR prepares simd_shuffle to also support a vector as the `idx` argument. Once this lands, stdarch can hopefully be updated to pass `idx` as a vector, and then support for arrays can be removed, which finally lets us get rid of that hack.
This commit is contained in:
commit
8a26d21ce2
@ -191,6 +191,14 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
|||||||
})
|
})
|
||||||
.try_into()
|
.try_into()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
|
_ if idx_ty.is_simd()
|
||||||
|
&& matches!(
|
||||||
|
idx_ty.simd_size_and_type(fx.tcx).1.kind(),
|
||||||
|
ty::Uint(ty::UintTy::U32)
|
||||||
|
) =>
|
||||||
|
{
|
||||||
|
idx_ty.simd_size_and_type(fx.tcx).0.try_into().unwrap()
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
fx.tcx.dcx().span_err(
|
fx.tcx.dcx().span_err(
|
||||||
span,
|
span,
|
||||||
@ -213,6 +221,8 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
|
|||||||
|
|
||||||
let total_len = lane_count * 2;
|
let total_len = lane_count * 2;
|
||||||
|
|
||||||
|
// FIXME: this is a terrible abstraction-breaking hack.
|
||||||
|
// Find a way to reuse `immediate_const_vector` from `codegen_ssa` instead.
|
||||||
let indexes = {
|
let indexes = {
|
||||||
use rustc_middle::mir::interpret::*;
|
use rustc_middle::mir::interpret::*;
|
||||||
let idx_const = match &idx.node {
|
let idx_const = match &idx.node {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user