335 const Simd128ShuffleOp& shuffle) {
337 return Next::ReduceInputGraphSimd128Shuffle(ig_index, shuffle);
341 if (shuffle.kind != Simd128ShuffleOp::Kind::kI8x16)
goto no_change;
343 auto og_left =
__ MapToNewGraph(shuffle.left());
344 auto og_right =
__ MapToNewGraph(shuffle.right());
345 std::array<uint8_t, kSimd128Size> shuffle_bytes = {0};
346 std::copy(shuffle.shuffle, shuffle.shuffle +
kSimd128Size,
347 shuffle_bytes.begin());
348#if V8_ENABLE_WASM_DEINTERLEAVED_MEM_OPS
349 if (
auto maybe_deinterleaved_load = IsDeinterleaveLoadShuffle(&shuffle)) {
350 const auto* deinterleaved_load = maybe_deinterleaved_load.value();
351 return __ Projection(deinterleaved_load->og_index,
352 deinterleaved_load->result_index,
359 bool does_shuffle_into_low_half =
360 analyzer_->DoesShuffleIntoLowHalf(&shuffle);
361 bool does_shuffle_into_high_half =
362 analyzer_->DoesShuffleIntoHighHalf(&shuffle);
366 if (does_shuffle_into_low_half && does_shuffle_into_high_half) {
383 std::transform(shuffle_bytes.begin(), shuffle_bytes.end(),
384 shuffle_bytes.begin(),
385 [](uint8_t lane) { return lane - half_lanes; });
386 }
else if (does_shuffle_into_low_half) {
388 analyzer_->ShouldRewriteShuffleToLow(shuffle.right()));
390 analyzer_->ShouldRewriteShuffleToLow(shuffle.right()));
408 std::transform(shuffle_bytes.begin(), shuffle_bytes.begin() + half_lanes,
409 shuffle_bytes.begin(),
410 [](uint8_t lane) { return lane - half_lanes; });
411 }
else if (does_shuffle_into_high_half) {
413 analyzer_->ShouldRewriteShuffleToLow(shuffle.right()));
415 analyzer_->ShouldRewriteShuffleToLow(shuffle.right()));
430 std::transform(shuffle_bytes.begin() + half_lanes, shuffle_bytes.end(),
431 shuffle_bytes.begin() + half_lanes,
432 [](uint8_t lane) { return lane - half_lanes; });
435 if (does_shuffle_into_low_half || does_shuffle_into_high_half) {
437 Simd128ShuffleOp::Kind::kI8x16,
438 shuffle_bytes.data());
442 if (
auto maybe_lanes =
analyzer_->DemandedByteLanes(&shuffle)) {
443 auto lanes = maybe_lanes.value();
444 if (
analyzer_->ShouldRewriteShuffleToLow(&shuffle)) {
448 std::copy(shuffle.shuffle + half_lanes, shuffle.shuffle +
kSimd128Size,
449 shuffle_bytes.begin());
452 std::copy(shuffle.shuffle, shuffle.shuffle + half_lanes,
453 shuffle_bytes.begin());
458 Simd128ShuffleOp::Kind::kI8x2,
459 shuffle_bytes.data());
462 Simd128ShuffleOp::Kind::kI8x4,
463 shuffle_bytes.data());
466 Simd128ShuffleOp::Kind::kI8x8,
467 shuffle_bytes.data());