brintos

brintos / llvm-project-archived public Read only

0
0
Text · 149.4 KiB · 4a54081 Raw
3493 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6 7target triple = "aarch64-unknown-linux-gnu"8 9;10; truncate i16 -> i811;12 13define <16 x i8> @trunc_v16i16_v16i8(ptr %in) nounwind {14; CHECK-LABEL: trunc_v16i16_v16i8:15; CHECK:       // %bb.0:16; CHECK-NEXT:    ldp q1, q0, [x0]17; CHECK-NEXT:    ptrue p0.b, vl818; CHECK-NEXT:    uzp1 z3.b, z0.b, z0.b19; CHECK-NEXT:    uzp1 z2.b, z1.b, z1.b20; CHECK-NEXT:    splice z0.b, p0, { z2.b, z3.b }21; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z022; CHECK-NEXT:    ret23;24; NONEON-NOSVE-LABEL: trunc_v16i16_v16i8:25; NONEON-NOSVE:       // %bb.0:26; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]27; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!28; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]29; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]30; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]31; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]32; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]33; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]34; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]35; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]36; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]37; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]38; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]39; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]40; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]41; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]42; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]43; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]44; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]45; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]46; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]47; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]48; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]49; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]50; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]51; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]52; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]53; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]54; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]55; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]56; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]57; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]58; NONEON-NOSVE-NEXT:    ldrh w8, [sp]59; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]60; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]61; NONEON-NOSVE-NEXT:    add sp, sp, #4862; NONEON-NOSVE-NEXT:    ret63  %a = load <16 x i16>, ptr %in64  %b = trunc <16 x i16> %a to <16 x i8>65  ret <16 x i8> %b66}67 68; NOTE: Extra 'add' is to prevent the truncate being combined with the store.69define void @trunc_v32i16_v32i8(ptr %in, ptr %out) nounwind {70; CHECK-LABEL: trunc_v32i16_v32i8:71; CHECK:       // %bb.0:72; CHECK-NEXT:    ldp q1, q0, [x0, #32]73; CHECK-NEXT:    ptrue p0.b, vl874; CHECK-NEXT:    ldp q3, q2, [x0]75; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b76; CHECK-NEXT:    uzp1 z4.b, z1.b, z1.b77; CHECK-NEXT:    uzp1 z1.b, z2.b, z2.b78; CHECK-NEXT:    uzp1 z0.b, z3.b, z3.b79; CHECK-NEXT:    splice z2.b, p0, { z4.b, z5.b }80; CHECK-NEXT:    splice z0.b, p0, { z0.b, z1.b }81; CHECK-NEXT:    add z1.b, z2.b, z2.b82; CHECK-NEXT:    add z0.b, z0.b, z0.b83; CHECK-NEXT:    stp q0, q1, [x1]84; CHECK-NEXT:    ret85;86; NONEON-NOSVE-LABEL: trunc_v32i16_v32i8:87; NONEON-NOSVE:       // %bb.0:88; NONEON-NOSVE-NEXT:    sub sp, sp, #20889; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0, #32]90; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #112] // 16-byte Folded Spill91; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]92; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #128] // 16-byte Folded Spill93; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #144] // 16-byte Folded Spill94; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #160] // 16-byte Folded Spill95; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #16]96; NONEON-NOSVE-NEXT:    stp q2, q0, [sp, #48]97; NONEON-NOSVE-NEXT:    ldrh w25, [sp, #28]98; NONEON-NOSVE-NEXT:    ldrh w26, [sp, #30]99; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #64]100; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #66]101; NONEON-NOSVE-NEXT:    ldrh w29, [sp, #52]102; NONEON-NOSVE-NEXT:    ldrh w27, [sp, #48]103; NONEON-NOSVE-NEXT:    ldrh w28, [sp, #50]104; NONEON-NOSVE-NEXT:    ldrh w23, [sp, #24]105; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill106; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]107; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #54]108; NONEON-NOSVE-NEXT:    ldrh w24, [sp, #26]109; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #176] // 16-byte Folded Spill110; NONEON-NOSVE-NEXT:    ldrh w21, [sp, #20]111; NONEON-NOSVE-NEXT:    add w8, w8, w8112; NONEON-NOSVE-NEXT:    add w9, w9, w9113; NONEON-NOSVE-NEXT:    ldrh w22, [sp, #22]114; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]115; NONEON-NOSVE-NEXT:    add w8, w29, w29116; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #44]117; NONEON-NOSVE-NEXT:    strb w9, [sp, #91]118; NONEON-NOSVE-NEXT:    add w9, w28, w28119; NONEON-NOSVE-NEXT:    ldrh w7, [sp, #46]120; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]121; NONEON-NOSVE-NEXT:    add w8, w27, w27122; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #40]123; NONEON-NOSVE-NEXT:    strb w9, [sp, #89]124; NONEON-NOSVE-NEXT:    add w9, w26, w26125; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #42]126; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]127; NONEON-NOSVE-NEXT:    add w8, w25, w25128; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #36]129; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #192] // 16-byte Folded Spill130; NONEON-NOSVE-NEXT:    ldrh w19, [sp, #16]131; NONEON-NOSVE-NEXT:    ldrh w20, [sp, #18]132; NONEON-NOSVE-NEXT:    strb w9, [sp, #87]133; NONEON-NOSVE-NEXT:    add w9, w24, w24134; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #38]135; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]136; NONEON-NOSVE-NEXT:    add w8, w23, w23137; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #60]138; NONEON-NOSVE-NEXT:    strb w9, [sp, #85]139; NONEON-NOSVE-NEXT:    add w9, w22, w22140; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #62]141; NONEON-NOSVE-NEXT:    add w6, w12, w12142; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]143; NONEON-NOSVE-NEXT:    add w8, w21, w21144; NONEON-NOSVE-NEXT:    add w5, w13, w13145; NONEON-NOSVE-NEXT:    strb w9, [sp, #83]146; NONEON-NOSVE-NEXT:    add w9, w20, w20147; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]148; NONEON-NOSVE-NEXT:    add w8, w19, w19149; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #32]150; NONEON-NOSVE-NEXT:    strb w9, [sp, #81]151; NONEON-NOSVE-NEXT:    add w9, w7, w7152; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #34]153; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]154; NONEON-NOSVE-NEXT:    add w8, w4, w4155; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #76]156; NONEON-NOSVE-NEXT:    strb w9, [sp, #111]157; NONEON-NOSVE-NEXT:    add w9, w3, w3158; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #78]159; NONEON-NOSVE-NEXT:    strb w8, [sp, #110]160; NONEON-NOSVE-NEXT:    add w8, w2, w2161; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #72]162; NONEON-NOSVE-NEXT:    strb w9, [sp, #109]163; NONEON-NOSVE-NEXT:    add w9, w0, w0164; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #74]165; NONEON-NOSVE-NEXT:    strb w8, [sp, #108]166; NONEON-NOSVE-NEXT:    add w8, w18, w18167; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #68]168; NONEON-NOSVE-NEXT:    strb w9, [sp, #107]169; NONEON-NOSVE-NEXT:    add w9, w17, w17170; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #70]171; NONEON-NOSVE-NEXT:    strb w8, [sp, #106]172; NONEON-NOSVE-NEXT:    add w8, w16, w16173; NONEON-NOSVE-NEXT:    ldrh w30, [sp, #58]174; NONEON-NOSVE-NEXT:    strb w9, [sp, #105]175; NONEON-NOSVE-NEXT:    add w9, w15, w15176; NONEON-NOSVE-NEXT:    strb w8, [sp, #104]177; NONEON-NOSVE-NEXT:    add w8, w14, w14178; NONEON-NOSVE-NEXT:    strb w9, [sp, #103]179; NONEON-NOSVE-NEXT:    add w9, w13, w13180; NONEON-NOSVE-NEXT:    strb w8, [sp, #102]181; NONEON-NOSVE-NEXT:    add w8, w12, w12182; NONEON-NOSVE-NEXT:    strb w9, [sp, #101]183; NONEON-NOSVE-NEXT:    add w9, w11, w11184; NONEON-NOSVE-NEXT:    strb w8, [sp, #100]185; NONEON-NOSVE-NEXT:    add w8, w10, w10186; NONEON-NOSVE-NEXT:    strb w9, [sp, #99]187; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Reload188; NONEON-NOSVE-NEXT:    strb w8, [sp, #98]189; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Reload190; NONEON-NOSVE-NEXT:    strb w5, [sp, #95]191; NONEON-NOSVE-NEXT:    add w5, w30, w30192; NONEON-NOSVE-NEXT:    add w9, w9, w9193; NONEON-NOSVE-NEXT:    add w8, w8, w8194; NONEON-NOSVE-NEXT:    strb w6, [sp, #94]195; NONEON-NOSVE-NEXT:    strb w5, [sp, #93]196; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #192] // 16-byte Folded Reload197; NONEON-NOSVE-NEXT:    strb w9, [sp, #97]198; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #176] // 16-byte Folded Reload199; NONEON-NOSVE-NEXT:    strb w8, [sp, #96]200; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #160] // 16-byte Folded Reload201; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #80]202; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #144] // 16-byte Folded Reload203; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #128] // 16-byte Folded Reload204; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #112] // 16-byte Folded Reload205; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]206; NONEON-NOSVE-NEXT:    add sp, sp, #208207; NONEON-NOSVE-NEXT:    ret208  %a = load <32 x i16>, ptr %in209  %b = trunc <32 x i16> %a to <32 x i8>210  %c = add <32 x i8> %b, %b211  store <32 x i8> %c, ptr %out212  ret void213}214 215; NOTE: Extra 'add' is to prevent the truncate being combined with the store.216define void @trunc_v64i16_v64i8(ptr %in, ptr %out) nounwind {217; CHECK-LABEL: trunc_v64i16_v64i8:218; CHECK:       // %bb.0:219; CHECK-NEXT:    ldp q1, q0, [x0, #64]220; CHECK-NEXT:    ptrue p0.b, vl8221; CHECK-NEXT:    ldp q2, q3, [x0, #96]222; CHECK-NEXT:    ldp q4, q5, [x0]223; CHECK-NEXT:    uzp1 z7.b, z0.b, z0.b224; CHECK-NEXT:    uzp1 z6.b, z1.b, z1.b225; CHECK-NEXT:    ldp q1, q0, [x0, #32]226; CHECK-NEXT:    uzp1 z17.b, z3.b, z3.b227; CHECK-NEXT:    uzp1 z16.b, z2.b, z2.b228; CHECK-NEXT:    uzp1 z3.b, z5.b, z5.b229; CHECK-NEXT:    uzp1 z2.b, z4.b, z4.b230; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b231; CHECK-NEXT:    splice z0.b, p0, { z6.b, z7.b }232; CHECK-NEXT:    uzp1 z4.b, z1.b, z1.b233; CHECK-NEXT:    splice z1.b, p0, { z16.b, z17.b }234; CHECK-NEXT:    splice z2.b, p0, { z2.b, z3.b }235; CHECK-NEXT:    splice z3.b, p0, { z4.b, z5.b }236; CHECK-NEXT:    add z0.b, z0.b, z0.b237; CHECK-NEXT:    add z1.b, z1.b, z1.b238; CHECK-NEXT:    add z2.b, z2.b, z2.b239; CHECK-NEXT:    add z3.b, z3.b, z3.b240; CHECK-NEXT:    stp q0, q1, [x1, #32]241; CHECK-NEXT:    stp q2, q3, [x1]242; CHECK-NEXT:    ret243;244; NONEON-NOSVE-LABEL: trunc_v64i16_v64i8:245; NONEON-NOSVE:       // %bb.0:246; NONEON-NOSVE-NEXT:    sub sp, sp, #448247; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]248; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #416] // 16-byte Folded Spill249; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0]250; NONEON-NOSVE-NEXT:    str x1, [sp, #152] // 8-byte Spill251; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #432] // 16-byte Folded Spill252; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #64]253; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #400] // 16-byte Folded Spill254; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #96]255; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #224]256; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #238]257; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #256]258; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #232]259; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #272]260; NONEON-NOSVE-NEXT:    stp q5, q7, [sp, #160]261; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #230]262; NONEON-NOSVE-NEXT:    add w21, w8, w8263; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #274]264; NONEON-NOSVE-NEXT:    stp q6, q0, [sp, #192]265; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #228]266; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #226]267; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #224]268; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144] // 8-byte Folded Spill269; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #276]270; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #278]271; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #270]272; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #268]273; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #266]274; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136] // 8-byte Folded Spill275; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #280]276; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #282]277; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #264]278; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #262]279; NONEON-NOSVE-NEXT:    ldrh w1, [sp, #260]280; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128] // 8-byte Folded Spill281; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #284]282; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #286]283; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #258]284; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #256]285; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #254]286; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120] // 8-byte Folded Spill287; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #208]288; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #210]289; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #252]290; NONEON-NOSVE-NEXT:    ldrh w6, [sp, #250]291; NONEON-NOSVE-NEXT:    ldrh w7, [sp, #248]292; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112] // 8-byte Folded Spill293; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #212]294; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #214]295; NONEON-NOSVE-NEXT:    ldrh w19, [sp, #246]296; NONEON-NOSVE-NEXT:    ldrh w20, [sp, #244]297; NONEON-NOSVE-NEXT:    ldrh w22, [sp, #242]298; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104] // 8-byte Folded Spill299; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #216]300; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #218]301; NONEON-NOSVE-NEXT:    ldrh w23, [sp, #240]302; NONEON-NOSVE-NEXT:    ldrh w24, [sp, #174]303; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #384] // 16-byte Folded Spill304; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96] // 8-byte Folded Spill305; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #220]306; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #222]307; NONEON-NOSVE-NEXT:    ldrh w25, [sp, #172]308; NONEON-NOSVE-NEXT:    ldrh w26, [sp, #170]309; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #368] // 16-byte Folded Spill310; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88] // 8-byte Folded Spill311; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #176]312; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #178]313; NONEON-NOSVE-NEXT:    ldrh w27, [sp, #168]314; NONEON-NOSVE-NEXT:    ldrh w28, [sp, #166]315; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #352] // 16-byte Folded Spill316; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80] // 8-byte Folded Spill317; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #180]318; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #182]319; NONEON-NOSVE-NEXT:    ldrh w29, [sp, #164]320; NONEON-NOSVE-NEXT:    ldrh w30, [sp, #162]321; NONEON-NOSVE-NEXT:    strb w21, [sp, #335]322; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72] // 8-byte Folded Spill323; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #184]324; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #186]325; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64] // 8-byte Folded Spill326; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #188]327; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #190]328; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56] // 8-byte Folded Spill329; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #192]330; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #194]331; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48] // 8-byte Folded Spill332; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #196]333; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #198]334; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40] // 8-byte Folded Spill335; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #200]336; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #202]337; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32] // 8-byte Folded Spill338; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #204]339; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #206]340; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24] // 8-byte Folded Spill341; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #160]342; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #236]343; NONEON-NOSVE-NEXT:    add w9, w9, w9344; NONEON-NOSVE-NEXT:    str w8, [sp, #20] // 4-byte Spill345; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #234]346; NONEON-NOSVE-NEXT:    strb w9, [sp, #334]347; NONEON-NOSVE-NEXT:    add w8, w8, w8348; NONEON-NOSVE-NEXT:    strb w8, [sp, #333]349; NONEON-NOSVE-NEXT:    add w8, w10, w10350; NONEON-NOSVE-NEXT:    strb w8, [sp, #332]351; NONEON-NOSVE-NEXT:    add w8, w11, w11352; NONEON-NOSVE-NEXT:    strb w8, [sp, #331]353; NONEON-NOSVE-NEXT:    add w8, w12, w12354; NONEON-NOSVE-NEXT:    strb w8, [sp, #330]355; NONEON-NOSVE-NEXT:    add w8, w13, w13356; NONEON-NOSVE-NEXT:    strb w8, [sp, #329]357; NONEON-NOSVE-NEXT:    add w8, w14, w14358; NONEON-NOSVE-NEXT:    strb w8, [sp, #328]359; NONEON-NOSVE-NEXT:    add w8, w15, w15360; NONEON-NOSVE-NEXT:    strb w8, [sp, #327]361; NONEON-NOSVE-NEXT:    add w8, w16, w16362; NONEON-NOSVE-NEXT:    strb w8, [sp, #326]363; NONEON-NOSVE-NEXT:    add w8, w17, w17364; NONEON-NOSVE-NEXT:    strb w8, [sp, #325]365; NONEON-NOSVE-NEXT:    add w8, w18, w18366; NONEON-NOSVE-NEXT:    strb w8, [sp, #324]367; NONEON-NOSVE-NEXT:    add w8, w0, w0368; NONEON-NOSVE-NEXT:    strb w8, [sp, #323]369; NONEON-NOSVE-NEXT:    add w8, w1, w1370; NONEON-NOSVE-NEXT:    strb w8, [sp, #322]371; NONEON-NOSVE-NEXT:    add w8, w2, w2372; NONEON-NOSVE-NEXT:    strb w8, [sp, #321]373; NONEON-NOSVE-NEXT:    add w8, w3, w3374; NONEON-NOSVE-NEXT:    strb w8, [sp, #320]375; NONEON-NOSVE-NEXT:    add w8, w4, w4376; NONEON-NOSVE-NEXT:    strb w8, [sp, #319]377; NONEON-NOSVE-NEXT:    add w8, w5, w5378; NONEON-NOSVE-NEXT:    strb w8, [sp, #318]379; NONEON-NOSVE-NEXT:    add w8, w6, w6380; NONEON-NOSVE-NEXT:    strb w8, [sp, #317]381; NONEON-NOSVE-NEXT:    add w8, w7, w7382; NONEON-NOSVE-NEXT:    strb w8, [sp, #316]383; NONEON-NOSVE-NEXT:    add w8, w19, w19384; NONEON-NOSVE-NEXT:    strb w8, [sp, #315]385; NONEON-NOSVE-NEXT:    add w8, w20, w20386; NONEON-NOSVE-NEXT:    strb w8, [sp, #314]387; NONEON-NOSVE-NEXT:    add w8, w22, w22388; NONEON-NOSVE-NEXT:    strb w8, [sp, #313]389; NONEON-NOSVE-NEXT:    add w8, w23, w23390; NONEON-NOSVE-NEXT:    strb w8, [sp, #312]391; NONEON-NOSVE-NEXT:    add w8, w24, w24392; NONEON-NOSVE-NEXT:    strb w8, [sp, #311]393; NONEON-NOSVE-NEXT:    add w8, w25, w25394; NONEON-NOSVE-NEXT:    strb w8, [sp, #310]395; NONEON-NOSVE-NEXT:    add w8, w26, w26396; NONEON-NOSVE-NEXT:    strb w8, [sp, #309]397; NONEON-NOSVE-NEXT:    add w8, w27, w27398; NONEON-NOSVE-NEXT:    strb w8, [sp, #308]399; NONEON-NOSVE-NEXT:    add w8, w28, w28400; NONEON-NOSVE-NEXT:    strb w8, [sp, #307]401; NONEON-NOSVE-NEXT:    add w8, w29, w29402; NONEON-NOSVE-NEXT:    strb w8, [sp, #306]403; NONEON-NOSVE-NEXT:    add w8, w30, w30404; NONEON-NOSVE-NEXT:    strb w8, [sp, #305]405; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20] // 4-byte Reload406; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #432] // 16-byte Folded Reload407; NONEON-NOSVE-NEXT:    add w8, w8, w8408; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #416] // 16-byte Folded Reload409; NONEON-NOSVE-NEXT:    strb w8, [sp, #304]410; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24] // 4-byte Reload411; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #400] // 16-byte Folded Reload412; NONEON-NOSVE-NEXT:    add w8, w8, w8413; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #384] // 16-byte Folded Reload414; NONEON-NOSVE-NEXT:    strb w8, [sp, #303]415; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28] // 4-byte Reload416; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #368] // 16-byte Folded Reload417; NONEON-NOSVE-NEXT:    add w8, w8, w8418; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #352] // 16-byte Folded Reload419; NONEON-NOSVE-NEXT:    strb w8, [sp, #302]420; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32] // 4-byte Reload421; NONEON-NOSVE-NEXT:    add w8, w8, w8422; NONEON-NOSVE-NEXT:    strb w8, [sp, #301]423; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36] // 4-byte Reload424; NONEON-NOSVE-NEXT:    add w8, w8, w8425; NONEON-NOSVE-NEXT:    strb w8, [sp, #300]426; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40] // 4-byte Reload427; NONEON-NOSVE-NEXT:    add w8, w8, w8428; NONEON-NOSVE-NEXT:    strb w8, [sp, #299]429; NONEON-NOSVE-NEXT:    ldr w8, [sp, #44] // 4-byte Reload430; NONEON-NOSVE-NEXT:    add w8, w8, w8431; NONEON-NOSVE-NEXT:    strb w8, [sp, #298]432; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48] // 4-byte Reload433; NONEON-NOSVE-NEXT:    add w8, w8, w8434; NONEON-NOSVE-NEXT:    strb w8, [sp, #297]435; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52] // 4-byte Reload436; NONEON-NOSVE-NEXT:    add w8, w8, w8437; NONEON-NOSVE-NEXT:    strb w8, [sp, #296]438; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56] // 4-byte Reload439; NONEON-NOSVE-NEXT:    add w8, w8, w8440; NONEON-NOSVE-NEXT:    strb w8, [sp, #295]441; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60] // 4-byte Reload442; NONEON-NOSVE-NEXT:    add w8, w8, w8443; NONEON-NOSVE-NEXT:    strb w8, [sp, #294]444; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64] // 4-byte Reload445; NONEON-NOSVE-NEXT:    add w8, w8, w8446; NONEON-NOSVE-NEXT:    strb w8, [sp, #293]447; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68] // 4-byte Reload448; NONEON-NOSVE-NEXT:    add w8, w8, w8449; NONEON-NOSVE-NEXT:    strb w8, [sp, #292]450; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72] // 4-byte Reload451; NONEON-NOSVE-NEXT:    add w8, w8, w8452; NONEON-NOSVE-NEXT:    strb w8, [sp, #291]453; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76] // 4-byte Reload454; NONEON-NOSVE-NEXT:    add w8, w8, w8455; NONEON-NOSVE-NEXT:    strb w8, [sp, #290]456; NONEON-NOSVE-NEXT:    ldr w8, [sp, #80] // 4-byte Reload457; NONEON-NOSVE-NEXT:    add w8, w8, w8458; NONEON-NOSVE-NEXT:    strb w8, [sp, #289]459; NONEON-NOSVE-NEXT:    ldr w8, [sp, #84] // 4-byte Reload460; NONEON-NOSVE-NEXT:    add w8, w8, w8461; NONEON-NOSVE-NEXT:    strb w8, [sp, #288]462; NONEON-NOSVE-NEXT:    ldr w8, [sp, #88] // 4-byte Reload463; NONEON-NOSVE-NEXT:    ldp q1, q3, [sp, #288]464; NONEON-NOSVE-NEXT:    add w8, w8, w8465; NONEON-NOSVE-NEXT:    strb w8, [sp, #351]466; NONEON-NOSVE-NEXT:    ldr w8, [sp, #92] // 4-byte Reload467; NONEON-NOSVE-NEXT:    add w8, w8, w8468; NONEON-NOSVE-NEXT:    strb w8, [sp, #350]469; NONEON-NOSVE-NEXT:    ldr w8, [sp, #96] // 4-byte Reload470; NONEON-NOSVE-NEXT:    add w8, w8, w8471; NONEON-NOSVE-NEXT:    strb w8, [sp, #349]472; NONEON-NOSVE-NEXT:    ldr w8, [sp, #100] // 4-byte Reload473; NONEON-NOSVE-NEXT:    add w8, w8, w8474; NONEON-NOSVE-NEXT:    strb w8, [sp, #348]475; NONEON-NOSVE-NEXT:    ldr w8, [sp, #104] // 4-byte Reload476; NONEON-NOSVE-NEXT:    add w8, w8, w8477; NONEON-NOSVE-NEXT:    strb w8, [sp, #347]478; NONEON-NOSVE-NEXT:    ldr w8, [sp, #108] // 4-byte Reload479; NONEON-NOSVE-NEXT:    add w8, w8, w8480; NONEON-NOSVE-NEXT:    strb w8, [sp, #346]481; NONEON-NOSVE-NEXT:    ldr w8, [sp, #112] // 4-byte Reload482; NONEON-NOSVE-NEXT:    add w8, w8, w8483; NONEON-NOSVE-NEXT:    strb w8, [sp, #345]484; NONEON-NOSVE-NEXT:    ldr w8, [sp, #116] // 4-byte Reload485; NONEON-NOSVE-NEXT:    add w8, w8, w8486; NONEON-NOSVE-NEXT:    strb w8, [sp, #344]487; NONEON-NOSVE-NEXT:    ldr w8, [sp, #120] // 4-byte Reload488; NONEON-NOSVE-NEXT:    add w8, w8, w8489; NONEON-NOSVE-NEXT:    strb w8, [sp, #343]490; NONEON-NOSVE-NEXT:    ldr w8, [sp, #124] // 4-byte Reload491; NONEON-NOSVE-NEXT:    add w8, w8, w8492; NONEON-NOSVE-NEXT:    strb w8, [sp, #342]493; NONEON-NOSVE-NEXT:    ldr w8, [sp, #128] // 4-byte Reload494; NONEON-NOSVE-NEXT:    add w8, w8, w8495; NONEON-NOSVE-NEXT:    strb w8, [sp, #341]496; NONEON-NOSVE-NEXT:    ldr w8, [sp, #132] // 4-byte Reload497; NONEON-NOSVE-NEXT:    add w8, w8, w8498; NONEON-NOSVE-NEXT:    strb w8, [sp, #340]499; NONEON-NOSVE-NEXT:    ldr w8, [sp, #136] // 4-byte Reload500; NONEON-NOSVE-NEXT:    add w8, w8, w8501; NONEON-NOSVE-NEXT:    strb w8, [sp, #339]502; NONEON-NOSVE-NEXT:    ldr w8, [sp, #140] // 4-byte Reload503; NONEON-NOSVE-NEXT:    add w8, w8, w8504; NONEON-NOSVE-NEXT:    strb w8, [sp, #338]505; NONEON-NOSVE-NEXT:    ldr w8, [sp, #144] // 4-byte Reload506; NONEON-NOSVE-NEXT:    add w8, w8, w8507; NONEON-NOSVE-NEXT:    strb w8, [sp, #337]508; NONEON-NOSVE-NEXT:    ldr w8, [sp, #148] // 4-byte Reload509; NONEON-NOSVE-NEXT:    add w8, w8, w8510; NONEON-NOSVE-NEXT:    strb w8, [sp, #336]511; NONEON-NOSVE-NEXT:    ldr x8, [sp, #152] // 8-byte Reload512; NONEON-NOSVE-NEXT:    ldp q2, q0, [sp, #320]513; NONEON-NOSVE-NEXT:    stp q3, q2, [x8]514; NONEON-NOSVE-NEXT:    stp q0, q1, [x8, #32]515; NONEON-NOSVE-NEXT:    add sp, sp, #448516; NONEON-NOSVE-NEXT:    ret517  %a = load <64 x i16>, ptr %in518  %b = trunc <64 x i16> %a to <64 x i8>519  %c = add <64 x i8> %b, %b520  store <64 x i8> %c, ptr %out521  ret void522}523 524; NOTE: Extra 'add' is to prevent the truncate being combined with the store.525define void @trunc_v128i16_v128i8(ptr %in, ptr %out) nounwind {526; CHECK-LABEL: trunc_v128i16_v128i8:527; CHECK:       // %bb.0:528; CHECK-NEXT:    ldp q2, q3, [x0, #192]529; CHECK-NEXT:    ptrue p0.b, vl8530; CHECK-NEXT:    ldp q4, q5, [x0]531; CHECK-NEXT:    ldp q6, q7, [x0, #64]532; CHECK-NEXT:    uzp1 z17.b, z3.b, z3.b533; CHECK-NEXT:    ldp q3, q18, [x0, #224]534; CHECK-NEXT:    uzp1 z16.b, z2.b, z2.b535; CHECK-NEXT:    ldp q2, q19, [x0, #128]536; CHECK-NEXT:    ldp q0, q1, [x0, #32]537; CHECK-NEXT:    uzp1 z21.b, z18.b, z18.b538; CHECK-NEXT:    ldp q18, q22, [x0, #160]539; CHECK-NEXT:    uzp1 z20.b, z3.b, z3.b540; CHECK-NEXT:    uzp1 z24.b, z19.b, z19.b541; CHECK-NEXT:    ldp q3, q19, [x0, #96]542; CHECK-NEXT:    uzp1 z23.b, z2.b, z2.b543; CHECK-NEXT:    uzp1 z26.b, z22.b, z22.b544; CHECK-NEXT:    splice z2.b, p0, { z16.b, z17.b }545; CHECK-NEXT:    uzp1 z17.b, z7.b, z7.b546; CHECK-NEXT:    uzp1 z25.b, z18.b, z18.b547; CHECK-NEXT:    splice z7.b, p0, { z20.b, z21.b }548; CHECK-NEXT:    uzp1 z21.b, z5.b, z5.b549; CHECK-NEXT:    uzp1 z19.b, z19.b, z19.b550; CHECK-NEXT:    uzp1 z20.b, z4.b, z4.b551; CHECK-NEXT:    uzp1 z5.b, z1.b, z1.b552; CHECK-NEXT:    uzp1 z16.b, z6.b, z6.b553; CHECK-NEXT:    splice z6.b, p0, { z23.b, z24.b }554; CHECK-NEXT:    uzp1 z18.b, z3.b, z3.b555; CHECK-NEXT:    splice z3.b, p0, { z25.b, z26.b }556; CHECK-NEXT:    uzp1 z4.b, z0.b, z0.b557; CHECK-NEXT:    add z0.b, z2.b, z2.b558; CHECK-NEXT:    add z7.b, z7.b, z7.b559; CHECK-NEXT:    splice z1.b, p0, { z16.b, z17.b }560; CHECK-NEXT:    splice z2.b, p0, { z18.b, z19.b }561; CHECK-NEXT:    splice z16.b, p0, { z20.b, z21.b }562; CHECK-NEXT:    splice z4.b, p0, { z4.b, z5.b }563; CHECK-NEXT:    add z6.b, z6.b, z6.b564; CHECK-NEXT:    add z3.b, z3.b, z3.b565; CHECK-NEXT:    stp q0, q7, [x1, #96]566; CHECK-NEXT:    add z0.b, z1.b, z1.b567; CHECK-NEXT:    add z1.b, z2.b, z2.b568; CHECK-NEXT:    add z2.b, z16.b, z16.b569; CHECK-NEXT:    stp q6, q3, [x1, #64]570; CHECK-NEXT:    add z3.b, z4.b, z4.b571; CHECK-NEXT:    stp q0, q1, [x1, #32]572; CHECK-NEXT:    stp q2, q3, [x1]573; CHECK-NEXT:    ret574;575; NONEON-NOSVE-LABEL: trunc_v128i16_v128i8:576; NONEON-NOSVE:       // %bb.0:577; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill578; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill579; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill580; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill581; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill582; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill583; NONEON-NOSVE-NEXT:    sub sp, sp, #800584; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]585; NONEON-NOSVE-NEXT:    str x1, [sp, #408] // 8-byte Spill586; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]587; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #96]588; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #64]589; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #192]590; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #160]591; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #128]592; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #224]593; NONEON-NOSVE-NEXT:    str q0, [sp, #592]594; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #606]595; NONEON-NOSVE-NEXT:    str q19, [sp, #496]596; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #600]597; NONEON-NOSVE-NEXT:    stp q18, q20, [sp, #512]598; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #598]599; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #596]600; NONEON-NOSVE-NEXT:    add w8, w8, w8601; NONEON-NOSVE-NEXT:    stp q17, q23, [sp, #432]602; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #594]603; NONEON-NOSVE-NEXT:    str w8, [sp, #64] // 4-byte Spill604; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #432]605; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #592]606; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #464]607; NONEON-NOSVE-NEXT:    ldr w30, [sp, #64] // 4-byte Reload608; NONEON-NOSVE-NEXT:    str w8, [sp, #404] // 4-byte Spill609; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #434]610; NONEON-NOSVE-NEXT:    stp q4, q6, [sp, #560]611; NONEON-NOSVE-NEXT:    str w8, [sp, #400] // 4-byte Spill612; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #436]613; NONEON-NOSVE-NEXT:    str q5, [sp, #544]614; NONEON-NOSVE-NEXT:    str w8, [sp, #396] // 4-byte Spill615; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #438]616; NONEON-NOSVE-NEXT:    stp q2, q1, [sp, #608]617; NONEON-NOSVE-NEXT:    str w8, [sp, #392] // 4-byte Spill618; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #440]619; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #638]620; NONEON-NOSVE-NEXT:    stp q7, q21, [sp, #640]621; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #636]622; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #634]623; NONEON-NOSVE-NEXT:    str w8, [sp, #388] // 4-byte Spill624; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #442]625; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #666]626; NONEON-NOSVE-NEXT:    str q3, [sp, #416]627; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #632]628; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #630]629; NONEON-NOSVE-NEXT:    str w8, [sp, #384] // 4-byte Spill630; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #444]631; NONEON-NOSVE-NEXT:    ldrh w1, [sp, #628]632; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #626]633; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #624]634; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #622]635; NONEON-NOSVE-NEXT:    str w8, [sp, #380] // 4-byte Spill636; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #446]637; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #620]638; NONEON-NOSVE-NEXT:    ldrh w6, [sp, #618]639; NONEON-NOSVE-NEXT:    ldrh w7, [sp, #616]640; NONEON-NOSVE-NEXT:    ldrh w19, [sp, #614]641; NONEON-NOSVE-NEXT:    str w8, [sp, #376] // 4-byte Spill642; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #480]643; NONEON-NOSVE-NEXT:    ldrh w20, [sp, #612]644; NONEON-NOSVE-NEXT:    ldrh w21, [sp, #610]645; NONEON-NOSVE-NEXT:    ldrh w22, [sp, #608]646; NONEON-NOSVE-NEXT:    ldrh w23, [sp, #430]647; NONEON-NOSVE-NEXT:    str w8, [sp, #372] // 4-byte Spill648; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #482]649; NONEON-NOSVE-NEXT:    ldrh w24, [sp, #428]650; NONEON-NOSVE-NEXT:    ldrh w25, [sp, #426]651; NONEON-NOSVE-NEXT:    ldrh w26, [sp, #424]652; NONEON-NOSVE-NEXT:    ldrh w27, [sp, #422]653; NONEON-NOSVE-NEXT:    str w8, [sp, #368] // 4-byte Spill654; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #484]655; NONEON-NOSVE-NEXT:    ldrh w28, [sp, #420]656; NONEON-NOSVE-NEXT:    ldrh w29, [sp, #418]657; NONEON-NOSVE-NEXT:    strb w30, [sp, #767]658; NONEON-NOSVE-NEXT:    str w8, [sp, #364] // 4-byte Spill659; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #486]660; NONEON-NOSVE-NEXT:    str w8, [sp, #360] // 4-byte Spill661; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #488]662; NONEON-NOSVE-NEXT:    str w8, [sp, #356] // 4-byte Spill663; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #490]664; NONEON-NOSVE-NEXT:    str w8, [sp, #352] // 4-byte Spill665; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #492]666; NONEON-NOSVE-NEXT:    str w8, [sp, #348] // 4-byte Spill667; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #494]668; NONEON-NOSVE-NEXT:    str w8, [sp, #344] // 4-byte Spill669; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #448]670; NONEON-NOSVE-NEXT:    str w8, [sp, #340] // 4-byte Spill671; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #450]672; NONEON-NOSVE-NEXT:    str w8, [sp, #336] // 4-byte Spill673; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #452]674; NONEON-NOSVE-NEXT:    str w8, [sp, #332] // 4-byte Spill675; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #454]676; NONEON-NOSVE-NEXT:    str w8, [sp, #328] // 4-byte Spill677; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #456]678; NONEON-NOSVE-NEXT:    str w8, [sp, #324] // 4-byte Spill679; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #458]680; NONEON-NOSVE-NEXT:    str w8, [sp, #320] // 4-byte Spill681; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #460]682; NONEON-NOSVE-NEXT:    str w8, [sp, #316] // 4-byte Spill683; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #462]684; NONEON-NOSVE-NEXT:    str w8, [sp, #312] // 4-byte Spill685; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #464]686; NONEON-NOSVE-NEXT:    str w8, [sp, #308] // 4-byte Spill687; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #466]688; NONEON-NOSVE-NEXT:    str w8, [sp, #304] // 4-byte Spill689; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #468]690; NONEON-NOSVE-NEXT:    str w8, [sp, #300] // 4-byte Spill691; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #470]692; NONEON-NOSVE-NEXT:    str w8, [sp, #296] // 4-byte Spill693; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #472]694; NONEON-NOSVE-NEXT:    str w8, [sp, #292] // 4-byte Spill695; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #474]696; NONEON-NOSVE-NEXT:    str w8, [sp, #288] // 4-byte Spill697; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #476]698; NONEON-NOSVE-NEXT:    str w8, [sp, #284] // 4-byte Spill699; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #478]700; NONEON-NOSVE-NEXT:    str w8, [sp, #280] // 4-byte Spill701; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #656]702; NONEON-NOSVE-NEXT:    str w8, [sp, #276] // 4-byte Spill703; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #658]704; NONEON-NOSVE-NEXT:    str w8, [sp, #272] // 4-byte Spill705; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #660]706; NONEON-NOSVE-NEXT:    str w8, [sp, #268] // 4-byte Spill707; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #662]708; NONEON-NOSVE-NEXT:    str w8, [sp, #264] // 4-byte Spill709; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #664]710; NONEON-NOSVE-NEXT:    str w8, [sp, #260] // 4-byte Spill711; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #668]712; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #252] // 8-byte Folded Spill713; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #670]714; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #528]715; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #244] // 8-byte Folded Spill716; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #530]717; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #532]718; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #236] // 8-byte Folded Spill719; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #534]720; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #536]721; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #228] // 8-byte Folded Spill722; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #538]723; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #540]724; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #220] // 8-byte Folded Spill725; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #542]726; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #496]727; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #212] // 8-byte Folded Spill728; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #498]729; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #500]730; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #204] // 8-byte Folded Spill731; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #502]732; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #504]733; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #196] // 8-byte Folded Spill734; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #506]735; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #508]736; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #188] // 8-byte Folded Spill737; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #510]738; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #512]739; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #180] // 8-byte Folded Spill740; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #514]741; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #516]742; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #172] // 8-byte Folded Spill743; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #518]744; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #520]745; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #164] // 8-byte Folded Spill746; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #522]747; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #524]748; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #156] // 8-byte Folded Spill749; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #526]750; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #640]751; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #148] // 8-byte Folded Spill752; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #642]753; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #644]754; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #140] // 8-byte Folded Spill755; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #646]756; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #648]757; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #132] // 8-byte Folded Spill758; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #650]759; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #652]760; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #124] // 8-byte Folded Spill761; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #654]762; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #576]763; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #116] // 8-byte Folded Spill764; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #578]765; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #580]766; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #108] // 8-byte Folded Spill767; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #582]768; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #584]769; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #100] // 8-byte Folded Spill770; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #586]771; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #588]772; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #92] // 8-byte Folded Spill773; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #590]774; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #544]775; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #84] // 8-byte Folded Spill776; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #546]777; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #548]778; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #76] // 8-byte Folded Spill779; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #550]780; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #552]781; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #68] // 8-byte Folded Spill782; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #554]783; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #556]784; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56] // 8-byte Folded Spill785; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #558]786; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #560]787; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48] // 8-byte Folded Spill788; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #562]789; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #564]790; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40] // 8-byte Folded Spill791; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #566]792; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #568]793; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32] // 8-byte Folded Spill794; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #570]795; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #572]796; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24] // 8-byte Folded Spill797; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #574]798; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #416]799; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16] // 8-byte Folded Spill800; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #602]801; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #604]802; NONEON-NOSVE-NEXT:    add w8, w8, w8803; NONEON-NOSVE-NEXT:    add w9, w9, w9804; NONEON-NOSVE-NEXT:    strb w8, [sp, #765]805; NONEON-NOSVE-NEXT:    add w8, w10, w10806; NONEON-NOSVE-NEXT:    strb w8, [sp, #764]807; NONEON-NOSVE-NEXT:    add w8, w11, w11808; NONEON-NOSVE-NEXT:    strb w8, [sp, #763]809; NONEON-NOSVE-NEXT:    add w8, w12, w12810; NONEON-NOSVE-NEXT:    strb w8, [sp, #762]811; NONEON-NOSVE-NEXT:    add w8, w13, w13812; NONEON-NOSVE-NEXT:    strb w8, [sp, #761]813; NONEON-NOSVE-NEXT:    add w8, w14, w14814; NONEON-NOSVE-NEXT:    strb w8, [sp, #760]815; NONEON-NOSVE-NEXT:    add w8, w15, w15816; NONEON-NOSVE-NEXT:    strb w8, [sp, #759]817; NONEON-NOSVE-NEXT:    add w8, w16, w16818; NONEON-NOSVE-NEXT:    strb w8, [sp, #758]819; NONEON-NOSVE-NEXT:    add w8, w17, w17820; NONEON-NOSVE-NEXT:    strb w8, [sp, #757]821; NONEON-NOSVE-NEXT:    add w8, w18, w18822; NONEON-NOSVE-NEXT:    strb w8, [sp, #756]823; NONEON-NOSVE-NEXT:    add w8, w0, w0824; NONEON-NOSVE-NEXT:    strb w8, [sp, #755]825; NONEON-NOSVE-NEXT:    add w8, w1, w1826; NONEON-NOSVE-NEXT:    strb w8, [sp, #754]827; NONEON-NOSVE-NEXT:    add w8, w2, w2828; NONEON-NOSVE-NEXT:    strb w8, [sp, #753]829; NONEON-NOSVE-NEXT:    add w8, w3, w3830; NONEON-NOSVE-NEXT:    strb w8, [sp, #752]831; NONEON-NOSVE-NEXT:    add w8, w4, w4832; NONEON-NOSVE-NEXT:    strb w8, [sp, #751]833; NONEON-NOSVE-NEXT:    add w8, w5, w5834; NONEON-NOSVE-NEXT:    strb w8, [sp, #750]835; NONEON-NOSVE-NEXT:    add w8, w6, w6836; NONEON-NOSVE-NEXT:    strb w8, [sp, #749]837; NONEON-NOSVE-NEXT:    add w8, w7, w7838; NONEON-NOSVE-NEXT:    strb w8, [sp, #748]839; NONEON-NOSVE-NEXT:    add w8, w19, w19840; NONEON-NOSVE-NEXT:    strb w8, [sp, #747]841; NONEON-NOSVE-NEXT:    add w8, w20, w20842; NONEON-NOSVE-NEXT:    strb w8, [sp, #746]843; NONEON-NOSVE-NEXT:    add w8, w21, w21844; NONEON-NOSVE-NEXT:    strb w8, [sp, #745]845; NONEON-NOSVE-NEXT:    add w8, w22, w22846; NONEON-NOSVE-NEXT:    strb w8, [sp, #744]847; NONEON-NOSVE-NEXT:    add w8, w23, w23848; NONEON-NOSVE-NEXT:    strb w8, [sp, #743]849; NONEON-NOSVE-NEXT:    add w8, w24, w24850; NONEON-NOSVE-NEXT:    strb w8, [sp, #742]851; NONEON-NOSVE-NEXT:    add w8, w25, w25852; NONEON-NOSVE-NEXT:    strb w8, [sp, #741]853; NONEON-NOSVE-NEXT:    add w8, w26, w26854; NONEON-NOSVE-NEXT:    strb w8, [sp, #740]855; NONEON-NOSVE-NEXT:    add w8, w27, w27856; NONEON-NOSVE-NEXT:    strb w8, [sp, #739]857; NONEON-NOSVE-NEXT:    add w8, w28, w28858; NONEON-NOSVE-NEXT:    strb w8, [sp, #738]859; NONEON-NOSVE-NEXT:    add w8, w29, w29860; NONEON-NOSVE-NEXT:    strb w8, [sp, #737]861; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16] // 4-byte Reload862; NONEON-NOSVE-NEXT:    strb w9, [sp, #766]863; NONEON-NOSVE-NEXT:    add w8, w8, w8864; NONEON-NOSVE-NEXT:    strb w8, [sp, #736]865; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20] // 4-byte Reload866; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #736]867; NONEON-NOSVE-NEXT:    add w8, w8, w8868; NONEON-NOSVE-NEXT:    strb w8, [sp, #735]869; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24] // 4-byte Reload870; NONEON-NOSVE-NEXT:    add w8, w8, w8871; NONEON-NOSVE-NEXT:    strb w8, [sp, #734]872; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28] // 4-byte Reload873; NONEON-NOSVE-NEXT:    add w8, w8, w8874; NONEON-NOSVE-NEXT:    strb w8, [sp, #733]875; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32] // 4-byte Reload876; NONEON-NOSVE-NEXT:    add w8, w8, w8877; NONEON-NOSVE-NEXT:    strb w8, [sp, #732]878; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36] // 4-byte Reload879; NONEON-NOSVE-NEXT:    add w8, w8, w8880; NONEON-NOSVE-NEXT:    strb w8, [sp, #731]881; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40] // 4-byte Reload882; NONEON-NOSVE-NEXT:    add w8, w8, w8883; NONEON-NOSVE-NEXT:    strb w8, [sp, #730]884; NONEON-NOSVE-NEXT:    ldr w8, [sp, #44] // 4-byte Reload885; NONEON-NOSVE-NEXT:    add w8, w8, w8886; NONEON-NOSVE-NEXT:    strb w8, [sp, #729]887; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48] // 4-byte Reload888; NONEON-NOSVE-NEXT:    add w8, w8, w8889; NONEON-NOSVE-NEXT:    strb w8, [sp, #728]890; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52] // 4-byte Reload891; NONEON-NOSVE-NEXT:    add w8, w8, w8892; NONEON-NOSVE-NEXT:    strb w8, [sp, #727]893; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56] // 4-byte Reload894; NONEON-NOSVE-NEXT:    add w8, w8, w8895; NONEON-NOSVE-NEXT:    strb w8, [sp, #726]896; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60] // 4-byte Reload897; NONEON-NOSVE-NEXT:    add w8, w8, w8898; NONEON-NOSVE-NEXT:    strb w8, [sp, #725]899; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68] // 4-byte Reload900; NONEON-NOSVE-NEXT:    add w8, w8, w8901; NONEON-NOSVE-NEXT:    strb w8, [sp, #724]902; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72] // 4-byte Reload903; NONEON-NOSVE-NEXT:    add w8, w8, w8904; NONEON-NOSVE-NEXT:    strb w8, [sp, #723]905; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76] // 4-byte Reload906; NONEON-NOSVE-NEXT:    add w8, w8, w8907; NONEON-NOSVE-NEXT:    strb w8, [sp, #722]908; NONEON-NOSVE-NEXT:    ldr w8, [sp, #80] // 4-byte Reload909; NONEON-NOSVE-NEXT:    add w8, w8, w8910; NONEON-NOSVE-NEXT:    strb w8, [sp, #721]911; NONEON-NOSVE-NEXT:    ldr w8, [sp, #84] // 4-byte Reload912; NONEON-NOSVE-NEXT:    add w8, w8, w8913; NONEON-NOSVE-NEXT:    strb w8, [sp, #720]914; NONEON-NOSVE-NEXT:    ldr w8, [sp, #88] // 4-byte Reload915; NONEON-NOSVE-NEXT:    add w8, w8, w8916; NONEON-NOSVE-NEXT:    strb w8, [sp, #783]917; NONEON-NOSVE-NEXT:    ldr w8, [sp, #92] // 4-byte Reload918; NONEON-NOSVE-NEXT:    add w8, w8, w8919; NONEON-NOSVE-NEXT:    strb w8, [sp, #782]920; NONEON-NOSVE-NEXT:    ldr w8, [sp, #96] // 4-byte Reload921; NONEON-NOSVE-NEXT:    add w8, w8, w8922; NONEON-NOSVE-NEXT:    strb w8, [sp, #781]923; NONEON-NOSVE-NEXT:    ldr w8, [sp, #100] // 4-byte Reload924; NONEON-NOSVE-NEXT:    add w8, w8, w8925; NONEON-NOSVE-NEXT:    strb w8, [sp, #780]926; NONEON-NOSVE-NEXT:    ldr w8, [sp, #104] // 4-byte Reload927; NONEON-NOSVE-NEXT:    add w8, w8, w8928; NONEON-NOSVE-NEXT:    strb w8, [sp, #779]929; NONEON-NOSVE-NEXT:    ldr w8, [sp, #108] // 4-byte Reload930; NONEON-NOSVE-NEXT:    add w8, w8, w8931; NONEON-NOSVE-NEXT:    strb w8, [sp, #778]932; NONEON-NOSVE-NEXT:    ldr w8, [sp, #112] // 4-byte Reload933; NONEON-NOSVE-NEXT:    add w8, w8, w8934; NONEON-NOSVE-NEXT:    strb w8, [sp, #777]935; NONEON-NOSVE-NEXT:    ldr w8, [sp, #116] // 4-byte Reload936; NONEON-NOSVE-NEXT:    add w8, w8, w8937; NONEON-NOSVE-NEXT:    strb w8, [sp, #776]938; NONEON-NOSVE-NEXT:    ldr w8, [sp, #120] // 4-byte Reload939; NONEON-NOSVE-NEXT:    add w8, w8, w8940; NONEON-NOSVE-NEXT:    strb w8, [sp, #775]941; NONEON-NOSVE-NEXT:    ldr w8, [sp, #124] // 4-byte Reload942; NONEON-NOSVE-NEXT:    add w8, w8, w8943; NONEON-NOSVE-NEXT:    strb w8, [sp, #774]944; NONEON-NOSVE-NEXT:    ldr w8, [sp, #128] // 4-byte Reload945; NONEON-NOSVE-NEXT:    add w8, w8, w8946; NONEON-NOSVE-NEXT:    strb w8, [sp, #773]947; NONEON-NOSVE-NEXT:    ldr w8, [sp, #132] // 4-byte Reload948; NONEON-NOSVE-NEXT:    add w8, w8, w8949; NONEON-NOSVE-NEXT:    strb w8, [sp, #772]950; NONEON-NOSVE-NEXT:    ldr w8, [sp, #136] // 4-byte Reload951; NONEON-NOSVE-NEXT:    add w8, w8, w8952; NONEON-NOSVE-NEXT:    strb w8, [sp, #771]953; NONEON-NOSVE-NEXT:    ldr w8, [sp, #140] // 4-byte Reload954; NONEON-NOSVE-NEXT:    add w8, w8, w8955; NONEON-NOSVE-NEXT:    strb w8, [sp, #770]956; NONEON-NOSVE-NEXT:    ldr w8, [sp, #144] // 4-byte Reload957; NONEON-NOSVE-NEXT:    add w8, w8, w8958; NONEON-NOSVE-NEXT:    strb w8, [sp, #769]959; NONEON-NOSVE-NEXT:    ldr w8, [sp, #148] // 4-byte Reload960; NONEON-NOSVE-NEXT:    add w8, w8, w8961; NONEON-NOSVE-NEXT:    strb w8, [sp, #768]962; NONEON-NOSVE-NEXT:    ldr w8, [sp, #152] // 4-byte Reload963; NONEON-NOSVE-NEXT:    add w8, w8, w8964; NONEON-NOSVE-NEXT:    strb w8, [sp, #719]965; NONEON-NOSVE-NEXT:    ldr w8, [sp, #156] // 4-byte Reload966; NONEON-NOSVE-NEXT:    add w8, w8, w8967; NONEON-NOSVE-NEXT:    strb w8, [sp, #718]968; NONEON-NOSVE-NEXT:    ldr w8, [sp, #160] // 4-byte Reload969; NONEON-NOSVE-NEXT:    add w8, w8, w8970; NONEON-NOSVE-NEXT:    strb w8, [sp, #717]971; NONEON-NOSVE-NEXT:    ldr w8, [sp, #164] // 4-byte Reload972; NONEON-NOSVE-NEXT:    add w8, w8, w8973; NONEON-NOSVE-NEXT:    strb w8, [sp, #716]974; NONEON-NOSVE-NEXT:    ldr w8, [sp, #168] // 4-byte Reload975; NONEON-NOSVE-NEXT:    add w8, w8, w8976; NONEON-NOSVE-NEXT:    strb w8, [sp, #715]977; NONEON-NOSVE-NEXT:    ldr w8, [sp, #172] // 4-byte Reload978; NONEON-NOSVE-NEXT:    add w8, w8, w8979; NONEON-NOSVE-NEXT:    strb w8, [sp, #714]980; NONEON-NOSVE-NEXT:    ldr w8, [sp, #176] // 4-byte Reload981; NONEON-NOSVE-NEXT:    add w8, w8, w8982; NONEON-NOSVE-NEXT:    strb w8, [sp, #713]983; NONEON-NOSVE-NEXT:    ldr w8, [sp, #180] // 4-byte Reload984; NONEON-NOSVE-NEXT:    add w8, w8, w8985; NONEON-NOSVE-NEXT:    strb w8, [sp, #712]986; NONEON-NOSVE-NEXT:    ldr w8, [sp, #184] // 4-byte Reload987; NONEON-NOSVE-NEXT:    add w8, w8, w8988; NONEON-NOSVE-NEXT:    strb w8, [sp, #711]989; NONEON-NOSVE-NEXT:    ldr w8, [sp, #188] // 4-byte Reload990; NONEON-NOSVE-NEXT:    add w8, w8, w8991; NONEON-NOSVE-NEXT:    strb w8, [sp, #710]992; NONEON-NOSVE-NEXT:    ldr w8, [sp, #192] // 4-byte Reload993; NONEON-NOSVE-NEXT:    add w8, w8, w8994; NONEON-NOSVE-NEXT:    strb w8, [sp, #709]995; NONEON-NOSVE-NEXT:    ldr w8, [sp, #196] // 4-byte Reload996; NONEON-NOSVE-NEXT:    add w8, w8, w8997; NONEON-NOSVE-NEXT:    strb w8, [sp, #708]998; NONEON-NOSVE-NEXT:    ldr w8, [sp, #200] // 4-byte Reload999; NONEON-NOSVE-NEXT:    add w8, w8, w81000; NONEON-NOSVE-NEXT:    strb w8, [sp, #707]1001; NONEON-NOSVE-NEXT:    ldr w8, [sp, #204] // 4-byte Reload1002; NONEON-NOSVE-NEXT:    add w8, w8, w81003; NONEON-NOSVE-NEXT:    strb w8, [sp, #706]1004; NONEON-NOSVE-NEXT:    ldr w8, [sp, #208] // 4-byte Reload1005; NONEON-NOSVE-NEXT:    add w8, w8, w81006; NONEON-NOSVE-NEXT:    strb w8, [sp, #705]1007; NONEON-NOSVE-NEXT:    ldr w8, [sp, #212] // 4-byte Reload1008; NONEON-NOSVE-NEXT:    add w8, w8, w81009; NONEON-NOSVE-NEXT:    strb w8, [sp, #704]1010; NONEON-NOSVE-NEXT:    ldr w8, [sp, #216] // 4-byte Reload1011; NONEON-NOSVE-NEXT:    ldp q6, q3, [sp, #704]1012; NONEON-NOSVE-NEXT:    add w8, w8, w81013; NONEON-NOSVE-NEXT:    strb w8, [sp, #799]1014; NONEON-NOSVE-NEXT:    ldr w8, [sp, #220] // 4-byte Reload1015; NONEON-NOSVE-NEXT:    add w8, w8, w81016; NONEON-NOSVE-NEXT:    strb w8, [sp, #798]1017; NONEON-NOSVE-NEXT:    ldr w8, [sp, #224] // 4-byte Reload1018; NONEON-NOSVE-NEXT:    add w8, w8, w81019; NONEON-NOSVE-NEXT:    strb w8, [sp, #797]1020; NONEON-NOSVE-NEXT:    ldr w8, [sp, #228] // 4-byte Reload1021; NONEON-NOSVE-NEXT:    add w8, w8, w81022; NONEON-NOSVE-NEXT:    strb w8, [sp, #796]1023; NONEON-NOSVE-NEXT:    ldr w8, [sp, #232] // 4-byte Reload1024; NONEON-NOSVE-NEXT:    add w8, w8, w81025; NONEON-NOSVE-NEXT:    strb w8, [sp, #795]1026; NONEON-NOSVE-NEXT:    ldr w8, [sp, #236] // 4-byte Reload1027; NONEON-NOSVE-NEXT:    add w8, w8, w81028; NONEON-NOSVE-NEXT:    strb w8, [sp, #794]1029; NONEON-NOSVE-NEXT:    ldr w8, [sp, #240] // 4-byte Reload1030; NONEON-NOSVE-NEXT:    add w8, w8, w81031; NONEON-NOSVE-NEXT:    strb w8, [sp, #793]1032; NONEON-NOSVE-NEXT:    ldr w8, [sp, #244] // 4-byte Reload1033; NONEON-NOSVE-NEXT:    add w8, w8, w81034; NONEON-NOSVE-NEXT:    strb w8, [sp, #792]1035; NONEON-NOSVE-NEXT:    ldr w8, [sp, #248] // 4-byte Reload1036; NONEON-NOSVE-NEXT:    add w8, w8, w81037; NONEON-NOSVE-NEXT:    strb w8, [sp, #791]1038; NONEON-NOSVE-NEXT:    ldr w8, [sp, #252] // 4-byte Reload1039; NONEON-NOSVE-NEXT:    add w8, w8, w81040; NONEON-NOSVE-NEXT:    strb w8, [sp, #790]1041; NONEON-NOSVE-NEXT:    ldr w8, [sp, #256] // 4-byte Reload1042; NONEON-NOSVE-NEXT:    add w8, w8, w81043; NONEON-NOSVE-NEXT:    strb w8, [sp, #789]1044; NONEON-NOSVE-NEXT:    ldr w8, [sp, #260] // 4-byte Reload1045; NONEON-NOSVE-NEXT:    add w8, w8, w81046; NONEON-NOSVE-NEXT:    strb w8, [sp, #788]1047; NONEON-NOSVE-NEXT:    ldr w8, [sp, #264] // 4-byte Reload1048; NONEON-NOSVE-NEXT:    add w8, w8, w81049; NONEON-NOSVE-NEXT:    strb w8, [sp, #787]1050; NONEON-NOSVE-NEXT:    ldr w8, [sp, #268] // 4-byte Reload1051; NONEON-NOSVE-NEXT:    add w8, w8, w81052; NONEON-NOSVE-NEXT:    strb w8, [sp, #786]1053; NONEON-NOSVE-NEXT:    ldr w8, [sp, #272] // 4-byte Reload1054; NONEON-NOSVE-NEXT:    add w8, w8, w81055; NONEON-NOSVE-NEXT:    strb w8, [sp, #785]1056; NONEON-NOSVE-NEXT:    ldr w8, [sp, #276] // 4-byte Reload1057; NONEON-NOSVE-NEXT:    add w8, w8, w81058; NONEON-NOSVE-NEXT:    strb w8, [sp, #784]1059; NONEON-NOSVE-NEXT:    ldr w8, [sp, #280] // 4-byte Reload1060; NONEON-NOSVE-NEXT:    ldp q4, q7, [sp, #768]1061; NONEON-NOSVE-NEXT:    add w8, w8, w81062; NONEON-NOSVE-NEXT:    strb w8, [sp, #687]1063; NONEON-NOSVE-NEXT:    ldr w8, [sp, #284] // 4-byte Reload1064; NONEON-NOSVE-NEXT:    add w8, w8, w81065; NONEON-NOSVE-NEXT:    strb w8, [sp, #686]1066; NONEON-NOSVE-NEXT:    ldr w8, [sp, #288] // 4-byte Reload1067; NONEON-NOSVE-NEXT:    add w8, w8, w81068; NONEON-NOSVE-NEXT:    strb w8, [sp, #685]1069; NONEON-NOSVE-NEXT:    ldr w8, [sp, #292] // 4-byte Reload1070; NONEON-NOSVE-NEXT:    add w8, w8, w81071; NONEON-NOSVE-NEXT:    strb w8, [sp, #684]1072; NONEON-NOSVE-NEXT:    ldr w8, [sp, #296] // 4-byte Reload1073; NONEON-NOSVE-NEXT:    add w8, w8, w81074; NONEON-NOSVE-NEXT:    strb w8, [sp, #683]1075; NONEON-NOSVE-NEXT:    ldr w8, [sp, #300] // 4-byte Reload1076; NONEON-NOSVE-NEXT:    add w8, w8, w81077; NONEON-NOSVE-NEXT:    strb w8, [sp, #682]1078; NONEON-NOSVE-NEXT:    ldr w8, [sp, #304] // 4-byte Reload1079; NONEON-NOSVE-NEXT:    add w8, w8, w81080; NONEON-NOSVE-NEXT:    strb w8, [sp, #681]1081; NONEON-NOSVE-NEXT:    ldr w8, [sp, #308] // 4-byte Reload1082; NONEON-NOSVE-NEXT:    add w8, w8, w81083; NONEON-NOSVE-NEXT:    strb w8, [sp, #680]1084; NONEON-NOSVE-NEXT:    ldr w8, [sp, #312] // 4-byte Reload1085; NONEON-NOSVE-NEXT:    add w8, w8, w81086; NONEON-NOSVE-NEXT:    strb w8, [sp, #679]1087; NONEON-NOSVE-NEXT:    ldr w8, [sp, #316] // 4-byte Reload1088; NONEON-NOSVE-NEXT:    add w8, w8, w81089; NONEON-NOSVE-NEXT:    strb w8, [sp, #678]1090; NONEON-NOSVE-NEXT:    ldr w8, [sp, #320] // 4-byte Reload1091; NONEON-NOSVE-NEXT:    add w8, w8, w81092; NONEON-NOSVE-NEXT:    strb w8, [sp, #677]1093; NONEON-NOSVE-NEXT:    ldr w8, [sp, #324] // 4-byte Reload1094; NONEON-NOSVE-NEXT:    add w8, w8, w81095; NONEON-NOSVE-NEXT:    strb w8, [sp, #676]1096; NONEON-NOSVE-NEXT:    ldr w8, [sp, #328] // 4-byte Reload1097; NONEON-NOSVE-NEXT:    add w8, w8, w81098; NONEON-NOSVE-NEXT:    strb w8, [sp, #675]1099; NONEON-NOSVE-NEXT:    ldr w8, [sp, #332] // 4-byte Reload1100; NONEON-NOSVE-NEXT:    add w8, w8, w81101; NONEON-NOSVE-NEXT:    strb w8, [sp, #674]1102; NONEON-NOSVE-NEXT:    ldr w8, [sp, #336] // 4-byte Reload1103; NONEON-NOSVE-NEXT:    add w8, w8, w81104; NONEON-NOSVE-NEXT:    strb w8, [sp, #673]1105; NONEON-NOSVE-NEXT:    ldr w8, [sp, #340] // 4-byte Reload1106; NONEON-NOSVE-NEXT:    add w8, w8, w81107; NONEON-NOSVE-NEXT:    strb w8, [sp, #672]1108; NONEON-NOSVE-NEXT:    ldr w8, [sp, #344] // 4-byte Reload1109; NONEON-NOSVE-NEXT:    add w8, w8, w81110; NONEON-NOSVE-NEXT:    strb w8, [sp, #703]1111; NONEON-NOSVE-NEXT:    ldr w8, [sp, #348] // 4-byte Reload1112; NONEON-NOSVE-NEXT:    add w8, w8, w81113; NONEON-NOSVE-NEXT:    strb w8, [sp, #702]1114; NONEON-NOSVE-NEXT:    ldr w8, [sp, #352] // 4-byte Reload1115; NONEON-NOSVE-NEXT:    add w8, w8, w81116; NONEON-NOSVE-NEXT:    strb w8, [sp, #701]1117; NONEON-NOSVE-NEXT:    ldr w8, [sp, #356] // 4-byte Reload1118; NONEON-NOSVE-NEXT:    add w8, w8, w81119; NONEON-NOSVE-NEXT:    strb w8, [sp, #700]1120; NONEON-NOSVE-NEXT:    ldr w8, [sp, #360] // 4-byte Reload1121; NONEON-NOSVE-NEXT:    add w8, w8, w81122; NONEON-NOSVE-NEXT:    strb w8, [sp, #699]1123; NONEON-NOSVE-NEXT:    ldr w8, [sp, #364] // 4-byte Reload1124; NONEON-NOSVE-NEXT:    add w8, w8, w81125; NONEON-NOSVE-NEXT:    strb w8, [sp, #698]1126; NONEON-NOSVE-NEXT:    ldr w8, [sp, #368] // 4-byte Reload1127; NONEON-NOSVE-NEXT:    add w8, w8, w81128; NONEON-NOSVE-NEXT:    strb w8, [sp, #697]1129; NONEON-NOSVE-NEXT:    ldr w8, [sp, #372] // 4-byte Reload1130; NONEON-NOSVE-NEXT:    add w8, w8, w81131; NONEON-NOSVE-NEXT:    strb w8, [sp, #696]1132; NONEON-NOSVE-NEXT:    ldr w8, [sp, #376] // 4-byte Reload1133; NONEON-NOSVE-NEXT:    add w8, w8, w81134; NONEON-NOSVE-NEXT:    strb w8, [sp, #695]1135; NONEON-NOSVE-NEXT:    ldr w8, [sp, #380] // 4-byte Reload1136; NONEON-NOSVE-NEXT:    add w8, w8, w81137; NONEON-NOSVE-NEXT:    strb w8, [sp, #694]1138; NONEON-NOSVE-NEXT:    ldr w8, [sp, #384] // 4-byte Reload1139; NONEON-NOSVE-NEXT:    add w8, w8, w81140; NONEON-NOSVE-NEXT:    strb w8, [sp, #693]1141; NONEON-NOSVE-NEXT:    ldr w8, [sp, #388] // 4-byte Reload1142; NONEON-NOSVE-NEXT:    add w8, w8, w81143; NONEON-NOSVE-NEXT:    strb w8, [sp, #692]1144; NONEON-NOSVE-NEXT:    ldr w8, [sp, #392] // 4-byte Reload1145; NONEON-NOSVE-NEXT:    add w8, w8, w81146; NONEON-NOSVE-NEXT:    strb w8, [sp, #691]1147; NONEON-NOSVE-NEXT:    ldr w8, [sp, #396] // 4-byte Reload1148; NONEON-NOSVE-NEXT:    add w8, w8, w81149; NONEON-NOSVE-NEXT:    strb w8, [sp, #690]1150; NONEON-NOSVE-NEXT:    ldr w8, [sp, #400] // 4-byte Reload1151; NONEON-NOSVE-NEXT:    add w8, w8, w81152; NONEON-NOSVE-NEXT:    strb w8, [sp, #689]1153; NONEON-NOSVE-NEXT:    ldr w8, [sp, #404] // 4-byte Reload1154; NONEON-NOSVE-NEXT:    add w8, w8, w81155; NONEON-NOSVE-NEXT:    strb w8, [sp, #688]1156; NONEON-NOSVE-NEXT:    ldr x8, [sp, #408] // 8-byte Reload1157; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #672]1158; NONEON-NOSVE-NEXT:    stp q1, q0, [x8]1159; NONEON-NOSVE-NEXT:    stp q4, q3, [x8, #32]1160; NONEON-NOSVE-NEXT:    stp q7, q6, [x8, #64]1161; NONEON-NOSVE-NEXT:    stp q2, q5, [x8, #96]1162; NONEON-NOSVE-NEXT:    add sp, sp, #8001163; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload1164; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload1165; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #48] // 16-byte Folded Reload1166; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #32] // 16-byte Folded Reload1167; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #16] // 16-byte Folded Reload1168; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp], #96 // 16-byte Folded Reload1169; NONEON-NOSVE-NEXT:    ret1170  %a = load <128 x i16>, ptr %in1171  %b = trunc <128 x i16> %a to <128 x i8>1172  %c = add <128 x i8> %b, %b1173  store <128 x i8> %c, ptr %out1174  ret void1175}1176 1177;1178; truncate i32 -> i81179;1180 1181define <8 x i8> @trunc_v8i32_v8i8(ptr %in) nounwind {1182; CHECK-LABEL: trunc_v8i32_v8i8:1183; CHECK:       // %bb.0:1184; CHECK-NEXT:    ldp q1, q0, [x0]1185; CHECK-NEXT:    ptrue p0.h, vl41186; CHECK-NEXT:    uzp1 z3.h, z0.h, z0.h1187; CHECK-NEXT:    uzp1 z2.h, z1.h, z1.h1188; CHECK-NEXT:    splice z0.h, p0, { z2.h, z3.h }1189; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b1190; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z01191; CHECK-NEXT:    ret1192;1193; NONEON-NOSVE-LABEL: trunc_v8i32_v8i8:1194; NONEON-NOSVE:       // %bb.0:1195; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1196; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!1197; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]1198; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]1199; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]1200; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]1201; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]1202; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]1203; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]1204; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]1205; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]1206; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]1207; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]1208; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]1209; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]1210; NONEON-NOSVE-NEXT:    add sp, sp, #481211; NONEON-NOSVE-NEXT:    ret1212  %a = load <8 x i32>, ptr %in1213  %b = trunc <8 x i32> %a to <8 x i8>1214  ret <8 x i8> %b1215}1216 1217define <16 x i8> @trunc_v16i32_v16i8(ptr %in) nounwind {1218; CHECK-LABEL: trunc_v16i32_v16i8:1219; CHECK:       // %bb.0:1220; CHECK-NEXT:    ldp q1, q0, [x0, #32]1221; CHECK-NEXT:    ptrue p0.h, vl41222; CHECK-NEXT:    ldp q3, q2, [x0]1223; CHECK-NEXT:    uzp1 z5.h, z0.h, z0.h1224; CHECK-NEXT:    uzp1 z4.h, z1.h, z1.h1225; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h1226; CHECK-NEXT:    uzp1 z0.h, z3.h, z3.h1227; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }1228; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }1229; CHECK-NEXT:    ptrue p0.b, vl81230; CHECK-NEXT:    uzp1 z2.b, z2.b, z2.b1231; CHECK-NEXT:    uzp1 z1.b, z0.b, z0.b1232; CHECK-NEXT:    splice z0.b, p0, { z1.b, z2.b }1233; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z01234; CHECK-NEXT:    ret1235;1236; NONEON-NOSVE-LABEL: trunc_v16i32_v16i8:1237; NONEON-NOSVE:       // %bb.0:1238; NONEON-NOSVE-NEXT:    sub sp, sp, #801239; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]1240; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]1241; NONEON-NOSVE-NEXT:    str q1, [sp, #48]1242; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #16]1243; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]1244; NONEON-NOSVE-NEXT:    str q2, [sp]1245; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]1246; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]1247; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]1248; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]1249; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]1250; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #56]1251; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]1252; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]1253; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #48]1254; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]1255; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]1256; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]1257; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]1258; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]1259; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]1260; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]1261; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]1262; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]1263; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]1264; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]1265; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]1266; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]1267; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]1268; NONEON-NOSVE-NEXT:    ldr q0, [sp, #64]1269; NONEON-NOSVE-NEXT:    add sp, sp, #801270; NONEON-NOSVE-NEXT:    ret1271  %a = load <16 x i32>, ptr %in1272  %b = trunc <16 x i32> %a to <16 x i8>1273  ret <16 x i8> %b1274}1275 1276; NOTE: Extra 'add' is to prevent the truncate being combined with the store.1277define void @trunc_v32i32_v32i8(ptr %in, ptr %out) nounwind {1278; CHECK-LABEL: trunc_v32i32_v32i8:1279; CHECK:       // %bb.0:1280; CHECK-NEXT:    ldp q0, q1, [x0, #96]1281; CHECK-NEXT:    ptrue p0.h, vl41282; CHECK-NEXT:    ldp q2, q3, [x0, #32]1283; CHECK-NEXT:    ldp q4, q5, [x0, #64]1284; CHECK-NEXT:    ldp q6, q7, [x0]1285; CHECK-NEXT:    uzp1 z17.h, z1.h, z1.h1286; CHECK-NEXT:    uzp1 z16.h, z0.h, z0.h1287; CHECK-NEXT:    uzp1 z1.h, z3.h, z3.h1288; CHECK-NEXT:    uzp1 z19.h, z5.h, z5.h1289; CHECK-NEXT:    uzp1 z0.h, z2.h, z2.h1290; CHECK-NEXT:    uzp1 z3.h, z7.h, z7.h1291; CHECK-NEXT:    uzp1 z18.h, z4.h, z4.h1292; CHECK-NEXT:    uzp1 z2.h, z6.h, z6.h1293; CHECK-NEXT:    splice z4.h, p0, { z16.h, z17.h }1294; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }1295; CHECK-NEXT:    splice z5.h, p0, { z18.h, z19.h }1296; CHECK-NEXT:    splice z1.h, p0, { z2.h, z3.h }1297; CHECK-NEXT:    ptrue p0.b, vl81298; CHECK-NEXT:    uzp1 z3.b, z4.b, z4.b1299; CHECK-NEXT:    uzp1 z7.b, z0.b, z0.b1300; CHECK-NEXT:    uzp1 z2.b, z5.b, z5.b1301; CHECK-NEXT:    uzp1 z6.b, z1.b, z1.b1302; CHECK-NEXT:    splice z0.b, p0, { z2.b, z3.b }1303; CHECK-NEXT:    splice z1.b, p0, { z6.b, z7.b }1304; CHECK-NEXT:    add z0.b, z0.b, z0.b1305; CHECK-NEXT:    add z1.b, z1.b, z1.b1306; CHECK-NEXT:    stp q1, q0, [x1]1307; CHECK-NEXT:    ret1308;1309; NONEON-NOSVE-LABEL: trunc_v32i32_v32i8:1310; NONEON-NOSVE:       // %bb.0:1311; NONEON-NOSVE-NEXT:    sub sp, sp, #2721312; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]1313; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #192] // 16-byte Folded Spill1314; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0]1315; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #208] // 16-byte Folded Spill1316; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #224] // 16-byte Folded Spill1317; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #64]1318; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #240] // 16-byte Folded Spill1319; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #96]1320; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #80]1321; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #112]1322; NONEON-NOSVE-NEXT:    stp q5, q7, [sp, #16]1323; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]1324; NONEON-NOSVE-NEXT:    ldp w27, w28, [sp, #112]1325; NONEON-NOSVE-NEXT:    ldp w25, w26, [sp, #104]1326; NONEON-NOSVE-NEXT:    add w6, w8, w81327; NONEON-NOSVE-NEXT:    add w5, w9, w91328; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #256] // 16-byte Folded Spill1329; NONEON-NOSVE-NEXT:    ldp w10, w8, [sp, #128]1330; NONEON-NOSVE-NEXT:    ldp w23, w24, [sp, #96]1331; NONEON-NOSVE-NEXT:    ldp w21, w22, [sp, #24]1332; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #8] // 8-byte Folded Spill1333; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #120]1334; NONEON-NOSVE-NEXT:    stp q6, q0, [sp, #48]1335; NONEON-NOSVE-NEXT:    ldp w19, w20, [sp, #16]1336; NONEON-NOSVE-NEXT:    add w8, w8, w81337; NONEON-NOSVE-NEXT:    add w9, w9, w91338; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #176] // 16-byte Folded Spill1339; NONEON-NOSVE-NEXT:    strb w8, [sp, #155]1340; NONEON-NOSVE-NEXT:    add w8, w28, w281341; NONEON-NOSVE-NEXT:    strb w9, [sp, #154]1342; NONEON-NOSVE-NEXT:    add w9, w27, w271343; NONEON-NOSVE-NEXT:    strb w8, [sp, #153]1344; NONEON-NOSVE-NEXT:    add w8, w26, w261345; NONEON-NOSVE-NEXT:    strb w9, [sp, #152]1346; NONEON-NOSVE-NEXT:    add w9, w25, w251347; NONEON-NOSVE-NEXT:    ldp w4, w7, [sp, #56]1348; NONEON-NOSVE-NEXT:    strb w8, [sp, #151]1349; NONEON-NOSVE-NEXT:    add w8, w24, w241350; NONEON-NOSVE-NEXT:    strb w9, [sp, #150]1351; NONEON-NOSVE-NEXT:    add w9, w23, w231352; NONEON-NOSVE-NEXT:    ldp w2, w3, [sp, #48]1353; NONEON-NOSVE-NEXT:    strb w8, [sp, #149]1354; NONEON-NOSVE-NEXT:    add w8, w22, w221355; NONEON-NOSVE-NEXT:    strb w9, [sp, #148]1356; NONEON-NOSVE-NEXT:    add w9, w21, w211357; NONEON-NOSVE-NEXT:    ldp w18, w0, [sp, #40]1358; NONEON-NOSVE-NEXT:    strb w8, [sp, #147]1359; NONEON-NOSVE-NEXT:    add w8, w20, w201360; NONEON-NOSVE-NEXT:    strb w9, [sp, #146]1361; NONEON-NOSVE-NEXT:    add w9, w19, w191362; NONEON-NOSVE-NEXT:    ldp w16, w17, [sp, #32]1363; NONEON-NOSVE-NEXT:    strb w8, [sp, #145]1364; NONEON-NOSVE-NEXT:    add w8, w7, w71365; NONEON-NOSVE-NEXT:    strb w9, [sp, #144]1366; NONEON-NOSVE-NEXT:    add w9, w4, w41367; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #72]1368; NONEON-NOSVE-NEXT:    strb w8, [sp, #175]1369; NONEON-NOSVE-NEXT:    add w8, w3, w31370; NONEON-NOSVE-NEXT:    strb w9, [sp, #174]1371; NONEON-NOSVE-NEXT:    add w9, w2, w21372; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #64]1373; NONEON-NOSVE-NEXT:    strb w8, [sp, #173]1374; NONEON-NOSVE-NEXT:    add w8, w0, w01375; NONEON-NOSVE-NEXT:    strb w9, [sp, #172]1376; NONEON-NOSVE-NEXT:    add w9, w18, w181377; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #136]1378; NONEON-NOSVE-NEXT:    strb w8, [sp, #171]1379; NONEON-NOSVE-NEXT:    add w8, w17, w171380; NONEON-NOSVE-NEXT:    strb w9, [sp, #170]1381; NONEON-NOSVE-NEXT:    add w9, w16, w161382; NONEON-NOSVE-NEXT:    strb w8, [sp, #169]1383; NONEON-NOSVE-NEXT:    add w8, w15, w151384; NONEON-NOSVE-NEXT:    strb w9, [sp, #168]1385; NONEON-NOSVE-NEXT:    add w9, w14, w141386; NONEON-NOSVE-NEXT:    strb w8, [sp, #167]1387; NONEON-NOSVE-NEXT:    add w8, w13, w131388; NONEON-NOSVE-NEXT:    strb w9, [sp, #166]1389; NONEON-NOSVE-NEXT:    add w9, w12, w121390; NONEON-NOSVE-NEXT:    ldp w29, w30, [sp, #80]1391; NONEON-NOSVE-NEXT:    strb w8, [sp, #165]1392; NONEON-NOSVE-NEXT:    add w8, w11, w111393; NONEON-NOSVE-NEXT:    strb w9, [sp, #164]1394; NONEON-NOSVE-NEXT:    add w9, w10, w101395; NONEON-NOSVE-NEXT:    strb w8, [sp, #163]1396; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload1397; NONEON-NOSVE-NEXT:    strb w9, [sp, #162]1398; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload1399; NONEON-NOSVE-NEXT:    strb w5, [sp, #159]1400; NONEON-NOSVE-NEXT:    add w5, w30, w301401; NONEON-NOSVE-NEXT:    add w8, w8, w81402; NONEON-NOSVE-NEXT:    strb w6, [sp, #158]1403; NONEON-NOSVE-NEXT:    add w6, w29, w291404; NONEON-NOSVE-NEXT:    add w9, w9, w91405; NONEON-NOSVE-NEXT:    strb w5, [sp, #157]1406; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #256] // 16-byte Folded Reload1407; NONEON-NOSVE-NEXT:    strb w6, [sp, #156]1408; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #240] // 16-byte Folded Reload1409; NONEON-NOSVE-NEXT:    strb w8, [sp, #161]1410; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #224] // 16-byte Folded Reload1411; NONEON-NOSVE-NEXT:    strb w9, [sp, #160]1412; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #208] // 16-byte Folded Reload1413; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #144]1414; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #192] // 16-byte Folded Reload1415; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #176] // 16-byte Folded Reload1416; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]1417; NONEON-NOSVE-NEXT:    add sp, sp, #2721418; NONEON-NOSVE-NEXT:    ret1419  %a = load <32 x i32>, ptr %in1420  %b = trunc <32 x i32> %a to <32 x i8>1421  %c = add <32 x i8> %b, %b1422  store <32 x i8> %c, ptr %out1423  ret void1424}1425 1426; NOTE: Extra 'add' is to prevent the truncate being combined with the store.1427define void @trunc_v64i32_v64i8(ptr %in, ptr %out) nounwind {1428; CHECK-LABEL: trunc_v64i32_v64i8:1429; CHECK:       // %bb.0:1430; CHECK-NEXT:    ldp q2, q3, [x0, #160]1431; CHECK-NEXT:    ptrue p0.h, vl41432; CHECK-NEXT:    ldp q4, q5, [x0, #96]1433; CHECK-NEXT:    ldp q6, q7, [x0]1434; CHECK-NEXT:    uzp1 z17.h, z3.h, z3.h1435; CHECK-NEXT:    ldp q3, q18, [x0, #128]1436; CHECK-NEXT:    uzp1 z16.h, z2.h, z2.h1437; CHECK-NEXT:    ldp q2, q19, [x0, #192]1438; CHECK-NEXT:    ldp q0, q1, [x0, #64]1439; CHECK-NEXT:    uzp1 z21.h, z18.h, z18.h1440; CHECK-NEXT:    ldp q18, q22, [x0, #224]1441; CHECK-NEXT:    uzp1 z20.h, z3.h, z3.h1442; CHECK-NEXT:    ldp q3, q23, [x0, #32]1443; CHECK-NEXT:    splice z16.h, p0, { z16.h, z17.h }1444; CHECK-NEXT:    uzp1 z27.h, z19.h, z19.h1445; CHECK-NEXT:    uzp1 z25.h, z22.h, z22.h1446; CHECK-NEXT:    uzp1 z26.h, z2.h, z2.h1447; CHECK-NEXT:    uzp1 z24.h, z18.h, z18.h1448; CHECK-NEXT:    uzp1 z18.h, z23.h, z23.h1449; CHECK-NEXT:    uzp1 z23.h, z5.h, z5.h1450; CHECK-NEXT:    uzp1 z17.h, z3.h, z3.h1451; CHECK-NEXT:    uzp1 z3.h, z7.h, z7.h1452; CHECK-NEXT:    uzp1 z22.h, z4.h, z4.h1453; CHECK-NEXT:    uzp1 z2.h, z6.h, z6.h1454; CHECK-NEXT:    uzp1 z5.h, z1.h, z1.h1455; CHECK-NEXT:    splice z1.h, p0, { z20.h, z21.h }1456; CHECK-NEXT:    splice z6.h, p0, { z24.h, z25.h }1457; CHECK-NEXT:    uzp1 z4.h, z0.h, z0.h1458; CHECK-NEXT:    splice z0.h, p0, { z26.h, z27.h }1459; CHECK-NEXT:    splice z7.h, p0, { z17.h, z18.h }1460; CHECK-NEXT:    uzp1 z17.b, z16.b, z16.b1461; CHECK-NEXT:    splice z2.h, p0, { z2.h, z3.h }1462; CHECK-NEXT:    splice z3.h, p0, { z22.h, z23.h }1463; CHECK-NEXT:    splice z4.h, p0, { z4.h, z5.h }1464; CHECK-NEXT:    uzp1 z16.b, z1.b, z1.b1465; CHECK-NEXT:    ptrue p0.b, vl81466; CHECK-NEXT:    uzp1 z6.b, z6.b, z6.b1467; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b1468; CHECK-NEXT:    uzp1 z1.b, z7.b, z7.b1469; CHECK-NEXT:    uzp1 z0.b, z2.b, z2.b1470; CHECK-NEXT:    uzp1 z3.b, z3.b, z3.b1471; CHECK-NEXT:    splice z7.b, p0, { z16.b, z17.b }1472; CHECK-NEXT:    uzp1 z2.b, z4.b, z4.b1473; CHECK-NEXT:    splice z4.b, p0, { z5.b, z6.b }1474; CHECK-NEXT:    splice z0.b, p0, { z0.b, z1.b }1475; CHECK-NEXT:    splice z1.b, p0, { z2.b, z3.b }1476; CHECK-NEXT:    add z2.b, z7.b, z7.b1477; CHECK-NEXT:    add z3.b, z4.b, z4.b1478; CHECK-NEXT:    add z0.b, z0.b, z0.b1479; CHECK-NEXT:    add z1.b, z1.b, z1.b1480; CHECK-NEXT:    stp q2, q3, [x1, #32]1481; CHECK-NEXT:    stp q0, q1, [x1]1482; CHECK-NEXT:    ret1483;1484; NONEON-NOSVE-LABEL: trunc_v64i32_v64i8:1485; NONEON-NOSVE:       // %bb.0:1486; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill1487; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill1488; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill1489; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill1490; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill1491; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill1492; NONEON-NOSVE-NEXT:    sub sp, sp, #4801493; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #96]1494; NONEON-NOSVE-NEXT:    str x1, [sp, #152] // 8-byte Spill1495; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #64]1496; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #128]1497; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #32]1498; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0]1499; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #224]1500; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #192]1501; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #160]1502; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #288]1503; NONEON-NOSVE-NEXT:    ldr w8, [sp, #316]1504; NONEON-NOSVE-NEXT:    str q18, [sp, #208]1505; NONEON-NOSVE-NEXT:    ldr w10, [sp, #304]1506; NONEON-NOSVE-NEXT:    stp q21, q19, [sp, #176]1507; NONEON-NOSVE-NEXT:    ldr w11, [sp, #296]1508; NONEON-NOSVE-NEXT:    ldr w12, [sp, #292]1509; NONEON-NOSVE-NEXT:    add w20, w8, w81510; NONEON-NOSVE-NEXT:    stp q20, q23, [sp, #224]1511; NONEON-NOSVE-NEXT:    ldr w13, [sp, #288]1512; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #256]1513; NONEON-NOSVE-NEXT:    ldr w22, [sp, #312]1514; NONEON-NOSVE-NEXT:    stp q3, q17, [sp, #384]1515; NONEON-NOSVE-NEXT:    ldr w9, [sp, #400]1516; NONEON-NOSVE-NEXT:    ldr w8, [sp, #404]1517; NONEON-NOSVE-NEXT:    str q7, [sp, #160]1518; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #320]1519; NONEON-NOSVE-NEXT:    ldr w18, [sp, #396]1520; NONEON-NOSVE-NEXT:    ldr w0, [sp, #392]1521; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144] // 8-byte Folded Spill1522; NONEON-NOSVE-NEXT:    ldr w9, [sp, #408]1523; NONEON-NOSVE-NEXT:    ldr w8, [sp, #412]1524; NONEON-NOSVE-NEXT:    ldr w14, [sp, #332]1525; NONEON-NOSVE-NEXT:    ldr w15, [sp, #328]1526; NONEON-NOSVE-NEXT:    ldr w16, [sp, #324]1527; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136] // 8-byte Folded Spill1528; NONEON-NOSVE-NEXT:    ldr w9, [sp, #272]1529; NONEON-NOSVE-NEXT:    ldr w8, [sp, #276]1530; NONEON-NOSVE-NEXT:    ldr w17, [sp, #320]1531; NONEON-NOSVE-NEXT:    ldr w1, [sp, #388]1532; NONEON-NOSVE-NEXT:    ldr w2, [sp, #384]1533; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128] // 8-byte Folded Spill1534; NONEON-NOSVE-NEXT:    ldr w9, [sp, #280]1535; NONEON-NOSVE-NEXT:    ldr w8, [sp, #284]1536; NONEON-NOSVE-NEXT:    ldr w3, [sp, #348]1537; NONEON-NOSVE-NEXT:    ldr w4, [sp, #344]1538; NONEON-NOSVE-NEXT:    ldr w5, [sp, #340]1539; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120] // 8-byte Folded Spill1540; NONEON-NOSVE-NEXT:    ldr w6, [sp, #336]1541; NONEON-NOSVE-NEXT:    stp q6, q5, [sp, #352]1542; NONEON-NOSVE-NEXT:    ldr w7, [sp, #380]1543; NONEON-NOSVE-NEXT:    ldr w19, [sp, #376]1544; NONEON-NOSVE-NEXT:    ldr w21, [sp, #372]1545; NONEON-NOSVE-NEXT:    ldr w23, [sp, #368]1546; NONEON-NOSVE-NEXT:    ldr w24, [sp, #364]1547; NONEON-NOSVE-NEXT:    ldr w25, [sp, #360]1548; NONEON-NOSVE-NEXT:    ldr w26, [sp, #356]1549; NONEON-NOSVE-NEXT:    ldr w27, [sp, #352]1550; NONEON-NOSVE-NEXT:    strb w20, [sp, #463]1551; NONEON-NOSVE-NEXT:    add w20, w22, w221552; NONEON-NOSVE-NEXT:    strb w20, [sp, #462]1553; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #240]1554; NONEON-NOSVE-NEXT:    ldp w29, w28, [sp, #168]1555; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112] // 8-byte Folded Spill1556; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #248]1557; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104] // 8-byte Folded Spill1558; NONEON-NOSVE-NEXT:    ldr w9, [sp, #256]1559; NONEON-NOSVE-NEXT:    ldr w8, [sp, #260]1560; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96] // 8-byte Folded Spill1561; NONEON-NOSVE-NEXT:    ldr w9, [sp, #264]1562; NONEON-NOSVE-NEXT:    ldr w8, [sp, #268]1563; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88] // 8-byte Folded Spill1564; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #176]1565; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80] // 8-byte Folded Spill1566; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #184]1567; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72] // 8-byte Folded Spill1568; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #224]1569; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64] // 8-byte Folded Spill1570; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #232]1571; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56] // 8-byte Folded Spill1572; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #192]1573; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48] // 8-byte Folded Spill1574; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #200]1575; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40] // 8-byte Folded Spill1576; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #208]1577; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32] // 8-byte Folded Spill1578; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #216]1579; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24] // 8-byte Folded Spill1580; NONEON-NOSVE-NEXT:    ldr w9, [sp, #300]1581; NONEON-NOSVE-NEXT:    ldp w8, w30, [sp, #160]1582; NONEON-NOSVE-NEXT:    str w8, [sp, #20] // 4-byte Spill1583; NONEON-NOSVE-NEXT:    ldr w8, [sp, #308]1584; NONEON-NOSVE-NEXT:    add w8, w8, w81585; NONEON-NOSVE-NEXT:    strb w8, [sp, #461]1586; NONEON-NOSVE-NEXT:    add w8, w10, w101587; NONEON-NOSVE-NEXT:    strb w8, [sp, #460]1588; NONEON-NOSVE-NEXT:    add w8, w9, w91589; NONEON-NOSVE-NEXT:    strb w8, [sp, #459]1590; NONEON-NOSVE-NEXT:    add w8, w11, w111591; NONEON-NOSVE-NEXT:    strb w8, [sp, #458]1592; NONEON-NOSVE-NEXT:    add w8, w12, w121593; NONEON-NOSVE-NEXT:    strb w8, [sp, #457]1594; NONEON-NOSVE-NEXT:    add w8, w13, w131595; NONEON-NOSVE-NEXT:    strb w8, [sp, #456]1596; NONEON-NOSVE-NEXT:    add w8, w14, w141597; NONEON-NOSVE-NEXT:    strb w8, [sp, #455]1598; NONEON-NOSVE-NEXT:    add w8, w15, w151599; NONEON-NOSVE-NEXT:    strb w8, [sp, #454]1600; NONEON-NOSVE-NEXT:    add w8, w16, w161601; NONEON-NOSVE-NEXT:    strb w8, [sp, #453]1602; NONEON-NOSVE-NEXT:    add w8, w17, w171603; NONEON-NOSVE-NEXT:    strb w8, [sp, #452]1604; NONEON-NOSVE-NEXT:    add w8, w18, w181605; NONEON-NOSVE-NEXT:    strb w8, [sp, #451]1606; NONEON-NOSVE-NEXT:    add w8, w0, w01607; NONEON-NOSVE-NEXT:    strb w8, [sp, #450]1608; NONEON-NOSVE-NEXT:    add w8, w1, w11609; NONEON-NOSVE-NEXT:    strb w8, [sp, #449]1610; NONEON-NOSVE-NEXT:    add w8, w2, w21611; NONEON-NOSVE-NEXT:    strb w8, [sp, #448]1612; NONEON-NOSVE-NEXT:    add w8, w3, w31613; NONEON-NOSVE-NEXT:    strb w8, [sp, #447]1614; NONEON-NOSVE-NEXT:    add w8, w4, w41615; NONEON-NOSVE-NEXT:    strb w8, [sp, #446]1616; NONEON-NOSVE-NEXT:    add w8, w5, w51617; NONEON-NOSVE-NEXT:    strb w8, [sp, #445]1618; NONEON-NOSVE-NEXT:    add w8, w6, w61619; NONEON-NOSVE-NEXT:    strb w8, [sp, #444]1620; NONEON-NOSVE-NEXT:    add w8, w7, w71621; NONEON-NOSVE-NEXT:    strb w8, [sp, #443]1622; NONEON-NOSVE-NEXT:    add w8, w19, w191623; NONEON-NOSVE-NEXT:    strb w8, [sp, #442]1624; NONEON-NOSVE-NEXT:    add w8, w21, w211625; NONEON-NOSVE-NEXT:    strb w8, [sp, #441]1626; NONEON-NOSVE-NEXT:    add w8, w23, w231627; NONEON-NOSVE-NEXT:    strb w8, [sp, #440]1628; NONEON-NOSVE-NEXT:    add w8, w24, w241629; NONEON-NOSVE-NEXT:    strb w8, [sp, #439]1630; NONEON-NOSVE-NEXT:    add w8, w25, w251631; NONEON-NOSVE-NEXT:    strb w8, [sp, #438]1632; NONEON-NOSVE-NEXT:    add w8, w26, w261633; NONEON-NOSVE-NEXT:    strb w8, [sp, #437]1634; NONEON-NOSVE-NEXT:    add w8, w27, w271635; NONEON-NOSVE-NEXT:    strb w8, [sp, #436]1636; NONEON-NOSVE-NEXT:    add w8, w28, w281637; NONEON-NOSVE-NEXT:    strb w8, [sp, #435]1638; NONEON-NOSVE-NEXT:    add w8, w29, w291639; NONEON-NOSVE-NEXT:    strb w8, [sp, #434]1640; NONEON-NOSVE-NEXT:    add w8, w30, w301641; NONEON-NOSVE-NEXT:    strb w8, [sp, #433]1642; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20] // 4-byte Reload1643; NONEON-NOSVE-NEXT:    add w8, w8, w81644; NONEON-NOSVE-NEXT:    strb w8, [sp, #432]1645; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24] // 4-byte Reload1646; NONEON-NOSVE-NEXT:    add w8, w8, w81647; NONEON-NOSVE-NEXT:    strb w8, [sp, #431]1648; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28] // 4-byte Reload1649; NONEON-NOSVE-NEXT:    add w8, w8, w81650; NONEON-NOSVE-NEXT:    strb w8, [sp, #430]1651; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32] // 4-byte Reload1652; NONEON-NOSVE-NEXT:    add w8, w8, w81653; NONEON-NOSVE-NEXT:    strb w8, [sp, #429]1654; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36] // 4-byte Reload1655; NONEON-NOSVE-NEXT:    add w8, w8, w81656; NONEON-NOSVE-NEXT:    strb w8, [sp, #428]1657; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40] // 4-byte Reload1658; NONEON-NOSVE-NEXT:    add w8, w8, w81659; NONEON-NOSVE-NEXT:    strb w8, [sp, #427]1660; NONEON-NOSVE-NEXT:    ldr w8, [sp, #44] // 4-byte Reload1661; NONEON-NOSVE-NEXT:    add w8, w8, w81662; NONEON-NOSVE-NEXT:    strb w8, [sp, #426]1663; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48] // 4-byte Reload1664; NONEON-NOSVE-NEXT:    add w8, w8, w81665; NONEON-NOSVE-NEXT:    strb w8, [sp, #425]1666; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52] // 4-byte Reload1667; NONEON-NOSVE-NEXT:    add w8, w8, w81668; NONEON-NOSVE-NEXT:    strb w8, [sp, #424]1669; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56] // 4-byte Reload1670; NONEON-NOSVE-NEXT:    add w8, w8, w81671; NONEON-NOSVE-NEXT:    strb w8, [sp, #423]1672; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60] // 4-byte Reload1673; NONEON-NOSVE-NEXT:    add w8, w8, w81674; NONEON-NOSVE-NEXT:    strb w8, [sp, #422]1675; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64] // 4-byte Reload1676; NONEON-NOSVE-NEXT:    add w8, w8, w81677; NONEON-NOSVE-NEXT:    strb w8, [sp, #421]1678; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68] // 4-byte Reload1679; NONEON-NOSVE-NEXT:    add w8, w8, w81680; NONEON-NOSVE-NEXT:    strb w8, [sp, #420]1681; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72] // 4-byte Reload1682; NONEON-NOSVE-NEXT:    add w8, w8, w81683; NONEON-NOSVE-NEXT:    strb w8, [sp, #419]1684; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76] // 4-byte Reload1685; NONEON-NOSVE-NEXT:    add w8, w8, w81686; NONEON-NOSVE-NEXT:    strb w8, [sp, #418]1687; NONEON-NOSVE-NEXT:    ldr w8, [sp, #80] // 4-byte Reload1688; NONEON-NOSVE-NEXT:    add w8, w8, w81689; NONEON-NOSVE-NEXT:    strb w8, [sp, #417]1690; NONEON-NOSVE-NEXT:    ldr w8, [sp, #84] // 4-byte Reload1691; NONEON-NOSVE-NEXT:    add w8, w8, w81692; NONEON-NOSVE-NEXT:    strb w8, [sp, #416]1693; NONEON-NOSVE-NEXT:    ldr w8, [sp, #88] // 4-byte Reload1694; NONEON-NOSVE-NEXT:    ldp q1, q3, [sp, #416]1695; NONEON-NOSVE-NEXT:    add w8, w8, w81696; NONEON-NOSVE-NEXT:    strb w8, [sp, #479]1697; NONEON-NOSVE-NEXT:    ldr w8, [sp, #92] // 4-byte Reload1698; NONEON-NOSVE-NEXT:    add w8, w8, w81699; NONEON-NOSVE-NEXT:    strb w8, [sp, #478]1700; NONEON-NOSVE-NEXT:    ldr w8, [sp, #96] // 4-byte Reload1701; NONEON-NOSVE-NEXT:    add w8, w8, w81702; NONEON-NOSVE-NEXT:    strb w8, [sp, #477]1703; NONEON-NOSVE-NEXT:    ldr w8, [sp, #100] // 4-byte Reload1704; NONEON-NOSVE-NEXT:    add w8, w8, w81705; NONEON-NOSVE-NEXT:    strb w8, [sp, #476]1706; NONEON-NOSVE-NEXT:    ldr w8, [sp, #104] // 4-byte Reload1707; NONEON-NOSVE-NEXT:    add w8, w8, w81708; NONEON-NOSVE-NEXT:    strb w8, [sp, #475]1709; NONEON-NOSVE-NEXT:    ldr w8, [sp, #108] // 4-byte Reload1710; NONEON-NOSVE-NEXT:    add w8, w8, w81711; NONEON-NOSVE-NEXT:    strb w8, [sp, #474]1712; NONEON-NOSVE-NEXT:    ldr w8, [sp, #112] // 4-byte Reload1713; NONEON-NOSVE-NEXT:    add w8, w8, w81714; NONEON-NOSVE-NEXT:    strb w8, [sp, #473]1715; NONEON-NOSVE-NEXT:    ldr w8, [sp, #116] // 4-byte Reload1716; NONEON-NOSVE-NEXT:    add w8, w8, w81717; NONEON-NOSVE-NEXT:    strb w8, [sp, #472]1718; NONEON-NOSVE-NEXT:    ldr w8, [sp, #120] // 4-byte Reload1719; NONEON-NOSVE-NEXT:    add w8, w8, w81720; NONEON-NOSVE-NEXT:    strb w8, [sp, #471]1721; NONEON-NOSVE-NEXT:    ldr w8, [sp, #124] // 4-byte Reload1722; NONEON-NOSVE-NEXT:    add w8, w8, w81723; NONEON-NOSVE-NEXT:    strb w8, [sp, #470]1724; NONEON-NOSVE-NEXT:    ldr w8, [sp, #128] // 4-byte Reload1725; NONEON-NOSVE-NEXT:    add w8, w8, w81726; NONEON-NOSVE-NEXT:    strb w8, [sp, #469]1727; NONEON-NOSVE-NEXT:    ldr w8, [sp, #132] // 4-byte Reload1728; NONEON-NOSVE-NEXT:    add w8, w8, w81729; NONEON-NOSVE-NEXT:    strb w8, [sp, #468]1730; NONEON-NOSVE-NEXT:    ldr w8, [sp, #136] // 4-byte Reload1731; NONEON-NOSVE-NEXT:    add w8, w8, w81732; NONEON-NOSVE-NEXT:    strb w8, [sp, #467]1733; NONEON-NOSVE-NEXT:    ldr w8, [sp, #140] // 4-byte Reload1734; NONEON-NOSVE-NEXT:    add w8, w8, w81735; NONEON-NOSVE-NEXT:    strb w8, [sp, #466]1736; NONEON-NOSVE-NEXT:    ldr w8, [sp, #144] // 4-byte Reload1737; NONEON-NOSVE-NEXT:    add w8, w8, w81738; NONEON-NOSVE-NEXT:    strb w8, [sp, #465]1739; NONEON-NOSVE-NEXT:    ldr w8, [sp, #148] // 4-byte Reload1740; NONEON-NOSVE-NEXT:    add w8, w8, w81741; NONEON-NOSVE-NEXT:    strb w8, [sp, #464]1742; NONEON-NOSVE-NEXT:    ldr x8, [sp, #152] // 8-byte Reload1743; NONEON-NOSVE-NEXT:    ldp q2, q0, [sp, #448]1744; NONEON-NOSVE-NEXT:    stp q3, q2, [x8]1745; NONEON-NOSVE-NEXT:    stp q0, q1, [x8, #32]1746; NONEON-NOSVE-NEXT:    add sp, sp, #4801747; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload1748; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload1749; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #48] // 16-byte Folded Reload1750; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #32] // 16-byte Folded Reload1751; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #16] // 16-byte Folded Reload1752; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp], #96 // 16-byte Folded Reload1753; NONEON-NOSVE-NEXT:    ret1754  %a = load <64 x i32>, ptr %in1755  %b = trunc <64 x i32> %a to <64 x i8>1756  %c = add <64 x i8> %b, %b1757  store <64 x i8> %c, ptr %out1758  ret void1759}1760 1761;1762; truncate i32 -> i161763;1764 1765define <8 x i16> @trunc_v8i32_v8i16(ptr %in) nounwind {1766; CHECK-LABEL: trunc_v8i32_v8i16:1767; CHECK:       // %bb.0:1768; CHECK-NEXT:    ldp q1, q0, [x0]1769; CHECK-NEXT:    ptrue p0.h, vl41770; CHECK-NEXT:    uzp1 z3.h, z0.h, z0.h1771; CHECK-NEXT:    uzp1 z2.h, z1.h, z1.h1772; CHECK-NEXT:    splice z0.h, p0, { z2.h, z3.h }1773; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z01774; CHECK-NEXT:    ret1775;1776; NONEON-NOSVE-LABEL: trunc_v8i32_v8i16:1777; NONEON-NOSVE:       // %bb.0:1778; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1779; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!1780; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]1781; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]1782; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]1783; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]1784; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]1785; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]1786; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]1787; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]1788; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]1789; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]1790; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]1791; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]1792; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1793; NONEON-NOSVE-NEXT:    add sp, sp, #481794; NONEON-NOSVE-NEXT:    ret1795  %a = load <8 x i32>, ptr %in1796  %b = trunc <8 x i32> %a to <8 x i16>1797  ret <8 x i16> %b1798}1799 1800; NOTE: Extra 'add' is to prevent the truncate being combined with the store.1801define void @trunc_v16i32_v16i16(ptr %in, ptr %out) nounwind {1802; CHECK-LABEL: trunc_v16i32_v16i16:1803; CHECK:       // %bb.0:1804; CHECK-NEXT:    ldp q1, q0, [x0, #32]1805; CHECK-NEXT:    ptrue p0.h, vl41806; CHECK-NEXT:    ldp q3, q2, [x0]1807; CHECK-NEXT:    uzp1 z5.h, z0.h, z0.h1808; CHECK-NEXT:    uzp1 z4.h, z1.h, z1.h1809; CHECK-NEXT:    uzp1 z1.h, z2.h, z2.h1810; CHECK-NEXT:    uzp1 z0.h, z3.h, z3.h1811; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }1812; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }1813; CHECK-NEXT:    add z1.h, z2.h, z2.h1814; CHECK-NEXT:    add z0.h, z0.h, z0.h1815; CHECK-NEXT:    stp q0, q1, [x1]1816; CHECK-NEXT:    ret1817;1818; NONEON-NOSVE-LABEL: trunc_v16i32_v16i16:1819; NONEON-NOSVE:       // %bb.0:1820; NONEON-NOSVE-NEXT:    sub sp, sp, #961821; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0, #32]1822; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]1823; NONEON-NOSVE-NEXT:    stp q3, q1, [sp]1824; NONEON-NOSVE-NEXT:    stp q2, q0, [sp, #32]1825; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #40]1826; NONEON-NOSVE-NEXT:    ldp w2, w3, [sp, #32]1827; NONEON-NOSVE-NEXT:    ldp w4, w5, [sp, #8]1828; NONEON-NOSVE-NEXT:    add w8, w8, w81829; NONEON-NOSVE-NEXT:    add w9, w9, w91830; NONEON-NOSVE-NEXT:    ldp w18, w0, [sp]1831; NONEON-NOSVE-NEXT:    ldp w16, w17, [sp, #24]1832; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]1833; NONEON-NOSVE-NEXT:    add w8, w3, w31834; NONEON-NOSVE-NEXT:    strh w9, [sp, #76]1835; NONEON-NOSVE-NEXT:    add w9, w2, w21836; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #16]1837; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]1838; NONEON-NOSVE-NEXT:    add w8, w5, w51839; NONEON-NOSVE-NEXT:    strh w9, [sp, #72]1840; NONEON-NOSVE-NEXT:    add w9, w4, w41841; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #56]1842; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]1843; NONEON-NOSVE-NEXT:    add w8, w0, w01844; NONEON-NOSVE-NEXT:    strh w9, [sp, #68]1845; NONEON-NOSVE-NEXT:    add w9, w18, w181846; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #48]1847; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]1848; NONEON-NOSVE-NEXT:    add w8, w17, w171849; NONEON-NOSVE-NEXT:    strh w9, [sp, #64]1850; NONEON-NOSVE-NEXT:    add w9, w16, w161851; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]1852; NONEON-NOSVE-NEXT:    add w8, w15, w151853; NONEON-NOSVE-NEXT:    strh w9, [sp, #92]1854; NONEON-NOSVE-NEXT:    add w9, w14, w141855; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]1856; NONEON-NOSVE-NEXT:    add w8, w13, w131857; NONEON-NOSVE-NEXT:    strh w9, [sp, #88]1858; NONEON-NOSVE-NEXT:    add w9, w12, w121859; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]1860; NONEON-NOSVE-NEXT:    add w8, w11, w111861; NONEON-NOSVE-NEXT:    strh w9, [sp, #84]1862; NONEON-NOSVE-NEXT:    add w9, w10, w101863; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]1864; NONEON-NOSVE-NEXT:    strh w9, [sp, #80]1865; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]1866; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]1867; NONEON-NOSVE-NEXT:    add sp, sp, #961868; NONEON-NOSVE-NEXT:    ret1869  %a = load <16 x i32>, ptr %in1870  %b = trunc <16 x i32> %a to <16 x i16>1871  %c = add <16 x i16> %b, %b1872  store <16 x i16> %c, ptr %out1873  ret void1874}1875 1876; NOTE: Extra 'add' is to prevent the truncate being combined with the store.1877define void @trunc_v32i32_v32i16(ptr %in, ptr %out) nounwind {1878; CHECK-LABEL: trunc_v32i32_v32i16:1879; CHECK:       // %bb.0:1880; CHECK-NEXT:    ldp q1, q0, [x0, #64]1881; CHECK-NEXT:    ptrue p0.h, vl41882; CHECK-NEXT:    ldp q2, q3, [x0, #96]1883; CHECK-NEXT:    ldp q4, q5, [x0]1884; CHECK-NEXT:    uzp1 z7.h, z0.h, z0.h1885; CHECK-NEXT:    uzp1 z6.h, z1.h, z1.h1886; CHECK-NEXT:    ldp q1, q0, [x0, #32]1887; CHECK-NEXT:    uzp1 z17.h, z3.h, z3.h1888; CHECK-NEXT:    uzp1 z16.h, z2.h, z2.h1889; CHECK-NEXT:    uzp1 z3.h, z5.h, z5.h1890; CHECK-NEXT:    uzp1 z2.h, z4.h, z4.h1891; CHECK-NEXT:    uzp1 z5.h, z0.h, z0.h1892; CHECK-NEXT:    splice z0.h, p0, { z6.h, z7.h }1893; CHECK-NEXT:    uzp1 z4.h, z1.h, z1.h1894; CHECK-NEXT:    splice z1.h, p0, { z16.h, z17.h }1895; CHECK-NEXT:    splice z2.h, p0, { z2.h, z3.h }1896; CHECK-NEXT:    splice z3.h, p0, { z4.h, z5.h }1897; CHECK-NEXT:    add z0.h, z0.h, z0.h1898; CHECK-NEXT:    add z1.h, z1.h, z1.h1899; CHECK-NEXT:    add z2.h, z2.h, z2.h1900; CHECK-NEXT:    add z3.h, z3.h, z3.h1901; CHECK-NEXT:    stp q0, q1, [x1, #32]1902; CHECK-NEXT:    stp q2, q3, [x1]1903; CHECK-NEXT:    ret1904;1905; NONEON-NOSVE-LABEL: trunc_v32i32_v32i16:1906; NONEON-NOSVE:       // %bb.0:1907; NONEON-NOSVE-NEXT:    sub sp, sp, #3041908; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]1909; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #224] // 16-byte Folded Spill1910; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0]1911; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #240] // 16-byte Folded Spill1912; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #256] // 16-byte Folded Spill1913; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #64]1914; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #272] // 16-byte Folded Spill1915; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #96]1916; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #80]1917; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #112]1918; NONEON-NOSVE-NEXT:    stp q5, q7, [sp, #16]1919; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]1920; NONEON-NOSVE-NEXT:    ldp w27, w28, [sp, #112]1921; NONEON-NOSVE-NEXT:    ldp w25, w26, [sp, #104]1922; NONEON-NOSVE-NEXT:    add w6, w8, w81923; NONEON-NOSVE-NEXT:    add w5, w9, w91924; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #288] // 16-byte Folded Spill1925; NONEON-NOSVE-NEXT:    ldp w10, w8, [sp, #128]1926; NONEON-NOSVE-NEXT:    ldp w23, w24, [sp, #96]1927; NONEON-NOSVE-NEXT:    ldp w21, w22, [sp, #24]1928; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #8] // 8-byte Folded Spill1929; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #120]1930; NONEON-NOSVE-NEXT:    stp q6, q0, [sp, #48]1931; NONEON-NOSVE-NEXT:    ldp w19, w20, [sp, #16]1932; NONEON-NOSVE-NEXT:    add w8, w8, w81933; NONEON-NOSVE-NEXT:    add w9, w9, w91934; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #208] // 16-byte Folded Spill1935; NONEON-NOSVE-NEXT:    strh w8, [sp, #182]1936; NONEON-NOSVE-NEXT:    add w8, w28, w281937; NONEON-NOSVE-NEXT:    strh w9, [sp, #180]1938; NONEON-NOSVE-NEXT:    add w9, w27, w271939; NONEON-NOSVE-NEXT:    strh w8, [sp, #178]1940; NONEON-NOSVE-NEXT:    add w8, w26, w261941; NONEON-NOSVE-NEXT:    strh w9, [sp, #176]1942; NONEON-NOSVE-NEXT:    add w9, w25, w251943; NONEON-NOSVE-NEXT:    ldp w4, w7, [sp, #56]1944; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]1945; NONEON-NOSVE-NEXT:    add w8, w24, w241946; NONEON-NOSVE-NEXT:    strh w9, [sp, #172]1947; NONEON-NOSVE-NEXT:    add w9, w23, w231948; NONEON-NOSVE-NEXT:    ldp w2, w3, [sp, #48]1949; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]1950; NONEON-NOSVE-NEXT:    add w8, w22, w221951; NONEON-NOSVE-NEXT:    strh w9, [sp, #168]1952; NONEON-NOSVE-NEXT:    add w9, w21, w211953; NONEON-NOSVE-NEXT:    ldp w18, w0, [sp, #40]1954; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]1955; NONEON-NOSVE-NEXT:    add w8, w20, w201956; NONEON-NOSVE-NEXT:    strh w9, [sp, #164]1957; NONEON-NOSVE-NEXT:    add w9, w19, w191958; NONEON-NOSVE-NEXT:    ldp w16, w17, [sp, #32]1959; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]1960; NONEON-NOSVE-NEXT:    add w8, w7, w71961; NONEON-NOSVE-NEXT:    strh w9, [sp, #160]1962; NONEON-NOSVE-NEXT:    add w9, w4, w41963; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #72]1964; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]1965; NONEON-NOSVE-NEXT:    add w8, w3, w31966; NONEON-NOSVE-NEXT:    strh w9, [sp, #156]1967; NONEON-NOSVE-NEXT:    add w9, w2, w21968; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #64]1969; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]1970; NONEON-NOSVE-NEXT:    add w8, w0, w01971; NONEON-NOSVE-NEXT:    strh w9, [sp, #152]1972; NONEON-NOSVE-NEXT:    add w9, w18, w181973; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #136]1974; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]1975; NONEON-NOSVE-NEXT:    add w8, w17, w171976; NONEON-NOSVE-NEXT:    strh w9, [sp, #148]1977; NONEON-NOSVE-NEXT:    add w9, w16, w161978; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]1979; NONEON-NOSVE-NEXT:    add w8, w15, w151980; NONEON-NOSVE-NEXT:    strh w9, [sp, #144]1981; NONEON-NOSVE-NEXT:    add w9, w14, w141982; NONEON-NOSVE-NEXT:    strh w8, [sp, #206]1983; NONEON-NOSVE-NEXT:    add w8, w13, w131984; NONEON-NOSVE-NEXT:    strh w9, [sp, #204]1985; NONEON-NOSVE-NEXT:    add w9, w12, w121986; NONEON-NOSVE-NEXT:    ldp w29, w30, [sp, #80]1987; NONEON-NOSVE-NEXT:    strh w8, [sp, #202]1988; NONEON-NOSVE-NEXT:    add w8, w11, w111989; NONEON-NOSVE-NEXT:    strh w9, [sp, #200]1990; NONEON-NOSVE-NEXT:    add w9, w10, w101991; NONEON-NOSVE-NEXT:    strh w8, [sp, #198]1992; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload1993; NONEON-NOSVE-NEXT:    strh w9, [sp, #196]1994; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload1995; NONEON-NOSVE-NEXT:    strh w5, [sp, #190]1996; NONEON-NOSVE-NEXT:    add w5, w30, w301997; NONEON-NOSVE-NEXT:    add w8, w8, w81998; NONEON-NOSVE-NEXT:    strh w6, [sp, #188]1999; NONEON-NOSVE-NEXT:    add w6, w29, w292000; NONEON-NOSVE-NEXT:    add w9, w9, w92001; NONEON-NOSVE-NEXT:    strh w5, [sp, #186]2002; NONEON-NOSVE-NEXT:    ldp q1, q3, [sp, #144]2003; NONEON-NOSVE-NEXT:    strh w6, [sp, #184]2004; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #288] // 16-byte Folded Reload2005; NONEON-NOSVE-NEXT:    strh w8, [sp, #194]2006; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #272] // 16-byte Folded Reload2007; NONEON-NOSVE-NEXT:    strh w9, [sp, #192]2008; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #256] // 16-byte Folded Reload2009; NONEON-NOSVE-NEXT:    ldp q2, q0, [sp, #176]2010; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #240] // 16-byte Folded Reload2011; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #224] // 16-byte Folded Reload2012; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #208] // 16-byte Folded Reload2013; NONEON-NOSVE-NEXT:    stp q3, q2, [x1]2014; NONEON-NOSVE-NEXT:    stp q0, q1, [x1, #32]2015; NONEON-NOSVE-NEXT:    add sp, sp, #3042016; NONEON-NOSVE-NEXT:    ret2017  %a = load <32 x i32>, ptr %in2018  %b = trunc <32 x i32> %a to <32 x i16>2019  %c = add <32 x i16> %b, %b2020  store <32 x i16> %c, ptr %out2021  ret void2022}2023 2024; NOTE: Extra 'add' is to prevent the truncate being combined with the store.2025define void @trunc_v64i32_v64i16(ptr %in, ptr %out) nounwind {2026; CHECK-LABEL: trunc_v64i32_v64i16:2027; CHECK:       // %bb.0:2028; CHECK-NEXT:    ldp q2, q3, [x0, #192]2029; CHECK-NEXT:    ptrue p0.h, vl42030; CHECK-NEXT:    ldp q4, q5, [x0]2031; CHECK-NEXT:    ldp q6, q7, [x0, #64]2032; CHECK-NEXT:    uzp1 z17.h, z3.h, z3.h2033; CHECK-NEXT:    ldp q3, q18, [x0, #224]2034; CHECK-NEXT:    uzp1 z16.h, z2.h, z2.h2035; CHECK-NEXT:    ldp q2, q19, [x0, #128]2036; CHECK-NEXT:    ldp q0, q1, [x0, #32]2037; CHECK-NEXT:    uzp1 z21.h, z18.h, z18.h2038; CHECK-NEXT:    ldp q18, q22, [x0, #160]2039; CHECK-NEXT:    uzp1 z20.h, z3.h, z3.h2040; CHECK-NEXT:    uzp1 z24.h, z19.h, z19.h2041; CHECK-NEXT:    ldp q3, q19, [x0, #96]2042; CHECK-NEXT:    uzp1 z23.h, z2.h, z2.h2043; CHECK-NEXT:    uzp1 z26.h, z22.h, z22.h2044; CHECK-NEXT:    splice z2.h, p0, { z16.h, z17.h }2045; CHECK-NEXT:    uzp1 z17.h, z7.h, z7.h2046; CHECK-NEXT:    uzp1 z25.h, z18.h, z18.h2047; CHECK-NEXT:    splice z7.h, p0, { z20.h, z21.h }2048; CHECK-NEXT:    uzp1 z21.h, z5.h, z5.h2049; CHECK-NEXT:    uzp1 z19.h, z19.h, z19.h2050; CHECK-NEXT:    uzp1 z20.h, z4.h, z4.h2051; CHECK-NEXT:    uzp1 z5.h, z1.h, z1.h2052; CHECK-NEXT:    uzp1 z16.h, z6.h, z6.h2053; CHECK-NEXT:    splice z6.h, p0, { z23.h, z24.h }2054; CHECK-NEXT:    uzp1 z18.h, z3.h, z3.h2055; CHECK-NEXT:    splice z3.h, p0, { z25.h, z26.h }2056; CHECK-NEXT:    uzp1 z4.h, z0.h, z0.h2057; CHECK-NEXT:    add z0.h, z2.h, z2.h2058; CHECK-NEXT:    add z7.h, z7.h, z7.h2059; CHECK-NEXT:    splice z1.h, p0, { z16.h, z17.h }2060; CHECK-NEXT:    splice z2.h, p0, { z18.h, z19.h }2061; CHECK-NEXT:    splice z16.h, p0, { z20.h, z21.h }2062; CHECK-NEXT:    splice z4.h, p0, { z4.h, z5.h }2063; CHECK-NEXT:    add z6.h, z6.h, z6.h2064; CHECK-NEXT:    add z3.h, z3.h, z3.h2065; CHECK-NEXT:    stp q0, q7, [x1, #96]2066; CHECK-NEXT:    add z0.h, z1.h, z1.h2067; CHECK-NEXT:    add z1.h, z2.h, z2.h2068; CHECK-NEXT:    add z2.h, z16.h, z16.h2069; CHECK-NEXT:    stp q6, q3, [x1, #64]2070; CHECK-NEXT:    add z3.h, z4.h, z4.h2071; CHECK-NEXT:    stp q0, q1, [x1, #32]2072; CHECK-NEXT:    stp q2, q3, [x1]2073; CHECK-NEXT:    ret2074;2075; NONEON-NOSVE-LABEL: trunc_v64i32_v64i16:2076; NONEON-NOSVE:       // %bb.0:2077; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill2078; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill2079; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill2080; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill2081; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill2082; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill2083; NONEON-NOSVE-NEXT:    sub sp, sp, #5282084; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]2085; NONEON-NOSVE-NEXT:    mov x5, x12086; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #192]2087; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #224]2088; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]2089; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #96]2090; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #64]2091; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #160]2092; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #128]2093; NONEON-NOSVE-NEXT:    str q0, [sp, #320]2094; NONEON-NOSVE-NEXT:    ldr w8, [sp, #332]2095; NONEON-NOSVE-NEXT:    stp q17, q23, [sp, #160]2096; NONEON-NOSVE-NEXT:    ldr w10, [sp, #320]2097; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #192]2098; NONEON-NOSVE-NEXT:    ldr w23, [sp, #328]2099; NONEON-NOSVE-NEXT:    add w21, w8, w82100; NONEON-NOSVE-NEXT:    stp q18, q20, [sp, #240]2101; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #160]2102; NONEON-NOSVE-NEXT:    stp q7, q21, [sp, #368]2103; NONEON-NOSVE-NEXT:    str q19, [sp, #224]2104; NONEON-NOSVE-NEXT:    ldr w29, [sp, #380]2105; NONEON-NOSVE-NEXT:    ldr w30, [sp, #376]2106; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136] // 8-byte Folded Spill2107; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #168]2108; NONEON-NOSVE-NEXT:    stp q4, q6, [sp, #288]2109; NONEON-NOSVE-NEXT:    stp q2, q1, [sp, #336]2110; NONEON-NOSVE-NEXT:    ldr w3, [sp, #300]2111; NONEON-NOSVE-NEXT:    ldr w4, [sp, #296]2112; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128] // 8-byte Folded Spill2113; NONEON-NOSVE-NEXT:    ldr w11, [sp, #360]2114; NONEON-NOSVE-NEXT:    ldr w12, [sp, #356]2115; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #208]2116; NONEON-NOSVE-NEXT:    ldr w13, [sp, #352]2117; NONEON-NOSVE-NEXT:    ldr w14, [sp, #348]2118; NONEON-NOSVE-NEXT:    ldr w15, [sp, #344]2119; NONEON-NOSVE-NEXT:    str q3, [sp, #144]2120; NONEON-NOSVE-NEXT:    ldr w16, [sp, #340]2121; NONEON-NOSVE-NEXT:    ldr w17, [sp, #336]2122; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120] // 8-byte Folded Spill2123; NONEON-NOSVE-NEXT:    ldr w6, [sp, #292]2124; NONEON-NOSVE-NEXT:    ldr w7, [sp, #288]2125; NONEON-NOSVE-NEXT:    str q5, [sp, #272]2126; NONEON-NOSVE-NEXT:    ldr w25, [sp, #316]2127; NONEON-NOSVE-NEXT:    ldr w26, [sp, #312]2128; NONEON-NOSVE-NEXT:    ldr w19, [sp, #284]2129; NONEON-NOSVE-NEXT:    ldr w20, [sp, #280]2130; NONEON-NOSVE-NEXT:    ldr w22, [sp, #276]2131; NONEON-NOSVE-NEXT:    ldr w24, [sp, #272]2132; NONEON-NOSVE-NEXT:    ldr w27, [sp, #308]2133; NONEON-NOSVE-NEXT:    ldr w28, [sp, #304]2134; NONEON-NOSVE-NEXT:    strh w21, [sp, #494]2135; NONEON-NOSVE-NEXT:    add w21, w23, w232136; NONEON-NOSVE-NEXT:    strh w21, [sp, #492]2137; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #216]2138; NONEON-NOSVE-NEXT:    ldp w0, w18, [sp, #152]2139; NONEON-NOSVE-NEXT:    ldp w2, w1, [sp, #144]2140; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112] // 8-byte Folded Spill2141; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #176]2142; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104] // 8-byte Folded Spill2143; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #184]2144; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96] // 8-byte Folded Spill2145; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #192]2146; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88] // 8-byte Folded Spill2147; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #200]2148; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80] // 8-byte Folded Spill2149; NONEON-NOSVE-NEXT:    ldr w9, [sp, #384]2150; NONEON-NOSVE-NEXT:    ldr w8, [sp, #388]2151; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72] // 8-byte Folded Spill2152; NONEON-NOSVE-NEXT:    ldr w9, [sp, #392]2153; NONEON-NOSVE-NEXT:    ldr w8, [sp, #396]2154; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64] // 8-byte Folded Spill2155; NONEON-NOSVE-NEXT:    ldr w9, [sp, #256]2156; NONEON-NOSVE-NEXT:    ldr w8, [sp, #260]2157; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56] // 8-byte Folded Spill2158; NONEON-NOSVE-NEXT:    ldr w9, [sp, #264]2159; NONEON-NOSVE-NEXT:    ldr w8, [sp, #268]2160; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48] // 8-byte Folded Spill2161; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #224]2162; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40] // 8-byte Folded Spill2163; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #232]2164; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32] // 8-byte Folded Spill2165; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #240]2166; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24] // 8-byte Folded Spill2167; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #248]2168; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16] // 8-byte Folded Spill2169; NONEON-NOSVE-NEXT:    ldr w9, [sp, #368]2170; NONEON-NOSVE-NEXT:    ldr w8, [sp, #372]2171; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill2172; NONEON-NOSVE-NEXT:    ldr w8, [sp, #324]2173; NONEON-NOSVE-NEXT:    ldr w9, [sp, #364]2174; NONEON-NOSVE-NEXT:    add w8, w8, w82175; NONEON-NOSVE-NEXT:    strh w8, [sp, #490]2176; NONEON-NOSVE-NEXT:    add w8, w10, w102177; NONEON-NOSVE-NEXT:    strh w8, [sp, #488]2178; NONEON-NOSVE-NEXT:    add w8, w9, w92179; NONEON-NOSVE-NEXT:    strh w8, [sp, #486]2180; NONEON-NOSVE-NEXT:    add w8, w11, w112181; NONEON-NOSVE-NEXT:    strh w8, [sp, #484]2182; NONEON-NOSVE-NEXT:    add w8, w12, w122183; NONEON-NOSVE-NEXT:    strh w8, [sp, #482]2184; NONEON-NOSVE-NEXT:    add w8, w13, w132185; NONEON-NOSVE-NEXT:    strh w8, [sp, #480]2186; NONEON-NOSVE-NEXT:    add w8, w14, w142187; NONEON-NOSVE-NEXT:    strh w8, [sp, #478]2188; NONEON-NOSVE-NEXT:    add w8, w15, w152189; NONEON-NOSVE-NEXT:    strh w8, [sp, #476]2190; NONEON-NOSVE-NEXT:    add w8, w16, w162191; NONEON-NOSVE-NEXT:    strh w8, [sp, #474]2192; NONEON-NOSVE-NEXT:    add w8, w17, w172193; NONEON-NOSVE-NEXT:    strh w8, [sp, #472]2194; NONEON-NOSVE-NEXT:    add w8, w18, w182195; NONEON-NOSVE-NEXT:    strh w8, [sp, #470]2196; NONEON-NOSVE-NEXT:    add w8, w0, w02197; NONEON-NOSVE-NEXT:    strh w8, [sp, #468]2198; NONEON-NOSVE-NEXT:    add w8, w1, w12199; NONEON-NOSVE-NEXT:    strh w8, [sp, #466]2200; NONEON-NOSVE-NEXT:    add w8, w2, w22201; NONEON-NOSVE-NEXT:    strh w8, [sp, #464]2202; NONEON-NOSVE-NEXT:    add w8, w3, w32203; NONEON-NOSVE-NEXT:    strh w8, [sp, #462]2204; NONEON-NOSVE-NEXT:    add w8, w4, w42205; NONEON-NOSVE-NEXT:    strh w8, [sp, #460]2206; NONEON-NOSVE-NEXT:    add w8, w6, w62207; NONEON-NOSVE-NEXT:    strh w8, [sp, #458]2208; NONEON-NOSVE-NEXT:    add w8, w7, w72209; NONEON-NOSVE-NEXT:    strh w8, [sp, #456]2210; NONEON-NOSVE-NEXT:    add w8, w19, w192211; NONEON-NOSVE-NEXT:    strh w8, [sp, #454]2212; NONEON-NOSVE-NEXT:    add w8, w20, w202213; NONEON-NOSVE-NEXT:    strh w8, [sp, #452]2214; NONEON-NOSVE-NEXT:    add w8, w22, w222215; NONEON-NOSVE-NEXT:    strh w8, [sp, #450]2216; NONEON-NOSVE-NEXT:    add w8, w24, w242217; NONEON-NOSVE-NEXT:    strh w8, [sp, #448]2218; NONEON-NOSVE-NEXT:    add w8, w25, w252219; NONEON-NOSVE-NEXT:    strh w8, [sp, #510]2220; NONEON-NOSVE-NEXT:    add w8, w26, w262221; NONEON-NOSVE-NEXT:    strh w8, [sp, #508]2222; NONEON-NOSVE-NEXT:    add w8, w27, w272223; NONEON-NOSVE-NEXT:    strh w8, [sp, #506]2224; NONEON-NOSVE-NEXT:    add w8, w28, w282225; NONEON-NOSVE-NEXT:    strh w8, [sp, #504]2226; NONEON-NOSVE-NEXT:    add w8, w29, w292227; NONEON-NOSVE-NEXT:    strh w8, [sp, #502]2228; NONEON-NOSVE-NEXT:    add w8, w30, w302229; NONEON-NOSVE-NEXT:    strh w8, [sp, #500]2230; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload2231; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #464]2232; NONEON-NOSVE-NEXT:    add w8, w8, w82233; NONEON-NOSVE-NEXT:    strh w8, [sp, #498]2234; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Reload2235; NONEON-NOSVE-NEXT:    add w8, w8, w82236; NONEON-NOSVE-NEXT:    strh w8, [sp, #496]2237; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16] // 4-byte Reload2238; NONEON-NOSVE-NEXT:    add w8, w8, w82239; NONEON-NOSVE-NEXT:    strh w8, [sp, #446]2240; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20] // 4-byte Reload2241; NONEON-NOSVE-NEXT:    add w8, w8, w82242; NONEON-NOSVE-NEXT:    strh w8, [sp, #444]2243; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24] // 4-byte Reload2244; NONEON-NOSVE-NEXT:    add w8, w8, w82245; NONEON-NOSVE-NEXT:    strh w8, [sp, #442]2246; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28] // 4-byte Reload2247; NONEON-NOSVE-NEXT:    add w8, w8, w82248; NONEON-NOSVE-NEXT:    strh w8, [sp, #440]2249; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32] // 4-byte Reload2250; NONEON-NOSVE-NEXT:    add w8, w8, w82251; NONEON-NOSVE-NEXT:    strh w8, [sp, #438]2252; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36] // 4-byte Reload2253; NONEON-NOSVE-NEXT:    add w8, w8, w82254; NONEON-NOSVE-NEXT:    strh w8, [sp, #436]2255; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40] // 4-byte Reload2256; NONEON-NOSVE-NEXT:    add w8, w8, w82257; NONEON-NOSVE-NEXT:    strh w8, [sp, #434]2258; NONEON-NOSVE-NEXT:    ldr w8, [sp, #44] // 4-byte Reload2259; NONEON-NOSVE-NEXT:    add w8, w8, w82260; NONEON-NOSVE-NEXT:    strh w8, [sp, #432]2261; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48] // 4-byte Reload2262; NONEON-NOSVE-NEXT:    ldp q6, q3, [sp, #432]2263; NONEON-NOSVE-NEXT:    add w8, w8, w82264; NONEON-NOSVE-NEXT:    strh w8, [sp, #526]2265; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52] // 4-byte Reload2266; NONEON-NOSVE-NEXT:    add w8, w8, w82267; NONEON-NOSVE-NEXT:    strh w8, [sp, #524]2268; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56] // 4-byte Reload2269; NONEON-NOSVE-NEXT:    add w8, w8, w82270; NONEON-NOSVE-NEXT:    strh w8, [sp, #522]2271; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60] // 4-byte Reload2272; NONEON-NOSVE-NEXT:    add w8, w8, w82273; NONEON-NOSVE-NEXT:    strh w8, [sp, #520]2274; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64] // 4-byte Reload2275; NONEON-NOSVE-NEXT:    add w8, w8, w82276; NONEON-NOSVE-NEXT:    strh w8, [sp, #518]2277; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68] // 4-byte Reload2278; NONEON-NOSVE-NEXT:    add w8, w8, w82279; NONEON-NOSVE-NEXT:    strh w8, [sp, #516]2280; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72] // 4-byte Reload2281; NONEON-NOSVE-NEXT:    add w8, w8, w82282; NONEON-NOSVE-NEXT:    strh w8, [sp, #514]2283; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76] // 4-byte Reload2284; NONEON-NOSVE-NEXT:    add w8, w8, w82285; NONEON-NOSVE-NEXT:    strh w8, [sp, #512]2286; NONEON-NOSVE-NEXT:    ldr w8, [sp, #80] // 4-byte Reload2287; NONEON-NOSVE-NEXT:    ldp q4, q7, [sp, #496]2288; NONEON-NOSVE-NEXT:    add w8, w8, w82289; NONEON-NOSVE-NEXT:    strh w8, [sp, #414]2290; NONEON-NOSVE-NEXT:    ldr w8, [sp, #84] // 4-byte Reload2291; NONEON-NOSVE-NEXT:    add w8, w8, w82292; NONEON-NOSVE-NEXT:    strh w8, [sp, #412]2293; NONEON-NOSVE-NEXT:    ldr w8, [sp, #88] // 4-byte Reload2294; NONEON-NOSVE-NEXT:    add w8, w8, w82295; NONEON-NOSVE-NEXT:    strh w8, [sp, #410]2296; NONEON-NOSVE-NEXT:    ldr w8, [sp, #92] // 4-byte Reload2297; NONEON-NOSVE-NEXT:    add w8, w8, w82298; NONEON-NOSVE-NEXT:    strh w8, [sp, #408]2299; NONEON-NOSVE-NEXT:    ldr w8, [sp, #96] // 4-byte Reload2300; NONEON-NOSVE-NEXT:    add w8, w8, w82301; NONEON-NOSVE-NEXT:    strh w8, [sp, #406]2302; NONEON-NOSVE-NEXT:    ldr w8, [sp, #100] // 4-byte Reload2303; NONEON-NOSVE-NEXT:    add w8, w8, w82304; NONEON-NOSVE-NEXT:    strh w8, [sp, #404]2305; NONEON-NOSVE-NEXT:    ldr w8, [sp, #104] // 4-byte Reload2306; NONEON-NOSVE-NEXT:    add w8, w8, w82307; NONEON-NOSVE-NEXT:    strh w8, [sp, #402]2308; NONEON-NOSVE-NEXT:    ldr w8, [sp, #108] // 4-byte Reload2309; NONEON-NOSVE-NEXT:    add w8, w8, w82310; NONEON-NOSVE-NEXT:    strh w8, [sp, #400]2311; NONEON-NOSVE-NEXT:    ldr w8, [sp, #112] // 4-byte Reload2312; NONEON-NOSVE-NEXT:    add w8, w8, w82313; NONEON-NOSVE-NEXT:    strh w8, [sp, #430]2314; NONEON-NOSVE-NEXT:    ldr w8, [sp, #116] // 4-byte Reload2315; NONEON-NOSVE-NEXT:    add w8, w8, w82316; NONEON-NOSVE-NEXT:    strh w8, [sp, #428]2317; NONEON-NOSVE-NEXT:    ldr w8, [sp, #120] // 4-byte Reload2318; NONEON-NOSVE-NEXT:    add w8, w8, w82319; NONEON-NOSVE-NEXT:    strh w8, [sp, #426]2320; NONEON-NOSVE-NEXT:    ldr w8, [sp, #124] // 4-byte Reload2321; NONEON-NOSVE-NEXT:    add w8, w8, w82322; NONEON-NOSVE-NEXT:    strh w8, [sp, #424]2323; NONEON-NOSVE-NEXT:    ldr w8, [sp, #128] // 4-byte Reload2324; NONEON-NOSVE-NEXT:    add w8, w8, w82325; NONEON-NOSVE-NEXT:    strh w8, [sp, #422]2326; NONEON-NOSVE-NEXT:    ldr w8, [sp, #132] // 4-byte Reload2327; NONEON-NOSVE-NEXT:    add w8, w8, w82328; NONEON-NOSVE-NEXT:    strh w8, [sp, #420]2329; NONEON-NOSVE-NEXT:    ldr w8, [sp, #136] // 4-byte Reload2330; NONEON-NOSVE-NEXT:    add w8, w8, w82331; NONEON-NOSVE-NEXT:    strh w8, [sp, #418]2332; NONEON-NOSVE-NEXT:    ldr w8, [sp, #140] // 4-byte Reload2333; NONEON-NOSVE-NEXT:    add w8, w8, w82334; NONEON-NOSVE-NEXT:    strh w8, [sp, #416]2335; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #400]2336; NONEON-NOSVE-NEXT:    stp q1, q0, [x5]2337; NONEON-NOSVE-NEXT:    stp q4, q3, [x5, #32]2338; NONEON-NOSVE-NEXT:    stp q7, q6, [x5, #64]2339; NONEON-NOSVE-NEXT:    stp q2, q5, [x5, #96]2340; NONEON-NOSVE-NEXT:    add sp, sp, #5282341; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload2342; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload2343; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #48] // 16-byte Folded Reload2344; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #32] // 16-byte Folded Reload2345; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #16] // 16-byte Folded Reload2346; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp], #96 // 16-byte Folded Reload2347; NONEON-NOSVE-NEXT:    ret2348  %a = load <64 x i32>, ptr %in2349  %b = trunc <64 x i32> %a to <64 x i16>2350  %c = add <64 x i16> %b, %b2351  store <64 x i16> %c, ptr %out2352  ret void2353}2354 2355;2356; truncate i64 -> i82357;2358 2359; NOTE: v4i8 is not legal so result i8 elements are held within i16 containers.2360define <4 x i8> @trunc_v4i64_v4i8(ptr %in) nounwind {2361; CHECK-LABEL: trunc_v4i64_v4i8:2362; CHECK:       // %bb.0:2363; CHECK-NEXT:    ldp q1, q0, [x0]2364; CHECK-NEXT:    ptrue p0.s, vl22365; CHECK-NEXT:    uzp1 z3.s, z0.s, z0.s2366; CHECK-NEXT:    uzp1 z2.s, z1.s, z1.s2367; CHECK-NEXT:    splice z0.s, p0, { z2.s, z3.s }2368; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h2369; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z02370; CHECK-NEXT:    ret2371;2372; NONEON-NOSVE-LABEL: trunc_v4i64_v4i8:2373; NONEON-NOSVE:       // %bb.0:2374; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2375; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!2376; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]2377; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]2378; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp]2379; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]2380; NONEON-NOSVE-NEXT:    strh w10, [sp, #42]2381; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]2382; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]2383; NONEON-NOSVE-NEXT:    add sp, sp, #482384; NONEON-NOSVE-NEXT:    ret2385  %a = load <4 x i64>, ptr %in2386  %b = trunc <4 x i64> %a to <4 x i8>2387  ret <4 x i8> %b2388}2389 2390define <8 x i8> @trunc_v8i64_v8i8(ptr %in) nounwind {2391; CHECK-LABEL: trunc_v8i64_v8i8:2392; CHECK:       // %bb.0:2393; CHECK-NEXT:    ldp q1, q0, [x0, #32]2394; CHECK-NEXT:    ptrue p0.s, vl22395; CHECK-NEXT:    ldp q3, q2, [x0]2396; CHECK-NEXT:    uzp1 z5.s, z0.s, z0.s2397; CHECK-NEXT:    uzp1 z4.s, z1.s, z1.s2398; CHECK-NEXT:    uzp1 z1.s, z2.s, z2.s2399; CHECK-NEXT:    uzp1 z0.s, z3.s, z3.s2400; CHECK-NEXT:    splice z2.s, p0, { z4.s, z5.s }2401; CHECK-NEXT:    splice z0.s, p0, { z0.s, z1.s }2402; CHECK-NEXT:    ptrue p0.h, vl42403; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h2404; CHECK-NEXT:    uzp1 z1.h, z0.h, z0.h2405; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }2406; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b2407; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z02408; CHECK-NEXT:    ret2409;2410; NONEON-NOSVE-LABEL: trunc_v8i64_v8i8:2411; NONEON-NOSVE:       // %bb.0:2412; NONEON-NOSVE-NEXT:    sub sp, sp, #802413; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]2414; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]2415; NONEON-NOSVE-NEXT:    str q1, [sp, #48]2416; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #16]2417; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]2418; NONEON-NOSVE-NEXT:    str q2, [sp]2419; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]2420; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp, #48]2421; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]2422; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]2423; NONEON-NOSVE-NEXT:    ldp x8, x11, [sp, #32]2424; NONEON-NOSVE-NEXT:    strb w10, [sp, #77]2425; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]2426; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]2427; NONEON-NOSVE-NEXT:    strb w11, [sp, #75]2428; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]2429; NONEON-NOSVE-NEXT:    ldr x8, [sp]2430; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]2431; NONEON-NOSVE-NEXT:    ldr d0, [sp, #72]2432; NONEON-NOSVE-NEXT:    add sp, sp, #802433; NONEON-NOSVE-NEXT:    ret2434  %a = load <8 x i64>, ptr %in2435  %b = trunc <8 x i64> %a to <8 x i8>2436  ret <8 x i8> %b2437}2438 2439define <16 x i8> @trunc_v16i64_v16i8(ptr %in) nounwind {2440; CHECK-LABEL: trunc_v16i64_v16i8:2441; CHECK:       // %bb.0:2442; CHECK-NEXT:    ldp q0, q1, [x0, #96]2443; CHECK-NEXT:    ptrue p0.s, vl22444; CHECK-NEXT:    ldp q2, q3, [x0, #32]2445; CHECK-NEXT:    ldp q4, q5, [x0, #64]2446; CHECK-NEXT:    ldp q6, q7, [x0]2447; CHECK-NEXT:    uzp1 z17.s, z1.s, z1.s2448; CHECK-NEXT:    uzp1 z16.s, z0.s, z0.s2449; CHECK-NEXT:    uzp1 z19.s, z3.s, z3.s2450; CHECK-NEXT:    uzp1 z1.s, z5.s, z5.s2451; CHECK-NEXT:    uzp1 z18.s, z2.s, z2.s2452; CHECK-NEXT:    uzp1 z0.s, z4.s, z4.s2453; CHECK-NEXT:    uzp1 z3.s, z7.s, z7.s2454; CHECK-NEXT:    uzp1 z2.s, z6.s, z6.s2455; CHECK-NEXT:    splice z4.s, p0, { z16.s, z17.s }2456; CHECK-NEXT:    splice z0.s, p0, { z0.s, z1.s }2457; CHECK-NEXT:    splice z1.s, p0, { z18.s, z19.s }2458; CHECK-NEXT:    splice z2.s, p0, { z2.s, z3.s }2459; CHECK-NEXT:    ptrue p0.h, vl42460; CHECK-NEXT:    uzp1 z4.h, z4.h, z4.h2461; CHECK-NEXT:    uzp1 z3.h, z0.h, z0.h2462; CHECK-NEXT:    uzp1 z1.h, z1.h, z1.h2463; CHECK-NEXT:    uzp1 z0.h, z2.h, z2.h2464; CHECK-NEXT:    splice z2.h, p0, { z3.h, z4.h }2465; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }2466; CHECK-NEXT:    ptrue p0.b, vl82467; CHECK-NEXT:    uzp1 z2.b, z2.b, z2.b2468; CHECK-NEXT:    uzp1 z1.b, z0.b, z0.b2469; CHECK-NEXT:    splice z0.b, p0, { z1.b, z2.b }2470; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z02471; CHECK-NEXT:    ret2472;2473; NONEON-NOSVE-LABEL: trunc_v16i64_v16i8:2474; NONEON-NOSVE:       // %bb.0:2475; NONEON-NOSVE-NEXT:    sub sp, sp, #1442476; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0, #96]2477; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]2478; NONEON-NOSVE-NEXT:    ldp q4, q5, [x0, #32]2479; NONEON-NOSVE-NEXT:    ldp q6, q7, [x0, #64]2480; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #16]2481; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #32]2482; NONEON-NOSVE-NEXT:    str q3, [sp, #80]2483; NONEON-NOSVE-NEXT:    str q2, [sp]2484; NONEON-NOSVE-NEXT:    stp q7, q5, [sp, #48]2485; NONEON-NOSVE-NEXT:    strb w8, [sp, #142]2486; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp, #16]2487; NONEON-NOSVE-NEXT:    stp q4, q6, [sp, #96]2488; NONEON-NOSVE-NEXT:    strb w9, [sp, #143]2489; NONEON-NOSVE-NEXT:    strb w8, [sp, #140]2490; NONEON-NOSVE-NEXT:    ldp x8, x11, [sp, #48]2491; NONEON-NOSVE-NEXT:    strb w10, [sp, #141]2492; NONEON-NOSVE-NEXT:    strb w8, [sp, #138]2493; NONEON-NOSVE-NEXT:    ldr x8, [sp, #120]2494; NONEON-NOSVE-NEXT:    strb w11, [sp, #139]2495; NONEON-NOSVE-NEXT:    strb w8, [sp, #137]2496; NONEON-NOSVE-NEXT:    ldr x8, [sp, #112]2497; NONEON-NOSVE-NEXT:    strb w8, [sp, #136]2498; NONEON-NOSVE-NEXT:    ldr x8, [sp, #72]2499; NONEON-NOSVE-NEXT:    strb w8, [sp, #135]2500; NONEON-NOSVE-NEXT:    ldr x8, [sp, #64]2501; NONEON-NOSVE-NEXT:    strb w8, [sp, #134]2502; NONEON-NOSVE-NEXT:    ldr x8, [sp, #104]2503; NONEON-NOSVE-NEXT:    strb w8, [sp, #133]2504; NONEON-NOSVE-NEXT:    ldr x8, [sp, #96]2505; NONEON-NOSVE-NEXT:    strb w8, [sp, #132]2506; NONEON-NOSVE-NEXT:    ldr x8, [sp, #88]2507; NONEON-NOSVE-NEXT:    strb w8, [sp, #131]2508; NONEON-NOSVE-NEXT:    ldr x8, [sp, #80]2509; NONEON-NOSVE-NEXT:    strb w8, [sp, #130]2510; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]2511; NONEON-NOSVE-NEXT:    strb w8, [sp, #129]2512; NONEON-NOSVE-NEXT:    ldr x8, [sp]2513; NONEON-NOSVE-NEXT:    strb w8, [sp, #128]2514; NONEON-NOSVE-NEXT:    ldr q0, [sp, #128]2515; NONEON-NOSVE-NEXT:    add sp, sp, #1442516; NONEON-NOSVE-NEXT:    ret2517  %a = load <16 x i64>, ptr %in2518  %b = trunc <16 x i64> %a to <16 x i8>2519  ret <16 x i8> %b2520}2521 2522; NOTE: Extra 'add' is to prevent the truncate being combined with the store.2523define void @trunc_v32i64_v32i8(ptr %in, ptr %out) nounwind {2524; CHECK-LABEL: trunc_v32i64_v32i8:2525; CHECK:       // %bb.0:2526; CHECK-NEXT:    ldp q5, q6, [x0, #224]2527; CHECK-NEXT:    ptrue p0.s, vl22528; CHECK-NEXT:    ldp q2, q3, [x0, #32]2529; CHECK-NEXT:    ldp q4, q7, [x0, #64]2530; CHECK-NEXT:    uzp1 z17.s, z6.s, z6.s2531; CHECK-NEXT:    ldp q6, q18, [x0, #192]2532; CHECK-NEXT:    uzp1 z16.s, z5.s, z5.s2533; CHECK-NEXT:    ldp q5, q19, [x0, #128]2534; CHECK-NEXT:    ldp q0, q1, [x0]2535; CHECK-NEXT:    uzp1 z21.s, z18.s, z18.s2536; CHECK-NEXT:    ldp q18, q22, [x0, #160]2537; CHECK-NEXT:    uzp1 z20.s, z6.s, z6.s2538; CHECK-NEXT:    ldp q6, q23, [x0, #96]2539; CHECK-NEXT:    splice z16.s, p0, { z16.s, z17.s }2540; CHECK-NEXT:    uzp1 z27.s, z19.s, z19.s2541; CHECK-NEXT:    uzp1 z25.s, z22.s, z22.s2542; CHECK-NEXT:    uzp1 z26.s, z5.s, z5.s2543; CHECK-NEXT:    uzp1 z24.s, z18.s, z18.s2544; CHECK-NEXT:    uzp1 z18.s, z23.s, z23.s2545; CHECK-NEXT:    uzp1 z23.s, z3.s, z3.s2546; CHECK-NEXT:    uzp1 z17.s, z6.s, z6.s2547; CHECK-NEXT:    uzp1 z6.s, z7.s, z7.s2548; CHECK-NEXT:    uzp1 z22.s, z2.s, z2.s2549; CHECK-NEXT:    uzp1 z5.s, z4.s, z4.s2550; CHECK-NEXT:    uzp1 z2.s, z1.s, z1.s2551; CHECK-NEXT:    splice z3.s, p0, { z20.s, z21.s }2552; CHECK-NEXT:    uzp1 z1.s, z0.s, z0.s2553; CHECK-NEXT:    splice z0.s, p0, { z24.s, z25.s }2554; CHECK-NEXT:    splice z7.s, p0, { z26.s, z27.s }2555; CHECK-NEXT:    splice z4.s, p0, { z17.s, z18.s }2556; CHECK-NEXT:    uzp1 z17.h, z16.h, z16.h2557; CHECK-NEXT:    splice z5.s, p0, { z5.s, z6.s }2558; CHECK-NEXT:    splice z6.s, p0, { z22.s, z23.s }2559; CHECK-NEXT:    splice z1.s, p0, { z1.s, z2.s }2560; CHECK-NEXT:    uzp1 z16.h, z3.h, z3.h2561; CHECK-NEXT:    ptrue p0.h, vl42562; CHECK-NEXT:    uzp1 z3.h, z0.h, z0.h2563; CHECK-NEXT:    uzp1 z19.h, z4.h, z4.h2564; CHECK-NEXT:    uzp1 z2.h, z7.h, z7.h2565; CHECK-NEXT:    uzp1 z18.h, z5.h, z5.h2566; CHECK-NEXT:    uzp1 z5.h, z6.h, z6.h2567; CHECK-NEXT:    splice z0.h, p0, { z16.h, z17.h }2568; CHECK-NEXT:    uzp1 z4.h, z1.h, z1.h2569; CHECK-NEXT:    splice z1.h, p0, { z2.h, z3.h }2570; CHECK-NEXT:    splice z2.h, p0, { z18.h, z19.h }2571; CHECK-NEXT:    splice z3.h, p0, { z4.h, z5.h }2572; CHECK-NEXT:    uzp1 z5.b, z0.b, z0.b2573; CHECK-NEXT:    ptrue p0.b, vl82574; CHECK-NEXT:    uzp1 z4.b, z1.b, z1.b2575; CHECK-NEXT:    uzp1 z7.b, z2.b, z2.b2576; CHECK-NEXT:    uzp1 z6.b, z3.b, z3.b2577; CHECK-NEXT:    splice z0.b, p0, { z4.b, z5.b }2578; CHECK-NEXT:    splice z1.b, p0, { z6.b, z7.b }2579; CHECK-NEXT:    add z0.b, z0.b, z0.b2580; CHECK-NEXT:    add z1.b, z1.b, z1.b2581; CHECK-NEXT:    stp q1, q0, [x1]2582; CHECK-NEXT:    ret2583;2584; NONEON-NOSVE-LABEL: trunc_v32i64_v32i8:2585; NONEON-NOSVE:       // %bb.0:2586; NONEON-NOSVE-NEXT:    sub sp, sp, #4162587; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #96]2588; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #336] // 16-byte Folded Spill2589; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #64]2590; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #352] // 16-byte Folded Spill2591; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #368] // 16-byte Folded Spill2592; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #32]2593; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #384] // 16-byte Folded Spill2594; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #128]2595; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #400] // 16-byte Folded Spill2596; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0]2597; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #320] // 16-byte Folded Spill2598; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #224]2599; NONEON-NOSVE-NEXT:    str x1, [sp, #24] // 8-byte Spill2600; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #192]2601; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #160]2602; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #160]2603; NONEON-NOSVE-NEXT:    ldr w8, [sp, #176]2604; NONEON-NOSVE-NEXT:    ldr w9, [sp, #184]2605; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #192]2606; NONEON-NOSVE-NEXT:    stp q21, q19, [sp, #48]2607; NONEON-NOSVE-NEXT:    ldr w25, [sp, #208]2608; NONEON-NOSVE-NEXT:    ldr w26, [sp, #216]2609; NONEON-NOSVE-NEXT:    add w5, w9, w92610; NONEON-NOSVE-NEXT:    add w6, w8, w82611; NONEON-NOSVE-NEXT:    ldr w9, [sp, #192]2612; NONEON-NOSVE-NEXT:    stp q20, q23, [sp, #96]2613; NONEON-NOSVE-NEXT:    ldr w2, [sp, #64]2614; NONEON-NOSVE-NEXT:    ldr w16, [sp, #48]2615; NONEON-NOSVE-NEXT:    add w9, w9, w92616; NONEON-NOSVE-NEXT:    ldr w18, [sp, #96]2617; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #128]2618; NONEON-NOSVE-NEXT:    stp q6, q5, [sp, #224]2619; NONEON-NOSVE-NEXT:    ldr w3, [sp, #72]2620; NONEON-NOSVE-NEXT:    ldr w14, [sp, #128]2621; NONEON-NOSVE-NEXT:    stp q3, q17, [sp, #256]2622; NONEON-NOSVE-NEXT:    ldr w23, [sp, #240]2623; NONEON-NOSVE-NEXT:    ldr w21, [sp, #224]2624; NONEON-NOSVE-NEXT:    ldr w8, [sp, #272]2625; NONEON-NOSVE-NEXT:    ldr w27, [sp, #256]2626; NONEON-NOSVE-NEXT:    ldr w28, [sp, #264]2627; NONEON-NOSVE-NEXT:    strb w9, [sp, #298]2628; NONEON-NOSVE-NEXT:    ldr w24, [sp, #248]2629; NONEON-NOSVE-NEXT:    ldr w22, [sp, #232]2630; NONEON-NOSVE-NEXT:    add w9, w27, w272631; NONEON-NOSVE-NEXT:    str w8, [sp, #20] // 4-byte Spill2632; NONEON-NOSVE-NEXT:    ldr w8, [sp, #200]2633; NONEON-NOSVE-NEXT:    str q7, [sp, #32]2634; NONEON-NOSVE-NEXT:    ldr w0, [sp, #104]2635; NONEON-NOSVE-NEXT:    ldr w12, [sp, #112]2636; NONEON-NOSVE-NEXT:    add w8, w8, w82637; NONEON-NOSVE-NEXT:    strb w9, [sp, #296]2638; NONEON-NOSVE-NEXT:    add w9, w25, w252639; NONEON-NOSVE-NEXT:    str q18, [sp, #80]2640; NONEON-NOSVE-NEXT:    ldr w19, [sp, #32]2641; NONEON-NOSVE-NEXT:    ldr w20, [sp, #40]2642; NONEON-NOSVE-NEXT:    strb w8, [sp, #299]2643; NONEON-NOSVE-NEXT:    add w8, w28, w282644; NONEON-NOSVE-NEXT:    ldr w4, [sp, #80]2645; NONEON-NOSVE-NEXT:    strb w9, [sp, #294]2646; NONEON-NOSVE-NEXT:    add w9, w23, w232647; NONEON-NOSVE-NEXT:    ldr w7, [sp, #88]2648; NONEON-NOSVE-NEXT:    strb w8, [sp, #297]2649; NONEON-NOSVE-NEXT:    add w8, w26, w262650; NONEON-NOSVE-NEXT:    ldr w17, [sp, #56]2651; NONEON-NOSVE-NEXT:    strb w9, [sp, #292]2652; NONEON-NOSVE-NEXT:    add w9, w21, w212653; NONEON-NOSVE-NEXT:    ldr w10, [sp, #144]2654; NONEON-NOSVE-NEXT:    strb w8, [sp, #295]2655; NONEON-NOSVE-NEXT:    add w8, w24, w242656; NONEON-NOSVE-NEXT:    ldr w15, [sp, #136]2657; NONEON-NOSVE-NEXT:    strb w9, [sp, #290]2658; NONEON-NOSVE-NEXT:    add w9, w19, w192659; NONEON-NOSVE-NEXT:    ldr w13, [sp, #120]2660; NONEON-NOSVE-NEXT:    strb w8, [sp, #293]2661; NONEON-NOSVE-NEXT:    add w8, w22, w222662; NONEON-NOSVE-NEXT:    ldr w11, [sp, #152]2663; NONEON-NOSVE-NEXT:    strb w9, [sp, #288]2664; NONEON-NOSVE-NEXT:    add w9, w4, w42665; NONEON-NOSVE-NEXT:    ldr w1, [sp, #280]2666; NONEON-NOSVE-NEXT:    strb w8, [sp, #291]2667; NONEON-NOSVE-NEXT:    add w8, w20, w202668; NONEON-NOSVE-NEXT:    ldr w29, [sp, #160]2669; NONEON-NOSVE-NEXT:    strb w9, [sp, #318]2670; NONEON-NOSVE-NEXT:    add w9, w2, w22671; NONEON-NOSVE-NEXT:    ldr w30, [sp, #168]2672; NONEON-NOSVE-NEXT:    strb w8, [sp, #289]2673; NONEON-NOSVE-NEXT:    add w8, w7, w72674; NONEON-NOSVE-NEXT:    strb w9, [sp, #316]2675; NONEON-NOSVE-NEXT:    add w9, w18, w182676; NONEON-NOSVE-NEXT:    strb w8, [sp, #319]2677; NONEON-NOSVE-NEXT:    add w8, w3, w32678; NONEON-NOSVE-NEXT:    strb w9, [sp, #314]2679; NONEON-NOSVE-NEXT:    add w9, w16, w162680; NONEON-NOSVE-NEXT:    strb w8, [sp, #317]2681; NONEON-NOSVE-NEXT:    add w8, w0, w02682; NONEON-NOSVE-NEXT:    strb w9, [sp, #312]2683; NONEON-NOSVE-NEXT:    add w9, w14, w142684; NONEON-NOSVE-NEXT:    strb w8, [sp, #315]2685; NONEON-NOSVE-NEXT:    add w8, w17, w172686; NONEON-NOSVE-NEXT:    strb w9, [sp, #310]2687; NONEON-NOSVE-NEXT:    add w9, w12, w122688; NONEON-NOSVE-NEXT:    strb w8, [sp, #313]2689; NONEON-NOSVE-NEXT:    add w8, w15, w152690; NONEON-NOSVE-NEXT:    strb w9, [sp, #308]2691; NONEON-NOSVE-NEXT:    add w9, w10, w102692; NONEON-NOSVE-NEXT:    strb w8, [sp, #311]2693; NONEON-NOSVE-NEXT:    add w8, w13, w132694; NONEON-NOSVE-NEXT:    strb w9, [sp, #306]2695; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20] // 4-byte Reload2696; NONEON-NOSVE-NEXT:    strb w8, [sp, #309]2697; NONEON-NOSVE-NEXT:    add w8, w11, w112698; NONEON-NOSVE-NEXT:    add w9, w9, w92699; NONEON-NOSVE-NEXT:    strb w5, [sp, #303]2700; NONEON-NOSVE-NEXT:    add w5, w30, w302701; NONEON-NOSVE-NEXT:    strb w6, [sp, #302]2702; NONEON-NOSVE-NEXT:    add w6, w29, w292703; NONEON-NOSVE-NEXT:    strb w8, [sp, #307]2704; NONEON-NOSVE-NEXT:    add w8, w1, w12705; NONEON-NOSVE-NEXT:    strb w5, [sp, #301]2706; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #400] // 16-byte Folded Reload2707; NONEON-NOSVE-NEXT:    strb w6, [sp, #300]2708; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #384] // 16-byte Folded Reload2709; NONEON-NOSVE-NEXT:    strb w8, [sp, #305]2710; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24] // 8-byte Reload2711; NONEON-NOSVE-NEXT:    strb w9, [sp, #304]2712; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #368] // 16-byte Folded Reload2713; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #288]2714; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #352] // 16-byte Folded Reload2715; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #336] // 16-byte Folded Reload2716; NONEON-NOSVE-NEXT:    stp q1, q0, [x8]2717; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #320] // 16-byte Folded Reload2718; NONEON-NOSVE-NEXT:    add sp, sp, #4162719; NONEON-NOSVE-NEXT:    ret2720  %a = load <32 x i64>, ptr %in2721  %b = trunc <32 x i64> %a to <32 x i8>2722  %c = add <32 x i8> %b, %b2723  store <32 x i8> %c, ptr %out2724  ret void2725}2726 2727;2728; truncate i64 -> i162729;2730 2731define <4 x i16> @trunc_v4i64_v4i16(ptr %in) nounwind {2732; CHECK-LABEL: trunc_v4i64_v4i16:2733; CHECK:       // %bb.0:2734; CHECK-NEXT:    ldp q1, q0, [x0]2735; CHECK-NEXT:    ptrue p0.s, vl22736; CHECK-NEXT:    uzp1 z3.s, z0.s, z0.s2737; CHECK-NEXT:    uzp1 z2.s, z1.s, z1.s2738; CHECK-NEXT:    splice z0.s, p0, { z2.s, z3.s }2739; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h2740; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z02741; CHECK-NEXT:    ret2742;2743; NONEON-NOSVE-LABEL: trunc_v4i64_v4i16:2744; NONEON-NOSVE:       // %bb.0:2745; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2746; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!2747; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]2748; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]2749; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp]2750; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]2751; NONEON-NOSVE-NEXT:    strh w10, [sp, #42]2752; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]2753; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]2754; NONEON-NOSVE-NEXT:    add sp, sp, #482755; NONEON-NOSVE-NEXT:    ret2756  %a = load <4 x i64>, ptr %in2757  %b = trunc <4 x i64> %a to <4 x i16>2758  ret <4 x i16> %b2759}2760 2761define <8 x i16> @trunc_v8i64_v8i16(ptr %in) nounwind {2762; CHECK-LABEL: trunc_v8i64_v8i16:2763; CHECK:       // %bb.0:2764; CHECK-NEXT:    ldp q1, q0, [x0, #32]2765; CHECK-NEXT:    ptrue p0.s, vl22766; CHECK-NEXT:    ldp q3, q2, [x0]2767; CHECK-NEXT:    uzp1 z5.s, z0.s, z0.s2768; CHECK-NEXT:    uzp1 z4.s, z1.s, z1.s2769; CHECK-NEXT:    uzp1 z1.s, z2.s, z2.s2770; CHECK-NEXT:    uzp1 z0.s, z3.s, z3.s2771; CHECK-NEXT:    splice z2.s, p0, { z4.s, z5.s }2772; CHECK-NEXT:    splice z0.s, p0, { z0.s, z1.s }2773; CHECK-NEXT:    ptrue p0.h, vl42774; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h2775; CHECK-NEXT:    uzp1 z1.h, z0.h, z0.h2776; CHECK-NEXT:    splice z0.h, p0, { z1.h, z2.h }2777; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z02778; CHECK-NEXT:    ret2779;2780; NONEON-NOSVE-LABEL: trunc_v8i64_v8i16:2781; NONEON-NOSVE:       // %bb.0:2782; NONEON-NOSVE-NEXT:    sub sp, sp, #802783; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]2784; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]2785; NONEON-NOSVE-NEXT:    str q1, [sp, #48]2786; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #16]2787; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]2788; NONEON-NOSVE-NEXT:    str q2, [sp]2789; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]2790; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp, #48]2791; NONEON-NOSVE-NEXT:    strh w9, [sp, #78]2792; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]2793; NONEON-NOSVE-NEXT:    ldp x8, x11, [sp, #32]2794; NONEON-NOSVE-NEXT:    strh w10, [sp, #74]2795; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]2796; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]2797; NONEON-NOSVE-NEXT:    strh w11, [sp, #70]2798; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]2799; NONEON-NOSVE-NEXT:    ldr x8, [sp]2800; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]2801; NONEON-NOSVE-NEXT:    ldr q0, [sp, #64]2802; NONEON-NOSVE-NEXT:    add sp, sp, #802803; NONEON-NOSVE-NEXT:    ret2804  %a = load <8 x i64>, ptr %in2805  %b = trunc <8 x i64> %a to <8 x i16>2806  ret <8 x i16> %b2807}2808 2809; NOTE: Extra 'add' is to prevent the truncate being combined with the store.2810define void @trunc_v16i64_v16i16(ptr %in, ptr %out) nounwind {2811; CHECK-LABEL: trunc_v16i64_v16i16:2812; CHECK:       // %bb.0:2813; CHECK-NEXT:    ldp q0, q1, [x0, #96]2814; CHECK-NEXT:    ptrue p0.s, vl22815; CHECK-NEXT:    ldp q2, q3, [x0, #32]2816; CHECK-NEXT:    ldp q4, q5, [x0, #64]2817; CHECK-NEXT:    ldp q6, q7, [x0]2818; CHECK-NEXT:    uzp1 z17.s, z1.s, z1.s2819; CHECK-NEXT:    uzp1 z16.s, z0.s, z0.s2820; CHECK-NEXT:    uzp1 z1.s, z3.s, z3.s2821; CHECK-NEXT:    uzp1 z19.s, z5.s, z5.s2822; CHECK-NEXT:    uzp1 z0.s, z2.s, z2.s2823; CHECK-NEXT:    uzp1 z3.s, z7.s, z7.s2824; CHECK-NEXT:    uzp1 z18.s, z4.s, z4.s2825; CHECK-NEXT:    uzp1 z2.s, z6.s, z6.s2826; CHECK-NEXT:    splice z4.s, p0, { z16.s, z17.s }2827; CHECK-NEXT:    splice z0.s, p0, { z0.s, z1.s }2828; CHECK-NEXT:    splice z5.s, p0, { z18.s, z19.s }2829; CHECK-NEXT:    splice z1.s, p0, { z2.s, z3.s }2830; CHECK-NEXT:    ptrue p0.h, vl42831; CHECK-NEXT:    uzp1 z3.h, z4.h, z4.h2832; CHECK-NEXT:    uzp1 z7.h, z0.h, z0.h2833; CHECK-NEXT:    uzp1 z2.h, z5.h, z5.h2834; CHECK-NEXT:    uzp1 z6.h, z1.h, z1.h2835; CHECK-NEXT:    splice z0.h, p0, { z2.h, z3.h }2836; CHECK-NEXT:    splice z1.h, p0, { z6.h, z7.h }2837; CHECK-NEXT:    add z0.h, z0.h, z0.h2838; CHECK-NEXT:    add z1.h, z1.h, z1.h2839; CHECK-NEXT:    stp q1, q0, [x1]2840; CHECK-NEXT:    ret2841;2842; NONEON-NOSVE-LABEL: trunc_v16i64_v16i16:2843; NONEON-NOSVE:       // %bb.0:2844; NONEON-NOSVE-NEXT:    sub sp, sp, #1602845; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]2846; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0]2847; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #64]2848; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #96]2849; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #64]2850; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #96]2851; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64]2852; NONEON-NOSVE-NEXT:    ldr w9, [sp, #72]2853; NONEON-NOSVE-NEXT:    ldr w2, [sp, #96]2854; NONEON-NOSVE-NEXT:    ldr w3, [sp, #104]2855; NONEON-NOSVE-NEXT:    stp q5, q7, [sp]2856; NONEON-NOSVE-NEXT:    add w9, w9, w92857; NONEON-NOSVE-NEXT:    add w8, w8, w82858; NONEON-NOSVE-NEXT:    ldr w4, [sp, #80]2859; NONEON-NOSVE-NEXT:    ldr w5, [sp, #88]2860; NONEON-NOSVE-NEXT:    stp q6, q0, [sp, #32]2861; NONEON-NOSVE-NEXT:    ldr w18, [sp]2862; NONEON-NOSVE-NEXT:    ldr w0, [sp, #8]2863; NONEON-NOSVE-NEXT:    strh w9, [sp, #142]2864; NONEON-NOSVE-NEXT:    add w9, w3, w32865; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]2866; NONEON-NOSVE-NEXT:    add w8, w2, w22867; NONEON-NOSVE-NEXT:    ldr w16, [sp, #32]2868; NONEON-NOSVE-NEXT:    ldr w17, [sp, #40]2869; NONEON-NOSVE-NEXT:    strh w9, [sp, #138]2870; NONEON-NOSVE-NEXT:    add w9, w5, w52871; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]2872; NONEON-NOSVE-NEXT:    add w8, w4, w42873; NONEON-NOSVE-NEXT:    ldr w14, [sp, #16]2874; NONEON-NOSVE-NEXT:    ldr w15, [sp, #24]2875; NONEON-NOSVE-NEXT:    strh w9, [sp, #134]2876; NONEON-NOSVE-NEXT:    add w9, w0, w02877; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]2878; NONEON-NOSVE-NEXT:    add w8, w18, w182879; NONEON-NOSVE-NEXT:    ldr w12, [sp, #48]2880; NONEON-NOSVE-NEXT:    ldr w13, [sp, #56]2881; NONEON-NOSVE-NEXT:    strh w9, [sp, #130]2882; NONEON-NOSVE-NEXT:    add w9, w17, w172883; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]2884; NONEON-NOSVE-NEXT:    add w8, w16, w162885; NONEON-NOSVE-NEXT:    ldr w10, [sp, #112]2886; NONEON-NOSVE-NEXT:    ldr w11, [sp, #120]2887; NONEON-NOSVE-NEXT:    strh w9, [sp, #158]2888; NONEON-NOSVE-NEXT:    add w9, w15, w152889; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]2890; NONEON-NOSVE-NEXT:    add w8, w14, w142891; NONEON-NOSVE-NEXT:    strh w9, [sp, #154]2892; NONEON-NOSVE-NEXT:    add w9, w13, w132893; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]2894; NONEON-NOSVE-NEXT:    add w8, w12, w122895; NONEON-NOSVE-NEXT:    strh w9, [sp, #150]2896; NONEON-NOSVE-NEXT:    add w9, w11, w112897; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]2898; NONEON-NOSVE-NEXT:    add w8, w10, w102899; NONEON-NOSVE-NEXT:    strh w9, [sp, #146]2900; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]2901; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #128]2902; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]2903; NONEON-NOSVE-NEXT:    add sp, sp, #1602904; NONEON-NOSVE-NEXT:    ret2905  %a = load <16 x i64>, ptr %in2906  %b = trunc <16 x i64> %a to <16 x i16>2907  %c = add <16 x i16> %b, %b2908  store <16 x i16> %c, ptr %out2909  ret void2910}2911 2912; NOTE: Extra 'add' is to prevent the truncate being combined with the store.2913define void @trunc_v32i64_v32i16(ptr %in, ptr %out) nounwind {2914; CHECK-LABEL: trunc_v32i64_v32i16:2915; CHECK:       // %bb.0:2916; CHECK-NEXT:    ldp q2, q3, [x0, #160]2917; CHECK-NEXT:    ptrue p0.s, vl22918; CHECK-NEXT:    ldp q4, q5, [x0, #96]2919; CHECK-NEXT:    ldp q6, q7, [x0]2920; CHECK-NEXT:    uzp1 z17.s, z3.s, z3.s2921; CHECK-NEXT:    ldp q3, q18, [x0, #128]2922; CHECK-NEXT:    uzp1 z16.s, z2.s, z2.s2923; CHECK-NEXT:    ldp q2, q19, [x0, #192]2924; CHECK-NEXT:    ldp q0, q1, [x0, #64]2925; CHECK-NEXT:    uzp1 z21.s, z18.s, z18.s2926; CHECK-NEXT:    ldp q18, q22, [x0, #224]2927; CHECK-NEXT:    uzp1 z20.s, z3.s, z3.s2928; CHECK-NEXT:    ldp q3, q23, [x0, #32]2929; CHECK-NEXT:    splice z16.s, p0, { z16.s, z17.s }2930; CHECK-NEXT:    uzp1 z27.s, z19.s, z19.s2931; CHECK-NEXT:    uzp1 z25.s, z22.s, z22.s2932; CHECK-NEXT:    uzp1 z26.s, z2.s, z2.s2933; CHECK-NEXT:    uzp1 z24.s, z18.s, z18.s2934; CHECK-NEXT:    uzp1 z18.s, z23.s, z23.s2935; CHECK-NEXT:    uzp1 z23.s, z5.s, z5.s2936; CHECK-NEXT:    uzp1 z17.s, z3.s, z3.s2937; CHECK-NEXT:    uzp1 z3.s, z7.s, z7.s2938; CHECK-NEXT:    uzp1 z22.s, z4.s, z4.s2939; CHECK-NEXT:    uzp1 z2.s, z6.s, z6.s2940; CHECK-NEXT:    uzp1 z5.s, z1.s, z1.s2941; CHECK-NEXT:    splice z1.s, p0, { z20.s, z21.s }2942; CHECK-NEXT:    splice z6.s, p0, { z24.s, z25.s }2943; CHECK-NEXT:    uzp1 z4.s, z0.s, z0.s2944; CHECK-NEXT:    splice z0.s, p0, { z26.s, z27.s }2945; CHECK-NEXT:    splice z7.s, p0, { z17.s, z18.s }2946; CHECK-NEXT:    uzp1 z17.h, z16.h, z16.h2947; CHECK-NEXT:    splice z2.s, p0, { z2.s, z3.s }2948; CHECK-NEXT:    splice z3.s, p0, { z22.s, z23.s }2949; CHECK-NEXT:    splice z4.s, p0, { z4.s, z5.s }2950; CHECK-NEXT:    uzp1 z16.h, z1.h, z1.h2951; CHECK-NEXT:    ptrue p0.h, vl42952; CHECK-NEXT:    uzp1 z6.h, z6.h, z6.h2953; CHECK-NEXT:    uzp1 z5.h, z0.h, z0.h2954; CHECK-NEXT:    uzp1 z1.h, z7.h, z7.h2955; CHECK-NEXT:    uzp1 z0.h, z2.h, z2.h2956; CHECK-NEXT:    uzp1 z3.h, z3.h, z3.h2957; CHECK-NEXT:    splice z7.h, p0, { z16.h, z17.h }2958; CHECK-NEXT:    uzp1 z2.h, z4.h, z4.h2959; CHECK-NEXT:    splice z4.h, p0, { z5.h, z6.h }2960; CHECK-NEXT:    splice z0.h, p0, { z0.h, z1.h }2961; CHECK-NEXT:    splice z1.h, p0, { z2.h, z3.h }2962; CHECK-NEXT:    add z2.h, z7.h, z7.h2963; CHECK-NEXT:    add z3.h, z4.h, z4.h2964; CHECK-NEXT:    add z0.h, z0.h, z0.h2965; CHECK-NEXT:    add z1.h, z1.h, z1.h2966; CHECK-NEXT:    stp q2, q3, [x1, #32]2967; CHECK-NEXT:    stp q0, q1, [x1]2968; CHECK-NEXT:    ret2969;2970; NONEON-NOSVE-LABEL: trunc_v32i64_v32i16:2971; NONEON-NOSVE:       // %bb.0:2972; NONEON-NOSVE-NEXT:    sub sp, sp, #4322973; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #96]2974; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #352] // 16-byte Folded Spill2975; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #64]2976; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #368] // 16-byte Folded Spill2977; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #384] // 16-byte Folded Spill2978; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #128]2979; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #400] // 16-byte Folded Spill2980; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #32]2981; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #416] // 16-byte Folded Spill2982; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0]2983; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #336] // 16-byte Folded Spill2984; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #224]2985; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #192]2986; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #160]2987; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #144]2988; NONEON-NOSVE-NEXT:    ldr w8, [sp, #160]2989; NONEON-NOSVE-NEXT:    ldr w9, [sp, #168]2990; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #176]2991; NONEON-NOSVE-NEXT:    stp q21, q19, [sp, #32]2992; NONEON-NOSVE-NEXT:    ldr w25, [sp, #192]2993; NONEON-NOSVE-NEXT:    ldr w26, [sp, #200]2994; NONEON-NOSVE-NEXT:    add w6, w8, w82995; NONEON-NOSVE-NEXT:    add w5, w9, w92996; NONEON-NOSVE-NEXT:    ldr w9, [sp, #176]2997; NONEON-NOSVE-NEXT:    stp q20, q23, [sp, #80]2998; NONEON-NOSVE-NEXT:    ldr w2, [sp, #48]2999; NONEON-NOSVE-NEXT:    ldr w3, [sp, #56]3000; NONEON-NOSVE-NEXT:    add w9, w9, w93001; NONEON-NOSVE-NEXT:    ldr w18, [sp, #80]3002; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #112]3003; NONEON-NOSVE-NEXT:    stp q6, q5, [sp, #208]3004; NONEON-NOSVE-NEXT:    ldr w0, [sp, #88]3005; NONEON-NOSVE-NEXT:    ldr w16, [sp, #32]3006; NONEON-NOSVE-NEXT:    stp q3, q17, [sp, #240]3007; NONEON-NOSVE-NEXT:    ldr w23, [sp, #224]3008; NONEON-NOSVE-NEXT:    ldr w24, [sp, #232]3009; NONEON-NOSVE-NEXT:    ldr w10, [sp, #256]3010; NONEON-NOSVE-NEXT:    ldr w8, [sp, #264]3011; NONEON-NOSVE-NEXT:    ldr w27, [sp, #240]3012; NONEON-NOSVE-NEXT:    ldr w28, [sp, #248]3013; NONEON-NOSVE-NEXT:    strh w9, [sp, #308]3014; NONEON-NOSVE-NEXT:    ldr w21, [sp, #208]3015; NONEON-NOSVE-NEXT:    add w9, w27, w273016; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #8] // 8-byte Folded Spill3017; NONEON-NOSVE-NEXT:    ldr w8, [sp, #184]3018; NONEON-NOSVE-NEXT:    str q7, [sp, #16]3019; NONEON-NOSVE-NEXT:    ldr w22, [sp, #216]3020; NONEON-NOSVE-NEXT:    ldr w17, [sp, #40]3021; NONEON-NOSVE-NEXT:    add w8, w8, w83022; NONEON-NOSVE-NEXT:    strh w9, [sp, #304]3023; NONEON-NOSVE-NEXT:    add w9, w25, w253024; NONEON-NOSVE-NEXT:    strh w8, [sp, #310]3025; NONEON-NOSVE-NEXT:    add w8, w28, w283026; NONEON-NOSVE-NEXT:    ldr w19, [sp, #16]3027; NONEON-NOSVE-NEXT:    strh w8, [sp, #306]3028; NONEON-NOSVE-NEXT:    add w8, w26, w263029; NONEON-NOSVE-NEXT:    ldr w20, [sp, #24]3030; NONEON-NOSVE-NEXT:    str q18, [sp, #64]3031; NONEON-NOSVE-NEXT:    ldr w14, [sp, #112]3032; NONEON-NOSVE-NEXT:    ldr w15, [sp, #120]3033; NONEON-NOSVE-NEXT:    strh w8, [sp, #302]3034; NONEON-NOSVE-NEXT:    add w8, w24, w243035; NONEON-NOSVE-NEXT:    ldr w4, [sp, #64]3036; NONEON-NOSVE-NEXT:    strh w9, [sp, #300]3037; NONEON-NOSVE-NEXT:    add w9, w23, w233038; NONEON-NOSVE-NEXT:    ldr w7, [sp, #72]3039; NONEON-NOSVE-NEXT:    strh w8, [sp, #298]3040; NONEON-NOSVE-NEXT:    add w8, w22, w223041; NONEON-NOSVE-NEXT:    ldr w12, [sp, #96]3042; NONEON-NOSVE-NEXT:    strh w9, [sp, #296]3043; NONEON-NOSVE-NEXT:    add w9, w21, w213044; NONEON-NOSVE-NEXT:    ldr w13, [sp, #104]3045; NONEON-NOSVE-NEXT:    strh w8, [sp, #294]3046; NONEON-NOSVE-NEXT:    add w8, w20, w203047; NONEON-NOSVE-NEXT:    ldr w10, [sp, #128]3048; NONEON-NOSVE-NEXT:    strh w9, [sp, #292]3049; NONEON-NOSVE-NEXT:    add w9, w19, w193050; NONEON-NOSVE-NEXT:    ldr w11, [sp, #136]3051; NONEON-NOSVE-NEXT:    strh w8, [sp, #290]3052; NONEON-NOSVE-NEXT:    add w8, w7, w73053; NONEON-NOSVE-NEXT:    ldr w29, [sp, #144]3054; NONEON-NOSVE-NEXT:    strh w9, [sp, #288]3055; NONEON-NOSVE-NEXT:    add w9, w4, w43056; NONEON-NOSVE-NEXT:    ldr w30, [sp, #152]3057; NONEON-NOSVE-NEXT:    strh w8, [sp, #286]3058; NONEON-NOSVE-NEXT:    add w8, w3, w33059; NONEON-NOSVE-NEXT:    strh w9, [sp, #284]3060; NONEON-NOSVE-NEXT:    add w9, w2, w23061; NONEON-NOSVE-NEXT:    strh w8, [sp, #282]3062; NONEON-NOSVE-NEXT:    add w8, w0, w03063; NONEON-NOSVE-NEXT:    strh w9, [sp, #280]3064; NONEON-NOSVE-NEXT:    add w9, w18, w183065; NONEON-NOSVE-NEXT:    strh w8, [sp, #278]3066; NONEON-NOSVE-NEXT:    add w8, w17, w173067; NONEON-NOSVE-NEXT:    strh w9, [sp, #276]3068; NONEON-NOSVE-NEXT:    add w9, w16, w163069; NONEON-NOSVE-NEXT:    strh w8, [sp, #274]3070; NONEON-NOSVE-NEXT:    add w8, w15, w153071; NONEON-NOSVE-NEXT:    strh w9, [sp, #272]3072; NONEON-NOSVE-NEXT:    add w9, w14, w143073; NONEON-NOSVE-NEXT:    strh w8, [sp, #334]3074; NONEON-NOSVE-NEXT:    add w8, w13, w133075; NONEON-NOSVE-NEXT:    strh w9, [sp, #332]3076; NONEON-NOSVE-NEXT:    add w9, w12, w123077; NONEON-NOSVE-NEXT:    strh w8, [sp, #330]3078; NONEON-NOSVE-NEXT:    add w8, w11, w113079; NONEON-NOSVE-NEXT:    strh w9, [sp, #328]3080; NONEON-NOSVE-NEXT:    add w9, w10, w103081; NONEON-NOSVE-NEXT:    strh w8, [sp, #326]3082; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload3083; NONEON-NOSVE-NEXT:    strh w9, [sp, #324]3084; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload3085; NONEON-NOSVE-NEXT:    add w8, w8, w83086; NONEON-NOSVE-NEXT:    strh w5, [sp, #318]3087; NONEON-NOSVE-NEXT:    add w5, w30, w303088; NONEON-NOSVE-NEXT:    strh w6, [sp, #316]3089; NONEON-NOSVE-NEXT:    add w6, w29, w293090; NONEON-NOSVE-NEXT:    add w9, w9, w93091; NONEON-NOSVE-NEXT:    strh w5, [sp, #314]3092; NONEON-NOSVE-NEXT:    ldp q1, q3, [sp, #272]3093; NONEON-NOSVE-NEXT:    strh w6, [sp, #312]3094; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #416] // 16-byte Folded Reload3095; NONEON-NOSVE-NEXT:    strh w8, [sp, #322]3096; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #400] // 16-byte Folded Reload3097; NONEON-NOSVE-NEXT:    strh w9, [sp, #320]3098; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #384] // 16-byte Folded Reload3099; NONEON-NOSVE-NEXT:    ldp q2, q0, [sp, #304]3100; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #368] // 16-byte Folded Reload3101; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #352] // 16-byte Folded Reload3102; NONEON-NOSVE-NEXT:    stp q3, q2, [x1]3103; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #336] // 16-byte Folded Reload3104; NONEON-NOSVE-NEXT:    stp q0, q1, [x1, #32]3105; NONEON-NOSVE-NEXT:    add sp, sp, #4323106; NONEON-NOSVE-NEXT:    ret3107  %a = load <32 x i64>, ptr %in3108  %b = trunc <32 x i64> %a to <32 x i16>3109  %c = add <32 x i16> %b, %b3110  store <32 x i16> %c, ptr %out3111  ret void3112}3113 3114;3115; truncate i64 -> i323116;3117 3118define <4 x i32> @trunc_v4i64_v4i32(ptr %in) nounwind {3119; CHECK-LABEL: trunc_v4i64_v4i32:3120; CHECK:       // %bb.0:3121; CHECK-NEXT:    ldp q1, q0, [x0]3122; CHECK-NEXT:    ptrue p0.s, vl23123; CHECK-NEXT:    uzp1 z3.s, z0.s, z0.s3124; CHECK-NEXT:    uzp1 z2.s, z1.s, z1.s3125; CHECK-NEXT:    splice z0.s, p0, { z2.s, z3.s }3126; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z03127; CHECK-NEXT:    ret3128;3129; NONEON-NOSVE-LABEL: trunc_v4i64_v4i32:3130; NONEON-NOSVE:       // %bb.0:3131; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]3132; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!3133; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]3134; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]3135; NONEON-NOSVE-NEXT:    ldp x8, x10, [sp]3136; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #32]3137; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]3138; NONEON-NOSVE-NEXT:    add sp, sp, #483139; NONEON-NOSVE-NEXT:    ret3140  %a = load <4 x i64>, ptr %in3141  %b = trunc <4 x i64> %a to <4 x i32>3142  ret <4 x i32> %b3143}3144 3145; NOTE: Extra 'add' is to prevent the truncate being combined with the store.3146define void @trunc_v8i64_v8i32(ptr %in, ptr %out) nounwind {3147; CHECK-LABEL: trunc_v8i64_v8i32:3148; CHECK:       // %bb.0:3149; CHECK-NEXT:    ldp q1, q0, [x0, #32]3150; CHECK-NEXT:    ptrue p0.s, vl23151; CHECK-NEXT:    ldp q3, q2, [x0]3152; CHECK-NEXT:    uzp1 z5.s, z0.s, z0.s3153; CHECK-NEXT:    uzp1 z4.s, z1.s, z1.s3154; CHECK-NEXT:    uzp1 z1.s, z2.s, z2.s3155; CHECK-NEXT:    uzp1 z0.s, z3.s, z3.s3156; CHECK-NEXT:    splice z2.s, p0, { z4.s, z5.s }3157; CHECK-NEXT:    splice z0.s, p0, { z0.s, z1.s }3158; CHECK-NEXT:    add z1.s, z2.s, z2.s3159; CHECK-NEXT:    add z0.s, z0.s, z0.s3160; CHECK-NEXT:    stp q0, q1, [x1]3161; CHECK-NEXT:    ret3162;3163; NONEON-NOSVE-LABEL: trunc_v8i64_v8i32:3164; NONEON-NOSVE:       // %bb.0:3165; NONEON-NOSVE-NEXT:    sub sp, sp, #963166; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0, #32]3167; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]3168; NONEON-NOSVE-NEXT:    stp q3, q1, [sp]3169; NONEON-NOSVE-NEXT:    stp q2, q0, [sp, #32]3170; NONEON-NOSVE-NEXT:    ldr w12, [sp]3171; NONEON-NOSVE-NEXT:    ldr w13, [sp, #8]3172; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32]3173; NONEON-NOSVE-NEXT:    ldr w9, [sp, #40]3174; NONEON-NOSVE-NEXT:    ldr w14, [sp, #16]3175; NONEON-NOSVE-NEXT:    ldr w15, [sp, #24]3176; NONEON-NOSVE-NEXT:    ldr w10, [sp, #48]3177; NONEON-NOSVE-NEXT:    ldr w11, [sp, #56]3178; NONEON-NOSVE-NEXT:    add w9, w9, w93179; NONEON-NOSVE-NEXT:    add w8, w8, w83180; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]3181; NONEON-NOSVE-NEXT:    add w9, w13, w133182; NONEON-NOSVE-NEXT:    add w8, w12, w123183; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]3184; NONEON-NOSVE-NEXT:    add w9, w15, w153185; NONEON-NOSVE-NEXT:    add w8, w14, w143186; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]3187; NONEON-NOSVE-NEXT:    add w9, w11, w113188; NONEON-NOSVE-NEXT:    add w8, w10, w103189; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]3190; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]3191; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]3192; NONEON-NOSVE-NEXT:    add sp, sp, #963193; NONEON-NOSVE-NEXT:    ret3194  %a = load <8 x i64>, ptr %in3195  %b = trunc <8 x i64> %a to <8 x i32>3196  %c = add <8 x i32> %b, %b3197  store <8 x i32> %c, ptr %out3198  ret void3199}3200 3201; NOTE: Extra 'add' is to prevent the truncate being combined with the store.3202define void @trunc_v16i64_v16i32(ptr %in, ptr %out) nounwind {3203; CHECK-LABEL: trunc_v16i64_v16i32:3204; CHECK:       // %bb.0:3205; CHECK-NEXT:    ldp q1, q0, [x0, #64]3206; CHECK-NEXT:    ptrue p0.s, vl23207; CHECK-NEXT:    ldp q2, q3, [x0, #96]3208; CHECK-NEXT:    ldp q4, q5, [x0]3209; CHECK-NEXT:    uzp1 z7.s, z0.s, z0.s3210; CHECK-NEXT:    uzp1 z6.s, z1.s, z1.s3211; CHECK-NEXT:    ldp q1, q0, [x0, #32]3212; CHECK-NEXT:    uzp1 z17.s, z3.s, z3.s3213; CHECK-NEXT:    uzp1 z16.s, z2.s, z2.s3214; CHECK-NEXT:    uzp1 z3.s, z5.s, z5.s3215; CHECK-NEXT:    uzp1 z2.s, z4.s, z4.s3216; CHECK-NEXT:    uzp1 z5.s, z0.s, z0.s3217; CHECK-NEXT:    splice z0.s, p0, { z6.s, z7.s }3218; CHECK-NEXT:    uzp1 z4.s, z1.s, z1.s3219; CHECK-NEXT:    splice z1.s, p0, { z16.s, z17.s }3220; CHECK-NEXT:    splice z2.s, p0, { z2.s, z3.s }3221; CHECK-NEXT:    splice z3.s, p0, { z4.s, z5.s }3222; CHECK-NEXT:    add z0.s, z0.s, z0.s3223; CHECK-NEXT:    add z1.s, z1.s, z1.s3224; CHECK-NEXT:    add z2.s, z2.s, z2.s3225; CHECK-NEXT:    add z3.s, z3.s, z3.s3226; CHECK-NEXT:    stp q0, q1, [x1, #32]3227; CHECK-NEXT:    stp q2, q3, [x1]3228; CHECK-NEXT:    ret3229;3230; NONEON-NOSVE-LABEL: trunc_v16i64_v16i32:3231; NONEON-NOSVE:       // %bb.0:3232; NONEON-NOSVE-NEXT:    sub sp, sp, #1923233; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]3234; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0]3235; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #64]3236; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #96]3237; NONEON-NOSVE-NEXT:    stp q2, q4, [sp, #64]3238; NONEON-NOSVE-NEXT:    stp q3, q1, [sp, #96]3239; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64]3240; NONEON-NOSVE-NEXT:    ldr w9, [sp, #72]3241; NONEON-NOSVE-NEXT:    ldr w2, [sp, #96]3242; NONEON-NOSVE-NEXT:    ldr w3, [sp, #104]3243; NONEON-NOSVE-NEXT:    stp q5, q7, [sp]3244; NONEON-NOSVE-NEXT:    add w9, w9, w93245; NONEON-NOSVE-NEXT:    add w8, w8, w83246; NONEON-NOSVE-NEXT:    ldr w4, [sp, #80]3247; NONEON-NOSVE-NEXT:    ldr w5, [sp, #88]3248; NONEON-NOSVE-NEXT:    stp q6, q0, [sp, #32]3249; NONEON-NOSVE-NEXT:    ldr w18, [sp]3250; NONEON-NOSVE-NEXT:    ldr w0, [sp, #8]3251; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #168]3252; NONEON-NOSVE-NEXT:    add w9, w3, w33253; NONEON-NOSVE-NEXT:    add w8, w2, w23254; NONEON-NOSVE-NEXT:    ldr w16, [sp, #32]3255; NONEON-NOSVE-NEXT:    ldr w17, [sp, #40]3256; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]3257; NONEON-NOSVE-NEXT:    add w9, w5, w53258; NONEON-NOSVE-NEXT:    add w8, w4, w43259; NONEON-NOSVE-NEXT:    ldr w14, [sp, #16]3260; NONEON-NOSVE-NEXT:    ldr w15, [sp, #24]3261; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]3262; NONEON-NOSVE-NEXT:    add w9, w0, w03263; NONEON-NOSVE-NEXT:    add w8, w18, w183264; NONEON-NOSVE-NEXT:    ldr w12, [sp, #48]3265; NONEON-NOSVE-NEXT:    ldr w13, [sp, #56]3266; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]3267; NONEON-NOSVE-NEXT:    add w9, w17, w173268; NONEON-NOSVE-NEXT:    add w8, w16, w163269; NONEON-NOSVE-NEXT:    ldr w10, [sp, #112]3270; NONEON-NOSVE-NEXT:    ldr w11, [sp, #120]3271; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]3272; NONEON-NOSVE-NEXT:    add w9, w15, w153273; NONEON-NOSVE-NEXT:    add w8, w14, w143274; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]3275; NONEON-NOSVE-NEXT:    add w9, w13, w133276; NONEON-NOSVE-NEXT:    add w8, w12, w123277; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #184]3278; NONEON-NOSVE-NEXT:    add w9, w11, w113279; NONEON-NOSVE-NEXT:    add w8, w10, w103280; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #176]3281; NONEON-NOSVE-NEXT:    ldp q1, q3, [sp, #128]3282; NONEON-NOSVE-NEXT:    ldp q2, q0, [sp, #160]3283; NONEON-NOSVE-NEXT:    stp q3, q2, [x1]3284; NONEON-NOSVE-NEXT:    stp q0, q1, [x1, #32]3285; NONEON-NOSVE-NEXT:    add sp, sp, #1923286; NONEON-NOSVE-NEXT:    ret3287  %a = load <16 x i64>, ptr %in3288  %b = trunc <16 x i64> %a to <16 x i32>3289  %c = add <16 x i32> %b, %b3290  store <16 x i32> %c, ptr %out3291  ret void3292}3293 3294; NOTE: Extra 'add' is to prevent the truncate being combined with the store.3295define void @trunc_v32i64_v32i32(ptr %in, ptr %out) nounwind {3296; CHECK-LABEL: trunc_v32i64_v32i32:3297; CHECK:       // %bb.0:3298; CHECK-NEXT:    ldp q2, q3, [x0, #192]3299; CHECK-NEXT:    ptrue p0.s, vl23300; CHECK-NEXT:    ldp q4, q5, [x0]3301; CHECK-NEXT:    ldp q6, q7, [x0, #64]3302; CHECK-NEXT:    uzp1 z17.s, z3.s, z3.s3303; CHECK-NEXT:    ldp q3, q18, [x0, #224]3304; CHECK-NEXT:    uzp1 z16.s, z2.s, z2.s3305; CHECK-NEXT:    ldp q2, q19, [x0, #128]3306; CHECK-NEXT:    ldp q0, q1, [x0, #32]3307; CHECK-NEXT:    uzp1 z21.s, z18.s, z18.s3308; CHECK-NEXT:    ldp q18, q22, [x0, #160]3309; CHECK-NEXT:    uzp1 z20.s, z3.s, z3.s3310; CHECK-NEXT:    uzp1 z24.s, z19.s, z19.s3311; CHECK-NEXT:    ldp q3, q19, [x0, #96]3312; CHECK-NEXT:    uzp1 z23.s, z2.s, z2.s3313; CHECK-NEXT:    uzp1 z26.s, z22.s, z22.s3314; CHECK-NEXT:    splice z2.s, p0, { z16.s, z17.s }3315; CHECK-NEXT:    uzp1 z17.s, z7.s, z7.s3316; CHECK-NEXT:    uzp1 z25.s, z18.s, z18.s3317; CHECK-NEXT:    splice z7.s, p0, { z20.s, z21.s }3318; CHECK-NEXT:    uzp1 z21.s, z5.s, z5.s3319; CHECK-NEXT:    uzp1 z19.s, z19.s, z19.s3320; CHECK-NEXT:    uzp1 z20.s, z4.s, z4.s3321; CHECK-NEXT:    uzp1 z5.s, z1.s, z1.s3322; CHECK-NEXT:    uzp1 z16.s, z6.s, z6.s3323; CHECK-NEXT:    splice z6.s, p0, { z23.s, z24.s }3324; CHECK-NEXT:    uzp1 z18.s, z3.s, z3.s3325; CHECK-NEXT:    splice z3.s, p0, { z25.s, z26.s }3326; CHECK-NEXT:    uzp1 z4.s, z0.s, z0.s3327; CHECK-NEXT:    add z0.s, z2.s, z2.s3328; CHECK-NEXT:    add z7.s, z7.s, z7.s3329; CHECK-NEXT:    splice z1.s, p0, { z16.s, z17.s }3330; CHECK-NEXT:    splice z2.s, p0, { z18.s, z19.s }3331; CHECK-NEXT:    splice z16.s, p0, { z20.s, z21.s }3332; CHECK-NEXT:    splice z4.s, p0, { z4.s, z5.s }3333; CHECK-NEXT:    add z6.s, z6.s, z6.s3334; CHECK-NEXT:    add z3.s, z3.s, z3.s3335; CHECK-NEXT:    stp q0, q7, [x1, #96]3336; CHECK-NEXT:    add z0.s, z1.s, z1.s3337; CHECK-NEXT:    add z1.s, z2.s, z2.s3338; CHECK-NEXT:    add z2.s, z16.s, z16.s3339; CHECK-NEXT:    stp q6, q3, [x1, #64]3340; CHECK-NEXT:    add z3.s, z4.s, z4.s3341; CHECK-NEXT:    stp q0, q1, [x1, #32]3342; CHECK-NEXT:    stp q2, q3, [x1]3343; CHECK-NEXT:    ret3344;3345; NONEON-NOSVE-LABEL: trunc_v32i64_v32i32:3346; NONEON-NOSVE:       // %bb.0:3347; NONEON-NOSVE-NEXT:    sub sp, sp, #4963348; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]3349; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #416] // 16-byte Folded Spill3350; NONEON-NOSVE-NEXT:    ldp q17, q16, [x0, #192]3351; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #432] // 16-byte Folded Spill3352; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #448] // 16-byte Folded Spill3353; NONEON-NOSVE-NEXT:    ldp q23, q22, [x0, #224]3354; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #464] // 16-byte Folded Spill3355; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0]3356; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #480] // 16-byte Folded Spill3357; NONEON-NOSVE-NEXT:    ldp q5, q4, [x0, #96]3358; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #400] // 16-byte Folded Spill3359; NONEON-NOSVE-NEXT:    ldp q7, q6, [x0, #64]3360; NONEON-NOSVE-NEXT:    ldp q19, q18, [x0, #160]3361; NONEON-NOSVE-NEXT:    ldp q21, q20, [x0, #128]3362; NONEON-NOSVE-NEXT:    str q0, [sp, #192]3363; NONEON-NOSVE-NEXT:    ldr w8, [sp, #192]3364; NONEON-NOSVE-NEXT:    stp q17, q23, [sp, #32]3365; NONEON-NOSVE-NEXT:    ldr w9, [sp, #200]3366; NONEON-NOSVE-NEXT:    ldr w10, [sp, #32]3367; NONEON-NOSVE-NEXT:    stp q4, q6, [sp, #160]3368; NONEON-NOSVE-NEXT:    ldr w12, [sp, #48]3369; NONEON-NOSVE-NEXT:    add w6, w8, w83370; NONEON-NOSVE-NEXT:    add w5, w9, w93371; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40]3372; NONEON-NOSVE-NEXT:    stp q18, q20, [sp, #112]3373; NONEON-NOSVE-NEXT:    ldr w25, [sp, #160]3374; NONEON-NOSVE-NEXT:    ldr w26, [sp, #168]3375; NONEON-NOSVE-NEXT:    str q5, [sp, #144]3376; NONEON-NOSVE-NEXT:    ldr w21, [sp, #176]3377; NONEON-NOSVE-NEXT:    ldr w22, [sp, #184]3378; NONEON-NOSVE-NEXT:    stp q2, q1, [sp, #208]3379; NONEON-NOSVE-NEXT:    ldr w23, [sp, #144]3380; NONEON-NOSVE-NEXT:    ldr w24, [sp, #152]3381; NONEON-NOSVE-NEXT:    str q3, [sp, #16]3382; NONEON-NOSVE-NEXT:    ldr w9, [sp, #208]3383; NONEON-NOSVE-NEXT:    ldr w4, [sp, #112]3384; NONEON-NOSVE-NEXT:    stp w8, w10, [sp, #8] // 8-byte Folded Spill3385; NONEON-NOSVE-NEXT:    ldr w8, [sp, #216]3386; NONEON-NOSVE-NEXT:    ldr w27, [sp, #16]3387; NONEON-NOSVE-NEXT:    add w9, w9, w93388; NONEON-NOSVE-NEXT:    ldr w28, [sp, #24]3389; NONEON-NOSVE-NEXT:    stp q22, q16, [sp, #64]3390; NONEON-NOSVE-NEXT:    add w8, w8, w83391; NONEON-NOSVE-NEXT:    str w9, [sp, #344]3392; NONEON-NOSVE-NEXT:    add w9, w27, w273393; NONEON-NOSVE-NEXT:    str w8, [sp, #348]3394; NONEON-NOSVE-NEXT:    add w8, w28, w283395; NONEON-NOSVE-NEXT:    ldr w7, [sp, #120]3396; NONEON-NOSVE-NEXT:    stp q7, q21, [sp, #240]3397; NONEON-NOSVE-NEXT:    ldr w18, [sp, #128]3398; NONEON-NOSVE-NEXT:    ldr w0, [sp, #136]3399; NONEON-NOSVE-NEXT:    str w8, [sp, #340]3400; NONEON-NOSVE-NEXT:    add w8, w26, w263401; NONEON-NOSVE-NEXT:    ldr w19, [sp, #240]3402; NONEON-NOSVE-NEXT:    str w9, [sp, #336]3403; NONEON-NOSVE-NEXT:    add w9, w25, w253404; NONEON-NOSVE-NEXT:    ldr w20, [sp, #248]3405; NONEON-NOSVE-NEXT:    str w8, [sp, #332]3406; NONEON-NOSVE-NEXT:    add w8, w24, w243407; NONEON-NOSVE-NEXT:    ldr w16, [sp, #256]3408; NONEON-NOSVE-NEXT:    str w9, [sp, #328]3409; NONEON-NOSVE-NEXT:    add w9, w23, w233410; NONEON-NOSVE-NEXT:    ldr w17, [sp, #264]3411; NONEON-NOSVE-NEXT:    str q19, [sp, #96]3412; NONEON-NOSVE-NEXT:    ldr w14, [sp, #64]3413; NONEON-NOSVE-NEXT:    ldr w15, [sp, #72]3414; NONEON-NOSVE-NEXT:    str w8, [sp, #324]3415; NONEON-NOSVE-NEXT:    add w8, w22, w223416; NONEON-NOSVE-NEXT:    ldr w2, [sp, #96]3417; NONEON-NOSVE-NEXT:    str w9, [sp, #320]3418; NONEON-NOSVE-NEXT:    add w9, w21, w213419; NONEON-NOSVE-NEXT:    ldr w3, [sp, #104]3420; NONEON-NOSVE-NEXT:    str w8, [sp, #380]3421; NONEON-NOSVE-NEXT:    add w8, w20, w203422; NONEON-NOSVE-NEXT:    ldr w13, [sp, #56]3423; NONEON-NOSVE-NEXT:    str w9, [sp, #376]3424; NONEON-NOSVE-NEXT:    add w9, w19, w193425; NONEON-NOSVE-NEXT:    ldr w10, [sp, #80]3426; NONEON-NOSVE-NEXT:    str w8, [sp, #372]3427; NONEON-NOSVE-NEXT:    add w8, w7, w73428; NONEON-NOSVE-NEXT:    ldr w11, [sp, #88]3429; NONEON-NOSVE-NEXT:    str w9, [sp, #368]3430; NONEON-NOSVE-NEXT:    add w9, w4, w43431; NONEON-NOSVE-NEXT:    ldr w29, [sp, #224]3432; NONEON-NOSVE-NEXT:    str w8, [sp, #316]3433; NONEON-NOSVE-NEXT:    add w8, w3, w33434; NONEON-NOSVE-NEXT:    ldr w30, [sp, #232]3435; NONEON-NOSVE-NEXT:    str w9, [sp, #312]3436; NONEON-NOSVE-NEXT:    add w9, w2, w23437; NONEON-NOSVE-NEXT:    str w8, [sp, #308]3438; NONEON-NOSVE-NEXT:    add w8, w0, w03439; NONEON-NOSVE-NEXT:    str w9, [sp, #304]3440; NONEON-NOSVE-NEXT:    add w9, w18, w183441; NONEON-NOSVE-NEXT:    str w8, [sp, #396]3442; NONEON-NOSVE-NEXT:    add w8, w17, w173443; NONEON-NOSVE-NEXT:    str w9, [sp, #392]3444; NONEON-NOSVE-NEXT:    add w9, w16, w163445; NONEON-NOSVE-NEXT:    str w8, [sp, #388]3446; NONEON-NOSVE-NEXT:    add w8, w15, w153447; NONEON-NOSVE-NEXT:    str w9, [sp, #384]3448; NONEON-NOSVE-NEXT:    add w9, w14, w143449; NONEON-NOSVE-NEXT:    str w8, [sp, #284]3450; NONEON-NOSVE-NEXT:    add w8, w13, w133451; NONEON-NOSVE-NEXT:    str w9, [sp, #280]3452; NONEON-NOSVE-NEXT:    add w9, w12, w123453; NONEON-NOSVE-NEXT:    str w8, [sp, #276]3454; NONEON-NOSVE-NEXT:    add w8, w11, w113455; NONEON-NOSVE-NEXT:    str w9, [sp, #272]3456; NONEON-NOSVE-NEXT:    add w9, w10, w103457; NONEON-NOSVE-NEXT:    str w8, [sp, #300]3458; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload3459; NONEON-NOSVE-NEXT:    str w9, [sp, #296]3460; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload3461; NONEON-NOSVE-NEXT:    add w8, w8, w83462; NONEON-NOSVE-NEXT:    str w5, [sp, #364]3463; NONEON-NOSVE-NEXT:    add w5, w30, w303464; NONEON-NOSVE-NEXT:    add w9, w9, w93465; NONEON-NOSVE-NEXT:    str w6, [sp, #360]3466; NONEON-NOSVE-NEXT:    add w6, w29, w293467; NONEON-NOSVE-NEXT:    str w5, [sp, #356]3468; NONEON-NOSVE-NEXT:    ldp q6, q3, [sp, #304]3469; NONEON-NOSVE-NEXT:    str w6, [sp, #352]3470; NONEON-NOSVE-NEXT:    ldp q4, q7, [sp, #368]3471; NONEON-NOSVE-NEXT:    str w8, [sp, #292]3472; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #336]3473; NONEON-NOSVE-NEXT:    str w9, [sp, #288]3474; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #480] // 16-byte Folded Reload3475; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #272]3476; NONEON-NOSVE-NEXT:    stp q4, q3, [x1, #32]3477; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]3478; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #464] // 16-byte Folded Reload3479; NONEON-NOSVE-NEXT:    stp q7, q6, [x1, #64]3480; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #448] // 16-byte Folded Reload3481; NONEON-NOSVE-NEXT:    stp q2, q5, [x1, #96]3482; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #432] // 16-byte Folded Reload3483; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #416] // 16-byte Folded Reload3484; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #400] // 16-byte Folded Reload3485; NONEON-NOSVE-NEXT:    add sp, sp, #4963486; NONEON-NOSVE-NEXT:    ret3487  %a = load <32 x i64>, ptr %in3488  %b = trunc <32 x i64> %a to <32 x i32>3489  %c = add <32 x i32> %b, %b3490  store <32 x i32> %c, ptr %out3491  ret void3492}3493