brintos

brintos / llvm-project-archived public Read only

0
0
Text · 115.9 KiB · f290e3b Raw
3016 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s --check-prefixes=CHECK,SVE3; RUN: llc -mattr=+sve2 -force-streaming-compatible  < %s | FileCheck %s --check-prefixes=CHECK,SVE24; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s --check-prefixes=CHECK,SVE25; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE6 7target triple = "aarch64-unknown-linux-gnu"8 9;10; sext i1 -> i3211;12 13; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg14; type's element type is not byte based and thus cannot be lowered directly to15; an SVE instruction.16define void @sext_v8i1_v8i32(<8 x i1> %a, ptr %out) {17; CHECK-LABEL: sext_v8i1_v8i32:18; CHECK:       // %bb.0:19; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z020; CHECK-NEXT:    uunpklo z0.h, z0.b21; CHECK-NEXT:    movprfx z1, z022; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #823; CHECK-NEXT:    uunpklo z0.s, z0.h24; CHECK-NEXT:    uunpklo z1.s, z1.h25; CHECK-NEXT:    lsl z0.s, z0.s, #3126; CHECK-NEXT:    lsl z1.s, z1.s, #3127; CHECK-NEXT:    asr z0.s, z0.s, #3128; CHECK-NEXT:    asr z1.s, z1.s, #3129; CHECK-NEXT:    stp q0, q1, [x0]30; CHECK-NEXT:    ret31;32; NONEON-NOSVE-LABEL: sext_v8i1_v8i32:33; NONEON-NOSVE:       // %bb.0:34; NONEON-NOSVE-NEXT:    sub sp, sp, #4835; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 4836; NONEON-NOSVE-NEXT:    str d0, [sp, #8]37; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]38; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #10]39; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #9]40; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #8]41; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]42; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #13]43; NONEON-NOSVE-NEXT:    sbfx w8, w8, #0, #144; NONEON-NOSVE-NEXT:    sbfx w10, w10, #0, #145; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #14]46; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #15]47; NONEON-NOSVE-NEXT:    sbfx w12, w12, #0, #148; NONEON-NOSVE-NEXT:    sbfx w9, w9, #0, #149; NONEON-NOSVE-NEXT:    stp w10, w8, [sp, #40]50; NONEON-NOSVE-NEXT:    sbfx w8, w14, #0, #151; NONEON-NOSVE-NEXT:    sbfx w10, w15, #0, #152; NONEON-NOSVE-NEXT:    stp w8, w12, [sp, #32]53; NONEON-NOSVE-NEXT:    sbfx w12, w13, #0, #154; NONEON-NOSVE-NEXT:    sbfx w8, w11, #0, #155; NONEON-NOSVE-NEXT:    stp w12, w10, [sp, #24]56; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #16]57; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]58; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]59; NONEON-NOSVE-NEXT:    add sp, sp, #4860; NONEON-NOSVE-NEXT:    ret61  %b = sext <8 x i1> %a to <8 x i32>62  store <8 x i32> %b, ptr %out63  ret void64}65 66;67; sext i3 -> i6468;69 70; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg71; type's element type is not power-of-2 based and thus cannot be lowered72; directly to an SVE instruction.73define void @sext_v4i3_v4i64(<4 x i3> %a, ptr %out) {74; CHECK-LABEL: sext_v4i3_v4i64:75; CHECK:       // %bb.0:76; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z077; CHECK-NEXT:    uunpklo z0.s, z0.h78; CHECK-NEXT:    movprfx z1, z079; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #880; CHECK-NEXT:    uunpklo z0.d, z0.s81; CHECK-NEXT:    uunpklo z1.d, z1.s82; CHECK-NEXT:    lsl z0.d, z0.d, #6183; CHECK-NEXT:    lsl z1.d, z1.d, #6184; CHECK-NEXT:    asr z0.d, z0.d, #6185; CHECK-NEXT:    asr z1.d, z1.d, #6186; CHECK-NEXT:    stp q0, q1, [x0]87; CHECK-NEXT:    ret88;89; NONEON-NOSVE-LABEL: sext_v4i3_v4i64:90; NONEON-NOSVE:       // %bb.0:91; NONEON-NOSVE-NEXT:    ushll v0.4s, v0.4h, #092; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!93; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 6494; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]95; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]96; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #24]97; NONEON-NOSVE-NEXT:    ldp w11, w10, [sp, #16]98; NONEON-NOSVE-NEXT:    sbfx x8, x8, #0, #399; NONEON-NOSVE-NEXT:    sbfx x9, x9, #0, #3100; NONEON-NOSVE-NEXT:    sbfx x10, x10, #0, #3101; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #48]102; NONEON-NOSVE-NEXT:    sbfx x8, x11, #0, #3103; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]104; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]105; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]106; NONEON-NOSVE-NEXT:    add sp, sp, #64107; NONEON-NOSVE-NEXT:    ret108  %b = sext <4 x i3> %a to <4 x i64>109  store <4 x i64> %b, ptr %out110  ret void111}112 113;114; sext i8 -> i16115;116 117define void @sext_v16i8_v16i16(<16 x i8> %a, ptr %out) {118; CHECK-LABEL: sext_v16i8_v16i16:119; CHECK:       // %bb.0:120; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0121; CHECK-NEXT:    movprfx z1, z0122; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8123; CHECK-NEXT:    sunpklo z0.h, z0.b124; CHECK-NEXT:    sunpklo z1.h, z1.b125; CHECK-NEXT:    stp q0, q1, [x0]126; CHECK-NEXT:    ret127;128; NONEON-NOSVE-LABEL: sext_v16i8_v16i16:129; NONEON-NOSVE:       // %bb.0:130; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!131; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64132; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]133; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]134; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]135; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]136; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]137; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]138; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]139; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]140; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]141; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]142; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]143; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]144; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]145; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]146; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]147; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]148; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]149; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]150; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]151; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]152; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]153; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]154; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]155; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]156; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]157; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]158; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]159; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]160; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]161; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]162; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]163; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]164; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]165; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]166; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]167; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]168; NONEON-NOSVE-NEXT:    add sp, sp, #64169; NONEON-NOSVE-NEXT:    ret170  %b = sext <16 x i8> %a to <16 x i16>171  store <16 x i16>%b, ptr %out172  ret void173}174 175; NOTE: Extra 'add' is to prevent the extend being combined with the load.176define void @sext_v32i8_v32i16(ptr %in, ptr %out) {177; CHECK-LABEL: sext_v32i8_v32i16:178; CHECK:       // %bb.0:179; CHECK-NEXT:    ldp q1, q0, [x0]180; CHECK-NEXT:    add z0.b, z0.b, z0.b181; CHECK-NEXT:    add z1.b, z1.b, z1.b182; CHECK-NEXT:    movprfx z2, z0183; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8184; CHECK-NEXT:    movprfx z3, z1185; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8186; CHECK-NEXT:    sunpklo z0.h, z0.b187; CHECK-NEXT:    sunpklo z1.h, z1.b188; CHECK-NEXT:    sunpklo z2.h, z2.b189; CHECK-NEXT:    sunpklo z3.h, z3.b190; CHECK-NEXT:    stp q1, q3, [x1]191; CHECK-NEXT:    stp q0, q2, [x1, #32]192; CHECK-NEXT:    ret193;194; NONEON-NOSVE-LABEL: sext_v32i8_v32i16:195; NONEON-NOSVE:       // %bb.0:196; NONEON-NOSVE-NEXT:    sub sp, sp, #208197; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #112] // 16-byte Folded Spill198; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #128] // 16-byte Folded Spill199; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #144] // 16-byte Folded Spill200; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #160] // 16-byte Folded Spill201; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #176] // 16-byte Folded Spill202; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #192] // 16-byte Folded Spill203; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 208204; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8205; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16206; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24207; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32208; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40209; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48210; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56211; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64212; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72213; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80214; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88215; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96216; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]217; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]218; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]219; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]220; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]221; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #20]222; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #19]223; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #16]224; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill225; NONEON-NOSVE-NEXT:    add w17, w17, w17226; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]227; NONEON-NOSVE-NEXT:    add w5, w14, w14228; NONEON-NOSVE-NEXT:    sxtb w6, w17229; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #17]230; NONEON-NOSVE-NEXT:    sxtb w5, w5231; NONEON-NOSVE-NEXT:    add w8, w8, w8232; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #30]233; NONEON-NOSVE-NEXT:    strh w6, [sp, #78]234; NONEON-NOSVE-NEXT:    add w6, w30, w30235; NONEON-NOSVE-NEXT:    sxtb w8, w8236; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #31]237; NONEON-NOSVE-NEXT:    sxtb w6, w6238; NONEON-NOSVE-NEXT:    add w9, w9, w9239; NONEON-NOSVE-NEXT:    strh w5, [sp, #72]240; NONEON-NOSVE-NEXT:    add w5, w29, w29241; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #28]242; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #29]243; NONEON-NOSVE-NEXT:    sxtb w9, w9244; NONEON-NOSVE-NEXT:    sxtb w5, w5245; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]246; NONEON-NOSVE-NEXT:    add w8, w27, w27247; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #26]248; NONEON-NOSVE-NEXT:    strh w6, [sp, #70]249; NONEON-NOSVE-NEXT:    add w6, w28, w28250; NONEON-NOSVE-NEXT:    sxtb w8, w8251; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #27]252; NONEON-NOSVE-NEXT:    sxtb w6, w6253; NONEON-NOSVE-NEXT:    strh w9, [sp, #66]254; NONEON-NOSVE-NEXT:    add w9, w26, w26255; NONEON-NOSVE-NEXT:    strh w5, [sp, #64]256; NONEON-NOSVE-NEXT:    add w5, w25, w25257; NONEON-NOSVE-NEXT:    sxtb w9, w9258; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]259; NONEON-NOSVE-NEXT:    sxtb w8, w5260; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #24]261; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #25]262; NONEON-NOSVE-NEXT:    strh w6, [sp, #62]263; NONEON-NOSVE-NEXT:    add w6, w24, w24264; NONEON-NOSVE-NEXT:    add w5, w23, w23265; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]266; NONEON-NOSVE-NEXT:    sxtb w9, w6267; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]268; NONEON-NOSVE-NEXT:    sxtb w8, w5269; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #38]270; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #39]271; NONEON-NOSVE-NEXT:    add w6, w22, w22272; NONEON-NOSVE-NEXT:    add w5, w21, w21273; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #21]274; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]275; NONEON-NOSVE-NEXT:    sxtb w9, w6276; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]277; NONEON-NOSVE-NEXT:    sxtb w8, w5278; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #36]279; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #37]280; NONEON-NOSVE-NEXT:    add w6, w20, w20281; NONEON-NOSVE-NEXT:    add w4, w4, w4282; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]283; NONEON-NOSVE-NEXT:    add w18, w15, w15284; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]285; NONEON-NOSVE-NEXT:    sxtb w9, w6286; NONEON-NOSVE-NEXT:    sxtb w19, w18287; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]288; NONEON-NOSVE-NEXT:    sxtb w8, w4289; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #34]290; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #35]291; NONEON-NOSVE-NEXT:    add w3, w3, w3292; NONEON-NOSVE-NEXT:    add w2, w2, w2293; NONEON-NOSVE-NEXT:    add w16, w16, w16294; NONEON-NOSVE-NEXT:    strh w9, [sp, #110]295; NONEON-NOSVE-NEXT:    sxtb w9, w3296; NONEON-NOSVE-NEXT:    strh w8, [sp, #108]297; NONEON-NOSVE-NEXT:    sxtb w8, w2298; NONEON-NOSVE-NEXT:    sxtb w7, w16299; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]300; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #33]301; NONEON-NOSVE-NEXT:    add w0, w0, w0302; NONEON-NOSVE-NEXT:    add w18, w18, w18303; NONEON-NOSVE-NEXT:    strh w9, [sp, #106]304; NONEON-NOSVE-NEXT:    sxtb w9, w0305; NONEON-NOSVE-NEXT:    strh w8, [sp, #104]306; NONEON-NOSVE-NEXT:    sxtb w8, w18307; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]308; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]309; NONEON-NOSVE-NEXT:    add w17, w17, w17310; NONEON-NOSVE-NEXT:    add w16, w16, w16311; NONEON-NOSVE-NEXT:    strh w9, [sp, #102]312; NONEON-NOSVE-NEXT:    sxtb w9, w17313; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]314; NONEON-NOSVE-NEXT:    strh w8, [sp, #100]315; NONEON-NOSVE-NEXT:    sxtb w8, w16316; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]317; NONEON-NOSVE-NEXT:    add w15, w15, w15318; NONEON-NOSVE-NEXT:    add w14, w14, w14319; NONEON-NOSVE-NEXT:    strh w9, [sp, #98]320; NONEON-NOSVE-NEXT:    sxtb w9, w15321; NONEON-NOSVE-NEXT:    strh w8, [sp, #96]322; NONEON-NOSVE-NEXT:    sxtb w8, w14323; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]324; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]325; NONEON-NOSVE-NEXT:    add w13, w13, w13326; NONEON-NOSVE-NEXT:    add w12, w12, w12327; NONEON-NOSVE-NEXT:    strh w9, [sp, #94]328; NONEON-NOSVE-NEXT:    sxtb w9, w13329; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]330; NONEON-NOSVE-NEXT:    sxtb w8, w12331; NONEON-NOSVE-NEXT:    add w11, w11, w11332; NONEON-NOSVE-NEXT:    add w10, w10, w10333; NONEON-NOSVE-NEXT:    strh w9, [sp, #90]334; NONEON-NOSVE-NEXT:    sxtb w9, w11335; NONEON-NOSVE-NEXT:    ldr w11, [sp, #8] // 4-byte Reload336; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]337; NONEON-NOSVE-NEXT:    sxtb w8, w10338; NONEON-NOSVE-NEXT:    ldr w10, [sp, #12] // 4-byte Reload339; NONEON-NOSVE-NEXT:    strh w9, [sp, #86]340; NONEON-NOSVE-NEXT:    add w11, w11, w11341; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]342; NONEON-NOSVE-NEXT:    add w10, w10, w10343; NONEON-NOSVE-NEXT:    sxtb w9, w11344; NONEON-NOSVE-NEXT:    strh w7, [sp, #76]345; NONEON-NOSVE-NEXT:    sxtb w8, w10346; NONEON-NOSVE-NEXT:    strh w19, [sp, #74]347; NONEON-NOSVE-NEXT:    strh w9, [sp, #82]348; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #48]349; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]350; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #192] // 16-byte Folded Reload351; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #80]352; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #176] // 16-byte Folded Reload353; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]354; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #160] // 16-byte Folded Reload355; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #144] // 16-byte Folded Reload356; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]357; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #128] // 16-byte Folded Reload358; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #112] // 16-byte Folded Reload359; NONEON-NOSVE-NEXT:    add sp, sp, #208360; NONEON-NOSVE-NEXT:    ret361  %a = load <32 x i8>, ptr %in362  %b = add <32 x i8> %a, %a363  %c = sext <32 x i8> %b to <32 x i16>364  store <32 x i16> %c, ptr %out365  ret void366}367 368;369; sext i8 -> i32370;371 372define void @sext_v8i8_v8i32(<8 x i8> %a, ptr %out) {373; CHECK-LABEL: sext_v8i8_v8i32:374; CHECK:       // %bb.0:375; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0376; CHECK-NEXT:    sunpklo z0.h, z0.b377; CHECK-NEXT:    movprfx z1, z0378; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8379; CHECK-NEXT:    sunpklo z0.s, z0.h380; CHECK-NEXT:    sunpklo z1.s, z1.h381; CHECK-NEXT:    stp q0, q1, [x0]382; CHECK-NEXT:    ret383;384; NONEON-NOSVE-LABEL: sext_v8i8_v8i32:385; NONEON-NOSVE:       // %bb.0:386; NONEON-NOSVE-NEXT:    sub sp, sp, #48387; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48388; NONEON-NOSVE-NEXT:    str d0, [sp, #8]389; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]390; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #10]391; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]392; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]393; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #8]394; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]395; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]396; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #14]397; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]398; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]399; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #12]400; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]401; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]402; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]403; NONEON-NOSVE-NEXT:    add sp, sp, #48404; NONEON-NOSVE-NEXT:    ret405  %b = sext <8 x i8> %a to <8 x i32>406  store <8 x i32>%b, ptr %out407  ret void408}409 410define void @sext_v16i8_v16i32(<16 x i8> %a, ptr %out) {411; CHECK-LABEL: sext_v16i8_v16i32:412; CHECK:       // %bb.0:413; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0414; CHECK-NEXT:    movprfx z1, z0415; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8416; CHECK-NEXT:    sunpklo z0.h, z0.b417; CHECK-NEXT:    sunpklo z1.h, z1.b418; CHECK-NEXT:    movprfx z2, z0419; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8420; CHECK-NEXT:    sunpklo z0.s, z0.h421; CHECK-NEXT:    movprfx z3, z1422; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8423; CHECK-NEXT:    sunpklo z1.s, z1.h424; CHECK-NEXT:    sunpklo z2.s, z2.h425; CHECK-NEXT:    sunpklo z3.s, z3.h426; CHECK-NEXT:    stp q0, q2, [x0]427; CHECK-NEXT:    stp q1, q3, [x0, #32]428; CHECK-NEXT:    ret429;430; NONEON-NOSVE-LABEL: sext_v16i8_v16i32:431; NONEON-NOSVE:       // %bb.0:432; NONEON-NOSVE-NEXT:    str q0, [sp, #-96]!433; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96434; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]435; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]436; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #27]437; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]438; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]439; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #25]440; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]441; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]442; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #31]443; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]444; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]445; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #29]446; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]447; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]448; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #19]449; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]450; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]451; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]452; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #17]453; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]454; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]455; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #23]456; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]457; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]458; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #21]459; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]460; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]461; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]462; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]463; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]464; NONEON-NOSVE-NEXT:    add sp, sp, #96465; NONEON-NOSVE-NEXT:    ret466  %b = sext <16 x i8> %a to <16 x i32>467  store <16 x i32> %b, ptr %out468  ret void469}470 471define void @sext_v32i8_v32i32(ptr %in, ptr %out) {472; CHECK-LABEL: sext_v32i8_v32i32:473; CHECK:       // %bb.0:474; CHECK-NEXT:    ldp q1, q0, [x0]475; CHECK-NEXT:    add z0.b, z0.b, z0.b476; CHECK-NEXT:    add z1.b, z1.b, z1.b477; CHECK-NEXT:    movprfx z2, z0478; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8479; CHECK-NEXT:    sunpklo z0.h, z0.b480; CHECK-NEXT:    sunpklo z3.h, z1.b481; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8482; CHECK-NEXT:    sunpklo z2.h, z2.b483; CHECK-NEXT:    movprfx z4, z0484; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #8485; CHECK-NEXT:    sunpklo z1.h, z1.b486; CHECK-NEXT:    movprfx z5, z3487; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #8488; CHECK-NEXT:    sunpklo z0.s, z0.h489; CHECK-NEXT:    sunpklo z3.s, z3.h490; CHECK-NEXT:    sunpklo z4.s, z4.h491; CHECK-NEXT:    sunpklo z5.s, z5.h492; CHECK-NEXT:    movprfx z6, z2493; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #8494; CHECK-NEXT:    movprfx z7, z1495; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #8496; CHECK-NEXT:    sunpklo z2.s, z2.h497; CHECK-NEXT:    sunpklo z1.s, z1.h498; CHECK-NEXT:    stp q3, q5, [x1]499; CHECK-NEXT:    sunpklo z3.s, z7.h500; CHECK-NEXT:    stp q0, q4, [x1, #64]501; CHECK-NEXT:    sunpklo z0.s, z6.h502; CHECK-NEXT:    stp q1, q3, [x1, #32]503; CHECK-NEXT:    stp q2, q0, [x1, #96]504; CHECK-NEXT:    ret505;506; NONEON-NOSVE-LABEL: sext_v32i8_v32i32:507; NONEON-NOSVE:       // %bb.0:508; NONEON-NOSVE-NEXT:    sub sp, sp, #272509; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #176] // 16-byte Folded Spill510; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #192] // 16-byte Folded Spill511; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #208] // 16-byte Folded Spill512; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #224] // 16-byte Folded Spill513; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #240] // 16-byte Folded Spill514; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #256] // 16-byte Folded Spill515; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 272516; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8517; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16518; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24519; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32520; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40521; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48522; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56523; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64524; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72525; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80526; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88527; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96528; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]529; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]530; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #18]531; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #19]532; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]533; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #45]534; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #16]535; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #17]536; NONEON-NOSVE-NEXT:    add w16, w16, w16537; NONEON-NOSVE-NEXT:    add w17, w17, w17538; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #23]539; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill540; NONEON-NOSVE-NEXT:    sxtb w6, w17541; NONEON-NOSVE-NEXT:    sxtb w7, w16542; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]543; NONEON-NOSVE-NEXT:    add w5, w14, w14544; NONEON-NOSVE-NEXT:    add w18, w15, w15545; NONEON-NOSVE-NEXT:    sxtb w19, w18546; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #20]547; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #21]548; NONEON-NOSVE-NEXT:    stp w7, w6, [sp, #104]549; NONEON-NOSVE-NEXT:    add w6, w30, w30550; NONEON-NOSVE-NEXT:    sxtb w5, w5551; NONEON-NOSVE-NEXT:    add w8, w8, w8552; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #26]553; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #27]554; NONEON-NOSVE-NEXT:    sxtb w6, w6555; NONEON-NOSVE-NEXT:    sxtb w8, w8556; NONEON-NOSVE-NEXT:    stp w5, w19, [sp, #96]557; NONEON-NOSVE-NEXT:    add w9, w9, w9558; NONEON-NOSVE-NEXT:    add w5, w29, w29559; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #24]560; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #25]561; NONEON-NOSVE-NEXT:    sxtb w9, w9562; NONEON-NOSVE-NEXT:    stp w8, w6, [sp, #88]563; NONEON-NOSVE-NEXT:    add w6, w28, w28564; NONEON-NOSVE-NEXT:    sxtb w5, w5565; NONEON-NOSVE-NEXT:    add w8, w27, w27566; NONEON-NOSVE-NEXT:    sxtb w6, w6567; NONEON-NOSVE-NEXT:    sxtb w8, w8568; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #30]569; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #31]570; NONEON-NOSVE-NEXT:    stp w5, w9, [sp, #80]571; NONEON-NOSVE-NEXT:    add w9, w26, w26572; NONEON-NOSVE-NEXT:    add w5, w25, w25573; NONEON-NOSVE-NEXT:    stp w8, w6, [sp, #72]574; NONEON-NOSVE-NEXT:    sxtb w9, w9575; NONEON-NOSVE-NEXT:    sxtb w8, w5576; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #28]577; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #29]578; NONEON-NOSVE-NEXT:    add w6, w24, w24579; NONEON-NOSVE-NEXT:    add w5, w23, w23580; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #34]581; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]582; NONEON-NOSVE-NEXT:    sxtb w9, w6583; NONEON-NOSVE-NEXT:    sxtb w8, w5584; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #35]585; NONEON-NOSVE-NEXT:    add w6, w22, w22586; NONEON-NOSVE-NEXT:    add w5, w21, w21587; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]588; NONEON-NOSVE-NEXT:    sxtb w9, w6589; NONEON-NOSVE-NEXT:    sxtb w8, w5590; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #32]591; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #33]592; NONEON-NOSVE-NEXT:    add w6, w20, w20593; NONEON-NOSVE-NEXT:    add w4, w4, w4594; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]595; NONEON-NOSVE-NEXT:    sxtb w9, w6596; NONEON-NOSVE-NEXT:    sxtb w8, w4597; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #38]598; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #39]599; NONEON-NOSVE-NEXT:    add w3, w3, w3600; NONEON-NOSVE-NEXT:    add w2, w2, w2601; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #36]602; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #168]603; NONEON-NOSVE-NEXT:    sxtb w9, w3604; NONEON-NOSVE-NEXT:    sxtb w8, w2605; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #37]606; NONEON-NOSVE-NEXT:    add w0, w0, w0607; NONEON-NOSVE-NEXT:    add w18, w18, w18608; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]609; NONEON-NOSVE-NEXT:    sxtb w9, w0610; NONEON-NOSVE-NEXT:    sxtb w8, w18611; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #42]612; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #43]613; NONEON-NOSVE-NEXT:    add w17, w17, w17614; NONEON-NOSVE-NEXT:    add w16, w16, w16615; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]616; NONEON-NOSVE-NEXT:    sxtb w9, w17617; NONEON-NOSVE-NEXT:    sxtb w8, w16618; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #40]619; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #41]620; NONEON-NOSVE-NEXT:    add w15, w15, w15621; NONEON-NOSVE-NEXT:    add w14, w14, w14622; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #46]623; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]624; NONEON-NOSVE-NEXT:    sxtb w9, w15625; NONEON-NOSVE-NEXT:    sxtb w8, w14626; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #47]627; NONEON-NOSVE-NEXT:    add w13, w13, w13628; NONEON-NOSVE-NEXT:    add w12, w12, w12629; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]630; NONEON-NOSVE-NEXT:    sxtb w9, w13631; NONEON-NOSVE-NEXT:    sxtb w8, w12632; NONEON-NOSVE-NEXT:    add w11, w11, w11633; NONEON-NOSVE-NEXT:    add w10, w10, w10634; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]635; NONEON-NOSVE-NEXT:    sxtb w9, w11636; NONEON-NOSVE-NEXT:    ldr w11, [sp, #8] // 4-byte Reload637; NONEON-NOSVE-NEXT:    sxtb w8, w10638; NONEON-NOSVE-NEXT:    ldr w10, [sp, #12] // 4-byte Reload639; NONEON-NOSVE-NEXT:    add w11, w11, w11640; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #80]641; NONEON-NOSVE-NEXT:    add w10, w10, w10642; NONEON-NOSVE-NEXT:    sxtb w11, w11643; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]644; NONEON-NOSVE-NEXT:    sxtb w8, w10645; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #48]646; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #144]647; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #112]648; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #256] // 16-byte Folded Reload649; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #112]650; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]651; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #240] // 16-byte Folded Reload652; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]653; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #224] // 16-byte Folded Reload654; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]655; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #208] // 16-byte Folded Reload656; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]657; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #192] // 16-byte Folded Reload658; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #176] // 16-byte Folded Reload659; NONEON-NOSVE-NEXT:    add sp, sp, #272660; NONEON-NOSVE-NEXT:    ret661  %a = load <32 x i8>, ptr %in662  %b = add <32 x i8> %a, %a663  %c = sext <32 x i8> %b to <32 x i32>664  store <32 x i32> %c, ptr %out665  ret void666}667 668;669; sext i8 -> i64670;671 672; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The sign673; extend is a two step process where the container is any_extend'd with the674; result feeding an inreg sign extend.675define void @sext_v4i8_v4i64(<4 x i8> %a, ptr %out) {676; CHECK-LABEL: sext_v4i8_v4i64:677; CHECK:       // %bb.0:678; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0679; CHECK-NEXT:    ptrue p0.d, vl2680; CHECK-NEXT:    uunpklo z0.s, z0.h681; CHECK-NEXT:    movprfx z1, z0682; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8683; CHECK-NEXT:    uunpklo z0.d, z0.s684; CHECK-NEXT:    uunpklo z1.d, z1.s685; CHECK-NEXT:    sxtb z0.d, p0/m, z0.d686; CHECK-NEXT:    sxtb z1.d, p0/m, z1.d687; CHECK-NEXT:    stp q0, q1, [x0]688; CHECK-NEXT:    ret689;690; NONEON-NOSVE-LABEL: sext_v4i8_v4i64:691; NONEON-NOSVE:       // %bb.0:692; NONEON-NOSVE-NEXT:    ushll v0.4s, v0.4h, #0693; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!694; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64695; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]696; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]697; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #28]698; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #24]699; NONEON-NOSVE-NEXT:    ldrsb x10, [sp, #16]700; NONEON-NOSVE-NEXT:    ldrsb x11, [sp, #20]701; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #48]702; NONEON-NOSVE-NEXT:    stp x10, x11, [sp, #32]703; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]704; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]705; NONEON-NOSVE-NEXT:    add sp, sp, #64706; NONEON-NOSVE-NEXT:    ret707  %b = sext <4 x i8> %a to <4 x i64>708  store <4 x i64>%b, ptr %out709  ret void710}711 712define void @sext_v8i8_v8i64(<8 x i8> %a, ptr %out) {713; CHECK-LABEL: sext_v8i8_v8i64:714; CHECK:       // %bb.0:715; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0716; CHECK-NEXT:    sunpklo z0.h, z0.b717; CHECK-NEXT:    movprfx z1, z0718; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8719; CHECK-NEXT:    sunpklo z0.s, z0.h720; CHECK-NEXT:    sunpklo z1.s, z1.h721; CHECK-NEXT:    movprfx z2, z0722; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8723; CHECK-NEXT:    sunpklo z0.d, z0.s724; CHECK-NEXT:    movprfx z3, z1725; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8726; CHECK-NEXT:    sunpklo z2.d, z2.s727; CHECK-NEXT:    sunpklo z1.d, z1.s728; CHECK-NEXT:    sunpklo z3.d, z3.s729; CHECK-NEXT:    stp q0, q2, [x0]730; CHECK-NEXT:    stp q1, q3, [x0, #32]731; CHECK-NEXT:    ret732;733; NONEON-NOSVE-LABEL: sext_v8i8_v8i64:734; NONEON-NOSVE:       // %bb.0:735; NONEON-NOSVE-NEXT:    sub sp, sp, #80736; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80737; NONEON-NOSVE-NEXT:    str d0, [sp, #8]738; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #9]739; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #8]740; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]741; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #11]742; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #10]743; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]744; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #13]745; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #12]746; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #48]747; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]748; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #15]749; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #14]750; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #16]751; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]752; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]753; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]754; NONEON-NOSVE-NEXT:    add sp, sp, #80755; NONEON-NOSVE-NEXT:    ret756  %b = sext <8 x i8> %a to <8 x i64>757  store <8 x i64>%b, ptr %out758  ret void759}760 761define void @sext_v16i8_v16i64(<16 x i8> %a, ptr %out) {762; CHECK-LABEL: sext_v16i8_v16i64:763; CHECK:       // %bb.0:764; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0765; CHECK-NEXT:    movprfx z1, z0766; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #8767; CHECK-NEXT:    sunpklo z0.h, z0.b768; CHECK-NEXT:    sunpklo z1.h, z1.b769; CHECK-NEXT:    movprfx z2, z0770; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8771; CHECK-NEXT:    sunpklo z0.s, z0.h772; CHECK-NEXT:    sunpklo z3.s, z1.h773; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8774; CHECK-NEXT:    sunpklo z2.s, z2.h775; CHECK-NEXT:    movprfx z4, z0776; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #8777; CHECK-NEXT:    sunpklo z0.d, z0.s778; CHECK-NEXT:    sunpklo z1.s, z1.h779; CHECK-NEXT:    movprfx z5, z3780; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #8781; CHECK-NEXT:    sunpklo z3.d, z3.s782; CHECK-NEXT:    sunpklo z4.d, z4.s783; CHECK-NEXT:    movprfx z6, z2784; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #8785; CHECK-NEXT:    sunpklo z2.d, z2.s786; CHECK-NEXT:    sunpklo z5.d, z5.s787; CHECK-NEXT:    sunpklo z6.d, z6.s788; CHECK-NEXT:    stp q0, q4, [x0]789; CHECK-NEXT:    movprfx z0, z1790; CHECK-NEXT:    ext z0.b, z0.b, z1.b, #8791; CHECK-NEXT:    sunpklo z1.d, z1.s792; CHECK-NEXT:    stp q3, q5, [x0, #64]793; CHECK-NEXT:    sunpklo z0.d, z0.s794; CHECK-NEXT:    stp q2, q6, [x0, #32]795; CHECK-NEXT:    stp q1, q0, [x0, #96]796; CHECK-NEXT:    ret797;798; NONEON-NOSVE-LABEL: sext_v16i8_v16i64:799; NONEON-NOSVE:       // %bb.0:800; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!801; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160802; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]803; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]804; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #25]805; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #24]806; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #144]807; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #27]808; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #26]809; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #128]810; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #29]811; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #28]812; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #128]813; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #112]814; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #31]815; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #30]816; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #96]817; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #17]818; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #16]819; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #96]820; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #80]821; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #19]822; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #18]823; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]824; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #21]825; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #20]826; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #64]827; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]828; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #23]829; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #22]830; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]831; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #32]832; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]833; NONEON-NOSVE-NEXT:    stp q3, q4, [x0, #32]834; NONEON-NOSVE-NEXT:    stp q6, q7, [x0, #64]835; NONEON-NOSVE-NEXT:    stp q5, q2, [x0, #96]836; NONEON-NOSVE-NEXT:    add sp, sp, #160837; NONEON-NOSVE-NEXT:    ret838  %b = sext <16 x i8> %a to <16 x i64>839  store <16 x i64> %b, ptr %out840  ret void841}842 843define void @sext_v32i8_v32i64(ptr %in, ptr %out) {844; CHECK-LABEL: sext_v32i8_v32i64:845; CHECK:       // %bb.0:846; CHECK-NEXT:    ldp q1, q0, [x0]847; CHECK-NEXT:    add z0.b, z0.b, z0.b848; CHECK-NEXT:    add z1.b, z1.b, z1.b849; CHECK-NEXT:    movprfx z2, z0850; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8851; CHECK-NEXT:    sunpklo z0.h, z0.b852; CHECK-NEXT:    movprfx z3, z1853; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8854; CHECK-NEXT:    sunpklo z1.h, z1.b855; CHECK-NEXT:    sunpklo z3.h, z3.b856; CHECK-NEXT:    sunpklo z2.h, z2.b857; CHECK-NEXT:    movprfx z4, z0858; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #8859; CHECK-NEXT:    sunpklo z0.s, z0.h860; CHECK-NEXT:    sunpklo z5.s, z1.h861; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8862; CHECK-NEXT:    movprfx z7, z3863; CHECK-NEXT:    ext z7.b, z7.b, z3.b, #8864; CHECK-NEXT:    sunpklo z3.s, z3.h865; CHECK-NEXT:    sunpklo z4.s, z4.h866; CHECK-NEXT:    movprfx z16, z0867; CHECK-NEXT:    ext z16.b, z16.b, z0.b, #8868; CHECK-NEXT:    sunpklo z0.d, z0.s869; CHECK-NEXT:    sunpklo z1.s, z1.h870; CHECK-NEXT:    sunpklo z6.s, z2.h871; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8872; CHECK-NEXT:    movprfx z17, z5873; CHECK-NEXT:    ext z17.b, z17.b, z5.b, #8874; CHECK-NEXT:    sunpklo z7.s, z7.h875; CHECK-NEXT:    sunpklo z5.d, z5.s876; CHECK-NEXT:    sunpklo z16.d, z16.s877; CHECK-NEXT:    movprfx z20, z3878; CHECK-NEXT:    ext z20.b, z20.b, z3.b, #8879; CHECK-NEXT:    sunpklo z19.d, z4.s880; CHECK-NEXT:    sunpklo z2.s, z2.h881; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8882; CHECK-NEXT:    sunpklo z3.d, z3.s883; CHECK-NEXT:    sunpklo z17.d, z17.s884; CHECK-NEXT:    sunpklo z18.d, z6.s885; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8886; CHECK-NEXT:    str q5, [x1]887; CHECK-NEXT:    stp q0, q16, [x1, #128]888; CHECK-NEXT:    sunpklo z0.d, z1.s889; CHECK-NEXT:    sunpklo z16.d, z20.s890; CHECK-NEXT:    sunpklo z4.d, z4.s891; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8892; CHECK-NEXT:    sunpklo z6.d, z6.s893; CHECK-NEXT:    stp q17, q0, [x1, #16]894; CHECK-NEXT:    movprfx z0, z2895; CHECK-NEXT:    ext z0.b, z0.b, z2.b, #8896; CHECK-NEXT:    sunpklo z1.d, z1.s897; CHECK-NEXT:    stp q3, q16, [x1, #64]898; CHECK-NEXT:    movprfx z3, z7899; CHECK-NEXT:    ext z3.b, z3.b, z7.b, #8900; CHECK-NEXT:    sunpklo z2.d, z2.s901; CHECK-NEXT:    stp q19, q4, [x1, #160]902; CHECK-NEXT:    sunpklo z4.d, z7.s903; CHECK-NEXT:    sunpklo z0.d, z0.s904; CHECK-NEXT:    stp q18, q6, [x1, #192]905; CHECK-NEXT:    sunpklo z3.d, z3.s906; CHECK-NEXT:    str q1, [x1, #48]907; CHECK-NEXT:    stp q2, q0, [x1, #224]908; CHECK-NEXT:    stp q4, q3, [x1, #96]909; CHECK-NEXT:    ret910;911; NONEON-NOSVE-LABEL: sext_v32i8_v32i64:912; NONEON-NOSVE:       // %bb.0:913; NONEON-NOSVE-NEXT:    sub sp, sp, #400914; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #304] // 16-byte Folded Spill915; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #320] // 16-byte Folded Spill916; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #336] // 16-byte Folded Spill917; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #352] // 16-byte Folded Spill918; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #368] // 16-byte Folded Spill919; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #384] // 16-byte Folded Spill920; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 400921; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8922; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16923; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24924; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32925; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40926; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48927; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56928; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64929; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72930; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80931; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88932; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96933; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]934; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]935; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #16]936; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #17]937; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]938; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #47]939; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #18]940; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #19]941; NONEON-NOSVE-NEXT:    add w16, w16, w16942; NONEON-NOSVE-NEXT:    add w17, w17, w17943; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]944; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill945; NONEON-NOSVE-NEXT:    sxtb x19, w17946; NONEON-NOSVE-NEXT:    sxtb x20, w16947; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]948; NONEON-NOSVE-NEXT:    add w7, w14, w14949; NONEON-NOSVE-NEXT:    add w18, w15, w15950; NONEON-NOSVE-NEXT:    sxtb x21, w18951; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #22]952; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #23]953; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #160]954; NONEON-NOSVE-NEXT:    add w19, w30, w30955; NONEON-NOSVE-NEXT:    sxtb x7, w7956; NONEON-NOSVE-NEXT:    add w8, w8, w8957; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #24]958; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #25]959; NONEON-NOSVE-NEXT:    sxtb x19, w19960; NONEON-NOSVE-NEXT:    sxtb x8, w8961; NONEON-NOSVE-NEXT:    stp x7, x21, [sp, #144]962; NONEON-NOSVE-NEXT:    add w9, w9, w9963; NONEON-NOSVE-NEXT:    add w7, w29, w29964; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #26]965; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #27]966; NONEON-NOSVE-NEXT:    sxtb x9, w9967; NONEON-NOSVE-NEXT:    stp x8, x19, [sp, #128]968; NONEON-NOSVE-NEXT:    add w19, w28, w28969; NONEON-NOSVE-NEXT:    sxtb x7, w7970; NONEON-NOSVE-NEXT:    add w8, w27, w27971; NONEON-NOSVE-NEXT:    sxtb x19, w19972; NONEON-NOSVE-NEXT:    sxtb x8, w8973; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]974; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]975; NONEON-NOSVE-NEXT:    stp x7, x9, [sp, #112]976; NONEON-NOSVE-NEXT:    add w9, w26, w26977; NONEON-NOSVE-NEXT:    add w7, w25, w25978; NONEON-NOSVE-NEXT:    stp x8, x19, [sp, #96]979; NONEON-NOSVE-NEXT:    sxtb x9, w9980; NONEON-NOSVE-NEXT:    sxtb x8, w7981; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #30]982; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #31]983; NONEON-NOSVE-NEXT:    add w19, w24, w24984; NONEON-NOSVE-NEXT:    add w7, w23, w23985; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #32]986; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #80]987; NONEON-NOSVE-NEXT:    sxtb x9, w19988; NONEON-NOSVE-NEXT:    sxtb x8, w7989; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #33]990; NONEON-NOSVE-NEXT:    add w19, w22, w22991; NONEON-NOSVE-NEXT:    add w6, w6, w6992; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]993; NONEON-NOSVE-NEXT:    sxtb x9, w19994; NONEON-NOSVE-NEXT:    sxtb x8, w6995; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]996; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]997; NONEON-NOSVE-NEXT:    add w5, w5, w5998; NONEON-NOSVE-NEXT:    add w4, w4, w4999; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]1000; NONEON-NOSVE-NEXT:    sxtb x9, w51001; NONEON-NOSVE-NEXT:    sxtb x8, w41002; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #36]1003; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #37]1004; NONEON-NOSVE-NEXT:    add w3, w3, w31005; NONEON-NOSVE-NEXT:    add w2, w2, w21006; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #38]1007; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #288]1008; NONEON-NOSVE-NEXT:    sxtb x9, w31009; NONEON-NOSVE-NEXT:    sxtb x8, w21010; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #39]1011; NONEON-NOSVE-NEXT:    add w0, w0, w01012; NONEON-NOSVE-NEXT:    add w18, w18, w181013; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #272]1014; NONEON-NOSVE-NEXT:    sxtb x9, w01015; NONEON-NOSVE-NEXT:    sxtb x8, w181016; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #40]1017; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #41]1018; NONEON-NOSVE-NEXT:    add w17, w17, w171019; NONEON-NOSVE-NEXT:    add w16, w16, w161020; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #256]1021; NONEON-NOSVE-NEXT:    sxtb x9, w171022; NONEON-NOSVE-NEXT:    sxtb x8, w161023; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #42]1024; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #43]1025; NONEON-NOSVE-NEXT:    add w15, w15, w151026; NONEON-NOSVE-NEXT:    add w14, w14, w141027; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #44]1028; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #240]1029; NONEON-NOSVE-NEXT:    sxtb x9, w151030; NONEON-NOSVE-NEXT:    sxtb x8, w141031; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #45]1032; NONEON-NOSVE-NEXT:    add w13, w13, w131033; NONEON-NOSVE-NEXT:    add w12, w12, w121034; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #224]1035; NONEON-NOSVE-NEXT:    sxtb x9, w131036; NONEON-NOSVE-NEXT:    sxtb x8, w121037; NONEON-NOSVE-NEXT:    add w11, w11, w111038; NONEON-NOSVE-NEXT:    add w10, w10, w101039; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #208]1040; NONEON-NOSVE-NEXT:    sxtb x9, w111041; NONEON-NOSVE-NEXT:    ldr w11, [sp, #8] // 4-byte Reload1042; NONEON-NOSVE-NEXT:    sxtb x8, w101043; NONEON-NOSVE-NEXT:    ldr w10, [sp, #12] // 4-byte Reload1044; NONEON-NOSVE-NEXT:    add w11, w11, w111045; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #144]1046; NONEON-NOSVE-NEXT:    add w10, w10, w101047; NONEON-NOSVE-NEXT:    sxtb x11, w111048; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #192]1049; NONEON-NOSVE-NEXT:    sxtb x8, w101050; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #112]1051; NONEON-NOSVE-NEXT:    ldp q5, q4, [sp, #80]1052; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #176]1053; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #48]1054; NONEON-NOSVE-NEXT:    ldp q17, q16, [sp, #272]1055; NONEON-NOSVE-NEXT:    ldp q18, q21, [sp, #176]1056; NONEON-NOSVE-NEXT:    ldp q20, q19, [sp, #240]1057; NONEON-NOSVE-NEXT:    ldp q23, q22, [sp, #208]1058; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]1059; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #384] // 16-byte Folded Reload1060; NONEON-NOSVE-NEXT:    stp q2, q3, [x1, #32]1061; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #368] // 16-byte Folded Reload1062; NONEON-NOSVE-NEXT:    stp q4, q5, [x1, #64]1063; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #352] // 16-byte Folded Reload1064; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #96]1065; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #336] // 16-byte Folded Reload1066; NONEON-NOSVE-NEXT:    stp q16, q17, [x1, #128]1067; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #320] // 16-byte Folded Reload1068; NONEON-NOSVE-NEXT:    stp q19, q20, [x1, #160]1069; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #304] // 16-byte Folded Reload1070; NONEON-NOSVE-NEXT:    stp q22, q23, [x1, #192]1071; NONEON-NOSVE-NEXT:    stp q21, q18, [x1, #224]1072; NONEON-NOSVE-NEXT:    add sp, sp, #4001073; NONEON-NOSVE-NEXT:    ret1074  %a = load <32 x i8>, ptr %in1075  %b = add <32 x i8> %a, %a1076  %c = sext <32 x i8> %b to <32 x i64>1077  store <32 x i64> %c, ptr %out1078  ret void1079}1080 1081;1082; sext i16 -> i321083;1084 1085define void @sext_v8i16_v8i32(<8 x i16> %a, ptr %out) {1086; CHECK-LABEL: sext_v8i16_v8i32:1087; CHECK:       // %bb.0:1088; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01089; CHECK-NEXT:    movprfx z1, z01090; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81091; CHECK-NEXT:    sunpklo z0.s, z0.h1092; CHECK-NEXT:    sunpklo z1.s, z1.h1093; CHECK-NEXT:    stp q0, q1, [x0]1094; CHECK-NEXT:    ret1095;1096; NONEON-NOSVE-LABEL: sext_v8i16_v8i32:1097; NONEON-NOSVE:       // %bb.0:1098; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!1099; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 641100; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]1101; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]1102; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]1103; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]1104; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]1105; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]1106; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]1107; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]1108; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]1109; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]1110; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]1111; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]1112; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]1113; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]1114; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]1115; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]1116; NONEON-NOSVE-NEXT:    add sp, sp, #641117; NONEON-NOSVE-NEXT:    ret1118  %b = sext <8 x i16> %a to <8 x i32>1119  store <8 x i32>%b, ptr %out1120  ret void1121}1122 1123define void @sext_v16i16_v16i32(ptr %in, ptr %out) {1124; CHECK-LABEL: sext_v16i16_v16i32:1125; CHECK:       // %bb.0:1126; CHECK-NEXT:    ldp q1, q0, [x0]1127; CHECK-NEXT:    add z0.h, z0.h, z0.h1128; CHECK-NEXT:    add z1.h, z1.h, z1.h1129; CHECK-NEXT:    movprfx z2, z01130; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81131; CHECK-NEXT:    movprfx z3, z11132; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81133; CHECK-NEXT:    sunpklo z0.s, z0.h1134; CHECK-NEXT:    sunpklo z1.s, z1.h1135; CHECK-NEXT:    sunpklo z2.s, z2.h1136; CHECK-NEXT:    sunpklo z3.s, z3.h1137; CHECK-NEXT:    stp q1, q3, [x1]1138; CHECK-NEXT:    stp q0, q2, [x1, #32]1139; CHECK-NEXT:    ret1140;1141; NONEON-NOSVE-LABEL: sext_v16i16_v16i32:1142; NONEON-NOSVE:       // %bb.0:1143; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1144; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-96]!1145; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961146; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #4]1147; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #6]1148; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #2]1149; NONEON-NOSVE-NEXT:    ldrh w3, [sp]1150; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #12]1151; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #14]1152; NONEON-NOSVE-NEXT:    add w13, w13, w131153; NONEON-NOSVE-NEXT:    add w16, w16, w161154; NONEON-NOSVE-NEXT:    add w12, w12, w121155; NONEON-NOSVE-NEXT:    sxth w16, w161156; NONEON-NOSVE-NEXT:    sxth w13, w131157; NONEON-NOSVE-NEXT:    add w3, w3, w31158; NONEON-NOSVE-NEXT:    sxth w12, w121159; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #8]1160; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #10]1161; NONEON-NOSVE-NEXT:    stp w13, w16, [sp, #56]1162; NONEON-NOSVE-NEXT:    sxth w13, w31163; NONEON-NOSVE-NEXT:    add w16, w5, w51164; NONEON-NOSVE-NEXT:    add w3, w4, w41165; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #20]1166; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #22]1167; NONEON-NOSVE-NEXT:    stp w13, w12, [sp, #48]1168; NONEON-NOSVE-NEXT:    sxth w12, w161169; NONEON-NOSVE-NEXT:    sxth w13, w31170; NONEON-NOSVE-NEXT:    add w16, w2, w21171; NONEON-NOSVE-NEXT:    add w0, w0, w01172; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]1173; NONEON-NOSVE-NEXT:    stp w13, w12, [sp, #40]1174; NONEON-NOSVE-NEXT:    sxth w12, w161175; NONEON-NOSVE-NEXT:    sxth w13, w01176; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]1177; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]1178; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]1179; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #16]1180; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #18]1181; NONEON-NOSVE-NEXT:    add w16, w18, w181182; NONEON-NOSVE-NEXT:    add w17, w17, w171183; NONEON-NOSVE-NEXT:    stp w13, w12, [sp, #32]1184; NONEON-NOSVE-NEXT:    sxth w12, w161185; NONEON-NOSVE-NEXT:    sxth w13, w171186; NONEON-NOSVE-NEXT:    add w15, w15, w151187; NONEON-NOSVE-NEXT:    add w14, w14, w141188; NONEON-NOSVE-NEXT:    add w11, w11, w111189; NONEON-NOSVE-NEXT:    add w10, w10, w101190; NONEON-NOSVE-NEXT:    add w9, w9, w91191; NONEON-NOSVE-NEXT:    add w8, w8, w81192; NONEON-NOSVE-NEXT:    stp w13, w12, [sp, #88]1193; NONEON-NOSVE-NEXT:    sxth w12, w151194; NONEON-NOSVE-NEXT:    sxth w13, w141195; NONEON-NOSVE-NEXT:    sxth w11, w111196; NONEON-NOSVE-NEXT:    sxth w10, w101197; NONEON-NOSVE-NEXT:    sxth w9, w91198; NONEON-NOSVE-NEXT:    sxth w8, w81199; NONEON-NOSVE-NEXT:    stp w13, w12, [sp, #80]1200; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #32]1201; NONEON-NOSVE-NEXT:    stp w10, w11, [sp, #72]1202; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]1203; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1204; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]1205; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]1206; NONEON-NOSVE-NEXT:    add sp, sp, #961207; NONEON-NOSVE-NEXT:    ret1208  %a = load <16 x i16>, ptr %in1209  %b = add <16 x i16> %a, %a1210  %c = sext <16 x i16> %b to <16 x i32>1211  store <16 x i32> %c, ptr %out1212  ret void1213}1214 1215;1216; sext i16 -> i641217;1218 1219define void @sext_v4i16_v4i64(<4 x i16> %a, ptr %out) {1220; CHECK-LABEL: sext_v4i16_v4i64:1221; CHECK:       // %bb.0:1222; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01223; CHECK-NEXT:    sunpklo z0.s, z0.h1224; CHECK-NEXT:    movprfx z1, z01225; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81226; CHECK-NEXT:    sunpklo z0.d, z0.s1227; CHECK-NEXT:    sunpklo z1.d, z1.s1228; CHECK-NEXT:    stp q0, q1, [x0]1229; CHECK-NEXT:    ret1230;1231; NONEON-NOSVE-LABEL: sext_v4i16_v4i64:1232; NONEON-NOSVE:       // %bb.0:1233; NONEON-NOSVE-NEXT:    sub sp, sp, #481234; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481235; NONEON-NOSVE-NEXT:    str d0, [sp, #8]1236; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #10]1237; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #8]1238; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]1239; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #14]1240; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #12]1241; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #16]1242; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]1243; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]1244; NONEON-NOSVE-NEXT:    add sp, sp, #481245; NONEON-NOSVE-NEXT:    ret1246  %b = sext <4 x i16> %a to <4 x i64>1247  store <4 x i64>%b, ptr %out1248  ret void1249}1250 1251define void @sext_v8i16_v8i64(<8 x i16> %a, ptr %out) {1252; CHECK-LABEL: sext_v8i16_v8i64:1253; CHECK:       // %bb.0:1254; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01255; CHECK-NEXT:    movprfx z1, z01256; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81257; CHECK-NEXT:    sunpklo z0.s, z0.h1258; CHECK-NEXT:    sunpklo z1.s, z1.h1259; CHECK-NEXT:    movprfx z2, z01260; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81261; CHECK-NEXT:    sunpklo z0.d, z0.s1262; CHECK-NEXT:    movprfx z3, z11263; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81264; CHECK-NEXT:    sunpklo z1.d, z1.s1265; CHECK-NEXT:    sunpklo z2.d, z2.s1266; CHECK-NEXT:    sunpklo z3.d, z3.s1267; CHECK-NEXT:    stp q0, q2, [x0]1268; CHECK-NEXT:    stp q1, q3, [x0, #32]1269; CHECK-NEXT:    ret1270;1271; NONEON-NOSVE-LABEL: sext_v8i16_v8i64:1272; NONEON-NOSVE:       // %bb.0:1273; NONEON-NOSVE-NEXT:    str q0, [sp, #-96]!1274; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961275; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]1276; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]1277; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #26]1278; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #24]1279; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #80]1280; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #30]1281; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #28]1282; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]1283; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #18]1284; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #16]1285; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]1286; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]1287; NONEON-NOSVE-NEXT:    ldrsh x9, [sp, #22]1288; NONEON-NOSVE-NEXT:    ldrsh x8, [sp, #20]1289; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]1290; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]1291; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]1292; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]1293; NONEON-NOSVE-NEXT:    add sp, sp, #961294; NONEON-NOSVE-NEXT:    ret1295  %b = sext <8 x i16> %a to <8 x i64>1296  store <8 x i64>%b, ptr %out1297  ret void1298}1299 1300define void @sext_v16i16_v16i64(ptr %in, ptr %out) {1301; CHECK-LABEL: sext_v16i16_v16i64:1302; CHECK:       // %bb.0:1303; CHECK-NEXT:    ldp q1, q0, [x0]1304; CHECK-NEXT:    add z0.h, z0.h, z0.h1305; CHECK-NEXT:    add z1.h, z1.h, z1.h1306; CHECK-NEXT:    movprfx z2, z01307; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81308; CHECK-NEXT:    sunpklo z0.s, z0.h1309; CHECK-NEXT:    sunpklo z3.s, z1.h1310; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #81311; CHECK-NEXT:    sunpklo z2.s, z2.h1312; CHECK-NEXT:    movprfx z4, z01313; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #81314; CHECK-NEXT:    sunpklo z1.s, z1.h1315; CHECK-NEXT:    movprfx z5, z31316; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #81317; CHECK-NEXT:    sunpklo z0.d, z0.s1318; CHECK-NEXT:    sunpklo z3.d, z3.s1319; CHECK-NEXT:    sunpklo z4.d, z4.s1320; CHECK-NEXT:    sunpklo z5.d, z5.s1321; CHECK-NEXT:    movprfx z6, z21322; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #81323; CHECK-NEXT:    movprfx z7, z11324; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #81325; CHECK-NEXT:    sunpklo z2.d, z2.s1326; CHECK-NEXT:    sunpklo z1.d, z1.s1327; CHECK-NEXT:    stp q3, q5, [x1]1328; CHECK-NEXT:    sunpklo z3.d, z7.s1329; CHECK-NEXT:    stp q0, q4, [x1, #64]1330; CHECK-NEXT:    sunpklo z0.d, z6.s1331; CHECK-NEXT:    stp q1, q3, [x1, #32]1332; CHECK-NEXT:    stp q2, q0, [x1, #96]1333; CHECK-NEXT:    ret1334;1335; NONEON-NOSVE-LABEL: sext_v16i16_v16i64:1336; NONEON-NOSVE:       // %bb.0:1337; NONEON-NOSVE-NEXT:    sub sp, sp, #1601338; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1601339; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1340; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]1341; NONEON-NOSVE-NEXT:    ldrh w13, [sp]1342; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #2]1343; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #6]1344; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #4]1345; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #8]1346; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #10]1347; NONEON-NOSVE-NEXT:    add w13, w13, w131348; NONEON-NOSVE-NEXT:    add w16, w16, w161349; NONEON-NOSVE-NEXT:    add w12, w12, w121350; NONEON-NOSVE-NEXT:    sxth x16, w161351; NONEON-NOSVE-NEXT:    sxth x13, w131352; NONEON-NOSVE-NEXT:    add w3, w3, w31353; NONEON-NOSVE-NEXT:    sxth x12, w121354; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #12]1355; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #14]1356; NONEON-NOSVE-NEXT:    stp x13, x16, [sp, #80]1357; NONEON-NOSVE-NEXT:    sxth x13, w31358; NONEON-NOSVE-NEXT:    add w16, w5, w51359; NONEON-NOSVE-NEXT:    add w3, w4, w41360; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #16]1361; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #18]1362; NONEON-NOSVE-NEXT:    stp x13, x12, [sp, #64]1363; NONEON-NOSVE-NEXT:    sxth x12, w161364; NONEON-NOSVE-NEXT:    sxth x13, w31365; NONEON-NOSVE-NEXT:    add w16, w2, w21366; NONEON-NOSVE-NEXT:    add w0, w0, w01367; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]1368; NONEON-NOSVE-NEXT:    stp x13, x12, [sp, #48]1369; NONEON-NOSVE-NEXT:    sxth x12, w161370; NONEON-NOSVE-NEXT:    sxth x13, w01371; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]1372; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #24]1373; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #26]1374; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #20]1375; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #22]1376; NONEON-NOSVE-NEXT:    add w16, w18, w181377; NONEON-NOSVE-NEXT:    add w17, w17, w171378; NONEON-NOSVE-NEXT:    stp x13, x12, [sp, #32]1379; NONEON-NOSVE-NEXT:    sxth x12, w161380; NONEON-NOSVE-NEXT:    sxth x13, w171381; NONEON-NOSVE-NEXT:    add w15, w15, w151382; NONEON-NOSVE-NEXT:    add w14, w14, w141383; NONEON-NOSVE-NEXT:    add w11, w11, w111384; NONEON-NOSVE-NEXT:    add w10, w10, w101385; NONEON-NOSVE-NEXT:    add w9, w9, w91386; NONEON-NOSVE-NEXT:    add w8, w8, w81387; NONEON-NOSVE-NEXT:    stp x13, x12, [sp, #144]1388; NONEON-NOSVE-NEXT:    sxth x12, w151389; NONEON-NOSVE-NEXT:    sxth x13, w141390; NONEON-NOSVE-NEXT:    sxth x11, w111391; NONEON-NOSVE-NEXT:    sxth x10, w101392; NONEON-NOSVE-NEXT:    sxth x9, w91393; NONEON-NOSVE-NEXT:    sxth x8, w81394; NONEON-NOSVE-NEXT:    stp x13, x12, [sp, #128]1395; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]1396; NONEON-NOSVE-NEXT:    stp x10, x11, [sp, #112]1397; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #32]1398; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #96]1399; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #128]1400; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #96]1401; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]1402; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]1403; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]1404; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]1405; NONEON-NOSVE-NEXT:    add sp, sp, #1601406; NONEON-NOSVE-NEXT:    ret1407  %a = load <16 x i16>, ptr %in1408  %b = add <16 x i16> %a, %a1409  %c = sext <16 x i16> %b to <16 x i64>1410  store <16 x i64> %c, ptr %out1411  ret void1412}1413 1414;1415; sext i32 -> i641416;1417 1418define void @sext_v4i32_v4i64(<4 x i32> %a, ptr %out) {1419; CHECK-LABEL: sext_v4i32_v4i64:1420; CHECK:       // %bb.0:1421; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01422; CHECK-NEXT:    movprfx z1, z01423; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81424; CHECK-NEXT:    sunpklo z0.d, z0.s1425; CHECK-NEXT:    sunpklo z1.d, z1.s1426; CHECK-NEXT:    stp q0, q1, [x0]1427; CHECK-NEXT:    ret1428;1429; NONEON-NOSVE-LABEL: sext_v4i32_v4i64:1430; NONEON-NOSVE:       // %bb.0:1431; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!1432; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 641433; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]1434; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]1435; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #24]1436; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]1437; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #16]1438; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]1439; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]1440; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]1441; NONEON-NOSVE-NEXT:    add sp, sp, #641442; NONEON-NOSVE-NEXT:    ret1443  %b = sext <4 x i32> %a to <4 x i64>1444  store <4 x i64>%b, ptr %out1445  ret void1446}1447 1448define void @sext_v8i32_v8i64(ptr %in, ptr %out) {1449; CHECK-LABEL: sext_v8i32_v8i64:1450; CHECK:       // %bb.0:1451; CHECK-NEXT:    ldp q1, q0, [x0]1452; CHECK-NEXT:    add z0.s, z0.s, z0.s1453; CHECK-NEXT:    add z1.s, z1.s, z1.s1454; CHECK-NEXT:    movprfx z2, z01455; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81456; CHECK-NEXT:    movprfx z3, z11457; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81458; CHECK-NEXT:    sunpklo z0.d, z0.s1459; CHECK-NEXT:    sunpklo z1.d, z1.s1460; CHECK-NEXT:    sunpklo z2.d, z2.s1461; CHECK-NEXT:    sunpklo z3.d, z3.s1462; CHECK-NEXT:    stp q1, q3, [x1]1463; CHECK-NEXT:    stp q0, q2, [x1, #32]1464; CHECK-NEXT:    ret1465;1466; NONEON-NOSVE-LABEL: sext_v8i32_v8i64:1467; NONEON-NOSVE:       // %bb.0:1468; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1469; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-96]!1470; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961471; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp]1472; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #16]1473; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #24]1474; NONEON-NOSVE-NEXT:    add w8, w8, w81475; NONEON-NOSVE-NEXT:    add w9, w9, w91476; NONEON-NOSVE-NEXT:    sxtw x8, w81477; NONEON-NOSVE-NEXT:    sxtw x9, w91478; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #8]1479; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #48]1480; NONEON-NOSVE-NEXT:    add w8, w15, w151481; NONEON-NOSVE-NEXT:    add w9, w14, w141482; NONEON-NOSVE-NEXT:    sxtw x8, w81483; NONEON-NOSVE-NEXT:    sxtw x9, w91484; NONEON-NOSVE-NEXT:    add w11, w11, w111485; NONEON-NOSVE-NEXT:    add w13, w13, w131486; NONEON-NOSVE-NEXT:    add w12, w12, w121487; NONEON-NOSVE-NEXT:    add w10, w10, w101488; NONEON-NOSVE-NEXT:    sxtw x13, w131489; NONEON-NOSVE-NEXT:    sxtw x12, w121490; NONEON-NOSVE-NEXT:    sxtw x11, w111491; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #80]1492; NONEON-NOSVE-NEXT:    sxtw x8, w101493; NONEON-NOSVE-NEXT:    stp x12, x13, [sp, #32]1494; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]1495; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #32]1496; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1497; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]1498; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]1499; NONEON-NOSVE-NEXT:    add sp, sp, #961500; NONEON-NOSVE-NEXT:    ret1501  %a = load <8 x i32>, ptr %in1502  %b = add <8 x i32> %a, %a1503  %c = sext <8 x i32> %b to <8 x i64>1504  store <8 x i64> %c, ptr %out1505  ret void1506}1507 1508;1509; zext i8 -> i161510;1511 1512define void @zext_v16i8_v16i16(<16 x i8> %a, ptr %out) {1513; CHECK-LABEL: zext_v16i8_v16i16:1514; CHECK:       // %bb.0:1515; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01516; CHECK-NEXT:    movprfx z1, z01517; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81518; CHECK-NEXT:    uunpklo z0.h, z0.b1519; CHECK-NEXT:    uunpklo z1.h, z1.b1520; CHECK-NEXT:    stp q0, q1, [x0]1521; CHECK-NEXT:    ret1522;1523; NONEON-NOSVE-LABEL: zext_v16i8_v16i16:1524; NONEON-NOSVE:       // %bb.0:1525; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!1526; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 641527; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]1528; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]1529; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]1530; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]1531; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]1532; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]1533; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]1534; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]1535; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]1536; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]1537; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]1538; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]1539; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]1540; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]1541; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]1542; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]1543; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]1544; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]1545; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]1546; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]1547; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1548; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]1549; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]1550; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]1551; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]1552; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]1553; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]1554; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]1555; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]1556; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]1557; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]1558; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]1559; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]1560; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]1561; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]1562; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]1563; NONEON-NOSVE-NEXT:    add sp, sp, #641564; NONEON-NOSVE-NEXT:    ret1565  %b = zext <16 x i8> %a to <16 x i16>1566  store <16 x i16>%b, ptr %out1567  ret void1568}1569 1570; NOTE: Extra 'add' is to prevent the extend being combined with the load.1571define void @zext_v32i8_v32i16(ptr %in, ptr %out) {1572; CHECK-LABEL: zext_v32i8_v32i16:1573; CHECK:       // %bb.0:1574; CHECK-NEXT:    ldp q1, q0, [x0]1575; CHECK-NEXT:    add z0.b, z0.b, z0.b1576; CHECK-NEXT:    add z1.b, z1.b, z1.b1577; CHECK-NEXT:    movprfx z2, z01578; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81579; CHECK-NEXT:    movprfx z3, z11580; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81581; CHECK-NEXT:    uunpklo z0.h, z0.b1582; CHECK-NEXT:    uunpklo z1.h, z1.b1583; CHECK-NEXT:    uunpklo z2.h, z2.b1584; CHECK-NEXT:    uunpklo z3.h, z3.b1585; CHECK-NEXT:    stp q1, q3, [x1]1586; CHECK-NEXT:    stp q0, q2, [x1, #32]1587; CHECK-NEXT:    ret1588;1589; NONEON-NOSVE-LABEL: zext_v32i8_v32i16:1590; NONEON-NOSVE:       // %bb.0:1591; NONEON-NOSVE-NEXT:    sub sp, sp, #2081592; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #112] // 16-byte Folded Spill1593; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #128] // 16-byte Folded Spill1594; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #144] // 16-byte Folded Spill1595; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #160] // 16-byte Folded Spill1596; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #176] // 16-byte Folded Spill1597; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #192] // 16-byte Folded Spill1598; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 2081599; NONEON-NOSVE-NEXT:    .cfi_offset w19, -81600; NONEON-NOSVE-NEXT:    .cfi_offset w20, -161601; NONEON-NOSVE-NEXT:    .cfi_offset w21, -241602; NONEON-NOSVE-NEXT:    .cfi_offset w22, -321603; NONEON-NOSVE-NEXT:    .cfi_offset w23, -401604; NONEON-NOSVE-NEXT:    .cfi_offset w24, -481605; NONEON-NOSVE-NEXT:    .cfi_offset w25, -561606; NONEON-NOSVE-NEXT:    .cfi_offset w26, -641607; NONEON-NOSVE-NEXT:    .cfi_offset w27, -721608; NONEON-NOSVE-NEXT:    .cfi_offset w28, -801609; NONEON-NOSVE-NEXT:    .cfi_offset w30, -881610; NONEON-NOSVE-NEXT:    .cfi_offset w29, -961611; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1612; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]1613; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]1614; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]1615; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #21]1616; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #16]1617; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #17]1618; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #31]1619; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill1620; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]1621; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #18]1622; NONEON-NOSVE-NEXT:    add w5, w17, w171623; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #29]1624; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #30]1625; NONEON-NOSVE-NEXT:    add w8, w8, w81626; NONEON-NOSVE-NEXT:    and w5, w5, #0xff1627; NONEON-NOSVE-NEXT:    add w9, w9, w91628; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1629; NONEON-NOSVE-NEXT:    strh w5, [sp, #74]1630; NONEON-NOSVE-NEXT:    add w5, w29, w291631; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1632; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]1633; NONEON-NOSVE-NEXT:    add w8, w28, w281634; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #28]1635; NONEON-NOSVE-NEXT:    and w5, w5, #0xff1636; NONEON-NOSVE-NEXT:    strh w9, [sp, #68]1637; NONEON-NOSVE-NEXT:    add w9, w27, w271638; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1639; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #27]1640; NONEON-NOSVE-NEXT:    strh w5, [sp, #66]1641; NONEON-NOSVE-NEXT:    add w5, w26, w261642; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1643; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]1644; NONEON-NOSVE-NEXT:    add w8, w25, w251645; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #26]1646; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]1647; NONEON-NOSVE-NEXT:    and w9, w5, #0xff1648; NONEON-NOSVE-NEXT:    add w5, w24, w241649; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1650; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #25]1651; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]1652; NONEON-NOSVE-NEXT:    add w9, w23, w231653; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]1654; NONEON-NOSVE-NEXT:    and w8, w5, #0xff1655; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #24]1656; NONEON-NOSVE-NEXT:    add w5, w22, w221657; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]1658; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1659; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #39]1660; NONEON-NOSVE-NEXT:    add w9, w21, w211661; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]1662; NONEON-NOSVE-NEXT:    and w8, w5, #0xff1663; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #23]1664; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #38]1665; NONEON-NOSVE-NEXT:    add w5, w20, w201666; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]1667; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1668; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #22]1669; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #37]1670; NONEON-NOSVE-NEXT:    add w9, w19, w191671; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]1672; NONEON-NOSVE-NEXT:    and w8, w5, #0xff1673; NONEON-NOSVE-NEXT:    add w0, w16, w161674; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #36]1675; NONEON-NOSVE-NEXT:    add w4, w4, w41676; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]1677; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1678; NONEON-NOSVE-NEXT:    add w18, w15, w151679; NONEON-NOSVE-NEXT:    and w6, w0, #0xff1680; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #35]1681; NONEON-NOSVE-NEXT:    add w9, w3, w31682; NONEON-NOSVE-NEXT:    strh w8, [sp, #110]1683; NONEON-NOSVE-NEXT:    and w8, w4, #0xff1684; NONEON-NOSVE-NEXT:    and w7, w18, #0xff1685; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #34]1686; NONEON-NOSVE-NEXT:    add w2, w2, w21687; NONEON-NOSVE-NEXT:    strh w8, [sp, #108]1688; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1689; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #33]1690; NONEON-NOSVE-NEXT:    add w9, w0, w01691; NONEON-NOSVE-NEXT:    strh w8, [sp, #106]1692; NONEON-NOSVE-NEXT:    and w8, w2, #0xff1693; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]1694; NONEON-NOSVE-NEXT:    add w18, w18, w181695; NONEON-NOSVE-NEXT:    strh w8, [sp, #104]1696; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1697; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]1698; NONEON-NOSVE-NEXT:    add w9, w17, w171699; NONEON-NOSVE-NEXT:    strh w8, [sp, #102]1700; NONEON-NOSVE-NEXT:    and w8, w18, #0xff1701; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]1702; NONEON-NOSVE-NEXT:    add w16, w16, w161703; NONEON-NOSVE-NEXT:    strh w8, [sp, #100]1704; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1705; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]1706; NONEON-NOSVE-NEXT:    add w9, w15, w151707; NONEON-NOSVE-NEXT:    strh w8, [sp, #98]1708; NONEON-NOSVE-NEXT:    and w8, w16, #0xff1709; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]1710; NONEON-NOSVE-NEXT:    add w14, w14, w141711; NONEON-NOSVE-NEXT:    strh w8, [sp, #96]1712; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1713; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]1714; NONEON-NOSVE-NEXT:    add w9, w13, w131715; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]1716; NONEON-NOSVE-NEXT:    and w8, w14, #0xff1717; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]1718; NONEON-NOSVE-NEXT:    add w12, w12, w121719; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]1720; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1721; NONEON-NOSVE-NEXT:    add w9, w11, w111722; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]1723; NONEON-NOSVE-NEXT:    and w8, w12, #0xff1724; NONEON-NOSVE-NEXT:    add w10, w10, w101725; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]1726; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1727; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Reload1728; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #20]1729; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]1730; NONEON-NOSVE-NEXT:    and w8, w10, #0xff1731; NONEON-NOSVE-NEXT:    ldr w10, [sp, #12] // 4-byte Reload1732; NONEON-NOSVE-NEXT:    strh w6, [sp, #78]1733; NONEON-NOSVE-NEXT:    add w9, w9, w91734; NONEON-NOSVE-NEXT:    add w6, w30, w301735; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]1736; NONEON-NOSVE-NEXT:    add w10, w10, w101737; NONEON-NOSVE-NEXT:    and w8, w9, #0xff1738; NONEON-NOSVE-NEXT:    and w6, w6, #0xff1739; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]1740; NONEON-NOSVE-NEXT:    and w8, w10, #0xff1741; NONEON-NOSVE-NEXT:    strh w7, [sp, #76]1742; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #192] // 16-byte Folded Reload1743; NONEON-NOSVE-NEXT:    strh w6, [sp, #72]1744; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #176] // 16-byte Folded Reload1745; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]1746; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #48]1747; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #80]1748; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #160] // 16-byte Folded Reload1749; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #144] // 16-byte Folded Reload1750; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]1751; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #128] // 16-byte Folded Reload1752; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]1753; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #112] // 16-byte Folded Reload1754; NONEON-NOSVE-NEXT:    add sp, sp, #2081755; NONEON-NOSVE-NEXT:    ret1756  %a = load <32 x i8>, ptr %in1757  %b = add <32 x i8> %a, %a1758  %c = zext <32 x i8> %b to <32 x i16>1759  store <32 x i16> %c, ptr %out1760  ret void1761}1762 1763;1764; zext i8 -> i321765;1766 1767define void @zext_v8i8_v8i32(<8 x i8> %a, ptr %out) {1768; CHECK-LABEL: zext_v8i8_v8i32:1769; CHECK:       // %bb.0:1770; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01771; CHECK-NEXT:    uunpklo z0.h, z0.b1772; CHECK-NEXT:    movprfx z1, z01773; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81774; CHECK-NEXT:    uunpklo z0.s, z0.h1775; CHECK-NEXT:    uunpklo z1.s, z1.h1776; CHECK-NEXT:    stp q0, q1, [x0]1777; CHECK-NEXT:    ret1778;1779; NONEON-NOSVE-LABEL: zext_v8i8_v8i32:1780; NONEON-NOSVE:       // %bb.0:1781; NONEON-NOSVE-NEXT:    sub sp, sp, #481782; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481783; NONEON-NOSVE-NEXT:    str d0, [sp, #8]1784; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]1785; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]1786; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]1787; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]1788; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]1789; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]1790; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]1791; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]1792; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]1793; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]1794; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]1795; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]1796; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]1797; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]1798; NONEON-NOSVE-NEXT:    add sp, sp, #481799; NONEON-NOSVE-NEXT:    ret1800  %b = zext <8 x i8> %a to <8 x i32>1801  store <8 x i32>%b, ptr %out1802  ret void1803}1804 1805define void @zext_v16i8_v16i32(<16 x i8> %a, ptr %out) {1806; CHECK-LABEL: zext_v16i8_v16i32:1807; CHECK:       // %bb.0:1808; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01809; CHECK-NEXT:    movprfx z1, z01810; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #81811; CHECK-NEXT:    uunpklo z0.h, z0.b1812; CHECK-NEXT:    uunpklo z1.h, z1.b1813; CHECK-NEXT:    movprfx z2, z01814; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81815; CHECK-NEXT:    uunpklo z0.s, z0.h1816; CHECK-NEXT:    movprfx z3, z11817; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81818; CHECK-NEXT:    uunpklo z1.s, z1.h1819; CHECK-NEXT:    uunpklo z2.s, z2.h1820; CHECK-NEXT:    uunpklo z3.s, z3.h1821; CHECK-NEXT:    stp q0, q2, [x0]1822; CHECK-NEXT:    stp q1, q3, [x0, #32]1823; CHECK-NEXT:    ret1824;1825; NONEON-NOSVE-LABEL: zext_v16i8_v16i32:1826; NONEON-NOSVE:       // %bb.0:1827; NONEON-NOSVE-NEXT:    str q0, [sp, #-96]!1828; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961829; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]1830; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]1831; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #27]1832; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]1833; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]1834; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #25]1835; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]1836; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]1837; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #31]1838; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]1839; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]1840; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #29]1841; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]1842; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]1843; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]1844; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]1845; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]1846; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]1847; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #17]1848; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]1849; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]1850; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #23]1851; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1852; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]1853; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #21]1854; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]1855; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]1856; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]1857; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]1858; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]1859; NONEON-NOSVE-NEXT:    add sp, sp, #961860; NONEON-NOSVE-NEXT:    ret1861  %b = zext <16 x i8> %a to <16 x i32>1862  store <16 x i32> %b, ptr %out1863  ret void1864}1865 1866define void @zext_v32i8_v32i32(ptr %in, ptr %out) {1867; CHECK-LABEL: zext_v32i8_v32i32:1868; CHECK:       // %bb.0:1869; CHECK-NEXT:    ldp q1, q0, [x0]1870; CHECK-NEXT:    add z0.b, z0.b, z0.b1871; CHECK-NEXT:    add z1.b, z1.b, z1.b1872; CHECK-NEXT:    movprfx z2, z01873; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #81874; CHECK-NEXT:    uunpklo z0.h, z0.b1875; CHECK-NEXT:    uunpklo z3.h, z1.b1876; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #81877; CHECK-NEXT:    uunpklo z2.h, z2.b1878; CHECK-NEXT:    movprfx z4, z01879; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #81880; CHECK-NEXT:    uunpklo z1.h, z1.b1881; CHECK-NEXT:    movprfx z5, z31882; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #81883; CHECK-NEXT:    uunpklo z0.s, z0.h1884; CHECK-NEXT:    uunpklo z3.s, z3.h1885; CHECK-NEXT:    uunpklo z4.s, z4.h1886; CHECK-NEXT:    uunpklo z5.s, z5.h1887; CHECK-NEXT:    movprfx z6, z21888; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #81889; CHECK-NEXT:    movprfx z7, z11890; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #81891; CHECK-NEXT:    uunpklo z2.s, z2.h1892; CHECK-NEXT:    uunpklo z1.s, z1.h1893; CHECK-NEXT:    stp q3, q5, [x1]1894; CHECK-NEXT:    uunpklo z3.s, z7.h1895; CHECK-NEXT:    stp q0, q4, [x1, #64]1896; CHECK-NEXT:    uunpklo z0.s, z6.h1897; CHECK-NEXT:    stp q1, q3, [x1, #32]1898; CHECK-NEXT:    stp q2, q0, [x1, #96]1899; CHECK-NEXT:    ret1900;1901; NONEON-NOSVE-LABEL: zext_v32i8_v32i32:1902; NONEON-NOSVE:       // %bb.0:1903; NONEON-NOSVE-NEXT:    sub sp, sp, #2721904; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #176] // 16-byte Folded Spill1905; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #192] // 16-byte Folded Spill1906; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #208] // 16-byte Folded Spill1907; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #224] // 16-byte Folded Spill1908; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #240] // 16-byte Folded Spill1909; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #256] // 16-byte Folded Spill1910; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 2721911; NONEON-NOSVE-NEXT:    .cfi_offset w19, -81912; NONEON-NOSVE-NEXT:    .cfi_offset w20, -161913; NONEON-NOSVE-NEXT:    .cfi_offset w21, -241914; NONEON-NOSVE-NEXT:    .cfi_offset w22, -321915; NONEON-NOSVE-NEXT:    .cfi_offset w23, -401916; NONEON-NOSVE-NEXT:    .cfi_offset w24, -481917; NONEON-NOSVE-NEXT:    .cfi_offset w25, -561918; NONEON-NOSVE-NEXT:    .cfi_offset w26, -641919; NONEON-NOSVE-NEXT:    .cfi_offset w27, -721920; NONEON-NOSVE-NEXT:    .cfi_offset w28, -801921; NONEON-NOSVE-NEXT:    .cfi_offset w30, -881922; NONEON-NOSVE-NEXT:    .cfi_offset w29, -961923; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]1924; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]1925; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]1926; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #45]1927; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #18]1928; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #19]1929; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #17]1930; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #16]1931; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill1932; NONEON-NOSVE-NEXT:    add w18, w15, w151933; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #22]1934; NONEON-NOSVE-NEXT:    add w0, w16, w161935; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]1936; NONEON-NOSVE-NEXT:    and w19, w18, #0xff1937; NONEON-NOSVE-NEXT:    and w7, w0, #0xff1938; NONEON-NOSVE-NEXT:    add w6, w17, w171939; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #20]1940; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #21]1941; NONEON-NOSVE-NEXT:    stp w19, w7, [sp, #104]1942; NONEON-NOSVE-NEXT:    add w7, w30, w301943; NONEON-NOSVE-NEXT:    add w8, w8, w81944; NONEON-NOSVE-NEXT:    add w9, w9, w91945; NONEON-NOSVE-NEXT:    and w6, w6, #0xff1946; NONEON-NOSVE-NEXT:    and w7, w7, #0xff1947; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1948; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1949; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #26]1950; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #27]1951; NONEON-NOSVE-NEXT:    stp w7, w6, [sp, #96]1952; NONEON-NOSVE-NEXT:    add w6, w29, w291953; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #88]1954; NONEON-NOSVE-NEXT:    add w8, w28, w281955; NONEON-NOSVE-NEXT:    and w6, w6, #0xff1956; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1957; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #24]1958; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #25]1959; NONEON-NOSVE-NEXT:    add w9, w27, w271960; NONEON-NOSVE-NEXT:    stp w8, w6, [sp, #80]1961; NONEON-NOSVE-NEXT:    add w6, w26, w261962; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1963; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #30]1964; NONEON-NOSVE-NEXT:    and w6, w6, #0xff1965; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #31]1966; NONEON-NOSVE-NEXT:    add w8, w25, w251967; NONEON-NOSVE-NEXT:    stp w6, w9, [sp, #72]1968; NONEON-NOSVE-NEXT:    add w9, w24, w241969; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1970; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1971; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #28]1972; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #29]1973; NONEON-NOSVE-NEXT:    add w6, w23, w231974; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #64]1975; NONEON-NOSVE-NEXT:    add w8, w22, w221976; NONEON-NOSVE-NEXT:    and w9, w6, #0xff1977; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1978; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #34]1979; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #35]1980; NONEON-NOSVE-NEXT:    add w6, w21, w211981; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]1982; NONEON-NOSVE-NEXT:    add w9, w20, w201983; NONEON-NOSVE-NEXT:    and w8, w6, #0xff1984; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #32]1985; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1986; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #33]1987; NONEON-NOSVE-NEXT:    add w5, w5, w51988; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #48]1989; NONEON-NOSVE-NEXT:    add w8, w4, w41990; NONEON-NOSVE-NEXT:    and w9, w5, #0xff1991; NONEON-NOSVE-NEXT:    and w8, w8, #0xff1992; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #38]1993; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #39]1994; NONEON-NOSVE-NEXT:    add w3, w3, w31995; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #168]1996; NONEON-NOSVE-NEXT:    add w9, w2, w21997; NONEON-NOSVE-NEXT:    and w8, w3, #0xff1998; NONEON-NOSVE-NEXT:    and w9, w9, #0xff1999; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #36]2000; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #37]2001; NONEON-NOSVE-NEXT:    add w0, w0, w02002; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #160]2003; NONEON-NOSVE-NEXT:    add w8, w18, w182004; NONEON-NOSVE-NEXT:    and w9, w0, #0xff2005; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #42]2006; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2007; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #43]2008; NONEON-NOSVE-NEXT:    add w17, w17, w172009; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]2010; NONEON-NOSVE-NEXT:    add w9, w16, w162011; NONEON-NOSVE-NEXT:    and w8, w17, #0xff2012; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2013; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #40]2014; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #41]2015; NONEON-NOSVE-NEXT:    add w15, w15, w152016; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #144]2017; NONEON-NOSVE-NEXT:    add w8, w14, w142018; NONEON-NOSVE-NEXT:    and w9, w15, #0xff2019; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2020; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #46]2021; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #47]2022; NONEON-NOSVE-NEXT:    add w13, w13, w132023; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]2024; NONEON-NOSVE-NEXT:    add w9, w12, w122025; NONEON-NOSVE-NEXT:    and w8, w13, #0xff2026; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2027; NONEON-NOSVE-NEXT:    add w11, w11, w112028; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #128]2029; NONEON-NOSVE-NEXT:    add w8, w10, w102030; NONEON-NOSVE-NEXT:    and w9, w11, #0xff2031; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2032; NONEON-NOSVE-NEXT:    ldr w10, [sp, #8] // 4-byte Reload2033; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]2034; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload2035; NONEON-NOSVE-NEXT:    add w10, w10, w102036; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #80]2037; NONEON-NOSVE-NEXT:    add w9, w9, w92038; NONEON-NOSVE-NEXT:    and w8, w10, #0xff2039; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2040; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #48]2041; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #112]2042; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #144]2043; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #112]2044; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]2045; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #256] // 16-byte Folded Reload2046; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]2047; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #240] // 16-byte Folded Reload2048; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]2049; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #224] // 16-byte Folded Reload2050; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]2051; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #208] // 16-byte Folded Reload2052; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #192] // 16-byte Folded Reload2053; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #176] // 16-byte Folded Reload2054; NONEON-NOSVE-NEXT:    add sp, sp, #2722055; NONEON-NOSVE-NEXT:    ret2056  %a = load <32 x i8>, ptr %in2057  %b = add <32 x i8> %a, %a2058  %c = zext <32 x i8> %b to <32 x i32>2059  store <32 x i32> %c, ptr %out2060  ret void2061}2062 2063;2064; zext i8 -> i642065;2066 2067; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The zero2068; extend is a two step process where the container is zero_extend_inreg'd with2069; the result feeding a normal zero extend from halfs to doublewords.2070define void @zext_v4i8_v4i64(<4 x i8> %a, ptr %out) {2071; CHECK-LABEL: zext_v4i8_v4i64:2072; CHECK:       // %bb.0:2073; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z02074; CHECK-NEXT:    and z0.h, z0.h, #0xff2075; CHECK-NEXT:    uunpklo z0.s, z0.h2076; CHECK-NEXT:    movprfx z1, z02077; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82078; CHECK-NEXT:    uunpklo z0.d, z0.s2079; CHECK-NEXT:    uunpklo z1.d, z1.s2080; CHECK-NEXT:    stp q0, q1, [x0]2081; CHECK-NEXT:    ret2082;2083; NONEON-NOSVE-LABEL: zext_v4i8_v4i64:2084; NONEON-NOSVE:       // %bb.0:2085; NONEON-NOSVE-NEXT:    sub sp, sp, #482086; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 482087; NONEON-NOSVE-NEXT:    str d0, [sp, #8]2088; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]2089; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #40]2090; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]2091; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2092; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]2093; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #24]2094; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]2095; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #16]2096; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]2097; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]2098; NONEON-NOSVE-NEXT:    add sp, sp, #482099; NONEON-NOSVE-NEXT:    ret2100  %b = zext <4 x i8> %a to <4 x i64>2101  store <4 x i64>%b, ptr %out2102  ret void2103}2104 2105define void @zext_v8i8_v8i64(<8 x i8> %a, ptr %out) {2106; CHECK-LABEL: zext_v8i8_v8i64:2107; CHECK:       // %bb.0:2108; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z02109; CHECK-NEXT:    uunpklo z0.h, z0.b2110; CHECK-NEXT:    movprfx z1, z02111; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82112; CHECK-NEXT:    uunpklo z0.s, z0.h2113; CHECK-NEXT:    uunpklo z1.s, z1.h2114; CHECK-NEXT:    movprfx z2, z02115; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82116; CHECK-NEXT:    uunpklo z0.d, z0.s2117; CHECK-NEXT:    movprfx z3, z12118; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #82119; CHECK-NEXT:    uunpklo z2.d, z2.s2120; CHECK-NEXT:    uunpklo z1.d, z1.s2121; CHECK-NEXT:    uunpklo z3.d, z3.s2122; CHECK-NEXT:    stp q0, q2, [x0]2123; CHECK-NEXT:    stp q1, q3, [x0, #32]2124; CHECK-NEXT:    ret2125;2126; NONEON-NOSVE-LABEL: zext_v8i8_v8i64:2127; NONEON-NOSVE:       // %bb.0:2128; NONEON-NOSVE-NEXT:    sub sp, sp, #802129; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 802130; NONEON-NOSVE-NEXT:    str d0, [sp, #8]2131; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]2132; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #72]2133; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]2134; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]2135; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]2136; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #56]2137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]2138; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]2139; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]2140; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #48]2141; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #40]2142; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]2143; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2144; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]2145; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #24]2146; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]2147; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #16]2148; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]2149; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]2150; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]2151; NONEON-NOSVE-NEXT:    add sp, sp, #802152; NONEON-NOSVE-NEXT:    ret2153  %b = zext <8 x i8> %a to <8 x i64>2154  store <8 x i64>%b, ptr %out2155  ret void2156}2157 2158define void @zext_v16i8_v16i64(<16 x i8> %a, ptr %out) {2159; CHECK-LABEL: zext_v16i8_v16i64:2160; CHECK:       // %bb.0:2161; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z02162; CHECK-NEXT:    movprfx z1, z02163; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82164; CHECK-NEXT:    uunpklo z0.h, z0.b2165; CHECK-NEXT:    uunpklo z1.h, z1.b2166; CHECK-NEXT:    movprfx z2, z02167; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82168; CHECK-NEXT:    uunpklo z0.s, z0.h2169; CHECK-NEXT:    uunpklo z3.s, z1.h2170; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #82171; CHECK-NEXT:    uunpklo z2.s, z2.h2172; CHECK-NEXT:    movprfx z4, z02173; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #82174; CHECK-NEXT:    uunpklo z0.d, z0.s2175; CHECK-NEXT:    uunpklo z1.s, z1.h2176; CHECK-NEXT:    movprfx z5, z32177; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #82178; CHECK-NEXT:    uunpklo z3.d, z3.s2179; CHECK-NEXT:    uunpklo z4.d, z4.s2180; CHECK-NEXT:    movprfx z6, z22181; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #82182; CHECK-NEXT:    uunpklo z2.d, z2.s2183; CHECK-NEXT:    uunpklo z5.d, z5.s2184; CHECK-NEXT:    uunpklo z6.d, z6.s2185; CHECK-NEXT:    stp q0, q4, [x0]2186; CHECK-NEXT:    movprfx z0, z12187; CHECK-NEXT:    ext z0.b, z0.b, z1.b, #82188; CHECK-NEXT:    uunpklo z1.d, z1.s2189; CHECK-NEXT:    stp q3, q5, [x0, #64]2190; CHECK-NEXT:    uunpklo z0.d, z0.s2191; CHECK-NEXT:    stp q2, q6, [x0, #32]2192; CHECK-NEXT:    stp q1, q0, [x0, #96]2193; CHECK-NEXT:    ret2194;2195; NONEON-NOSVE-LABEL: zext_v16i8_v16i64:2196; NONEON-NOSVE:       // %bb.0:2197; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!2198; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1602199; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]2200; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]2201; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]2202; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #152]2203; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]2204; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #144]2205; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]2206; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #136]2207; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]2208; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #128]2209; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]2210; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #128]2211; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #120]2212; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]2213; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #112]2214; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]2215; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #104]2216; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]2217; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #96]2218; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]2219; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #96]2220; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #88]2221; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]2222; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #80]2223; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]2224; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #72]2225; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]2226; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]2227; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]2228; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #64]2229; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #56]2230; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]2231; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]2232; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]2233; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #40]2234; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]2235; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2236; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #32]2237; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]2238; NONEON-NOSVE-NEXT:    stp q3, q4, [x0, #32]2239; NONEON-NOSVE-NEXT:    stp q6, q7, [x0, #64]2240; NONEON-NOSVE-NEXT:    stp q5, q2, [x0, #96]2241; NONEON-NOSVE-NEXT:    add sp, sp, #1602242; NONEON-NOSVE-NEXT:    ret2243  %b = zext <16 x i8> %a to <16 x i64>2244  store <16 x i64> %b, ptr %out2245  ret void2246}2247 2248define void @zext_v32i8_v32i64(ptr %in, ptr %out) {2249; CHECK-LABEL: zext_v32i8_v32i64:2250; CHECK:       // %bb.0:2251; CHECK-NEXT:    ldp q1, q0, [x0]2252; CHECK-NEXT:    add z0.b, z0.b, z0.b2253; CHECK-NEXT:    add z1.b, z1.b, z1.b2254; CHECK-NEXT:    movprfx z2, z02255; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82256; CHECK-NEXT:    uunpklo z0.h, z0.b2257; CHECK-NEXT:    movprfx z3, z12258; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #82259; CHECK-NEXT:    uunpklo z1.h, z1.b2260; CHECK-NEXT:    uunpklo z3.h, z3.b2261; CHECK-NEXT:    uunpklo z2.h, z2.b2262; CHECK-NEXT:    movprfx z4, z02263; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #82264; CHECK-NEXT:    uunpklo z0.s, z0.h2265; CHECK-NEXT:    uunpklo z5.s, z1.h2266; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #82267; CHECK-NEXT:    movprfx z7, z32268; CHECK-NEXT:    ext z7.b, z7.b, z3.b, #82269; CHECK-NEXT:    uunpklo z3.s, z3.h2270; CHECK-NEXT:    uunpklo z4.s, z4.h2271; CHECK-NEXT:    movprfx z16, z02272; CHECK-NEXT:    ext z16.b, z16.b, z0.b, #82273; CHECK-NEXT:    uunpklo z0.d, z0.s2274; CHECK-NEXT:    uunpklo z1.s, z1.h2275; CHECK-NEXT:    uunpklo z6.s, z2.h2276; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #82277; CHECK-NEXT:    movprfx z17, z52278; CHECK-NEXT:    ext z17.b, z17.b, z5.b, #82279; CHECK-NEXT:    uunpklo z7.s, z7.h2280; CHECK-NEXT:    uunpklo z5.d, z5.s2281; CHECK-NEXT:    uunpklo z16.d, z16.s2282; CHECK-NEXT:    movprfx z20, z32283; CHECK-NEXT:    ext z20.b, z20.b, z3.b, #82284; CHECK-NEXT:    uunpklo z19.d, z4.s2285; CHECK-NEXT:    uunpklo z2.s, z2.h2286; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #82287; CHECK-NEXT:    uunpklo z3.d, z3.s2288; CHECK-NEXT:    uunpklo z17.d, z17.s2289; CHECK-NEXT:    uunpklo z18.d, z6.s2290; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #82291; CHECK-NEXT:    str q5, [x1]2292; CHECK-NEXT:    stp q0, q16, [x1, #128]2293; CHECK-NEXT:    uunpklo z0.d, z1.s2294; CHECK-NEXT:    uunpklo z16.d, z20.s2295; CHECK-NEXT:    uunpklo z4.d, z4.s2296; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #82297; CHECK-NEXT:    uunpklo z6.d, z6.s2298; CHECK-NEXT:    stp q17, q0, [x1, #16]2299; CHECK-NEXT:    movprfx z0, z22300; CHECK-NEXT:    ext z0.b, z0.b, z2.b, #82301; CHECK-NEXT:    uunpklo z1.d, z1.s2302; CHECK-NEXT:    stp q3, q16, [x1, #64]2303; CHECK-NEXT:    movprfx z3, z72304; CHECK-NEXT:    ext z3.b, z3.b, z7.b, #82305; CHECK-NEXT:    uunpklo z2.d, z2.s2306; CHECK-NEXT:    stp q19, q4, [x1, #160]2307; CHECK-NEXT:    uunpklo z4.d, z7.s2308; CHECK-NEXT:    uunpklo z0.d, z0.s2309; CHECK-NEXT:    stp q18, q6, [x1, #192]2310; CHECK-NEXT:    uunpklo z3.d, z3.s2311; CHECK-NEXT:    str q1, [x1, #48]2312; CHECK-NEXT:    stp q2, q0, [x1, #224]2313; CHECK-NEXT:    stp q4, q3, [x1, #96]2314; CHECK-NEXT:    ret2315;2316; NONEON-NOSVE-LABEL: zext_v32i8_v32i64:2317; NONEON-NOSVE:       // %bb.0:2318; NONEON-NOSVE-NEXT:    sub sp, sp, #4002319; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #304] // 16-byte Folded Spill2320; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #320] // 16-byte Folded Spill2321; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #336] // 16-byte Folded Spill2322; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #352] // 16-byte Folded Spill2323; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #368] // 16-byte Folded Spill2324; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #384] // 16-byte Folded Spill2325; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 4002326; NONEON-NOSVE-NEXT:    .cfi_offset w19, -82327; NONEON-NOSVE-NEXT:    .cfi_offset w20, -162328; NONEON-NOSVE-NEXT:    .cfi_offset w21, -242329; NONEON-NOSVE-NEXT:    .cfi_offset w22, -322330; NONEON-NOSVE-NEXT:    .cfi_offset w23, -402331; NONEON-NOSVE-NEXT:    .cfi_offset w24, -482332; NONEON-NOSVE-NEXT:    .cfi_offset w25, -562333; NONEON-NOSVE-NEXT:    .cfi_offset w26, -642334; NONEON-NOSVE-NEXT:    .cfi_offset w27, -722335; NONEON-NOSVE-NEXT:    .cfi_offset w28, -802336; NONEON-NOSVE-NEXT:    .cfi_offset w30, -882337; NONEON-NOSVE-NEXT:    .cfi_offset w29, -962338; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2339; NONEON-NOSVE-NEXT:    str wzr, [sp, #172]2340; NONEON-NOSVE-NEXT:    str wzr, [sp, #292]2341; NONEON-NOSVE-NEXT:    str wzr, [sp, #300]2342; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]2343; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]2344; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #47]2345; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]2346; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #20]2347; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #22]2348; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #23]2349; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill2350; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]2351; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]2352; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #25]2353; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #24]2354; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #26]2355; NONEON-NOSVE-NEXT:    add w8, w8, w82356; NONEON-NOSVE-NEXT:    add w9, w9, w92357; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #27]2358; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2359; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2360; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #29]2361; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #140]2362; NONEON-NOSVE-NEXT:    add w8, w30, w302363; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #28]2364; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #148]2365; NONEON-NOSVE-NEXT:    add w9, w29, w292366; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2367; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2368; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #132]2369; NONEON-NOSVE-NEXT:    add w8, w27, w272370; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #124]2371; NONEON-NOSVE-NEXT:    add w9, w28, w282372; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2373; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2374; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #108]2375; NONEON-NOSVE-NEXT:    add w8, w26, w262376; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #116]2377; NONEON-NOSVE-NEXT:    add w9, w25, w252378; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2379; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2380; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #100]2381; NONEON-NOSVE-NEXT:    add w8, w24, w242382; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #92]2383; NONEON-NOSVE-NEXT:    add w9, w21, w212384; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2385; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #30]2386; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2387; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #76]2388; NONEON-NOSVE-NEXT:    add w8, w19, w192389; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #31]2390; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #84]2391; NONEON-NOSVE-NEXT:    add w9, w20, w202392; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2393; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #33]2394; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2395; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #68]2396; NONEON-NOSVE-NEXT:    add w8, w7, w72397; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #32]2398; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #60]2399; NONEON-NOSVE-NEXT:    add w9, w6, w62400; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2401; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #16]2402; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #17]2403; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #34]2404; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2405; NONEON-NOSVE-NEXT:    str w8, [sp, #48]2406; NONEON-NOSVE-NEXT:    add w8, w4, w42407; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #35]2408; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #52]2409; NONEON-NOSVE-NEXT:    add w9, w5, w52410; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2411; NONEON-NOSVE-NEXT:    add w0, w16, w162412; NONEON-NOSVE-NEXT:    add w22, w18, w182413; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #37]2414; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2415; NONEON-NOSVE-NEXT:    str w8, [sp, #296]2416; NONEON-NOSVE-NEXT:    add w8, w3, w32417; NONEON-NOSVE-NEXT:    and w23, w0, #0xff2418; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #36]2419; NONEON-NOSVE-NEXT:    str w9, [sp, #288]2420; NONEON-NOSVE-NEXT:    add w9, w2, w22421; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2422; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #38]2423; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2424; NONEON-NOSVE-NEXT:    str w8, [sp, #272]2425; NONEON-NOSVE-NEXT:    add w8, w18, w182426; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #39]2427; NONEON-NOSVE-NEXT:    str w9, [sp, #280]2428; NONEON-NOSVE-NEXT:    add w9, w0, w02429; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2430; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #41]2431; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2432; NONEON-NOSVE-NEXT:    str w8, [sp, #264]2433; NONEON-NOSVE-NEXT:    add w8, w17, w172434; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #40]2435; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #252]2436; NONEON-NOSVE-NEXT:    add w9, w16, w162437; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2438; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #42]2439; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2440; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #236]2441; NONEON-NOSVE-NEXT:    add w8, w15, w152442; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #43]2443; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #244]2444; NONEON-NOSVE-NEXT:    add w9, w14, w142445; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2446; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #45]2447; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2448; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #228]2449; NONEON-NOSVE-NEXT:    add w8, w12, w122450; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #44]2451; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #220]2452; NONEON-NOSVE-NEXT:    add w9, w13, w132453; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2454; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2455; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #204]2456; NONEON-NOSVE-NEXT:    add w8, w11, w112457; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #212]2458; NONEON-NOSVE-NEXT:    add w9, w10, w102459; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2460; NONEON-NOSVE-NEXT:    and w9, w9, #0xff2461; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #196]2462; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8] // 4-byte Reload2463; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #188]2464; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12] // 4-byte Reload2465; NONEON-NOSVE-NEXT:    and w22, w22, #0xff2466; NONEON-NOSVE-NEXT:    add w8, w8, w82467; NONEON-NOSVE-NEXT:    stp wzr, w22, [sp, #164]2468; NONEON-NOSVE-NEXT:    and w8, w8, #0xff2469; NONEON-NOSVE-NEXT:    add w9, w9, w92470; NONEON-NOSVE-NEXT:    stp wzr, w23, [sp, #156]2471; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #180]2472; NONEON-NOSVE-NEXT:    and w8, w9, #0xff2473; NONEON-NOSVE-NEXT:    str wzr, [sp, #276]2474; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #144]2475; NONEON-NOSVE-NEXT:    str wzr, [sp, #284]2476; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #112]2477; NONEON-NOSVE-NEXT:    str wzr, [sp, #260]2478; NONEON-NOSVE-NEXT:    ldp q5, q4, [sp, #80]2479; NONEON-NOSVE-NEXT:    str wzr, [sp, #268]2480; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #48]2481; NONEON-NOSVE-NEXT:    str w8, [sp, #176]2482; NONEON-NOSVE-NEXT:    ldp q17, q16, [sp, #272]2483; NONEON-NOSVE-NEXT:    ldp q18, q21, [sp, #176]2484; NONEON-NOSVE-NEXT:    ldp q20, q19, [sp, #240]2485; NONEON-NOSVE-NEXT:    ldp q23, q22, [sp, #208]2486; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]2487; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #384] // 16-byte Folded Reload2488; NONEON-NOSVE-NEXT:    stp q2, q3, [x1, #32]2489; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #368] // 16-byte Folded Reload2490; NONEON-NOSVE-NEXT:    stp q4, q5, [x1, #64]2491; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #352] // 16-byte Folded Reload2492; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #96]2493; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #336] // 16-byte Folded Reload2494; NONEON-NOSVE-NEXT:    stp q16, q17, [x1, #128]2495; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #320] // 16-byte Folded Reload2496; NONEON-NOSVE-NEXT:    stp q19, q20, [x1, #160]2497; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #304] // 16-byte Folded Reload2498; NONEON-NOSVE-NEXT:    stp q22, q23, [x1, #192]2499; NONEON-NOSVE-NEXT:    stp q21, q18, [x1, #224]2500; NONEON-NOSVE-NEXT:    add sp, sp, #4002501; NONEON-NOSVE-NEXT:    ret2502  %a = load <32 x i8>, ptr %in2503  %b = add <32 x i8> %a, %a2504  %c = zext <32 x i8> %b to <32 x i64>2505  store <32 x i64> %c, ptr %out2506  ret void2507}2508 2509;2510; zext i16 -> i322511;2512 2513define void @zext_v8i16_v8i32(<8 x i16> %a, ptr %out) {2514; CHECK-LABEL: zext_v8i16_v8i32:2515; CHECK:       // %bb.0:2516; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z02517; CHECK-NEXT:    movprfx z1, z02518; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82519; CHECK-NEXT:    uunpklo z0.s, z0.h2520; CHECK-NEXT:    uunpklo z1.s, z1.h2521; CHECK-NEXT:    stp q0, q1, [x0]2522; CHECK-NEXT:    ret2523;2524; NONEON-NOSVE-LABEL: zext_v8i16_v8i32:2525; NONEON-NOSVE:       // %bb.0:2526; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!2527; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 642528; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]2529; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]2530; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]2531; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]2532; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]2533; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]2534; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]2535; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]2536; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]2537; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]2538; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]2539; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]2540; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]2541; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]2542; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]2543; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]2544; NONEON-NOSVE-NEXT:    add sp, sp, #642545; NONEON-NOSVE-NEXT:    ret2546  %b = zext <8 x i16> %a to <8 x i32>2547  store <8 x i32>%b, ptr %out2548  ret void2549}2550 2551define void @zext_v16i16_v16i32(ptr %in, ptr %out) {2552; CHECK-LABEL: zext_v16i16_v16i32:2553; CHECK:       // %bb.0:2554; CHECK-NEXT:    ldp q1, q0, [x0]2555; CHECK-NEXT:    add z0.h, z0.h, z0.h2556; CHECK-NEXT:    add z1.h, z1.h, z1.h2557; CHECK-NEXT:    movprfx z2, z02558; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82559; CHECK-NEXT:    movprfx z3, z12560; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #82561; CHECK-NEXT:    uunpklo z0.s, z0.h2562; CHECK-NEXT:    uunpklo z1.s, z1.h2563; CHECK-NEXT:    uunpklo z2.s, z2.h2564; CHECK-NEXT:    uunpklo z3.s, z3.h2565; CHECK-NEXT:    stp q1, q3, [x1]2566; CHECK-NEXT:    stp q0, q2, [x1, #32]2567; CHECK-NEXT:    ret2568;2569; NONEON-NOSVE-LABEL: zext_v16i16_v16i32:2570; NONEON-NOSVE:       // %bb.0:2571; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2572; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-96]!2573; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 962574; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #6]2575; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #4]2576; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #2]2577; NONEON-NOSVE-NEXT:    ldrh w3, [sp]2578; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #12]2579; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #14]2580; NONEON-NOSVE-NEXT:    add w14, w14, w142581; NONEON-NOSVE-NEXT:    add w17, w17, w172582; NONEON-NOSVE-NEXT:    add w16, w16, w162583; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2584; NONEON-NOSVE-NEXT:    and w17, w17, #0xffff2585; NONEON-NOSVE-NEXT:    and w16, w16, #0xffff2586; NONEON-NOSVE-NEXT:    stp w17, w14, [sp, #56]2587; NONEON-NOSVE-NEXT:    add w14, w3, w32588; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #8]2589; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2590; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #10]2591; NONEON-NOSVE-NEXT:    add w17, w5, w52592; NONEON-NOSVE-NEXT:    stp w14, w16, [sp, #48]2593; NONEON-NOSVE-NEXT:    add w16, w4, w42594; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]2595; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]2596; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]2597; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]2598; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #16]2599; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #18]2600; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #20]2601; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #22]2602; NONEON-NOSVE-NEXT:    and w14, w17, #0xffff2603; NONEON-NOSVE-NEXT:    and w16, w16, #0xffff2604; NONEON-NOSVE-NEXT:    add w17, w2, w22605; NONEON-NOSVE-NEXT:    stp w16, w14, [sp, #40]2606; NONEON-NOSVE-NEXT:    add w14, w0, w02607; NONEON-NOSVE-NEXT:    and w16, w17, #0xffff2608; NONEON-NOSVE-NEXT:    add w17, w18, w182609; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2610; NONEON-NOSVE-NEXT:    add w15, w15, w152611; NONEON-NOSVE-NEXT:    add w13, w13, w132612; NONEON-NOSVE-NEXT:    add w12, w12, w122613; NONEON-NOSVE-NEXT:    add w11, w11, w112614; NONEON-NOSVE-NEXT:    add w10, w10, w102615; NONEON-NOSVE-NEXT:    add w9, w9, w92616; NONEON-NOSVE-NEXT:    add w8, w8, w82617; NONEON-NOSVE-NEXT:    stp w14, w16, [sp, #32]2618; NONEON-NOSVE-NEXT:    and w14, w17, #0xffff2619; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2620; NONEON-NOSVE-NEXT:    and w13, w13, #0xffff2621; NONEON-NOSVE-NEXT:    and w12, w12, #0xffff2622; NONEON-NOSVE-NEXT:    and w11, w11, #0xffff2623; NONEON-NOSVE-NEXT:    and w10, w10, #0xffff2624; NONEON-NOSVE-NEXT:    and w9, w9, #0xffff2625; NONEON-NOSVE-NEXT:    and w8, w8, #0xffff2626; NONEON-NOSVE-NEXT:    stp w15, w14, [sp, #88]2627; NONEON-NOSVE-NEXT:    stp w12, w13, [sp, #80]2628; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #32]2629; NONEON-NOSVE-NEXT:    stp w10, w11, [sp, #72]2630; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]2631; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]2632; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]2633; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]2634; NONEON-NOSVE-NEXT:    add sp, sp, #962635; NONEON-NOSVE-NEXT:    ret2636  %a = load <16 x i16>, ptr %in2637  %b = add <16 x i16> %a, %a2638  %c = zext <16 x i16> %b to <16 x i32>2639  store <16 x i32> %c, ptr %out2640  ret void2641}2642 2643;2644; zext i16 -> i642645;2646 2647define void @zext_v4i16_v4i64(<4 x i16> %a, ptr %out) {2648; CHECK-LABEL: zext_v4i16_v4i64:2649; CHECK:       // %bb.0:2650; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z02651; CHECK-NEXT:    uunpklo z0.s, z0.h2652; CHECK-NEXT:    movprfx z1, z02653; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82654; CHECK-NEXT:    uunpklo z0.d, z0.s2655; CHECK-NEXT:    uunpklo z1.d, z1.s2656; CHECK-NEXT:    stp q0, q1, [x0]2657; CHECK-NEXT:    ret2658;2659; NONEON-NOSVE-LABEL: zext_v4i16_v4i64:2660; NONEON-NOSVE:       // %bb.0:2661; NONEON-NOSVE-NEXT:    sub sp, sp, #482662; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 482663; NONEON-NOSVE-NEXT:    str d0, [sp, #8]2664; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]2665; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #40]2666; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]2667; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2668; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]2669; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #24]2670; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]2671; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #16]2672; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #16]2673; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]2674; NONEON-NOSVE-NEXT:    add sp, sp, #482675; NONEON-NOSVE-NEXT:    ret2676  %b = zext <4 x i16> %a to <4 x i64>2677  store <4 x i64>%b, ptr %out2678  ret void2679}2680 2681define void @zext_v8i16_v8i64(<8 x i16> %a, ptr %out) {2682; CHECK-LABEL: zext_v8i16_v8i64:2683; CHECK:       // %bb.0:2684; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z02685; CHECK-NEXT:    movprfx z1, z02686; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82687; CHECK-NEXT:    uunpklo z0.s, z0.h2688; CHECK-NEXT:    uunpklo z1.s, z1.h2689; CHECK-NEXT:    movprfx z2, z02690; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82691; CHECK-NEXT:    uunpklo z0.d, z0.s2692; CHECK-NEXT:    movprfx z3, z12693; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #82694; CHECK-NEXT:    uunpklo z1.d, z1.s2695; CHECK-NEXT:    uunpklo z2.d, z2.s2696; CHECK-NEXT:    uunpklo z3.d, z3.s2697; CHECK-NEXT:    stp q0, q2, [x0]2698; CHECK-NEXT:    stp q1, q3, [x0, #32]2699; CHECK-NEXT:    ret2700;2701; NONEON-NOSVE-LABEL: zext_v8i16_v8i64:2702; NONEON-NOSVE:       // %bb.0:2703; NONEON-NOSVE-NEXT:    str q0, [sp, #-96]!2704; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 962705; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]2706; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]2707; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]2708; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #88]2709; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]2710; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #80]2711; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]2712; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #72]2713; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]2714; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]2715; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]2716; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]2717; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #56]2718; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]2719; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]2720; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]2721; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #40]2722; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]2723; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2724; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]2725; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]2726; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]2727; NONEON-NOSVE-NEXT:    add sp, sp, #962728; NONEON-NOSVE-NEXT:    ret2729  %b = zext <8 x i16> %a to <8 x i64>2730  store <8 x i64>%b, ptr %out2731  ret void2732}2733 2734define void @zext_v16i16_v16i64(ptr %in, ptr %out) {2735; CHECK-LABEL: zext_v16i16_v16i64:2736; CHECK:       // %bb.0:2737; CHECK-NEXT:    ldp q1, q0, [x0]2738; CHECK-NEXT:    add z0.h, z0.h, z0.h2739; CHECK-NEXT:    add z1.h, z1.h, z1.h2740; CHECK-NEXT:    movprfx z2, z02741; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82742; CHECK-NEXT:    uunpklo z0.s, z0.h2743; CHECK-NEXT:    uunpklo z3.s, z1.h2744; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #82745; CHECK-NEXT:    uunpklo z2.s, z2.h2746; CHECK-NEXT:    movprfx z4, z02747; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #82748; CHECK-NEXT:    uunpklo z1.s, z1.h2749; CHECK-NEXT:    movprfx z5, z32750; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #82751; CHECK-NEXT:    uunpklo z0.d, z0.s2752; CHECK-NEXT:    uunpklo z3.d, z3.s2753; CHECK-NEXT:    uunpklo z4.d, z4.s2754; CHECK-NEXT:    uunpklo z5.d, z5.s2755; CHECK-NEXT:    movprfx z6, z22756; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #82757; CHECK-NEXT:    movprfx z7, z12758; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #82759; CHECK-NEXT:    uunpklo z2.d, z2.s2760; CHECK-NEXT:    uunpklo z1.d, z1.s2761; CHECK-NEXT:    stp q3, q5, [x1]2762; CHECK-NEXT:    uunpklo z3.d, z7.s2763; CHECK-NEXT:    stp q0, q4, [x1, #64]2764; CHECK-NEXT:    uunpklo z0.d, z6.s2765; CHECK-NEXT:    stp q1, q3, [x1, #32]2766; CHECK-NEXT:    stp q2, q0, [x1, #96]2767; CHECK-NEXT:    ret2768;2769; NONEON-NOSVE-LABEL: zext_v16i16_v16i64:2770; NONEON-NOSVE:       // %bb.0:2771; NONEON-NOSVE-NEXT:    sub sp, sp, #1602772; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1602773; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2774; NONEON-NOSVE-NEXT:    str wzr, [sp, #92]2775; NONEON-NOSVE-NEXT:    str wzr, [sp, #156]2776; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]2777; NONEON-NOSVE-NEXT:    ldrh w14, [sp]2778; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #2]2779; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #4]2780; NONEON-NOSVE-NEXT:    ldrh w5, [sp, #6]2781; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #8]2782; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #10]2783; NONEON-NOSVE-NEXT:    add w14, w14, w142784; NONEON-NOSVE-NEXT:    add w15, w15, w152785; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #12]2786; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2787; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2788; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #14]2789; NONEON-NOSVE-NEXT:    stp wzr, w15, [sp, #84]2790; NONEON-NOSVE-NEXT:    add w15, w4, w42791; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]2792; NONEON-NOSVE-NEXT:    stp wzr, w14, [sp, #76]2793; NONEON-NOSVE-NEXT:    add w14, w5, w52794; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2795; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2796; NONEON-NOSVE-NEXT:    stp wzr, w15, [sp, #60]2797; NONEON-NOSVE-NEXT:    add w15, w3, w32798; NONEON-NOSVE-NEXT:    stp wzr, w14, [sp, #68]2799; NONEON-NOSVE-NEXT:    add w14, w2, w22800; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2801; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2802; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]2803; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #24]2804; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #26]2805; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #20]2806; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #22]2807; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #16]2808; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #18]2809; NONEON-NOSVE-NEXT:    stp wzr, w15, [sp, #52]2810; NONEON-NOSVE-NEXT:    add w15, w18, w182811; NONEON-NOSVE-NEXT:    stp wzr, w14, [sp, #44]2812; NONEON-NOSVE-NEXT:    add w14, w0, w02813; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2814; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2815; NONEON-NOSVE-NEXT:    add w13, w13, w132816; NONEON-NOSVE-NEXT:    stp wzr, w14, [sp, #36]2817; NONEON-NOSVE-NEXT:    add w14, w16, w162818; NONEON-NOSVE-NEXT:    add w12, w12, w122819; NONEON-NOSVE-NEXT:    str w15, [sp, #32]2820; NONEON-NOSVE-NEXT:    add w15, w17, w172821; NONEON-NOSVE-NEXT:    add w10, w10, w102822; NONEON-NOSVE-NEXT:    add w11, w11, w112823; NONEON-NOSVE-NEXT:    add w9, w9, w92824; NONEON-NOSVE-NEXT:    add w8, w8, w82825; NONEON-NOSVE-NEXT:    and w14, w14, #0xffff2826; NONEON-NOSVE-NEXT:    and w15, w15, #0xffff2827; NONEON-NOSVE-NEXT:    and w13, w13, #0xffff2828; NONEON-NOSVE-NEXT:    and w12, w12, #0xffff2829; NONEON-NOSVE-NEXT:    and w10, w10, #0xffff2830; NONEON-NOSVE-NEXT:    and w11, w11, #0xffff2831; NONEON-NOSVE-NEXT:    and w9, w9, #0xffff2832; NONEON-NOSVE-NEXT:    and w8, w8, #0xffff2833; NONEON-NOSVE-NEXT:    stp wzr, w15, [sp, #148]2834; NONEON-NOSVE-NEXT:    stp wzr, w14, [sp, #140]2835; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]2836; NONEON-NOSVE-NEXT:    stp wzr, w12, [sp, #132]2837; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #32]2838; NONEON-NOSVE-NEXT:    stp wzr, w13, [sp, #124]2839; NONEON-NOSVE-NEXT:    stp wzr, w11, [sp, #116]2840; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #128]2841; NONEON-NOSVE-NEXT:    stp wzr, w10, [sp, #108]2842; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #100]2843; NONEON-NOSVE-NEXT:    str w8, [sp, #96]2844; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #96]2845; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]2846; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]2847; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]2848; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]2849; NONEON-NOSVE-NEXT:    add sp, sp, #1602850; NONEON-NOSVE-NEXT:    ret2851  %a = load <16 x i16>, ptr %in2852  %b = add <16 x i16> %a, %a2853  %c = zext <16 x i16> %b to <16 x i64>2854  store <16 x i64> %c, ptr %out2855  ret void2856}2857 2858;2859; zext i32 -> i642860;2861 2862define void @zext_v4i32_v4i64(<4 x i32> %a, ptr %out) {2863; CHECK-LABEL: zext_v4i32_v4i64:2864; CHECK:       // %bb.0:2865; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z02866; CHECK-NEXT:    movprfx z1, z02867; CHECK-NEXT:    ext z1.b, z1.b, z0.b, #82868; CHECK-NEXT:    uunpklo z0.d, z0.s2869; CHECK-NEXT:    uunpklo z1.d, z1.s2870; CHECK-NEXT:    stp q0, q1, [x0]2871; CHECK-NEXT:    ret2872;2873; NONEON-NOSVE-LABEL: zext_v4i32_v4i64:2874; NONEON-NOSVE:       // %bb.0:2875; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!2876; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 642877; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]2878; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]2879; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]2880; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #56]2881; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]2882; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]2883; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #40]2884; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]2885; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]2886; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]2887; NONEON-NOSVE-NEXT:    add sp, sp, #642888; NONEON-NOSVE-NEXT:    ret2889  %b = zext <4 x i32> %a to <4 x i64>2890  store <4 x i64>%b, ptr %out2891  ret void2892}2893 2894define void @zext_v8i32_v8i64(ptr %in, ptr %out) {2895; CHECK-LABEL: zext_v8i32_v8i64:2896; CHECK:       // %bb.0:2897; CHECK-NEXT:    ldp q1, q0, [x0]2898; CHECK-NEXT:    add z0.s, z0.s, z0.s2899; CHECK-NEXT:    add z1.s, z1.s, z1.s2900; CHECK-NEXT:    movprfx z2, z02901; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #82902; CHECK-NEXT:    movprfx z3, z12903; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #82904; CHECK-NEXT:    uunpklo z0.d, z0.s2905; CHECK-NEXT:    uunpklo z1.d, z1.s2906; CHECK-NEXT:    uunpklo z2.d, z2.s2907; CHECK-NEXT:    uunpklo z3.d, z3.s2908; CHECK-NEXT:    stp q1, q3, [x1]2909; CHECK-NEXT:    stp q0, q2, [x1, #32]2910; CHECK-NEXT:    ret2911;2912; NONEON-NOSVE-LABEL: zext_v8i32_v8i64:2913; NONEON-NOSVE:       // %bb.0:2914; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]2915; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-96]!2916; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 962917; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp]2918; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #8]2919; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #16]2920; NONEON-NOSVE-NEXT:    add w10, w10, w102921; NONEON-NOSVE-NEXT:    add w11, w11, w112922; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]2923; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #48]2924; NONEON-NOSVE-NEXT:    add w10, w15, w152925; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #40]2926; NONEON-NOSVE-NEXT:    add w10, w14, w142927; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #32]2928; NONEON-NOSVE-NEXT:    add w10, w13, w132929; NONEON-NOSVE-NEXT:    add w9, w9, w92930; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #88]2931; NONEON-NOSVE-NEXT:    add w10, w12, w122932; NONEON-NOSVE-NEXT:    add w8, w8, w82933; NONEON-NOSVE-NEXT:    stp w11, wzr, [sp, #56]2934; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #80]2935; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #32]2936; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #72]2937; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]2938; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]2939; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]2940; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]2941; NONEON-NOSVE-NEXT:    add sp, sp, #962942; NONEON-NOSVE-NEXT:    ret2943  %a = load <8 x i32>, ptr %in2944  %b = add <8 x i32> %a, %a2945  %c = zext <8 x i32> %b to <8 x i64>2946  store <8 x i64> %c, ptr %out2947  ret void2948}2949 2950define void @extend_and_mul(i32 %0, <2 x i64> %1, ptr %2) {2951; SVE-LABEL: extend_and_mul:2952; SVE:       // %bb.0:2953; SVE-NEXT:    mov z1.s, w02954; SVE-NEXT:    ptrue p0.d, vl22955; SVE-NEXT:    // kill: def $q0 killed $q0 def $z02956; SVE-NEXT:    uunpklo z1.d, z1.s2957; SVE-NEXT:    mul z0.d, p0/m, z0.d, z1.d2958; SVE-NEXT:    str q0, [x1]2959; SVE-NEXT:    ret2960;2961; SVE2-LABEL: extend_and_mul:2962; SVE2:       // %bb.0:2963; SVE2-NEXT:    mov z1.s, w02964; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z02965; SVE2-NEXT:    uunpklo z1.d, z1.s2966; SVE2-NEXT:    mul z0.d, z1.d, z0.d2967; SVE2-NEXT:    str q0, [x1]2968; SVE2-NEXT:    ret2969;2970; NONEON-NOSVE-LABEL: extend_and_mul:2971; NONEON-NOSVE:       // %bb.0:2972; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!2973; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 322974; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]2975; NONEON-NOSVE-NEXT:    mov w9, w02976; NONEON-NOSVE-NEXT:    mul x10, x9, x82977; NONEON-NOSVE-NEXT:    ldr x8, [sp]2978; NONEON-NOSVE-NEXT:    mul x8, x9, x82979; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #16]2980; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]2981; NONEON-NOSVE-NEXT:    str q0, [x1]2982; NONEON-NOSVE-NEXT:    add sp, sp, #322983; NONEON-NOSVE-NEXT:    ret2984  %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 02985  %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer2986  %4 = zext <2 x i32> %broadcast.splat3 to <2 x i64>2987  %5 = mul <2 x i64> %4, %12988  store <2 x i64> %5, ptr %2, align 22989  ret void2990}2991 2992define void @extend_no_mul(i32 %0, <2 x i64> %1, ptr %2) {2993; CHECK-LABEL: extend_no_mul:2994; CHECK:       // %bb.0: // %entry2995; CHECK-NEXT:    mov w8, w02996; CHECK-NEXT:    mov z0.d, x82997; CHECK-NEXT:    str q0, [x1]2998; CHECK-NEXT:    ret2999;3000; NONEON-NOSVE-LABEL: extend_no_mul:3001; NONEON-NOSVE:       // %bb.0: // %entry3002; NONEON-NOSVE-NEXT:    mov w8, w03003; NONEON-NOSVE-NEXT:    stp x8, x8, [sp, #-16]!3004; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 163005; NONEON-NOSVE-NEXT:    ldr q0, [sp]3006; NONEON-NOSVE-NEXT:    str q0, [x1]3007; NONEON-NOSVE-NEXT:    add sp, sp, #163008; NONEON-NOSVE-NEXT:    ret3009entry:3010  %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 03011  %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer3012  %3 = zext <2 x i32> %broadcast.splat3 to <2 x i64>3013  store <2 x i64> %3, ptr %2, align 23014  ret void3015}3016