brintos

brintos / llvm-project-archived public Read only

0
0
Text · 167.0 KiB · 111b3fd Raw
2403 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -force-streaming -enable-subreg-liveness -verify-machineinstrs < %s | FileCheck %s3 4target triple="aarch64-linux-gnu"5 6 7; == Multi, multi (unsigned) ==8 9define void @udot_multi_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3) #0 {10; CHECK-LABEL: udot_multi_za32_u16_vg1x2:11; CHECK:       // %bb.0:12; CHECK-NEXT:    mov z5.d, z4.d13; CHECK-NEXT:    mov z7.d, z2.d14; CHECK-NEXT:    mov w8, w015; CHECK-NEXT:    mov z4.d, z3.d16; CHECK-NEXT:    mov z6.d, z1.d17; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z6.h, z7.h }, { z4.h, z5.h }18; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z6.h, z7.h }, { z4.h, z5.h }19; CHECK-NEXT:    ret20  call void @llvm.aarch64.sme.udot.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)21  %slice2 = add i32 %slice, 722  call void @llvm.aarch64.sme.udot.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)23  ret void24}25 26define void @udot_multi_za32_u16_vg1x2_tuple(i64 %stride, ptr %ptr) #1 {27; CHECK-LABEL: udot_multi_za32_u16_vg1x2_tuple:28; CHECK:       // %bb.0: // %entry29; CHECK-NEXT:    ptrue pn8.b30; CHECK-NEXT:    mov w8, wzr31; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x1]32; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x1, x0]33; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z16.b, z17.b }, { z24.b, z25.b }34; CHECK-NEXT:    ret35entry:36  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()37  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)38  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 039  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 140  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride41  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)42  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 043  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 144  call void @llvm.aarch64.sme.udot.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6)45  ret void46}47 48define void @udot_multi_za32_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,49; CHECK-LABEL: udot_multi_za32_u16_vg1x4:50; CHECK:       // %bb.0:51; CHECK-NEXT:    mov z26.d, z7.d52; CHECK-NEXT:    mov z25.d, z6.d53; CHECK-NEXT:    ldr z27, [x1]54; CHECK-NEXT:    mov z7.d, z4.d55; CHECK-NEXT:    mov z24.d, z5.d56; CHECK-NEXT:    mov w8, w057; CHECK-NEXT:    mov z6.d, z3.d58; CHECK-NEXT:    mov z5.d, z2.d59; CHECK-NEXT:    mov z4.d, z1.d60; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z4.h - z7.h }, { z24.h - z27.h }61; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z4.h - z7.h }, { z24.h - z27.h }62; CHECK-NEXT:    ret63                                        <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7) #0 {64  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,65                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)66  %slice2 = add i32 %slice, 767  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,68                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)69  ret void70}71 72define void @udot_multi_za32_u16_vg1x4_tuple(i64 %stride, ptr %ptr) #1 {73; CHECK-LABEL: udot_multi_za32_u16_vg1x4_tuple:74; CHECK:       // %bb.0: // %entry75; CHECK-NEXT:    lsl x9, x0, #176; CHECK-NEXT:    ptrue pn8.b77; CHECK-NEXT:    mov w8, wzr78; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x1]79; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x1, x0]80; CHECK-NEXT:    add x10, x9, x081; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x1, x9]82; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x1, x10]83; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z16.b - z19.b }, { z20.b - z23.b }84; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z24.b - z27.b }, { z28.b - z31.b }85; CHECK-NEXT:    ret86entry:87  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()88  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)89  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 090  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 191  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 292  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 393  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride94  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)95  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 096  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 197  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 298  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 399  %mul3 = shl i64 %stride, 1100  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3101  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)102  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 0103  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 1104  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 2105  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 3106  %mul5 = mul i64 %stride, 3107  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5108  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)109  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 0110  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 1111  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 2112  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 3113  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17,114                                                      <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18)115  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19,116                                                      <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20)117  ret void118}119 120define void @udot_multi_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3) #0 {121; CHECK-LABEL: udot_multi_za32_u8_vg1x2:122; CHECK:       // %bb.0:123; CHECK-NEXT:    mov z5.d, z4.d124; CHECK-NEXT:    mov z7.d, z2.d125; CHECK-NEXT:    mov w8, w0126; CHECK-NEXT:    mov z4.d, z3.d127; CHECK-NEXT:    mov z6.d, z1.d128; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z6.b, z7.b }, { z4.b, z5.b }129; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z6.b, z7.b }, { z4.b, z5.b }130; CHECK-NEXT:    ret131  call void @llvm.aarch64.sme.udot.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)132  %slice2 = add i32 %slice, 7133  call void @llvm.aarch64.sme.udot.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)134  ret void135}136 137define void @udot_multi_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,138; CHECK-LABEL: udot_multi_za32_u8_vg1x4:139; CHECK:       // %bb.0:140; CHECK-NEXT:    mov z26.d, z7.d141; CHECK-NEXT:    mov z25.d, z6.d142; CHECK-NEXT:    ldr z27, [x1]143; CHECK-NEXT:    mov z7.d, z4.d144; CHECK-NEXT:    mov z24.d, z5.d145; CHECK-NEXT:    mov w8, w0146; CHECK-NEXT:    mov z6.d, z3.d147; CHECK-NEXT:    mov z5.d, z2.d148; CHECK-NEXT:    mov z4.d, z1.d149; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z4.b - z7.b }, { z24.b - z27.b }150; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z4.b - z7.b }, { z24.b - z27.b }151; CHECK-NEXT:    ret152                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7) #0 {153  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,154                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)155  %slice2 = add i32 %slice, 7156  call void @llvm.aarch64.sme.udot.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,157                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)158  ret void159}160 161define void @udot_multi_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3) #1 {162; CHECK-LABEL: udot_multi_za64_u16_vg1x2:163; CHECK:       // %bb.0:164; CHECK-NEXT:    mov z5.d, z4.d165; CHECK-NEXT:    mov z7.d, z2.d166; CHECK-NEXT:    mov w8, w0167; CHECK-NEXT:    mov z4.d, z3.d168; CHECK-NEXT:    mov z6.d, z1.d169; CHECK-NEXT:    udot za.d[w8, 0, vgx2], { z6.h, z7.h }, { z4.h, z5.h }170; CHECK-NEXT:    udot za.d[w8, 7, vgx2], { z6.h, z7.h }, { z4.h, z5.h }171; CHECK-NEXT:    ret172  call void @llvm.aarch64.sme.udot.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)173  %slice2 = add i32 %slice, 7174  call void @llvm.aarch64.sme.udot.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)175  ret void176}177 178define void @udot_multi_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,179; CHECK-LABEL: udot_multi_za64_u16_vg1x4:180; CHECK:       // %bb.0:181; CHECK-NEXT:    mov z26.d, z7.d182; CHECK-NEXT:    mov z25.d, z6.d183; CHECK-NEXT:    ldr z27, [x1]184; CHECK-NEXT:    mov z7.d, z4.d185; CHECK-NEXT:    mov z24.d, z5.d186; CHECK-NEXT:    mov w8, w0187; CHECK-NEXT:    mov z6.d, z3.d188; CHECK-NEXT:    mov z5.d, z2.d189; CHECK-NEXT:    mov z4.d, z1.d190; CHECK-NEXT:    udot za.d[w8, 0, vgx4], { z4.h - z7.h }, { z24.h - z27.h }191; CHECK-NEXT:    udot za.d[w8, 7, vgx4], { z4.h - z7.h }, { z24.h - z27.h }192; CHECK-NEXT:    ret193                                       <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7) #1 {194  call void @llvm.aarch64.sme.udot.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,195                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)196  %slice2 = add i32 %slice, 7197  call void @llvm.aarch64.sme.udot.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,198                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)199  ret void200}201 202define void @usdot_multi_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3) #0 {203; CHECK-LABEL: usdot_multi_za32_u8_vg1x2:204; CHECK:       // %bb.0:205; CHECK-NEXT:    mov z5.d, z4.d206; CHECK-NEXT:    mov z7.d, z2.d207; CHECK-NEXT:    mov w8, w0208; CHECK-NEXT:    mov z4.d, z3.d209; CHECK-NEXT:    mov z6.d, z1.d210; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z6.b, z7.b }, { z4.b, z5.b }211; CHECK-NEXT:    usdot za.s[w8, 7, vgx2], { z6.b, z7.b }, { z4.b, z5.b }212; CHECK-NEXT:    ret213  call void @llvm.aarch64.sme.usdot.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)214  %slice2 = add i32 %slice, 7215  call void @llvm.aarch64.sme.usdot.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)216  ret void217}218 219define void @usdot_multi_za32_u16_vg1x2_tuple(i64 %stride, ptr %ptr) #1 {220; CHECK-LABEL: usdot_multi_za32_u16_vg1x2_tuple:221; CHECK:       // %bb.0: // %entry222; CHECK-NEXT:    ptrue pn8.b223; CHECK-NEXT:    mov w8, wzr224; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x1]225; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x1, x0]226; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z16.b, z17.b }, { z24.b, z25.b }227; CHECK-NEXT:    ret228entry:229  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()230  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)231  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0232  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1233  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride234  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)235  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 0236  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 1237  call void @llvm.aarch64.sme.usdot.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6)238  ret void239}240 241define void @usdot_multi_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,242; CHECK-LABEL: usdot_multi_za32_u8_vg1x4:243; CHECK:       // %bb.0:244; CHECK-NEXT:    mov z26.d, z7.d245; CHECK-NEXT:    mov z25.d, z6.d246; CHECK-NEXT:    ldr z27, [x1]247; CHECK-NEXT:    mov z7.d, z4.d248; CHECK-NEXT:    mov z24.d, z5.d249; CHECK-NEXT:    mov w8, w0250; CHECK-NEXT:    mov z6.d, z3.d251; CHECK-NEXT:    mov z5.d, z2.d252; CHECK-NEXT:    mov z4.d, z1.d253; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z4.b - z7.b }, { z24.b - z27.b }254; CHECK-NEXT:    usdot za.s[w8, 7, vgx4], { z4.b - z7.b }, { z24.b - z27.b }255; CHECK-NEXT:    ret256                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7) #0 {257  call void @llvm.aarch64.sme.usdot.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,258                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)259  %slice2 = add i32 %slice, 7260  call void @llvm.aarch64.sme.usdot.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,261                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)262  ret void263}264 265define void @usdot_multi_za32_u16_vg1x4_tuple(i64 %stride, ptr %ptr) #1 {266; CHECK-LABEL: usdot_multi_za32_u16_vg1x4_tuple:267; CHECK:       // %bb.0: // %entry268; CHECK-NEXT:    lsl x9, x0, #1269; CHECK-NEXT:    ptrue pn8.b270; CHECK-NEXT:    mov w8, wzr271; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x1]272; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x1, x0]273; CHECK-NEXT:    add x10, x9, x0274; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x1, x9]275; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x1, x10]276; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z16.b - z19.b }, { z20.b - z23.b }277; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z24.b - z27.b }, { z28.b - z31.b }278; CHECK-NEXT:    ret279entry:280  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()281  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)282  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0283  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1284  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 2285  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 3286  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride287  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)288  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 0289  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 1290  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 2291  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 3292  %mul3 = shl i64 %stride, 1293  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3294  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)295  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 0296  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 1297  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 2298  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 3299  %mul5 = mul i64 %stride, 3300  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5301  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)302  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 0303  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 1304  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 2305  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 3306  call void @llvm.aarch64.sme.usdot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17,307                                                      <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18)308  call void @llvm.aarch64.sme.usdot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19,309                                                      <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20)310  ret void311}312 313; == Multi, multi (signed) ==314 315define void @sdot_multi_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3) #0 {316; CHECK-LABEL: sdot_multi_za32_u16_vg1x2:317; CHECK:       // %bb.0:318; CHECK-NEXT:    mov z5.d, z4.d319; CHECK-NEXT:    mov z7.d, z2.d320; CHECK-NEXT:    mov w8, w0321; CHECK-NEXT:    mov z4.d, z3.d322; CHECK-NEXT:    mov z6.d, z1.d323; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z6.h, z7.h }, { z4.h, z5.h }324; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z6.h, z7.h }, { z4.h, z5.h }325; CHECK-NEXT:    ret326  call void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)327  %slice2 = add i32 %slice, 7328  call void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)329  ret void330}331 332define void @sdot_multi_za32_u16_vg1x2_tuple(i64 %stride, ptr %ptr) #0 {333; CHECK-LABEL: sdot_multi_za32_u16_vg1x2_tuple:334; CHECK:       // %bb.0: // %entry335; CHECK-NEXT:    ptrue pn8.b336; CHECK-NEXT:    mov w8, wzr337; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x1]338; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x1, x0]339; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z16.b, z17.b }, { z24.b, z25.b }340; CHECK-NEXT:    ret341entry:342  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()343  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)344  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0345  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1346  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride347  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)348  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 0349  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 1350  call void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6)351  ret void352}353 354define void @sdot_multi_za32_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,355; CHECK-LABEL: sdot_multi_za32_u16_vg1x4:356; CHECK:       // %bb.0:357; CHECK-NEXT:    mov z26.d, z7.d358; CHECK-NEXT:    mov z25.d, z6.d359; CHECK-NEXT:    ldr z27, [x1]360; CHECK-NEXT:    mov z7.d, z4.d361; CHECK-NEXT:    mov z24.d, z5.d362; CHECK-NEXT:    mov w8, w0363; CHECK-NEXT:    mov z6.d, z3.d364; CHECK-NEXT:    mov z5.d, z2.d365; CHECK-NEXT:    mov z4.d, z1.d366; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z4.h - z7.h }, { z24.h - z27.h }367; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z4.h - z7.h }, { z24.h - z27.h }368; CHECK-NEXT:    ret369                                        <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7) #0 {370  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,371                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)372  %slice2 = add i32 %slice, 7373  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,374                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)375  ret void376}377 378define void @sdot_multi_za32_u16_vg1x4_tuple(i64 %stride, ptr %ptr) #0 {379; CHECK-LABEL: sdot_multi_za32_u16_vg1x4_tuple:380; CHECK:       // %bb.0: // %entry381; CHECK-NEXT:    lsl x9, x0, #1382; CHECK-NEXT:    ptrue pn8.b383; CHECK-NEXT:    mov w8, wzr384; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x1]385; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x1, x0]386; CHECK-NEXT:    add x10, x9, x0387; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x1, x9]388; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x1, x10]389; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z16.b - z19.b }, { z20.b - z23.b }390; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.b - z27.b }, { z28.b - z31.b }391; CHECK-NEXT:    ret392entry:393  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()394  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)395  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0396  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1397  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 2398  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 3399  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride400  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)401  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 0402  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 1403  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 2404  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 3405  %mul3 = shl i64 %stride, 1406  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3407  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)408  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 0409  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 1410  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 2411  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 3412  %mul5 = mul i64 %stride, 3413  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5414  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)415  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 0416  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 1417  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 2418  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 3419  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17,420                                                      <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18)421  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19,422                                                      <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20)423  ret void424}425 426define void @sdot_multi_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3) #0 {427; CHECK-LABEL: sdot_multi_za32_u8_vg1x2:428; CHECK:       // %bb.0:429; CHECK-NEXT:    mov z5.d, z4.d430; CHECK-NEXT:    mov z7.d, z2.d431; CHECK-NEXT:    mov w8, w0432; CHECK-NEXT:    mov z4.d, z3.d433; CHECK-NEXT:    mov z6.d, z1.d434; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z6.b, z7.b }, { z4.b, z5.b }435; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z6.b, z7.b }, { z4.b, z5.b }436; CHECK-NEXT:    ret437  call void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)438  %slice2 = add i32 %slice, 7439  call void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3)440  ret void441}442 443define void @sdot_multi_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,444; CHECK-LABEL: sdot_multi_za32_u8_vg1x4:445; CHECK:       // %bb.0:446; CHECK-NEXT:    mov z26.d, z7.d447; CHECK-NEXT:    mov z25.d, z6.d448; CHECK-NEXT:    ldr z27, [x1]449; CHECK-NEXT:    mov z7.d, z4.d450; CHECK-NEXT:    mov z24.d, z5.d451; CHECK-NEXT:    mov w8, w0452; CHECK-NEXT:    mov z6.d, z3.d453; CHECK-NEXT:    mov z5.d, z2.d454; CHECK-NEXT:    mov z4.d, z1.d455; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z4.b - z7.b }, { z24.b - z27.b }456; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z4.b - z7.b }, { z24.b - z27.b }457; CHECK-NEXT:    ret458                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7) #0 {459  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,460                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)461  %slice2 = add i32 %slice, 7462  call void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,463                                                      <vscale x 16 x i8> %zn4, <vscale x 16 x i8> %zn5, <vscale x 16 x i8> %zn6, <vscale x 16 x i8> %zn7)464  ret void465}466 467define void @sdot_multi_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3) #1 {468; CHECK-LABEL: sdot_multi_za64_u16_vg1x2:469; CHECK:       // %bb.0:470; CHECK-NEXT:    mov z5.d, z4.d471; CHECK-NEXT:    mov z7.d, z2.d472; CHECK-NEXT:    mov w8, w0473; CHECK-NEXT:    mov z4.d, z3.d474; CHECK-NEXT:    mov z6.d, z1.d475; CHECK-NEXT:    sdot za.d[w8, 0, vgx2], { z6.h, z7.h }, { z4.h, z5.h }476; CHECK-NEXT:    sdot za.d[w8, 7, vgx2], { z6.h, z7.h }, { z4.h, z5.h }477; CHECK-NEXT:    ret478  call void @llvm.aarch64.sme.sdot.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)479  %slice2 = add i32 %slice, 7480  call void @llvm.aarch64.sme.sdot.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3)481  ret void482}483 484define void @sdot_multi_za64_u16_vg1x2_tuple(i64 %stride, ptr %ptr) #1 {485; CHECK-LABEL: sdot_multi_za64_u16_vg1x2_tuple:486; CHECK:       // %bb.0: // %entry487; CHECK-NEXT:    ptrue pn8.b488; CHECK-NEXT:    add x9, x1, x0489; CHECK-NEXT:    mov w8, wzr490; CHECK-NEXT:    ld1h { z16.h, z24.h }, pn8/z, [x1]491; CHECK-NEXT:    ld1h { z17.h, z25.h }, pn8/z, [x9]492; CHECK-NEXT:    sdot za.d[w8, 0, vgx2], { z16.h, z17.h }, { z24.h, z25.h }493; CHECK-NEXT:    ret494entry:495  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()496  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)497  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0498  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1499  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride500  %4 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)501  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 0502  %6 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 1503  call void @llvm.aarch64.sme.sdot.za64.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %5, <vscale x 8 x i16> %3, <vscale x 8 x i16> %6)504  ret void505}506 507define void @sdot_multi_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,508; CHECK-LABEL: sdot_multi_za64_u16_vg1x4:509; CHECK:       // %bb.0:510; CHECK-NEXT:    mov z26.d, z7.d511; CHECK-NEXT:    mov z25.d, z6.d512; CHECK-NEXT:    ldr z27, [x1]513; CHECK-NEXT:    mov z7.d, z4.d514; CHECK-NEXT:    mov z24.d, z5.d515; CHECK-NEXT:    mov w8, w0516; CHECK-NEXT:    mov z6.d, z3.d517; CHECK-NEXT:    mov z5.d, z2.d518; CHECK-NEXT:    mov z4.d, z1.d519; CHECK-NEXT:    sdot za.d[w8, 0, vgx4], { z4.h - z7.h }, { z24.h - z27.h }520; CHECK-NEXT:    sdot za.d[w8, 7, vgx4], { z4.h - z7.h }, { z24.h - z27.h }521; CHECK-NEXT:    ret522                                       <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7) #1 {523  call void @llvm.aarch64.sme.sdot.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,524                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)525  %slice2 = add i32 %slice, 7526  call void @llvm.aarch64.sme.sdot.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,527                                                      <vscale x 8 x i16> %zn4, <vscale x 8 x i16> %zn5, <vscale x 8 x i16> %zn6, <vscale x 8 x i16> %zn7)528  ret void529}530 531define void @sdot_multi_za64_u16_vg1x4_tuple(i64 %stride, ptr %ptr) #1 {532; CHECK-LABEL: sdot_multi_za64_u16_vg1x4_tuple:533; CHECK:       // %bb.0: // %entry534; CHECK-NEXT:    add x9, x0, x0, lsl #1535; CHECK-NEXT:    ptrue pn8.b536; CHECK-NEXT:    add x10, x1, x0537; CHECK-NEXT:    ld1h { z16.h, z20.h, z24.h, z28.h }, pn8/z, [x1]538; CHECK-NEXT:    ld1h { z17.h, z21.h, z25.h, z29.h }, pn8/z, [x10]539; CHECK-NEXT:    ld1h { z18.h, z22.h, z26.h, z30.h }, pn8/z, [x1, x0, lsl #1]540; CHECK-NEXT:    add x9, x1, x9541; CHECK-NEXT:    mov w8, wzr542; CHECK-NEXT:    ld1h { z19.h, z23.h, z27.h, z31.h }, pn8/z, [x9]543; CHECK-NEXT:    sdot za.d[w8, 0, vgx4], { z16.h - z19.h }, { z20.h - z23.h }544; CHECK-NEXT:    sdot za.d[w8, 0, vgx4], { z24.h - z27.h }, { z28.h - z31.h }545; CHECK-NEXT:    ret546entry:547  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()548  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)549  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0550  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1551  %4 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 2552  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 3553  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride554  %6 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)555  %7 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 0556  %8 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 1557  %9 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 2558  %10 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 3559  %mul3 = shl i64 %stride, 1560  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3561  %11 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx4)562  %12 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 0563  %13 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 1564  %14 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 2565  %15 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 3566  %mul5 = mul i64 %stride, 3567  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5568  %16 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx6)569  %17 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 0570  %18 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 1571  %19 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 2572  %20 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 3573  call void @llvm.aarch64.sme.sdot.za64.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %7, <vscale x 8 x i16> %12, <vscale x 8 x i16> %17,574                                                      <vscale x 8 x i16> %3, <vscale x 8 x i16> %8, <vscale x 8 x i16> %13, <vscale x 8 x i16> %18)575  call void @llvm.aarch64.sme.sdot.za64.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %4, <vscale x 8 x i16> %9, <vscale x 8 x i16> %14, <vscale x 8 x i16> %19,576                                                      <vscale x 8 x i16> %5, <vscale x 8 x i16> %10, <vscale x 8 x i16> %15, <vscale x 8 x i16> %20)577  ret void578}579 580; == Multi, single (unsigned) ==581 582define void @udot_single_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #0 {583; CHECK-LABEL: udot_single_za32_u16_vg1x2:584; CHECK:       // %bb.0:585; CHECK-NEXT:    mov w8, w0586; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z1.h, z2.h }, z3.h587; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z1.h, z2.h }, z3.h588; CHECK-NEXT:    ret589  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)590  %slice2 = add i32 %slice, 7591  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)592  ret void593}594 595define void @udot_single_za32_u16_vg1x2_tuple(ptr %ptr, i64 %stride, <vscale x 8 x i16> %zn) #0 {596; CHECK-LABEL: udot_single_za32_u16_vg1x2_tuple:597; CHECK:       // %bb.0: // %entry598; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill599; CHECK-NEXT:    addvl sp, sp, #-3600; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill601; CHECK-NEXT:    ptrue pn8.b602; CHECK-NEXT:    add x9, x0, x1603; CHECK-NEXT:    str z10, [sp, #1, mul vl] // 16-byte Folded Spill604; CHECK-NEXT:    mov w8, wzr605; CHECK-NEXT:    str z9, [sp, #2, mul vl] // 16-byte Folded Spill606; CHECK-NEXT:    ld1h { z1.h, z9.h }, pn8/z, [x0]607; CHECK-NEXT:    ld1h { z2.h, z10.h }, pn8/z, [x9]608; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z1.h, z2.h }, z0.h609; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z9.h, z10.h }, z0.h610; CHECK-NEXT:    ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload611; CHECK-NEXT:    ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload612; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload613; CHECK-NEXT:    addvl sp, sp, #3614; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload615; CHECK-NEXT:    ret616entry:617  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()618  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)619  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0620  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1621  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride622  %4 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)623  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 0624  %6 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 1625  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %5, <vscale x 8 x i16> %zn)626  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %3, <vscale x 8 x i16> %6, <vscale x 8 x i16> %zn)627  ret void628}629 630define void @udot_single_za32_u16_vg1x2_x4load_x2tuple(ptr %ptr, i64 %stride, <vscale x 8 x i16> %zn) #0 {631; CHECK-LABEL: udot_single_za32_u16_vg1x2_x4load_x2tuple:632; CHECK:       // %bb.0: // %entry633; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill634; CHECK-NEXT:    addvl sp, sp, #-5635; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill636; CHECK-NEXT:    ptrue pn8.b637; CHECK-NEXT:    add x9, x0, x1638; CHECK-NEXT:    str z14, [sp, #1, mul vl] // 16-byte Folded Spill639; CHECK-NEXT:    mov w8, wzr640; CHECK-NEXT:    str z13, [sp, #2, mul vl] // 16-byte Folded Spill641; CHECK-NEXT:    str z10, [sp, #3, mul vl] // 16-byte Folded Spill642; CHECK-NEXT:    str z9, [sp, #4, mul vl] // 16-byte Folded Spill643; CHECK-NEXT:    ld1h { z1.h, z5.h, z9.h, z13.h }, pn8/z, [x0]644; CHECK-NEXT:    ld1h { z2.h, z6.h, z10.h, z14.h }, pn8/z, [x9]645; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z1.h, z2.h }, z0.h646; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z5.h, z6.h }, z0.h647; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z9.h, z10.h }, z0.h648; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z13.h, z14.h }, z0.h649; CHECK-NEXT:    ldr z14, [sp, #1, mul vl] // 16-byte Folded Reload650; CHECK-NEXT:    ldr z13, [sp, #2, mul vl] // 16-byte Folded Reload651; CHECK-NEXT:    ldr z10, [sp, #3, mul vl] // 16-byte Folded Reload652; CHECK-NEXT:    ldr z9, [sp, #4, mul vl] // 16-byte Folded Reload653; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload654; CHECK-NEXT:    addvl sp, sp, #5655; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload656; CHECK-NEXT:    ret657entry:658  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()659  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)660  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0661  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1662  %4 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 2663  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 3664  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride665  %6 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)666  %7 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 0667  %8 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 1668  %9 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 2669  %10 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 3670  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %7, <vscale x 8 x i16> %zn)671  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %3, <vscale x 8 x i16> %8, <vscale x 8 x i16> %zn)672  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %4, <vscale x 8 x i16> %9, <vscale x 8 x i16> %zn)673  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %5, <vscale x 8 x i16> %10, <vscale x 8 x i16> %zn)674  ret void675}676 677define void @udot_single_za32_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #0 {678; CHECK-LABEL: udot_single_za32_u16_vg1x4:679; CHECK:       // %bb.0:680; CHECK-NEXT:    mov w8, w0681; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z1.h - z4.h }, z5.h682; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z1.h - z4.h }, z5.h683; CHECK-NEXT:    ret684  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)685  %slice2 = add i32 %slice, 7686  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)687  ret void688}689 690define void @udot_single_za32_u16_vg1x4_tuple(ptr %ptr, i64 %stride, <vscale x 8 x i16> %zn) #0 {691; CHECK-LABEL: udot_single_za32_u16_vg1x4_tuple:692; CHECK:       // %bb.0: // %entry693; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill694; CHECK-NEXT:    addvl sp, sp, #-9695; CHECK-NEXT:    add x9, x1, x1, lsl #1696; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill697; CHECK-NEXT:    ptrue pn8.b698; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill699; CHECK-NEXT:    add x10, x0, x1700; CHECK-NEXT:    mov w8, wzr701; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill702; CHECK-NEXT:    add x9, x0, x9703; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill704; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill705; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill706; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill707; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill708; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill709; CHECK-NEXT:    ld1h { z16.h, z20.h, z24.h, z28.h }, pn8/z, [x0]710; CHECK-NEXT:    ld1h { z17.h, z21.h, z25.h, z29.h }, pn8/z, [x10]711; CHECK-NEXT:    ld1h { z18.h, z22.h, z26.h, z30.h }, pn8/z, [x0, x1, lsl #1]712; CHECK-NEXT:    ld1h { z19.h, z23.h, z27.h, z31.h }, pn8/z, [x9]713; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z16.h - z19.h }, z0.h714; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z20.h - z23.h }, z0.h715; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z24.h - z27.h }, z0.h716; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z28.h - z31.h }, z0.h717; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload718; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload719; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload720; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload721; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload722; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload723; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload724; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload725; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload726; CHECK-NEXT:    addvl sp, sp, #9727; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload728; CHECK-NEXT:    ret729entry:730  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()731  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)732  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0733  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1734  %4 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 2735  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 3736  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride737  %6 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)738  %7 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 0739  %8 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 1740  %9 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 2741  %10 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 3742  %mul3 = shl i64 %stride, 1743  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3744  %11 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx4)745  %12 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 0746  %13 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 1747  %14 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 2748  %15 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 3749  %mul5 = mul i64 %stride, 3750  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5751  %16 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx6)752  %17 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 0753  %18 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 1754  %19 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 2755  %20 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 3756  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %7, <vscale x 8 x i16> %12, <vscale x 8 x i16> %17, <vscale x 8 x i16> %zn)757  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %3, <vscale x 8 x i16> %8, <vscale x 8 x i16> %13, <vscale x 8 x i16> %18, <vscale x 8 x i16> %zn)758  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %4, <vscale x 8 x i16> %9, <vscale x 8 x i16> %14, <vscale x 8 x i16> %19, <vscale x 8 x i16> %zn)759  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %5, <vscale x 8 x i16> %10, <vscale x 8 x i16> %15, <vscale x 8 x i16> %20, <vscale x 8 x i16> %zn)760  ret void761}762 763define void @udot_single_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {764; CHECK-LABEL: udot_single_za32_u8_vg1x2:765; CHECK:       // %bb.0:766; CHECK-NEXT:    mov w8, w0767; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z1.b, z2.b }, z3.b768; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z1.b, z2.b }, z3.b769; CHECK-NEXT:    ret770  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)771  %slice2 = add i32 %slice, 7772  call void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)773  ret void774}775 776define void @udot_single_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {777; CHECK-LABEL: udot_single_za32_u8_vg1x4:778; CHECK:       // %bb.0:779; CHECK-NEXT:    mov w8, w0780; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z1.b - z4.b }, z5.b781; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z1.b - z4.b }, z5.b782; CHECK-NEXT:    ret783  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)784  %slice2 = add i32 %slice, 7785  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)786  ret void787}788 789define void @udot_single_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #1 {790; CHECK-LABEL: udot_single_za64_u16_vg1x2:791; CHECK:       // %bb.0:792; CHECK-NEXT:    mov w8, w0793; CHECK-NEXT:    udot za.d[w8, 0, vgx2], { z1.h, z2.h }, z3.h794; CHECK-NEXT:    udot za.d[w8, 7, vgx2], { z1.h, z2.h }, z3.h795; CHECK-NEXT:    ret796  call void @llvm.aarch64.sme.udot.single.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)797  %slice2 = add i32 %slice, 7798  call void @llvm.aarch64.sme.udot.single.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)799  ret void800}801 802define void @udot_single_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #1 {803; CHECK-LABEL: udot_single_za64_u16_vg1x4:804; CHECK:       // %bb.0:805; CHECK-NEXT:    mov w8, w0806; CHECK-NEXT:    udot za.d[w8, 0, vgx4], { z1.h - z4.h }, z5.h807; CHECK-NEXT:    udot za.d[w8, 7, vgx4], { z1.h - z4.h }, z5.h808; CHECK-NEXT:    ret809  call void @llvm.aarch64.sme.udot.single.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)810  %slice2 = add i32 %slice, 7811  call void @llvm.aarch64.sme.udot.single.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)812  ret void813}814 815define void @usdot_single_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {816; CHECK-LABEL: usdot_single_za32_u8_vg1x2:817; CHECK:       // %bb.0:818; CHECK-NEXT:    mov w8, w0819; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z1.b, z2.b }, z3.b820; CHECK-NEXT:    usdot za.s[w8, 7, vgx2], { z1.b, z2.b }, z3.b821; CHECK-NEXT:    ret822  call void @llvm.aarch64.sme.usdot.single.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)823  %slice2 = add i32 %slice, 7824  call void @llvm.aarch64.sme.usdot.single.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)825  ret void826}827 828define void @usdot_single_za32_u16_vg1x2_tuple(ptr %ptr, i64 %stride, <vscale x 16 x i8> %zn) #0 {829; CHECK-LABEL: usdot_single_za32_u16_vg1x2_tuple:830; CHECK:       // %bb.0: // %entry831; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill832; CHECK-NEXT:    addvl sp, sp, #-3833; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill834; CHECK-NEXT:    ptrue pn8.b835; CHECK-NEXT:    mov w8, wzr836; CHECK-NEXT:    str z10, [sp, #1, mul vl] // 16-byte Folded Spill837; CHECK-NEXT:    str z9, [sp, #2, mul vl] // 16-byte Folded Spill838; CHECK-NEXT:    ld1b { z1.b, z9.b }, pn8/z, [x0]839; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0, x1]840; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z1.b, z2.b }, z0.b841; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z9.b, z10.b }, z0.b842; CHECK-NEXT:    ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload843; CHECK-NEXT:    ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload844; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload845; CHECK-NEXT:    addvl sp, sp, #3846; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload847; CHECK-NEXT:    ret848entry:849  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()850  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)851  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0852  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1853  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride854  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)855  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 0856  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 1857  call void @llvm.aarch64.sme.usdot.single.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %zn)858  call void @llvm.aarch64.sme.usdot.single.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> %zn)859  ret void860}861 862define void @usdot_single_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {863; CHECK-LABEL: usdot_single_za32_u8_vg1x4:864; CHECK:       // %bb.0:865; CHECK-NEXT:    mov w8, w0866; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z1.b - z4.b }, z5.b867; CHECK-NEXT:    usdot za.s[w8, 7, vgx4], { z1.b - z4.b }, z5.b868; CHECK-NEXT:    ret869  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)870  %slice2 = add i32 %slice, 7871  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)872  ret void873}874 875define void @usdot_single_za32_u16_vg1x4_tuple(ptr %ptr, i64 %stride, <vscale x 16 x i8> %zn) #0 {876; CHECK-LABEL: usdot_single_za32_u16_vg1x4_tuple:877; CHECK:       // %bb.0: // %entry878; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill879; CHECK-NEXT:    addvl sp, sp, #-9880; CHECK-NEXT:    lsl x9, x1, #1881; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill882; CHECK-NEXT:    ptrue pn8.b883; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill884; CHECK-NEXT:    mov w8, wzr885; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill886; CHECK-NEXT:    add x10, x9, x1887; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill888; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill889; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill890; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill891; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill892; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill893; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]894; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]895; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]896; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]897; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b898; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b899; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b900; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b901; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload902; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload903; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload904; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload905; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload906; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload907; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload908; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload909; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload910; CHECK-NEXT:    addvl sp, sp, #9911; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload912; CHECK-NEXT:    ret913entry:914  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()915  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)916  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 0917  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 1918  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 2919  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 3920  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride921  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)922  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 0923  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 1924  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 2925  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 3926  %mul3 = shl i64 %stride, 1927  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3928  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)929  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 0930  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 1931  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 2932  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 3933  %mul5 = mul i64 %stride, 3934  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5935  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)936  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 0937  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 1938  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 2939  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 3940  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> %zn)941  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> %zn)942  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> %zn)943  call void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> %zn)944  ret void945}946 947; == Multi, single (signed) ==948 949define void @sdot_single_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #0 {950; CHECK-LABEL: sdot_single_za32_u16_vg1x2:951; CHECK:       // %bb.0:952; CHECK-NEXT:    mov w8, w0953; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z1.h, z2.h }, z3.h954; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z1.h, z2.h }, z3.h955; CHECK-NEXT:    ret956  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)957  %slice2 = add i32 %slice, 7958  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)959  ret void960}961 962define void @sdot_single_za32_u16_vg1x2_tuple(ptr %ptr, i64 %stride, <vscale x 8 x i16> %zn) #0 {963; CHECK-LABEL: sdot_single_za32_u16_vg1x2_tuple:964; CHECK:       // %bb.0: // %entry965; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill966; CHECK-NEXT:    addvl sp, sp, #-3967; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill968; CHECK-NEXT:    ptrue pn8.b969; CHECK-NEXT:    add x9, x0, x1970; CHECK-NEXT:    str z10, [sp, #1, mul vl] // 16-byte Folded Spill971; CHECK-NEXT:    mov w8, wzr972; CHECK-NEXT:    str z9, [sp, #2, mul vl] // 16-byte Folded Spill973; CHECK-NEXT:    ld1h { z1.h, z9.h }, pn8/z, [x0]974; CHECK-NEXT:    ld1h { z2.h, z10.h }, pn8/z, [x9]975; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z1.h, z2.h }, z0.h976; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z9.h, z10.h }, z0.h977; CHECK-NEXT:    ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload978; CHECK-NEXT:    ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload979; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload980; CHECK-NEXT:    addvl sp, sp, #3981; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload982; CHECK-NEXT:    ret983entry:984  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()985  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)986  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 0987  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 1988  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride989  %4 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x2.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)990  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 0991  %6 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %4, 1992  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %5, <vscale x 8 x i16> %zn)993  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv8i16(i32 0, <vscale x 8 x i16> %3, <vscale x 8 x i16> %6, <vscale x 8 x i16> %zn)994  ret void995}996 997define void @sdot_single_za32_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #0 {998; CHECK-LABEL: sdot_single_za32_u16_vg1x4:999; CHECK:       // %bb.0:1000; CHECK-NEXT:    mov w8, w01001; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z1.h - z4.h }, z5.h1002; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z1.h - z4.h }, z5.h1003; CHECK-NEXT:    ret1004  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)1005  %slice2 = add i32 %slice, 71006  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)1007  ret void1008}1009 1010define void @sdot_single_za32_u16_vg1x4_tuple(ptr %ptr, i64 %stride, <vscale x 8 x i16> %zn) #0 {1011; CHECK-LABEL: sdot_single_za32_u16_vg1x4_tuple:1012; CHECK:       // %bb.0: // %entry1013; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1014; CHECK-NEXT:    addvl sp, sp, #-91015; CHECK-NEXT:    add x9, x1, x1, lsl #11016; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1017; CHECK-NEXT:    ptrue pn8.b1018; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill1019; CHECK-NEXT:    add x10, x0, x11020; CHECK-NEXT:    mov w8, wzr1021; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill1022; CHECK-NEXT:    add x9, x0, x91023; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill1024; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill1025; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill1026; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill1027; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill1028; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill1029; CHECK-NEXT:    ld1h { z16.h, z20.h, z24.h, z28.h }, pn8/z, [x0]1030; CHECK-NEXT:    ld1h { z17.h, z21.h, z25.h, z29.h }, pn8/z, [x10]1031; CHECK-NEXT:    ld1h { z18.h, z22.h, z26.h, z30.h }, pn8/z, [x0, x1, lsl #1]1032; CHECK-NEXT:    ld1h { z19.h, z23.h, z27.h, z31.h }, pn8/z, [x9]1033; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z16.h - z19.h }, z0.h1034; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z20.h - z23.h }, z0.h1035; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.h - z27.h }, z0.h1036; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z28.h - z31.h }, z0.h1037; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload1038; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload1039; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload1040; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload1041; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload1042; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload1043; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload1044; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload1045; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1046; CHECK-NEXT:    addvl sp, sp, #91047; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1048; CHECK-NEXT:    ret1049entry:1050  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1051  %1 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %ptr)1052  %2 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 01053  %3 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 11054  %4 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 21055  %5 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %1, 31056  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1057  %6 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx2)1058  %7 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 01059  %8 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 11060  %9 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 21061  %10 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %6, 31062  %mul3 = shl i64 %stride, 11063  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31064  %11 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx4)1065  %12 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 01066  %13 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 11067  %14 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 21068  %15 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %11, 31069  %mul5 = mul i64 %stride, 31070  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51071  %16 = tail call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.ld1.pn.x4.nxv8i16(target("aarch64.svcount") %0, ptr %arrayidx6)1072  %17 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 01073  %18 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 11074  %19 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 21075  %20 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %16, 31076  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %2, <vscale x 8 x i16> %7, <vscale x 8 x i16> %12, <vscale x 8 x i16> %17, <vscale x 8 x i16> %zn)1077  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %3, <vscale x 8 x i16> %8, <vscale x 8 x i16> %13, <vscale x 8 x i16> %18, <vscale x 8 x i16> %zn)1078  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %4, <vscale x 8 x i16> %9, <vscale x 8 x i16> %14, <vscale x 8 x i16> %19, <vscale x 8 x i16> %zn)1079  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32 0, <vscale x 8 x i16> %5, <vscale x 8 x i16> %10, <vscale x 8 x i16> %15, <vscale x 8 x i16> %20, <vscale x 8 x i16> %zn)1080  ret void1081}1082 1083define void @sdot_single_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {1084; CHECK-LABEL: sdot_single_za32_u8_vg1x2:1085; CHECK:       // %bb.0:1086; CHECK-NEXT:    mov w8, w01087; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z1.b, z2.b }, z3.b1088; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z1.b, z2.b }, z3.b1089; CHECK-NEXT:    ret1090  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)1091  %slice2 = add i32 %slice, 71092  call void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)1093  ret void1094}1095 1096define void @sdot_single_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {1097; CHECK-LABEL: sdot_single_za32_u8_vg1x4:1098; CHECK:       // %bb.0:1099; CHECK-NEXT:    mov w8, w01100; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z1.b - z4.b }, z5.b1101; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z1.b - z4.b }, z5.b1102; CHECK-NEXT:    ret1103  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)1104  %slice2 = add i32 %slice, 71105  call void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)1106  ret void1107}1108 1109define void @sdot_single_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #1 {1110; CHECK-LABEL: sdot_single_za64_u16_vg1x2:1111; CHECK:       // %bb.0:1112; CHECK-NEXT:    mov w8, w01113; CHECK-NEXT:    sdot za.d[w8, 0, vgx2], { z1.h, z2.h }, z3.h1114; CHECK-NEXT:    sdot za.d[w8, 7, vgx2], { z1.h, z2.h }, z3.h1115; CHECK-NEXT:    ret1116  call void @llvm.aarch64.sme.sdot.single.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)1117  %slice2 = add i32 %slice, 71118  call void @llvm.aarch64.sme.sdot.single.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2)1119  ret void1120}1121 1122define void @sdot_single_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #1 {1123; CHECK-LABEL: sdot_single_za64_u16_vg1x4:1124; CHECK:       // %bb.0:1125; CHECK-NEXT:    mov w8, w01126; CHECK-NEXT:    sdot za.d[w8, 0, vgx4], { z1.h - z4.h }, z5.h1127; CHECK-NEXT:    sdot za.d[w8, 7, vgx4], { z1.h - z4.h }, z5.h1128; CHECK-NEXT:    ret1129  call void @llvm.aarch64.sme.sdot.single.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)1130  %slice2 = add i32 %slice, 71131  call void @llvm.aarch64.sme.sdot.single.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4)1132  ret void1133}1134 1135define void @sudot_single_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {1136; CHECK-LABEL: sudot_single_za32_u8_vg1x2:1137; CHECK:       // %bb.0:1138; CHECK-NEXT:    mov w8, w01139; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z1.b, z2.b }, z3.b1140; CHECK-NEXT:    sudot za.s[w8, 7, vgx2], { z1.b, z2.b }, z3.b1141; CHECK-NEXT:    ret1142  call void @llvm.aarch64.sme.sudot.single.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)1143  %slice2 = add i32 %slice, 71144  call void @llvm.aarch64.sme.sudot.single.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2)1145  ret void1146}1147 1148define void @sudot_single_za32_u16_vg1x2_tuple(ptr %ptr, i64 %stride, <vscale x 16 x i8> %zn) #0 {1149; CHECK-LABEL: sudot_single_za32_u16_vg1x2_tuple:1150; CHECK:       // %bb.0: // %entry1151; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1152; CHECK-NEXT:    addvl sp, sp, #-31153; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1154; CHECK-NEXT:    ptrue pn8.b1155; CHECK-NEXT:    mov w8, wzr1156; CHECK-NEXT:    str z10, [sp, #1, mul vl] // 16-byte Folded Spill1157; CHECK-NEXT:    str z9, [sp, #2, mul vl] // 16-byte Folded Spill1158; CHECK-NEXT:    ld1b { z1.b, z9.b }, pn8/z, [x0]1159; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0, x1]1160; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z1.b, z2.b }, z0.b1161; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z9.b, z10.b }, z0.b1162; CHECK-NEXT:    ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload1163; CHECK-NEXT:    ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload1164; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1165; CHECK-NEXT:    addvl sp, sp, #31166; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1167; CHECK-NEXT:    ret1168entry:1169  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1170  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1171  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01172  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11173  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1174  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1175  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01176  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11177  call void @llvm.aarch64.sme.sudot.single.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %zn)1178  call void @llvm.aarch64.sme.sudot.single.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> %zn)1179  ret void1180}1181 1182define void @sudot_single_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {1183; CHECK-LABEL: sudot_single_za32_u8_vg1x4:1184; CHECK:       // %bb.0:1185; CHECK-NEXT:    mov w8, w01186; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z1.b - z4.b }, z5.b1187; CHECK-NEXT:    sudot za.s[w8, 7, vgx4], { z1.b - z4.b }, z5.b1188; CHECK-NEXT:    ret1189  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)1190  %slice2 = add i32 %slice, 71191  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4)1192  ret void1193}1194 1195define void @sudot_single_za32_u16_vg1x4_tuple(ptr %ptr, i64 %stride, <vscale x 16 x i8> %zn) #0 {1196; CHECK-LABEL: sudot_single_za32_u16_vg1x4_tuple:1197; CHECK:       // %bb.0: // %entry1198; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1199; CHECK-NEXT:    addvl sp, sp, #-91200; CHECK-NEXT:    lsl x9, x1, #11201; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1202; CHECK-NEXT:    ptrue pn8.b1203; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill1204; CHECK-NEXT:    mov w8, wzr1205; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill1206; CHECK-NEXT:    add x10, x9, x11207; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill1208; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill1209; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill1210; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill1211; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill1212; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill1213; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1214; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1215; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1216; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1217; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b1218; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b1219; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b1220; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b1221; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload1222; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload1223; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload1224; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload1225; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload1226; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload1227; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload1228; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload1229; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1230; CHECK-NEXT:    addvl sp, sp, #91231; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1232; CHECK-NEXT:    ret1233entry:1234  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1235  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1236  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01237  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11238  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21239  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31240  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1241  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1242  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01243  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11244  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21245  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31246  %mul3 = shl i64 %stride, 11247  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31248  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1249  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01250  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11251  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21252  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31253  %mul5 = mul i64 %stride, 31254  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51255  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1256  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01257  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11258  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21259  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31260  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> %zn)1261  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> %zn)1262  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> %zn)1263  call void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> %zn)1264  ret void1265}1266 1267; == Multi, indexed (unsigned) ==1268 1269define void @udot_lane_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #0 {1270; CHECK-LABEL: udot_lane_za32_u16_vg1x2:1271; CHECK:       // %bb.0:1272; CHECK-NEXT:    mov z5.d, z2.d1273; CHECK-NEXT:    mov z4.d, z1.d1274; CHECK-NEXT:    mov w8, w01275; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z4.h, z5.h }, z3.h[3]1276; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z4.h, z5.h }, z3.h[3]1277; CHECK-NEXT:    ret1278  call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 3)1279  %slice2 = add i32 %slice, 71280  call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 3)1281  ret void1282}1283 1284define void @udot_lane_za32_u16_vg1x4(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #0 {1285; CHECK-LABEL: udot_lane_za32_u16_vg1x4:1286; CHECK:       // %bb.0:1287; CHECK-NEXT:    mov w8, w01288; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z0.h - z3.h }, z4.h[3]1289; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z0.h - z3.h }, z4.h[3]1290; CHECK-NEXT:    ret1291  call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1292                                                           <vscale x 8 x i16> %zn4, i32 3)1293  %slice2 = add i32 %slice, 71294  call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1295                                                           <vscale x 8 x i16> %zn4, i32 3)1296  ret void1297}1298 1299define void @udot_lane_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {1300; CHECK-LABEL: udot_lane_za32_u8_vg1x2:1301; CHECK:       // %bb.0:1302; CHECK-NEXT:    mov z5.d, z2.d1303; CHECK-NEXT:    mov z4.d, z1.d1304; CHECK-NEXT:    mov w8, w01305; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z4.b, z5.b }, z3.b[3]1306; CHECK-NEXT:    udot za.s[w8, 7, vgx2], { z4.b, z5.b }, z3.b[3]1307; CHECK-NEXT:    ret1308  call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1309  %slice2 = add i32 %slice, 71310  call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1311  ret void1312}1313 1314define void @udot_lane_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {1315; CHECK-LABEL: udot_lane_za32_u8_vg1x4:1316; CHECK:       // %bb.0:1317; CHECK-NEXT:    mov z27.d, z4.d1318; CHECK-NEXT:    mov z26.d, z3.d1319; CHECK-NEXT:    mov w8, w01320; CHECK-NEXT:    mov z25.d, z2.d1321; CHECK-NEXT:    mov z24.d, z1.d1322; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z24.b - z27.b }, z5.b[3]1323; CHECK-NEXT:    udot za.s[w8, 7, vgx4], { z24.b - z27.b }, z5.b[3]1324; CHECK-NEXT:    ret1325  call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1326                                                           <vscale x 16 x i8> %zn4, i32 3)1327  %slice2 = add i32 %slice, 71328  call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1329                                                           <vscale x 16 x i8> %zn4, i32 3)1330  ret void1331}1332 1333define void @udot_form_2x_tuple(ptr %ptr, i64 %stride) #0 {1334; CHECK-LABEL: udot_form_2x_tuple:1335; CHECK:       // %bb.0: // %entry1336; CHECK-NEXT:    ptrue pn8.b1337; CHECK-NEXT:    mov w8, wzr1338; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x0]1339; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x0, x1]1340; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z16.b, z17.b }, z0.b[0]1341; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z24.b, z25.b }, z0.b[0]1342; CHECK-NEXT:    ret1343entry:1344  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1345  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1346  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01347  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11348  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1349  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1350  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01351  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11352  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1353  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1354  ret void1355}1356 1357define void @udot_form_2x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {1358; CHECK-LABEL: udot_form_2x_tuple_svecc:1359; CHECK:       // %bb.0: // %entry1360; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1361; CHECK-NEXT:    addvl sp, sp, #-31362; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1363; CHECK-NEXT:    ptrue pn8.b1364; CHECK-NEXT:    mov w8, wzr1365; CHECK-NEXT:    str z11, [sp, #1, mul vl] // 16-byte Folded Spill1366; CHECK-NEXT:    str z10, [sp, #2, mul vl] // 16-byte Folded Spill1367; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0]1368; CHECK-NEXT:    ld1b { z3.b, z11.b }, pn8/z, [x0, x1]1369; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z2.b, z3.b }, z0.b[0]1370; CHECK-NEXT:    udot za.s[w8, 0, vgx2], { z10.b, z11.b }, z0.b[0]1371; CHECK-NEXT:    ldr z11, [sp, #1, mul vl] // 16-byte Folded Reload1372; CHECK-NEXT:    ldr z10, [sp, #2, mul vl] // 16-byte Folded Reload1373; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1374; CHECK-NEXT:    str z0, [x0]1375; CHECK-NEXT:    addvl sp, sp, #31376; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1377; CHECK-NEXT:    ret1378entry:1379  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1380  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1381  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01382  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11383  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1384  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1385  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01386  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11387  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1388  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1389  store <vscale x 16 x i8> %scalable_arg, ptr %ptr1390  ret void1391}1392 1393define void @udot_form_4x_tuple(ptr %ptr, i64 %stride) #0 {1394; CHECK-LABEL: udot_form_4x_tuple:1395; CHECK:       // %bb.0: // %entry1396; CHECK-NEXT:    lsl x9, x1, #11397; CHECK-NEXT:    ptrue pn8.b1398; CHECK-NEXT:    mov w8, wzr1399; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1400; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1401; CHECK-NEXT:    add x10, x9, x11402; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1403; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1404; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]1405; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]1406; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]1407; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]1408; CHECK-NEXT:    ret1409entry:1410  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1411  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1412  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01413  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11414  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21415  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31416  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1417  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1418  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01419  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11420  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21421  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31422  %mul3 = shl i64 %stride, 11423  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31424  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1425  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01426  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11427  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21428  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31429  %mul5 = mul i64 %stride, 31430  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51431  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1432  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01433  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11434  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21435  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31436  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)1437  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)1438  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)1439  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)1440  ret void1441}1442 1443define void @udot_form_4x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {1444; CHECK-LABEL: udot_form_4x_tuple_svecc:1445; CHECK:       // %bb.0: // %entry1446; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1447; CHECK-NEXT:    addvl sp, sp, #-91448; CHECK-NEXT:    lsl x9, x1, #11449; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1450; CHECK-NEXT:    ptrue pn8.b1451; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill1452; CHECK-NEXT:    mov w8, wzr1453; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill1454; CHECK-NEXT:    add x10, x9, x11455; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill1456; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill1457; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill1458; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill1459; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill1460; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill1461; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1462; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1463; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1464; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1465; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]1466; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]1467; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]1468; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]1469; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload1470; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload1471; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload1472; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload1473; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload1474; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload1475; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload1476; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload1477; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1478; CHECK-NEXT:    str z0, [x0]1479; CHECK-NEXT:    addvl sp, sp, #91480; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1481; CHECK-NEXT:    ret1482entry:1483  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1484  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1485  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01486  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11487  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21488  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31489  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1490  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1491  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01492  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11493  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21494  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31495  %mul3 = shl i64 %stride, 11496  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31497  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1498  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01499  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11500  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21501  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31502  %mul5 = mul i64 %stride, 31503  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51504  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1505  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01506  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11507  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21508  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31509  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)1510  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)1511  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)1512  tail call void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)1513  store <vscale x 16 x i8> %scalable_arg, ptr %ptr1514  ret void1515}1516 1517define void @udot_single_za32_u16_vg1x4_x2load_x4tuple(ptr %ptr, i64 %stride, <vscale x 16 x i8> %zn) #0 {1518; CHECK-LABEL: udot_single_za32_u16_vg1x4_x2load_x4tuple:1519; CHECK:       // %bb.0: // %entry1520; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1521; CHECK-NEXT:    addvl sp, sp, #-51522; CHECK-NEXT:    lsl x9, x1, #11523; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1524; CHECK-NEXT:    ptrue pn8.b1525; CHECK-NEXT:    str z12, [sp, #1, mul vl] // 16-byte Folded Spill1526; CHECK-NEXT:    st1b { z10.b, z11.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill1527; CHECK-NEXT:    ptrue pn8.b1528; CHECK-NEXT:    str z9, [sp, #4, mul vl] // 16-byte Folded Spill1529; CHECK-NEXT:    add x10, x9, x11530; CHECK-NEXT:    mov w8, wzr1531; CHECK-NEXT:    ld1b { z1.b, z9.b }, pn8/z, [x0]1532; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0, x1]1533; CHECK-NEXT:    ld1b { z3.b, z11.b }, pn8/z, [x0, x9]1534; CHECK-NEXT:    ld1b { z4.b, z12.b }, pn8/z, [x0, x10]1535; CHECK-NEXT:    ptrue pn8.b1536; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z1.b - z4.b }, z0.b1537; CHECK-NEXT:    udot za.s[w8, 0, vgx4], { z9.b - z12.b }, z0.b1538; CHECK-NEXT:    ldr z12, [sp, #1, mul vl] // 16-byte Folded Reload1539; CHECK-NEXT:    ld1b { z10.b, z11.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload1540; CHECK-NEXT:    ldr z9, [sp, #4, mul vl] // 16-byte Folded Reload1541; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1542; CHECK-NEXT:    addvl sp, sp, #51543; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1544; CHECK-NEXT:    ret1545entry:1546  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1547  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1548  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01549  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11550  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1551  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1552  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01553  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11554  %mul3 = shl i64 %stride, 11555  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31556  %7 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1557  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %7, 01558  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %7, 11559  %mul5 = mul i64 %stride, 31560  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51561  %10 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1562  %11 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %10, 01563  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %10, 11564  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> %8, <vscale x 16 x i8> %11, <vscale x 16 x i8> %zn)1565  call void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> %9, <vscale x 16 x i8> %12, <vscale x 16 x i8> %zn)1566  ret void1567}1568 1569define void @udot_lane_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #1 {1570; CHECK-LABEL: udot_lane_za64_u16_vg1x2:1571; CHECK:       // %bb.0:1572; CHECK-NEXT:    mov z5.d, z2.d1573; CHECK-NEXT:    mov z4.d, z1.d1574; CHECK-NEXT:    mov w8, w01575; CHECK-NEXT:    udot za.d[w8, 0, vgx2], { z4.h, z5.h }, z3.h[1]1576; CHECK-NEXT:    udot za.d[w8, 7, vgx2], { z4.h, z5.h }, z3.h[1]1577; CHECK-NEXT:    ret1578  call void @llvm.aarch64.sme.udot.lane.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 1)1579  %slice2 = add i32 %slice, 71580  call void @llvm.aarch64.sme.udot.lane.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 1)1581  ret void1582}1583 1584define void @udot_lane_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #1 {1585; CHECK-LABEL: udot_lane_za64_u16_vg1x4:1586; CHECK:       // %bb.0:1587; CHECK-NEXT:    mov z27.d, z4.d1588; CHECK-NEXT:    mov z26.d, z3.d1589; CHECK-NEXT:    mov w8, w01590; CHECK-NEXT:    mov z25.d, z2.d1591; CHECK-NEXT:    mov z24.d, z1.d1592; CHECK-NEXT:    udot za.d[w8, 0, vgx4], { z24.h - z27.h }, z5.h[1]1593; CHECK-NEXT:    udot za.d[w8, 7, vgx4], { z24.h - z27.h }, z5.h[1]1594; CHECK-NEXT:    ret1595  call void @llvm.aarch64.sme.udot.lane.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1596                                                           <vscale x 8 x i16> %zn4, i32 1)1597  %slice2 = add i32 %slice, 71598  call void @llvm.aarch64.sme.udot.lane.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1599                                                           <vscale x 8 x i16> %zn4, i32 1)1600  ret void1601}1602 1603define void @usdot_lane_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {1604; CHECK-LABEL: usdot_lane_za32_u8_vg1x2:1605; CHECK:       // %bb.0:1606; CHECK-NEXT:    mov z5.d, z2.d1607; CHECK-NEXT:    mov z4.d, z1.d1608; CHECK-NEXT:    mov w8, w01609; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z4.b, z5.b }, z3.b[3]1610; CHECK-NEXT:    usdot za.s[w8, 7, vgx2], { z4.b, z5.b }, z3.b[3]1611; CHECK-NEXT:    ret1612  call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1613  %slice2 = add i32 %slice, 71614  call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1615  ret void1616}1617 1618define void @usdot_lane_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {1619; CHECK-LABEL: usdot_lane_za32_u8_vg1x4:1620; CHECK:       // %bb.0:1621; CHECK-NEXT:    mov z27.d, z4.d1622; CHECK-NEXT:    mov z26.d, z3.d1623; CHECK-NEXT:    mov w8, w01624; CHECK-NEXT:    mov z25.d, z2.d1625; CHECK-NEXT:    mov z24.d, z1.d1626; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z5.b[3]1627; CHECK-NEXT:    usdot za.s[w8, 7, vgx4], { z24.b - z27.b }, z5.b[3]1628; CHECK-NEXT:    ret1629  call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1630                                                            <vscale x 16 x i8> %zn4, i32 3)1631  %slice2 = add i32 %slice, 71632  call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1633                                                            <vscale x 16 x i8> %zn4, i32 3)1634  ret void1635}1636 1637define void @usdot_form_2x_tuple(ptr %ptr, i64 %stride) #0 {1638; CHECK-LABEL: usdot_form_2x_tuple:1639; CHECK:       // %bb.0: // %entry1640; CHECK-NEXT:    ptrue pn8.b1641; CHECK-NEXT:    mov w8, wzr1642; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x0]1643; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x0, x1]1644; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z16.b, z17.b }, z0.b[0]1645; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z24.b, z25.b }, z0.b[0]1646; CHECK-NEXT:    ret1647entry:1648  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1649  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1650  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01651  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11652  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1653  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1654  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01655  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11656  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1657  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1658  ret void1659}1660 1661define void @usdot_form_2x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {1662; CHECK-LABEL: usdot_form_2x_tuple_svecc:1663; CHECK:       // %bb.0: // %entry1664; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1665; CHECK-NEXT:    addvl sp, sp, #-31666; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1667; CHECK-NEXT:    ptrue pn8.b1668; CHECK-NEXT:    mov w8, wzr1669; CHECK-NEXT:    str z11, [sp, #1, mul vl] // 16-byte Folded Spill1670; CHECK-NEXT:    str z10, [sp, #2, mul vl] // 16-byte Folded Spill1671; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0]1672; CHECK-NEXT:    ld1b { z3.b, z11.b }, pn8/z, [x0, x1]1673; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z2.b, z3.b }, z0.b[0]1674; CHECK-NEXT:    usdot za.s[w8, 0, vgx2], { z10.b, z11.b }, z0.b[0]1675; CHECK-NEXT:    ldr z11, [sp, #1, mul vl] // 16-byte Folded Reload1676; CHECK-NEXT:    ldr z10, [sp, #2, mul vl] // 16-byte Folded Reload1677; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1678; CHECK-NEXT:    str z0, [x0]1679; CHECK-NEXT:    addvl sp, sp, #31680; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1681; CHECK-NEXT:    ret1682entry:1683  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1684  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1685  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01686  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11687  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1688  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1689  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01690  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11691  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1692  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1693  store <vscale x 16 x i8> %scalable_arg, ptr %ptr1694  ret void1695}1696 1697define void @usdot_form_4x_tuple(ptr %ptr, i64 %stride) #0 {1698; CHECK-LABEL: usdot_form_4x_tuple:1699; CHECK:       // %bb.0: // %entry1700; CHECK-NEXT:    lsl x9, x1, #11701; CHECK-NEXT:    ptrue pn8.b1702; CHECK-NEXT:    mov w8, wzr1703; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1704; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1705; CHECK-NEXT:    add x10, x9, x11706; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1707; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1708; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]1709; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]1710; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]1711; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]1712; CHECK-NEXT:    ret1713entry:1714  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1715  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1716  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01717  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11718  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21719  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31720  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1721  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1722  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01723  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11724  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21725  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31726  %mul3 = shl i64 %stride, 11727  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31728  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1729  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01730  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11731  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21732  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31733  %mul5 = mul i64 %stride, 31734  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51735  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1736  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01737  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11738  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21739  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31740  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)1741  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)1742  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)1743  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)1744  ret void1745}1746 1747define void @usdot_form_4x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {1748; CHECK-LABEL: usdot_form_4x_tuple_svecc:1749; CHECK:       // %bb.0: // %entry1750; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1751; CHECK-NEXT:    addvl sp, sp, #-91752; CHECK-NEXT:    lsl x9, x1, #11753; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1754; CHECK-NEXT:    ptrue pn8.b1755; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill1756; CHECK-NEXT:    mov w8, wzr1757; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill1758; CHECK-NEXT:    add x10, x9, x11759; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill1760; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill1761; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill1762; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill1763; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill1764; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill1765; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1766; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1767; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1768; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1769; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]1770; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]1771; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]1772; CHECK-NEXT:    usdot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]1773; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload1774; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload1775; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload1776; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload1777; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload1778; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload1779; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload1780; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload1781; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1782; CHECK-NEXT:    str z0, [x0]1783; CHECK-NEXT:    addvl sp, sp, #91784; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1785; CHECK-NEXT:    ret1786entry:1787  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1788  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1789  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01790  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11791  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21792  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31793  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1794  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1795  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01796  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11797  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21798  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31799  %mul3 = shl i64 %stride, 11800  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31801  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1802  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01803  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11804  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21805  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31806  %mul5 = mul i64 %stride, 31807  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51808  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1809  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01810  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11811  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21812  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31813  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)1814  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)1815  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)1816  tail call void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)1817  store <vscale x 16 x i8> %scalable_arg, ptr %ptr1818  ret void1819}1820 1821; == Multi, indexed (signed) ==1822 1823define void @sdot_lane_za32_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #0 {1824; CHECK-LABEL: sdot_lane_za32_u16_vg1x2:1825; CHECK:       // %bb.0:1826; CHECK-NEXT:    mov z5.d, z2.d1827; CHECK-NEXT:    mov z4.d, z1.d1828; CHECK-NEXT:    mov w8, w01829; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z4.h, z5.h }, z3.h[3]1830; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z4.h, z5.h }, z3.h[3]1831; CHECK-NEXT:    ret1832  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 3)1833  %slice2 = add i32 %slice, 71834  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 3)1835  ret void1836}1837 1838define void @sdot_lane_za32_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #0 {1839; CHECK-LABEL: sdot_lane_za32_u16_vg1x4:1840; CHECK:       // %bb.0:1841; CHECK-NEXT:    mov z27.d, z4.d1842; CHECK-NEXT:    mov z26.d, z3.d1843; CHECK-NEXT:    mov w8, w01844; CHECK-NEXT:    mov z25.d, z2.d1845; CHECK-NEXT:    mov z24.d, z1.d1846; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.h - z27.h }, z5.h[3]1847; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z24.h - z27.h }, z5.h[3]1848; CHECK-NEXT:    ret1849  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1850                                                           <vscale x 8 x i16> %zn4, i32 3)1851  %slice2 = add i32 %slice, 71852  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,1853                                                           <vscale x 8 x i16> %zn4, i32 3)1854  ret void1855}1856 1857define void @sdot_lane_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {1858; CHECK-LABEL: sdot_lane_za32_u8_vg1x2:1859; CHECK:       // %bb.0:1860; CHECK-NEXT:    mov z5.d, z2.d1861; CHECK-NEXT:    mov z4.d, z1.d1862; CHECK-NEXT:    mov w8, w01863; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z4.b, z5.b }, z3.b[3]1864; CHECK-NEXT:    sdot za.s[w8, 7, vgx2], { z4.b, z5.b }, z3.b[3]1865; CHECK-NEXT:    ret1866  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1867  %slice2 = add i32 %slice, 71868  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)1869  ret void1870}1871 1872define void @sdot_lane_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {1873; CHECK-LABEL: sdot_lane_za32_u8_vg1x4:1874; CHECK:       // %bb.0:1875; CHECK-NEXT:    mov z27.d, z4.d1876; CHECK-NEXT:    mov z26.d, z3.d1877; CHECK-NEXT:    mov w8, w01878; CHECK-NEXT:    mov z25.d, z2.d1879; CHECK-NEXT:    mov z24.d, z1.d1880; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z5.b[3]1881; CHECK-NEXT:    sdot za.s[w8, 7, vgx4], { z24.b - z27.b }, z5.b[3]1882; CHECK-NEXT:    ret1883  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1884                                                           <vscale x 16 x i8> %zn4, i32 3)1885  %slice2 = add i32 %slice, 71886  call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,1887                                                           <vscale x 16 x i8> %zn4, i32 3)1888  ret void1889}1890 1891define void @sdot_form_2x_tuple(ptr %ptr, i64 %stride) #0 {1892; CHECK-LABEL: sdot_form_2x_tuple:1893; CHECK:       // %bb.0: // %entry1894; CHECK-NEXT:    ptrue pn8.b1895; CHECK-NEXT:    mov w8, wzr1896; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x0]1897; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x0, x1]1898; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z16.b, z17.b }, z0.b[0]1899; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z24.b, z25.b }, z0.b[0]1900; CHECK-NEXT:    ret1901entry:1902  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1903  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1904  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01905  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11906  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1907  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1908  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01909  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11910  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1911  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1912  ret void1913}1914 1915define void @sdot_form_2x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {1916; CHECK-LABEL: sdot_form_2x_tuple_svecc:1917; CHECK:       // %bb.0: // %entry1918; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill1919; CHECK-NEXT:    addvl sp, sp, #-31920; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill1921; CHECK-NEXT:    ptrue pn8.b1922; CHECK-NEXT:    mov w8, wzr1923; CHECK-NEXT:    str z11, [sp, #1, mul vl] // 16-byte Folded Spill1924; CHECK-NEXT:    str z10, [sp, #2, mul vl] // 16-byte Folded Spill1925; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0]1926; CHECK-NEXT:    ld1b { z3.b, z11.b }, pn8/z, [x0, x1]1927; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z2.b, z3.b }, z0.b[0]1928; CHECK-NEXT:    sdot za.s[w8, 0, vgx2], { z10.b, z11.b }, z0.b[0]1929; CHECK-NEXT:    ldr z11, [sp, #1, mul vl] // 16-byte Folded Reload1930; CHECK-NEXT:    ldr z10, [sp, #2, mul vl] // 16-byte Folded Reload1931; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload1932; CHECK-NEXT:    str z0, [x0]1933; CHECK-NEXT:    addvl sp, sp, #31934; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload1935; CHECK-NEXT:    ret1936entry:1937  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1938  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1939  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01940  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11941  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1942  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1943  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 01944  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 11945  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)1946  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)1947  store <vscale x 16 x i8> %scalable_arg, ptr %ptr1948  ret void1949}1950 1951define void @sdot_form_4x_tuple(ptr %ptr, i64 %stride) #0 {1952; CHECK-LABEL: sdot_form_4x_tuple:1953; CHECK:       // %bb.0: // %entry1954; CHECK-NEXT:    lsl x9, x1, #11955; CHECK-NEXT:    ptrue pn8.b1956; CHECK-NEXT:    mov w8, wzr1957; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]1958; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]1959; CHECK-NEXT:    add x10, x9, x11960; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]1961; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]1962; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]1963; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]1964; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]1965; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]1966; CHECK-NEXT:    ret1967entry:1968  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()1969  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)1970  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 01971  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 11972  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 21973  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 31974  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride1975  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)1976  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 01977  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 11978  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 21979  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 31980  %mul3 = shl i64 %stride, 11981  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul31982  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)1983  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 01984  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 11985  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 21986  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 31987  %mul5 = mul i64 %stride, 31988  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul51989  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)1990  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 01991  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 11992  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 21993  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 31994  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)1995  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)1996  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)1997  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)1998  ret void1999}2000 2001define void @sdot_form_4x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {2002; CHECK-LABEL: sdot_form_4x_tuple_svecc:2003; CHECK:       // %bb.0: // %entry2004; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill2005; CHECK-NEXT:    addvl sp, sp, #-92006; CHECK-NEXT:    lsl x9, x1, #12007; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill2008; CHECK-NEXT:    ptrue pn8.b2009; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill2010; CHECK-NEXT:    mov w8, wzr2011; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill2012; CHECK-NEXT:    add x10, x9, x12013; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill2014; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill2015; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill2016; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill2017; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill2018; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill2019; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]2020; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]2021; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]2022; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]2023; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]2024; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]2025; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]2026; CHECK-NEXT:    sdot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]2027; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload2028; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload2029; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload2030; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload2031; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload2032; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload2033; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload2034; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload2035; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload2036; CHECK-NEXT:    str z0, [x0]2037; CHECK-NEXT:    addvl sp, sp, #92038; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload2039; CHECK-NEXT:    ret2040entry:2041  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()2042  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)2043  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 02044  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 12045  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 22046  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 32047  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride2048  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)2049  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 02050  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 12051  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 22052  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 32053  %mul3 = shl i64 %stride, 12054  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul32055  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)2056  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 02057  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 12058  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 22059  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 32060  %mul5 = mul i64 %stride, 32061  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul52062  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)2063  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 02064  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 12065  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 22066  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 32067  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)2068  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)2069  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)2070  tail call void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)2071  store <vscale x 16 x i8> %scalable_arg, ptr %ptr2072  ret void2073}2074 2075define void @sdot_lane_za64_u16_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2) #1 {2076; CHECK-LABEL: sdot_lane_za64_u16_vg1x2:2077; CHECK:       // %bb.0:2078; CHECK-NEXT:    mov z5.d, z2.d2079; CHECK-NEXT:    mov z4.d, z1.d2080; CHECK-NEXT:    mov w8, w02081; CHECK-NEXT:    sdot za.d[w8, 0, vgx2], { z4.h, z5.h }, z3.h[1]2082; CHECK-NEXT:    sdot za.d[w8, 7, vgx2], { z4.h, z5.h }, z3.h[1]2083; CHECK-NEXT:    ret2084  call void @llvm.aarch64.sme.sdot.lane.za64.vg1x2.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 1)2085  %slice2 = add i32 %slice, 72086  call void @llvm.aarch64.sme.sdot.lane.za64.vg1x2.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, i32 1)2087  ret void2088}2089 2090define void @sdot_lane_za64_u16_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3, <vscale x 8 x i16> %zn4) #1 {2091; CHECK-LABEL: sdot_lane_za64_u16_vg1x4:2092; CHECK:       // %bb.0:2093; CHECK-NEXT:    mov z27.d, z4.d2094; CHECK-NEXT:    mov z26.d, z3.d2095; CHECK-NEXT:    mov w8, w02096; CHECK-NEXT:    mov z25.d, z2.d2097; CHECK-NEXT:    mov z24.d, z1.d2098; CHECK-NEXT:    sdot za.d[w8, 0, vgx4], { z24.h - z27.h }, z5.h[1]2099; CHECK-NEXT:    sdot za.d[w8, 7, vgx4], { z24.h - z27.h }, z5.h[1]2100; CHECK-NEXT:    ret2101  call void @llvm.aarch64.sme.sdot.lane.za64.vg1x4.nxv8i16(i32 %slice, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,2102                                                           <vscale x 8 x i16> %zn4, i32 1)2103  %slice2 = add i32 %slice, 72104  call void @llvm.aarch64.sme.sdot.lane.za64.vg1x4.nxv8i16(i32 %slice2, <vscale x 8 x i16> %zn0, <vscale x 8 x i16> %zn1, <vscale x 8 x i16> %zn2, <vscale x 8 x i16> %zn3,2105                                                           <vscale x 8 x i16> %zn4, i32 1)2106  ret void2107}2108 2109 2110 2111define void @sudot_lane_za32_u8_vg1x2(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2) #0 {2112; CHECK-LABEL: sudot_lane_za32_u8_vg1x2:2113; CHECK:       // %bb.0:2114; CHECK-NEXT:    mov z5.d, z2.d2115; CHECK-NEXT:    mov z4.d, z1.d2116; CHECK-NEXT:    mov w8, w02117; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z4.b, z5.b }, z3.b[3]2118; CHECK-NEXT:    sudot za.s[w8, 7, vgx2], { z4.b, z5.b }, z3.b[3]2119; CHECK-NEXT:    ret2120  call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)2121  %slice2 = add i32 %slice, 72122  call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, i32 3)2123  ret void2124}2125 2126define void @sudot_lane_za32_u8_vg1x4(i32 %slice, <vscale x 16 x i8> %unused, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zn4) #0 {2127; CHECK-LABEL: sudot_lane_za32_u8_vg1x4:2128; CHECK:       // %bb.0:2129; CHECK-NEXT:    mov z27.d, z4.d2130; CHECK-NEXT:    mov z26.d, z3.d2131; CHECK-NEXT:    mov w8, w02132; CHECK-NEXT:    mov z25.d, z2.d2133; CHECK-NEXT:    mov z24.d, z1.d2134; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z24.b - z27.b }, z5.b[3]2135; CHECK-NEXT:    sudot za.s[w8, 7, vgx4], { z24.b - z27.b }, z5.b[3]2136; CHECK-NEXT:    ret2137  call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,2138                                                            <vscale x 16 x i8> %zn4, i32 3)2139  %slice2 = add i32 %slice, 72140  call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 %slice2, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,2141                                                            <vscale x 16 x i8> %zn4, i32 3)2142  ret void2143}2144 2145define void @sudot_form_2x_tuple(ptr %ptr, i64 %stride) #0 {2146; CHECK-LABEL: sudot_form_2x_tuple:2147; CHECK:       // %bb.0: // %entry2148; CHECK-NEXT:    ptrue pn8.b2149; CHECK-NEXT:    mov w8, wzr2150; CHECK-NEXT:    ld1b { z16.b, z24.b }, pn8/z, [x0]2151; CHECK-NEXT:    ld1b { z17.b, z25.b }, pn8/z, [x0, x1]2152; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z16.b, z17.b }, z0.b[0]2153; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z24.b, z25.b }, z0.b[0]2154; CHECK-NEXT:    ret2155entry:2156  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()2157  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)2158  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 02159  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 12160  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride2161  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)2162  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 02163  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 12164  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)2165  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)2166  ret void2167}2168 2169define void @sudot_form_2x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {2170; CHECK-LABEL: sudot_form_2x_tuple_svecc:2171; CHECK:       // %bb.0: // %entry2172; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill2173; CHECK-NEXT:    addvl sp, sp, #-32174; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill2175; CHECK-NEXT:    ptrue pn8.b2176; CHECK-NEXT:    mov w8, wzr2177; CHECK-NEXT:    str z11, [sp, #1, mul vl] // 16-byte Folded Spill2178; CHECK-NEXT:    str z10, [sp, #2, mul vl] // 16-byte Folded Spill2179; CHECK-NEXT:    ld1b { z2.b, z10.b }, pn8/z, [x0]2180; CHECK-NEXT:    ld1b { z3.b, z11.b }, pn8/z, [x0, x1]2181; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z2.b, z3.b }, z0.b[0]2182; CHECK-NEXT:    sudot za.s[w8, 0, vgx2], { z10.b, z11.b }, z0.b[0]2183; CHECK-NEXT:    ldr z11, [sp, #1, mul vl] // 16-byte Folded Reload2184; CHECK-NEXT:    ldr z10, [sp, #2, mul vl] // 16-byte Folded Reload2185; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload2186; CHECK-NEXT:    str z0, [x0]2187; CHECK-NEXT:    addvl sp, sp, #32188; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload2189; CHECK-NEXT:    ret2190entry:2191  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()2192  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)2193  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 02194  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 12195  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride2196  %4 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x2.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)2197  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 02198  %6 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %4, 12199  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %5, <vscale x 16 x i8> poison, i32 0)2200  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %6, <vscale x 16 x i8> poison, i32 0)2201  store <vscale x 16 x i8> %scalable_arg, ptr %ptr2202  ret void2203}2204 2205define void @sudot_form_4x_tuple(ptr %ptr, i64 %stride) #0 {2206; CHECK-LABEL: sudot_form_4x_tuple:2207; CHECK:       // %bb.0: // %entry2208; CHECK-NEXT:    lsl x9, x1, #12209; CHECK-NEXT:    ptrue pn8.b2210; CHECK-NEXT:    mov w8, wzr2211; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]2212; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]2213; CHECK-NEXT:    add x10, x9, x12214; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]2215; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]2216; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]2217; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]2218; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]2219; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]2220; CHECK-NEXT:    ret2221entry:2222  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()2223  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)2224  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 02225  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 12226  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 22227  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 32228  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride2229  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)2230  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 02231  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 12232  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 22233  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 32234  %mul3 = shl i64 %stride, 12235  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul32236  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)2237  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 02238  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 12239  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 22240  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 32241  %mul5 = mul i64 %stride, 32242  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul52243  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)2244  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 02245  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 12246  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 22247  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 32248  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)2249  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)2250  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)2251  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)2252  ret void2253}2254 2255define void @sudot_form_4x_tuple_svecc(ptr %ptr, i64 %stride, <vscale x 16 x i8> %scalable_arg) #0 {2256; CHECK-LABEL: sudot_form_4x_tuple_svecc:2257; CHECK:       // %bb.0: // %entry2258; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill2259; CHECK-NEXT:    addvl sp, sp, #-92260; CHECK-NEXT:    lsl x9, x1, #12261; CHECK-NEXT:    str p8, [sp, #7, mul vl] // 2-byte Spill2262; CHECK-NEXT:    ptrue pn8.b2263; CHECK-NEXT:    str z23, [sp, #1, mul vl] // 16-byte Folded Spill2264; CHECK-NEXT:    mov w8, wzr2265; CHECK-NEXT:    str z22, [sp, #2, mul vl] // 16-byte Folded Spill2266; CHECK-NEXT:    add x10, x9, x12267; CHECK-NEXT:    str z21, [sp, #3, mul vl] // 16-byte Folded Spill2268; CHECK-NEXT:    str z20, [sp, #4, mul vl] // 16-byte Folded Spill2269; CHECK-NEXT:    str z19, [sp, #5, mul vl] // 16-byte Folded Spill2270; CHECK-NEXT:    str z18, [sp, #6, mul vl] // 16-byte Folded Spill2271; CHECK-NEXT:    str z17, [sp, #7, mul vl] // 16-byte Folded Spill2272; CHECK-NEXT:    str z16, [sp, #8, mul vl] // 16-byte Folded Spill2273; CHECK-NEXT:    ld1b { z16.b, z20.b, z24.b, z28.b }, pn8/z, [x0]2274; CHECK-NEXT:    ld1b { z17.b, z21.b, z25.b, z29.b }, pn8/z, [x0, x1]2275; CHECK-NEXT:    ld1b { z18.b, z22.b, z26.b, z30.b }, pn8/z, [x0, x9]2276; CHECK-NEXT:    ld1b { z19.b, z23.b, z27.b, z31.b }, pn8/z, [x0, x10]2277; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z16.b - z19.b }, z0.b[0]2278; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z20.b - z23.b }, z0.b[0]2279; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z24.b - z27.b }, z0.b[0]2280; CHECK-NEXT:    sudot za.s[w8, 0, vgx4], { z28.b - z31.b }, z0.b[0]2281; CHECK-NEXT:    ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload2282; CHECK-NEXT:    ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload2283; CHECK-NEXT:    ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload2284; CHECK-NEXT:    ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload2285; CHECK-NEXT:    ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload2286; CHECK-NEXT:    ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload2287; CHECK-NEXT:    ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload2288; CHECK-NEXT:    ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload2289; CHECK-NEXT:    ldr p8, [sp, #7, mul vl] // 2-byte Reload2290; CHECK-NEXT:    str z0, [x0]2291; CHECK-NEXT:    addvl sp, sp, #92292; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload2293; CHECK-NEXT:    ret2294entry:2295  %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8()2296  %1 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %ptr)2297  %2 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 02298  %3 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 12299  %4 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 22300  %5 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %1, 32301  %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride2302  %6 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx2)2303  %7 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 02304  %8 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 12305  %9 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 22306  %10 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %6, 32307  %mul3 = shl i64 %stride, 12308  %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul32309  %11 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx4)2310  %12 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 02311  %13 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 12312  %14 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 22313  %15 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %11, 32314  %mul5 = mul i64 %stride, 32315  %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul52316  %16 = tail call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.ld1.pn.x4.nxv16i8(target("aarch64.svcount") %0, ptr %arrayidx6)2317  %17 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 02318  %18 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 12319  %19 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 22320  %20 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %16, 32321  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %2, <vscale x 16 x i8> %7, <vscale x 16 x i8> %12, <vscale x 16 x i8> %17, <vscale x 16 x i8> poison, i32 0)2322  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %3, <vscale x 16 x i8> %8, <vscale x 16 x i8> %13, <vscale x 16 x i8> %18, <vscale x 16 x i8> poison, i32 0)2323  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %4, <vscale x 16 x i8> %9, <vscale x 16 x i8> %14, <vscale x 16 x i8> %19, <vscale x 16 x i8> poison, i32 0)2324  tail call void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32 0, <vscale x 16 x i8> %5, <vscale x 16 x i8> %10, <vscale x 16 x i8> %15, <vscale x 16 x i8> %20, <vscale x 16 x i8> poison, i32 0)2325  store <vscale x 16 x i8> %scalable_arg, ptr %ptr2326  ret void2327}2328 2329 2330attributes #0 = { nounwind "target-features"="+sme2" }2331attributes #1 = { nounwind "target-features"="+sme2,+sme-i16i64" }2332 2333; == Multi, multi (unsigned)2334 2335declare void @llvm.aarch64.sme.udot.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2336declare void @llvm.aarch64.sme.udot.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>,2337                                                       <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2338declare void @llvm.aarch64.sme.udot.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2339declare void @llvm.aarch64.sme.udot.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>,2340                                                       <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2341declare void @llvm.aarch64.sme.udot.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2342declare void @llvm.aarch64.sme.udot.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>,2343                                                       <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2344declare void @llvm.aarch64.sme.usdot.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2345declare void @llvm.aarch64.sme.usdot.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>,2346                                                        <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2347 2348; == Multi, multi (signed)2349 2350declare void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2351declare void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>,2352                                                       <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2353declare void @llvm.aarch64.sme.sdot.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2354declare void @llvm.aarch64.sme.sdot.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>,2355                                                       <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2356declare void @llvm.aarch64.sme.sdot.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2357declare void @llvm.aarch64.sme.sdot.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>,2358                                                       <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2359 2360; == Multi, single (unsigned)2361 2362declare void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2363declare void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2364declare void @llvm.aarch64.sme.udot.single.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2365declare void @llvm.aarch64.sme.udot.single.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2366declare void @llvm.aarch64.sme.udot.single.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2367declare void @llvm.aarch64.sme.udot.single.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2368declare void @llvm.aarch64.sme.usdot.single.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2369declare void @llvm.aarch64.sme.usdot.single.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2370 2371; == Multi, single (signed)2372 2373declare void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2374declare void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2375declare void @llvm.aarch64.sme.sdot.single.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2376declare void @llvm.aarch64.sme.sdot.single.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2377declare void @llvm.aarch64.sme.sdot.single.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2378declare void @llvm.aarch64.sme.sdot.single.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)2379declare void @llvm.aarch64.sme.sudot.single.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2380declare void @llvm.aarch64.sme.sudot.single.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)2381 2382; == Multi, indexed (unsigned)2383 2384declare void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2385declare void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2386declare void @llvm.aarch64.sme.udot.lane.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2387declare void @llvm.aarch64.sme.udot.lane.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2388declare void @llvm.aarch64.sme.udot.lane.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2389declare void @llvm.aarch64.sme.udot.lane.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2390declare void @llvm.aarch64.sme.usdot.lane.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2391declare void @llvm.aarch64.sme.usdot.lane.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2392 2393; == Multi, indexed (signed)2394 2395declare void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2396declare void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2397declare void @llvm.aarch64.sme.sdot.lane.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2398declare void @llvm.aarch64.sme.sdot.lane.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2399declare void @llvm.aarch64.sme.sdot.lane.za64.vg1x2.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2400declare void @llvm.aarch64.sme.sdot.lane.za64.vg1x4.nxv8i16(i32, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)2401declare void @llvm.aarch64.sme.sudot.lane.za32.vg1x2.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2402declare void @llvm.aarch64.sme.sudot.lane.za32.vg1x4.nxv16i8(i32, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)2403