2303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; ASHR10;11 12define <4 x i8> @ashr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {13; CHECK-LABEL: ashr_v4i8:14; CHECK: // %bb.0:15; CHECK-NEXT: ptrue p0.h, vl416; CHECK-NEXT: // kill: def $d1 killed $d1 def $z117; CHECK-NEXT: // kill: def $d0 killed $d0 def $z018; CHECK-NEXT: and z1.h, z1.h, #0xff19; CHECK-NEXT: sxtb z0.h, p0/m, z0.h20; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h21; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z022; CHECK-NEXT: ret23;24; NONEON-NOSVE-LABEL: ashr_v4i8:25; NONEON-NOSVE: // %bb.0:26; NONEON-NOSVE-NEXT: sub sp, sp, #3227; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3228; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]29; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]30; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]31; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20]32; NONEON-NOSVE-NEXT: ldrsb w11, [sp, #12]33; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18]34; NONEON-NOSVE-NEXT: ldrsb w13, [sp, #10]35; NONEON-NOSVE-NEXT: asr w8, w9, w836; NONEON-NOSVE-NEXT: ldrb w9, [sp, #16]37; NONEON-NOSVE-NEXT: ldrsb w14, [sp, #8]38; NONEON-NOSVE-NEXT: asr w10, w11, w1039; NONEON-NOSVE-NEXT: asr w11, w13, w1240; NONEON-NOSVE-NEXT: strh w8, [sp, #30]41; NONEON-NOSVE-NEXT: asr w8, w14, w942; NONEON-NOSVE-NEXT: strh w10, [sp, #28]43; NONEON-NOSVE-NEXT: strh w11, [sp, #26]44; NONEON-NOSVE-NEXT: strh w8, [sp, #24]45; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]46; NONEON-NOSVE-NEXT: add sp, sp, #3247; NONEON-NOSVE-NEXT: ret48 %res = ashr <4 x i8> %op1, %op249 ret <4 x i8> %res50}51 52define <8 x i8> @ashr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {53; CHECK-LABEL: ashr_v8i8:54; CHECK: // %bb.0:55; CHECK-NEXT: ptrue p0.b, vl856; CHECK-NEXT: // kill: def $d0 killed $d0 def $z057; CHECK-NEXT: // kill: def $d1 killed $d1 def $z158; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b59; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z060; CHECK-NEXT: ret61;62; NONEON-NOSVE-LABEL: ashr_v8i8:63; NONEON-NOSVE: // %bb.0:64; NONEON-NOSVE-NEXT: sub sp, sp, #3265; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3266; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]68; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]69; NONEON-NOSVE-NEXT: asr w8, w9, w870; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]71; NONEON-NOSVE-NEXT: strb w8, [sp, #31]72; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]73; NONEON-NOSVE-NEXT: asr w8, w9, w874; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]75; NONEON-NOSVE-NEXT: strb w8, [sp, #30]76; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]77; NONEON-NOSVE-NEXT: asr w8, w9, w878; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]79; NONEON-NOSVE-NEXT: strb w8, [sp, #29]80; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]81; NONEON-NOSVE-NEXT: asr w8, w9, w882; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]83; NONEON-NOSVE-NEXT: strb w8, [sp, #28]84; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]85; NONEON-NOSVE-NEXT: asr w8, w9, w886; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]87; NONEON-NOSVE-NEXT: strb w8, [sp, #27]88; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]89; NONEON-NOSVE-NEXT: asr w8, w9, w890; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]91; NONEON-NOSVE-NEXT: strb w8, [sp, #26]92; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]93; NONEON-NOSVE-NEXT: asr w8, w9, w894; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]95; NONEON-NOSVE-NEXT: strb w8, [sp, #25]96; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]97; NONEON-NOSVE-NEXT: asr w8, w9, w898; NONEON-NOSVE-NEXT: strb w8, [sp, #24]99; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]100; NONEON-NOSVE-NEXT: add sp, sp, #32101; NONEON-NOSVE-NEXT: ret102 %res = ashr <8 x i8> %op1, %op2103 ret <8 x i8> %res104}105 106define <16 x i8> @ashr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {107; CHECK-LABEL: ashr_v16i8:108; CHECK: // %bb.0:109; CHECK-NEXT: ptrue p0.b, vl16110; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0111; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1112; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b113; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0114; CHECK-NEXT: ret115;116; NONEON-NOSVE-LABEL: ashr_v16i8:117; NONEON-NOSVE: // %bb.0:118; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!119; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48120; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]121; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]122; NONEON-NOSVE-NEXT: asr w8, w9, w8123; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]124; NONEON-NOSVE-NEXT: strb w8, [sp, #47]125; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]126; NONEON-NOSVE-NEXT: asr w8, w9, w8127; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]128; NONEON-NOSVE-NEXT: strb w8, [sp, #46]129; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]130; NONEON-NOSVE-NEXT: asr w8, w9, w8131; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]132; NONEON-NOSVE-NEXT: strb w8, [sp, #45]133; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]134; NONEON-NOSVE-NEXT: asr w8, w9, w8135; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]136; NONEON-NOSVE-NEXT: strb w8, [sp, #44]137; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]138; NONEON-NOSVE-NEXT: asr w8, w9, w8139; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]140; NONEON-NOSVE-NEXT: strb w8, [sp, #43]141; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]142; NONEON-NOSVE-NEXT: asr w8, w9, w8143; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]144; NONEON-NOSVE-NEXT: strb w8, [sp, #42]145; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]146; NONEON-NOSVE-NEXT: asr w8, w9, w8147; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]148; NONEON-NOSVE-NEXT: strb w8, [sp, #41]149; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]150; NONEON-NOSVE-NEXT: asr w8, w9, w8151; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]152; NONEON-NOSVE-NEXT: strb w8, [sp, #40]153; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]154; NONEON-NOSVE-NEXT: asr w8, w9, w8155; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]156; NONEON-NOSVE-NEXT: strb w8, [sp, #39]157; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]158; NONEON-NOSVE-NEXT: asr w8, w9, w8159; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]160; NONEON-NOSVE-NEXT: strb w8, [sp, #38]161; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]162; NONEON-NOSVE-NEXT: asr w8, w9, w8163; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]164; NONEON-NOSVE-NEXT: strb w8, [sp, #37]165; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]166; NONEON-NOSVE-NEXT: asr w8, w9, w8167; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]168; NONEON-NOSVE-NEXT: strb w8, [sp, #36]169; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]170; NONEON-NOSVE-NEXT: asr w8, w9, w8171; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]172; NONEON-NOSVE-NEXT: strb w8, [sp, #35]173; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]174; NONEON-NOSVE-NEXT: asr w8, w9, w8175; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]176; NONEON-NOSVE-NEXT: strb w8, [sp, #34]177; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]178; NONEON-NOSVE-NEXT: asr w8, w9, w8179; NONEON-NOSVE-NEXT: ldrsb w9, [sp]180; NONEON-NOSVE-NEXT: strb w8, [sp, #33]181; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]182; NONEON-NOSVE-NEXT: asr w8, w9, w8183; NONEON-NOSVE-NEXT: strb w8, [sp, #32]184; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]185; NONEON-NOSVE-NEXT: add sp, sp, #48186; NONEON-NOSVE-NEXT: ret187 %res = ashr <16 x i8> %op1, %op2188 ret <16 x i8> %res189}190 191define void @ashr_v32i8(ptr %a, ptr %b) {192; CHECK-LABEL: ashr_v32i8:193; CHECK: // %bb.0:194; CHECK-NEXT: ldp q0, q3, [x1]195; CHECK-NEXT: ptrue p0.b, vl16196; CHECK-NEXT: ldp q1, q2, [x0]197; CHECK-NEXT: asrr z0.b, p0/m, z0.b, z1.b198; CHECK-NEXT: asr z2.b, p0/m, z2.b, z3.b199; CHECK-NEXT: stp q0, q2, [x0]200; CHECK-NEXT: ret201;202; NONEON-NOSVE-LABEL: ashr_v32i8:203; NONEON-NOSVE: // %bb.0:204; NONEON-NOSVE-NEXT: sub sp, sp, #96205; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96206; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]207; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]208; NONEON-NOSVE-NEXT: stp q2, q3, [sp]209; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]210; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63]211; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47]212; NONEON-NOSVE-NEXT: asr w8, w9, w8213; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46]214; NONEON-NOSVE-NEXT: strb w8, [sp, #95]215; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62]216; NONEON-NOSVE-NEXT: asr w8, w9, w8217; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45]218; NONEON-NOSVE-NEXT: strb w8, [sp, #94]219; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61]220; NONEON-NOSVE-NEXT: asr w8, w9, w8221; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44]222; NONEON-NOSVE-NEXT: strb w8, [sp, #93]223; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60]224; NONEON-NOSVE-NEXT: asr w8, w9, w8225; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43]226; NONEON-NOSVE-NEXT: strb w8, [sp, #92]227; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59]228; NONEON-NOSVE-NEXT: asr w8, w9, w8229; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42]230; NONEON-NOSVE-NEXT: strb w8, [sp, #91]231; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58]232; NONEON-NOSVE-NEXT: asr w8, w9, w8233; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41]234; NONEON-NOSVE-NEXT: strb w8, [sp, #90]235; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57]236; NONEON-NOSVE-NEXT: asr w8, w9, w8237; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40]238; NONEON-NOSVE-NEXT: strb w8, [sp, #89]239; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56]240; NONEON-NOSVE-NEXT: asr w8, w9, w8241; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39]242; NONEON-NOSVE-NEXT: strb w8, [sp, #88]243; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55]244; NONEON-NOSVE-NEXT: asr w8, w9, w8245; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38]246; NONEON-NOSVE-NEXT: strb w8, [sp, #87]247; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54]248; NONEON-NOSVE-NEXT: asr w8, w9, w8249; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37]250; NONEON-NOSVE-NEXT: strb w8, [sp, #86]251; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53]252; NONEON-NOSVE-NEXT: asr w8, w9, w8253; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36]254; NONEON-NOSVE-NEXT: strb w8, [sp, #85]255; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52]256; NONEON-NOSVE-NEXT: asr w8, w9, w8257; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35]258; NONEON-NOSVE-NEXT: strb w8, [sp, #84]259; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51]260; NONEON-NOSVE-NEXT: asr w8, w9, w8261; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34]262; NONEON-NOSVE-NEXT: strb w8, [sp, #83]263; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50]264; NONEON-NOSVE-NEXT: asr w8, w9, w8265; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33]266; NONEON-NOSVE-NEXT: strb w8, [sp, #82]267; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49]268; NONEON-NOSVE-NEXT: asr w8, w9, w8269; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32]270; NONEON-NOSVE-NEXT: strb w8, [sp, #81]271; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48]272; NONEON-NOSVE-NEXT: asr w8, w9, w8273; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]274; NONEON-NOSVE-NEXT: strb w8, [sp, #80]275; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]276; NONEON-NOSVE-NEXT: asr w8, w9, w8277; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]278; NONEON-NOSVE-NEXT: strb w8, [sp, #79]279; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]280; NONEON-NOSVE-NEXT: asr w8, w9, w8281; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]282; NONEON-NOSVE-NEXT: strb w8, [sp, #78]283; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]284; NONEON-NOSVE-NEXT: asr w8, w9, w8285; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]286; NONEON-NOSVE-NEXT: strb w8, [sp, #77]287; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]288; NONEON-NOSVE-NEXT: asr w8, w9, w8289; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]290; NONEON-NOSVE-NEXT: strb w8, [sp, #76]291; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]292; NONEON-NOSVE-NEXT: asr w8, w9, w8293; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]294; NONEON-NOSVE-NEXT: strb w8, [sp, #75]295; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]296; NONEON-NOSVE-NEXT: asr w8, w9, w8297; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]298; NONEON-NOSVE-NEXT: strb w8, [sp, #74]299; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]300; NONEON-NOSVE-NEXT: asr w8, w9, w8301; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]302; NONEON-NOSVE-NEXT: strb w8, [sp, #73]303; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]304; NONEON-NOSVE-NEXT: asr w8, w9, w8305; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]306; NONEON-NOSVE-NEXT: strb w8, [sp, #72]307; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]308; NONEON-NOSVE-NEXT: asr w8, w9, w8309; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]310; NONEON-NOSVE-NEXT: strb w8, [sp, #71]311; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]312; NONEON-NOSVE-NEXT: asr w8, w9, w8313; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]314; NONEON-NOSVE-NEXT: strb w8, [sp, #70]315; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]316; NONEON-NOSVE-NEXT: asr w8, w9, w8317; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]318; NONEON-NOSVE-NEXT: strb w8, [sp, #69]319; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]320; NONEON-NOSVE-NEXT: asr w8, w9, w8321; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]322; NONEON-NOSVE-NEXT: strb w8, [sp, #68]323; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]324; NONEON-NOSVE-NEXT: asr w8, w9, w8325; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]326; NONEON-NOSVE-NEXT: strb w8, [sp, #67]327; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]328; NONEON-NOSVE-NEXT: asr w8, w9, w8329; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]330; NONEON-NOSVE-NEXT: strb w8, [sp, #66]331; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]332; NONEON-NOSVE-NEXT: asr w8, w9, w8333; NONEON-NOSVE-NEXT: ldrsb w9, [sp]334; NONEON-NOSVE-NEXT: strb w8, [sp, #65]335; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]336; NONEON-NOSVE-NEXT: asr w8, w9, w8337; NONEON-NOSVE-NEXT: strb w8, [sp, #64]338; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]339; NONEON-NOSVE-NEXT: stp q0, q1, [x0]340; NONEON-NOSVE-NEXT: add sp, sp, #96341; NONEON-NOSVE-NEXT: ret342 %op1 = load <32 x i8>, ptr %a343 %op2 = load <32 x i8>, ptr %b344 %res = ashr <32 x i8> %op1, %op2345 store <32 x i8> %res, ptr %a346 ret void347}348 349define <2 x i16> @ashr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {350; CHECK-LABEL: ashr_v2i16:351; CHECK: // %bb.0:352; CHECK-NEXT: ptrue p0.s, vl2353; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1354; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0355; CHECK-NEXT: and z1.s, z1.s, #0xffff356; CHECK-NEXT: sxth z0.s, p0/m, z0.s357; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s358; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0359; CHECK-NEXT: ret360;361; NONEON-NOSVE-LABEL: ashr_v2i16:362; NONEON-NOSVE: // %bb.0:363; NONEON-NOSVE-NEXT: sub sp, sp, #32364; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32365; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]366; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]367; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]368; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16]369; NONEON-NOSVE-NEXT: ldrsh w11, [sp, #8]370; NONEON-NOSVE-NEXT: asr w8, w9, w8371; NONEON-NOSVE-NEXT: asr w9, w11, w10372; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24]373; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]374; NONEON-NOSVE-NEXT: add sp, sp, #32375; NONEON-NOSVE-NEXT: ret376 %res = ashr <2 x i16> %op1, %op2377 ret <2 x i16> %res378}379 380define <4 x i16> @ashr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {381; CHECK-LABEL: ashr_v4i16:382; CHECK: // %bb.0:383; CHECK-NEXT: ptrue p0.h, vl4384; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0385; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1386; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h387; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0388; CHECK-NEXT: ret389;390; NONEON-NOSVE-LABEL: ashr_v4i16:391; NONEON-NOSVE: // %bb.0:392; NONEON-NOSVE-NEXT: sub sp, sp, #32393; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32394; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]395; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]396; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]397; NONEON-NOSVE-NEXT: asr w8, w9, w8398; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]399; NONEON-NOSVE-NEXT: strh w8, [sp, #30]400; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]401; NONEON-NOSVE-NEXT: asr w8, w9, w8402; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]403; NONEON-NOSVE-NEXT: strh w8, [sp, #28]404; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]405; NONEON-NOSVE-NEXT: asr w8, w9, w8406; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]407; NONEON-NOSVE-NEXT: strh w8, [sp, #26]408; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]409; NONEON-NOSVE-NEXT: asr w8, w9, w8410; NONEON-NOSVE-NEXT: strh w8, [sp, #24]411; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]412; NONEON-NOSVE-NEXT: add sp, sp, #32413; NONEON-NOSVE-NEXT: ret414 %res = ashr <4 x i16> %op1, %op2415 ret <4 x i16> %res416}417 418define <8 x i16> @ashr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {419; CHECK-LABEL: ashr_v8i16:420; CHECK: // %bb.0:421; CHECK-NEXT: ptrue p0.h, vl8422; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0423; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1424; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h425; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0426; CHECK-NEXT: ret427;428; NONEON-NOSVE-LABEL: ashr_v8i16:429; NONEON-NOSVE: // %bb.0:430; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!431; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48432; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]433; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]434; NONEON-NOSVE-NEXT: asr w8, w9, w8435; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]436; NONEON-NOSVE-NEXT: strh w8, [sp, #46]437; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]438; NONEON-NOSVE-NEXT: asr w8, w9, w8439; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]440; NONEON-NOSVE-NEXT: strh w8, [sp, #44]441; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]442; NONEON-NOSVE-NEXT: asr w8, w9, w8443; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]444; NONEON-NOSVE-NEXT: strh w8, [sp, #42]445; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]446; NONEON-NOSVE-NEXT: asr w8, w9, w8447; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]448; NONEON-NOSVE-NEXT: strh w8, [sp, #40]449; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]450; NONEON-NOSVE-NEXT: asr w8, w9, w8451; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]452; NONEON-NOSVE-NEXT: strh w8, [sp, #38]453; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]454; NONEON-NOSVE-NEXT: asr w8, w9, w8455; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]456; NONEON-NOSVE-NEXT: strh w8, [sp, #36]457; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]458; NONEON-NOSVE-NEXT: asr w8, w9, w8459; NONEON-NOSVE-NEXT: ldrsh w9, [sp]460; NONEON-NOSVE-NEXT: strh w8, [sp, #34]461; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]462; NONEON-NOSVE-NEXT: asr w8, w9, w8463; NONEON-NOSVE-NEXT: strh w8, [sp, #32]464; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]465; NONEON-NOSVE-NEXT: add sp, sp, #48466; NONEON-NOSVE-NEXT: ret467 %res = ashr <8 x i16> %op1, %op2468 ret <8 x i16> %res469}470 471define void @ashr_v16i16(ptr %a, ptr %b) {472; CHECK-LABEL: ashr_v16i16:473; CHECK: // %bb.0:474; CHECK-NEXT: ldp q0, q3, [x1]475; CHECK-NEXT: ptrue p0.h, vl8476; CHECK-NEXT: ldp q1, q2, [x0]477; CHECK-NEXT: asrr z0.h, p0/m, z0.h, z1.h478; CHECK-NEXT: asr z2.h, p0/m, z2.h, z3.h479; CHECK-NEXT: stp q0, q2, [x0]480; CHECK-NEXT: ret481;482; NONEON-NOSVE-LABEL: ashr_v16i16:483; NONEON-NOSVE: // %bb.0:484; NONEON-NOSVE-NEXT: sub sp, sp, #96485; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96486; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]487; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]488; NONEON-NOSVE-NEXT: stp q2, q3, [sp]489; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]490; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]491; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46]492; NONEON-NOSVE-NEXT: asr w8, w9, w8493; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44]494; NONEON-NOSVE-NEXT: strh w8, [sp, #94]495; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]496; NONEON-NOSVE-NEXT: asr w8, w9, w8497; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42]498; NONEON-NOSVE-NEXT: strh w8, [sp, #92]499; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]500; NONEON-NOSVE-NEXT: asr w8, w9, w8501; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40]502; NONEON-NOSVE-NEXT: strh w8, [sp, #90]503; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]504; NONEON-NOSVE-NEXT: asr w8, w9, w8505; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38]506; NONEON-NOSVE-NEXT: strh w8, [sp, #88]507; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]508; NONEON-NOSVE-NEXT: asr w8, w9, w8509; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36]510; NONEON-NOSVE-NEXT: strh w8, [sp, #86]511; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]512; NONEON-NOSVE-NEXT: asr w8, w9, w8513; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34]514; NONEON-NOSVE-NEXT: strh w8, [sp, #84]515; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]516; NONEON-NOSVE-NEXT: asr w8, w9, w8517; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32]518; NONEON-NOSVE-NEXT: strh w8, [sp, #82]519; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]520; NONEON-NOSVE-NEXT: asr w8, w9, w8521; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]522; NONEON-NOSVE-NEXT: strh w8, [sp, #80]523; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]524; NONEON-NOSVE-NEXT: asr w8, w9, w8525; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]526; NONEON-NOSVE-NEXT: strh w8, [sp, #78]527; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]528; NONEON-NOSVE-NEXT: asr w8, w9, w8529; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]530; NONEON-NOSVE-NEXT: strh w8, [sp, #76]531; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]532; NONEON-NOSVE-NEXT: asr w8, w9, w8533; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]534; NONEON-NOSVE-NEXT: strh w8, [sp, #74]535; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]536; NONEON-NOSVE-NEXT: asr w8, w9, w8537; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]538; NONEON-NOSVE-NEXT: strh w8, [sp, #72]539; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]540; NONEON-NOSVE-NEXT: asr w8, w9, w8541; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]542; NONEON-NOSVE-NEXT: strh w8, [sp, #70]543; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]544; NONEON-NOSVE-NEXT: asr w8, w9, w8545; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]546; NONEON-NOSVE-NEXT: strh w8, [sp, #68]547; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]548; NONEON-NOSVE-NEXT: asr w8, w9, w8549; NONEON-NOSVE-NEXT: ldrsh w9, [sp]550; NONEON-NOSVE-NEXT: strh w8, [sp, #66]551; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]552; NONEON-NOSVE-NEXT: asr w8, w9, w8553; NONEON-NOSVE-NEXT: strh w8, [sp, #64]554; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]555; NONEON-NOSVE-NEXT: stp q0, q1, [x0]556; NONEON-NOSVE-NEXT: add sp, sp, #96557; NONEON-NOSVE-NEXT: ret558 %op1 = load <16 x i16>, ptr %a559 %op2 = load <16 x i16>, ptr %b560 %res = ashr <16 x i16> %op1, %op2561 store <16 x i16> %res, ptr %a562 ret void563}564 565define <2 x i32> @ashr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {566; CHECK-LABEL: ashr_v2i32:567; CHECK: // %bb.0:568; CHECK-NEXT: ptrue p0.s, vl2569; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0570; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1571; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s572; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0573; CHECK-NEXT: ret574;575; NONEON-NOSVE-LABEL: ashr_v2i32:576; NONEON-NOSVE: // %bb.0:577; NONEON-NOSVE-NEXT: sub sp, sp, #32578; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32579; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]580; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]581; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]582; NONEON-NOSVE-NEXT: asr w11, w10, w8583; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]584; NONEON-NOSVE-NEXT: asr w8, w9, w8585; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]586; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]587; NONEON-NOSVE-NEXT: add sp, sp, #32588; NONEON-NOSVE-NEXT: ret589 %res = ashr <2 x i32> %op1, %op2590 ret <2 x i32> %res591}592 593define <4 x i32> @ashr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {594; CHECK-LABEL: ashr_v4i32:595; CHECK: // %bb.0:596; CHECK-NEXT: ptrue p0.s, vl4597; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0598; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1599; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s600; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0601; CHECK-NEXT: ret602;603; NONEON-NOSVE-LABEL: ashr_v4i32:604; NONEON-NOSVE: // %bb.0:605; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!606; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48607; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]608; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]609; NONEON-NOSVE-NEXT: asr w11, w10, w8610; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]611; NONEON-NOSVE-NEXT: asr w8, w9, w8612; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]613; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]614; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]615; NONEON-NOSVE-NEXT: asr w11, w10, w8616; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]617; NONEON-NOSVE-NEXT: asr w8, w9, w8618; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]619; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]620; NONEON-NOSVE-NEXT: add sp, sp, #48621; NONEON-NOSVE-NEXT: ret622 %res = ashr <4 x i32> %op1, %op2623 ret <4 x i32> %res624}625 626define void @ashr_v8i32(ptr %a, ptr %b) {627; CHECK-LABEL: ashr_v8i32:628; CHECK: // %bb.0:629; CHECK-NEXT: ldp q0, q3, [x1]630; CHECK-NEXT: ptrue p0.s, vl4631; CHECK-NEXT: ldp q1, q2, [x0]632; CHECK-NEXT: asrr z0.s, p0/m, z0.s, z1.s633; CHECK-NEXT: asr z2.s, p0/m, z2.s, z3.s634; CHECK-NEXT: stp q0, q2, [x0]635; CHECK-NEXT: ret636;637; NONEON-NOSVE-LABEL: ashr_v8i32:638; NONEON-NOSVE: // %bb.0:639; NONEON-NOSVE-NEXT: sub sp, sp, #96640; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96641; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]642; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]643; NONEON-NOSVE-NEXT: stp q2, q3, [sp]644; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]645; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]646; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]647; NONEON-NOSVE-NEXT: asr w11, w10, w8648; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]649; NONEON-NOSVE-NEXT: asr w8, w9, w8650; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]651; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]652; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]653; NONEON-NOSVE-NEXT: asr w11, w10, w8654; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]655; NONEON-NOSVE-NEXT: asr w8, w9, w8656; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]657; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]658; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]659; NONEON-NOSVE-NEXT: asr w11, w10, w8660; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]661; NONEON-NOSVE-NEXT: asr w8, w9, w8662; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]663; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]664; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]665; NONEON-NOSVE-NEXT: asr w11, w10, w8666; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]667; NONEON-NOSVE-NEXT: asr w8, w9, w8668; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]669; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]670; NONEON-NOSVE-NEXT: stp q0, q1, [x0]671; NONEON-NOSVE-NEXT: add sp, sp, #96672; NONEON-NOSVE-NEXT: ret673 %op1 = load <8 x i32>, ptr %a674 %op2 = load <8 x i32>, ptr %b675 %res = ashr <8 x i32> %op1, %op2676 store <8 x i32> %res, ptr %a677 ret void678}679 680define <1 x i64> @ashr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {681; CHECK-LABEL: ashr_v1i64:682; CHECK: // %bb.0:683; CHECK-NEXT: ptrue p0.d, vl1684; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0685; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1686; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d687; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0688; CHECK-NEXT: ret689;690; NONEON-NOSVE-LABEL: ashr_v1i64:691; NONEON-NOSVE: // %bb.0:692; NONEON-NOSVE-NEXT: sub sp, sp, #16693; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16694; NONEON-NOSVE-NEXT: fmov x8, d1695; NONEON-NOSVE-NEXT: fmov x9, d0696; NONEON-NOSVE-NEXT: asr x8, x9, x8697; NONEON-NOSVE-NEXT: str x8, [sp, #8]698; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]699; NONEON-NOSVE-NEXT: add sp, sp, #16700; NONEON-NOSVE-NEXT: ret701 %res = ashr <1 x i64> %op1, %op2702 ret <1 x i64> %res703}704 705define <2 x i64> @ashr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {706; CHECK-LABEL: ashr_v2i64:707; CHECK: // %bb.0:708; CHECK-NEXT: ptrue p0.d, vl2709; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0710; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1711; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d712; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0713; CHECK-NEXT: ret714;715; NONEON-NOSVE-LABEL: ashr_v2i64:716; NONEON-NOSVE: // %bb.0:717; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!718; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48719; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]720; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]721; NONEON-NOSVE-NEXT: asr x11, x10, x8722; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]723; NONEON-NOSVE-NEXT: asr x8, x9, x8724; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]725; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]726; NONEON-NOSVE-NEXT: add sp, sp, #48727; NONEON-NOSVE-NEXT: ret728 %res = ashr <2 x i64> %op1, %op2729 ret <2 x i64> %res730}731 732define void @ashr_v4i64(ptr %a, ptr %b) {733; CHECK-LABEL: ashr_v4i64:734; CHECK: // %bb.0:735; CHECK-NEXT: ldp q0, q3, [x1]736; CHECK-NEXT: ptrue p0.d, vl2737; CHECK-NEXT: ldp q1, q2, [x0]738; CHECK-NEXT: asrr z0.d, p0/m, z0.d, z1.d739; CHECK-NEXT: asr z2.d, p0/m, z2.d, z3.d740; CHECK-NEXT: stp q0, q2, [x0]741; CHECK-NEXT: ret742;743; NONEON-NOSVE-LABEL: ashr_v4i64:744; NONEON-NOSVE: // %bb.0:745; NONEON-NOSVE-NEXT: sub sp, sp, #96746; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96747; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]748; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]749; NONEON-NOSVE-NEXT: stp q2, q3, [sp]750; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]751; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]752; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]753; NONEON-NOSVE-NEXT: asr x11, x10, x8754; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]755; NONEON-NOSVE-NEXT: asr x8, x9, x8756; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]757; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]758; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]759; NONEON-NOSVE-NEXT: asr x11, x10, x8760; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]761; NONEON-NOSVE-NEXT: asr x8, x9, x8762; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]763; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]764; NONEON-NOSVE-NEXT: stp q0, q1, [x0]765; NONEON-NOSVE-NEXT: add sp, sp, #96766; NONEON-NOSVE-NEXT: ret767 %op1 = load <4 x i64>, ptr %a768 %op2 = load <4 x i64>, ptr %b769 %res = ashr <4 x i64> %op1, %op2770 store <4 x i64> %res, ptr %a771 ret void772}773 774;775; LSHR776;777 778define <4 x i8> @lshr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {779; CHECK-LABEL: lshr_v4i8:780; CHECK: // %bb.0:781; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1782; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0783; CHECK-NEXT: ptrue p0.h, vl4784; CHECK-NEXT: and z1.h, z1.h, #0xff785; CHECK-NEXT: and z0.h, z0.h, #0xff786; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h787; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0788; CHECK-NEXT: ret789;790; NONEON-NOSVE-LABEL: lshr_v4i8:791; NONEON-NOSVE: // %bb.0:792; NONEON-NOSVE-NEXT: sub sp, sp, #32793; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32794; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]795; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]796; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]797; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20]798; NONEON-NOSVE-NEXT: ldrb w11, [sp, #12]799; NONEON-NOSVE-NEXT: ldrb w12, [sp, #18]800; NONEON-NOSVE-NEXT: ldrb w13, [sp, #10]801; NONEON-NOSVE-NEXT: lsr w8, w9, w8802; NONEON-NOSVE-NEXT: ldrb w9, [sp, #16]803; NONEON-NOSVE-NEXT: ldrb w14, [sp, #8]804; NONEON-NOSVE-NEXT: lsr w10, w11, w10805; NONEON-NOSVE-NEXT: lsr w11, w13, w12806; NONEON-NOSVE-NEXT: strh w8, [sp, #30]807; NONEON-NOSVE-NEXT: lsr w8, w14, w9808; NONEON-NOSVE-NEXT: strh w10, [sp, #28]809; NONEON-NOSVE-NEXT: strh w11, [sp, #26]810; NONEON-NOSVE-NEXT: strh w8, [sp, #24]811; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]812; NONEON-NOSVE-NEXT: add sp, sp, #32813; NONEON-NOSVE-NEXT: ret814 %res = lshr <4 x i8> %op1, %op2815 ret <4 x i8> %res816}817 818define <8 x i8> @lshr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {819; CHECK-LABEL: lshr_v8i8:820; CHECK: // %bb.0:821; CHECK-NEXT: ptrue p0.b, vl8822; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0823; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1824; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b825; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0826; CHECK-NEXT: ret827;828; NONEON-NOSVE-LABEL: lshr_v8i8:829; NONEON-NOSVE: // %bb.0:830; NONEON-NOSVE-NEXT: sub sp, sp, #32831; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32832; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]833; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]834; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]835; NONEON-NOSVE-NEXT: lsr w8, w9, w8836; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]837; NONEON-NOSVE-NEXT: strb w8, [sp, #31]838; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]839; NONEON-NOSVE-NEXT: lsr w8, w9, w8840; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]841; NONEON-NOSVE-NEXT: strb w8, [sp, #30]842; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]843; NONEON-NOSVE-NEXT: lsr w8, w9, w8844; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]845; NONEON-NOSVE-NEXT: strb w8, [sp, #29]846; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]847; NONEON-NOSVE-NEXT: lsr w8, w9, w8848; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]849; NONEON-NOSVE-NEXT: strb w8, [sp, #28]850; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]851; NONEON-NOSVE-NEXT: lsr w8, w9, w8852; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]853; NONEON-NOSVE-NEXT: strb w8, [sp, #27]854; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]855; NONEON-NOSVE-NEXT: lsr w8, w9, w8856; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]857; NONEON-NOSVE-NEXT: strb w8, [sp, #26]858; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]859; NONEON-NOSVE-NEXT: lsr w8, w9, w8860; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]861; NONEON-NOSVE-NEXT: strb w8, [sp, #25]862; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]863; NONEON-NOSVE-NEXT: lsr w8, w9, w8864; NONEON-NOSVE-NEXT: strb w8, [sp, #24]865; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]866; NONEON-NOSVE-NEXT: add sp, sp, #32867; NONEON-NOSVE-NEXT: ret868 %res = lshr <8 x i8> %op1, %op2869 ret <8 x i8> %res870}871 872define <16 x i8> @lshr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {873; CHECK-LABEL: lshr_v16i8:874; CHECK: // %bb.0:875; CHECK-NEXT: ptrue p0.b, vl16876; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0877; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1878; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b879; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0880; CHECK-NEXT: ret881;882; NONEON-NOSVE-LABEL: lshr_v16i8:883; NONEON-NOSVE: // %bb.0:884; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!885; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48886; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]887; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]888; NONEON-NOSVE-NEXT: lsr w8, w9, w8889; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]890; NONEON-NOSVE-NEXT: strb w8, [sp, #47]891; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]892; NONEON-NOSVE-NEXT: lsr w8, w9, w8893; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]894; NONEON-NOSVE-NEXT: strb w8, [sp, #46]895; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]896; NONEON-NOSVE-NEXT: lsr w8, w9, w8897; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]898; NONEON-NOSVE-NEXT: strb w8, [sp, #45]899; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]900; NONEON-NOSVE-NEXT: lsr w8, w9, w8901; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]902; NONEON-NOSVE-NEXT: strb w8, [sp, #44]903; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]904; NONEON-NOSVE-NEXT: lsr w8, w9, w8905; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]906; NONEON-NOSVE-NEXT: strb w8, [sp, #43]907; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]908; NONEON-NOSVE-NEXT: lsr w8, w9, w8909; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]910; NONEON-NOSVE-NEXT: strb w8, [sp, #42]911; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]912; NONEON-NOSVE-NEXT: lsr w8, w9, w8913; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]914; NONEON-NOSVE-NEXT: strb w8, [sp, #41]915; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]916; NONEON-NOSVE-NEXT: lsr w8, w9, w8917; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]918; NONEON-NOSVE-NEXT: strb w8, [sp, #40]919; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]920; NONEON-NOSVE-NEXT: lsr w8, w9, w8921; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]922; NONEON-NOSVE-NEXT: strb w8, [sp, #39]923; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]924; NONEON-NOSVE-NEXT: lsr w8, w9, w8925; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]926; NONEON-NOSVE-NEXT: strb w8, [sp, #38]927; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]928; NONEON-NOSVE-NEXT: lsr w8, w9, w8929; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]930; NONEON-NOSVE-NEXT: strb w8, [sp, #37]931; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]932; NONEON-NOSVE-NEXT: lsr w8, w9, w8933; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]934; NONEON-NOSVE-NEXT: strb w8, [sp, #36]935; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]936; NONEON-NOSVE-NEXT: lsr w8, w9, w8937; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]938; NONEON-NOSVE-NEXT: strb w8, [sp, #35]939; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]940; NONEON-NOSVE-NEXT: lsr w8, w9, w8941; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]942; NONEON-NOSVE-NEXT: strb w8, [sp, #34]943; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]944; NONEON-NOSVE-NEXT: lsr w8, w9, w8945; NONEON-NOSVE-NEXT: ldrb w9, [sp]946; NONEON-NOSVE-NEXT: strb w8, [sp, #33]947; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]948; NONEON-NOSVE-NEXT: lsr w8, w9, w8949; NONEON-NOSVE-NEXT: strb w8, [sp, #32]950; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]951; NONEON-NOSVE-NEXT: add sp, sp, #48952; NONEON-NOSVE-NEXT: ret953 %res = lshr <16 x i8> %op1, %op2954 ret <16 x i8> %res955}956 957define void @lshr_v32i8(ptr %a, ptr %b) {958; CHECK-LABEL: lshr_v32i8:959; CHECK: // %bb.0:960; CHECK-NEXT: ldp q0, q3, [x1]961; CHECK-NEXT: ptrue p0.b, vl16962; CHECK-NEXT: ldp q1, q2, [x0]963; CHECK-NEXT: lsrr z0.b, p0/m, z0.b, z1.b964; CHECK-NEXT: lsr z2.b, p0/m, z2.b, z3.b965; CHECK-NEXT: stp q0, q2, [x0]966; CHECK-NEXT: ret967;968; NONEON-NOSVE-LABEL: lshr_v32i8:969; NONEON-NOSVE: // %bb.0:970; NONEON-NOSVE-NEXT: sub sp, sp, #96971; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96972; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]973; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]974; NONEON-NOSVE-NEXT: stp q2, q3, [sp]975; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]976; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63]977; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47]978; NONEON-NOSVE-NEXT: lsr w8, w9, w8979; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46]980; NONEON-NOSVE-NEXT: strb w8, [sp, #95]981; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62]982; NONEON-NOSVE-NEXT: lsr w8, w9, w8983; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45]984; NONEON-NOSVE-NEXT: strb w8, [sp, #94]985; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61]986; NONEON-NOSVE-NEXT: lsr w8, w9, w8987; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44]988; NONEON-NOSVE-NEXT: strb w8, [sp, #93]989; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60]990; NONEON-NOSVE-NEXT: lsr w8, w9, w8991; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43]992; NONEON-NOSVE-NEXT: strb w8, [sp, #92]993; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59]994; NONEON-NOSVE-NEXT: lsr w8, w9, w8995; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42]996; NONEON-NOSVE-NEXT: strb w8, [sp, #91]997; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58]998; NONEON-NOSVE-NEXT: lsr w8, w9, w8999; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41]1000; NONEON-NOSVE-NEXT: strb w8, [sp, #90]1001; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57]1002; NONEON-NOSVE-NEXT: lsr w8, w9, w81003; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40]1004; NONEON-NOSVE-NEXT: strb w8, [sp, #89]1005; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56]1006; NONEON-NOSVE-NEXT: lsr w8, w9, w81007; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39]1008; NONEON-NOSVE-NEXT: strb w8, [sp, #88]1009; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55]1010; NONEON-NOSVE-NEXT: lsr w8, w9, w81011; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38]1012; NONEON-NOSVE-NEXT: strb w8, [sp, #87]1013; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54]1014; NONEON-NOSVE-NEXT: lsr w8, w9, w81015; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37]1016; NONEON-NOSVE-NEXT: strb w8, [sp, #86]1017; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53]1018; NONEON-NOSVE-NEXT: lsr w8, w9, w81019; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36]1020; NONEON-NOSVE-NEXT: strb w8, [sp, #85]1021; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52]1022; NONEON-NOSVE-NEXT: lsr w8, w9, w81023; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35]1024; NONEON-NOSVE-NEXT: strb w8, [sp, #84]1025; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51]1026; NONEON-NOSVE-NEXT: lsr w8, w9, w81027; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34]1028; NONEON-NOSVE-NEXT: strb w8, [sp, #83]1029; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50]1030; NONEON-NOSVE-NEXT: lsr w8, w9, w81031; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33]1032; NONEON-NOSVE-NEXT: strb w8, [sp, #82]1033; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49]1034; NONEON-NOSVE-NEXT: lsr w8, w9, w81035; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32]1036; NONEON-NOSVE-NEXT: strb w8, [sp, #81]1037; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48]1038; NONEON-NOSVE-NEXT: lsr w8, w9, w81039; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1040; NONEON-NOSVE-NEXT: strb w8, [sp, #80]1041; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]1042; NONEON-NOSVE-NEXT: lsr w8, w9, w81043; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1044; NONEON-NOSVE-NEXT: strb w8, [sp, #79]1045; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]1046; NONEON-NOSVE-NEXT: lsr w8, w9, w81047; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1048; NONEON-NOSVE-NEXT: strb w8, [sp, #78]1049; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]1050; NONEON-NOSVE-NEXT: lsr w8, w9, w81051; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1052; NONEON-NOSVE-NEXT: strb w8, [sp, #77]1053; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]1054; NONEON-NOSVE-NEXT: lsr w8, w9, w81055; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1056; NONEON-NOSVE-NEXT: strb w8, [sp, #76]1057; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]1058; NONEON-NOSVE-NEXT: lsr w8, w9, w81059; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1060; NONEON-NOSVE-NEXT: strb w8, [sp, #75]1061; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]1062; NONEON-NOSVE-NEXT: lsr w8, w9, w81063; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1064; NONEON-NOSVE-NEXT: strb w8, [sp, #74]1065; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]1066; NONEON-NOSVE-NEXT: lsr w8, w9, w81067; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1068; NONEON-NOSVE-NEXT: strb w8, [sp, #73]1069; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]1070; NONEON-NOSVE-NEXT: lsr w8, w9, w81071; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1072; NONEON-NOSVE-NEXT: strb w8, [sp, #72]1073; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1074; NONEON-NOSVE-NEXT: lsr w8, w9, w81075; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]1076; NONEON-NOSVE-NEXT: strb w8, [sp, #71]1077; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1078; NONEON-NOSVE-NEXT: lsr w8, w9, w81079; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]1080; NONEON-NOSVE-NEXT: strb w8, [sp, #70]1081; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1082; NONEON-NOSVE-NEXT: lsr w8, w9, w81083; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]1084; NONEON-NOSVE-NEXT: strb w8, [sp, #69]1085; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1086; NONEON-NOSVE-NEXT: lsr w8, w9, w81087; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1088; NONEON-NOSVE-NEXT: strb w8, [sp, #68]1089; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1090; NONEON-NOSVE-NEXT: lsr w8, w9, w81091; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]1092; NONEON-NOSVE-NEXT: strb w8, [sp, #67]1093; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1094; NONEON-NOSVE-NEXT: lsr w8, w9, w81095; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]1096; NONEON-NOSVE-NEXT: strb w8, [sp, #66]1097; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1098; NONEON-NOSVE-NEXT: lsr w8, w9, w81099; NONEON-NOSVE-NEXT: ldrb w9, [sp]1100; NONEON-NOSVE-NEXT: strb w8, [sp, #65]1101; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1102; NONEON-NOSVE-NEXT: lsr w8, w9, w81103; NONEON-NOSVE-NEXT: strb w8, [sp, #64]1104; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1105; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1106; NONEON-NOSVE-NEXT: add sp, sp, #961107; NONEON-NOSVE-NEXT: ret1108 %op1 = load <32 x i8>, ptr %a1109 %op2 = load <32 x i8>, ptr %b1110 %res = lshr <32 x i8> %op1, %op21111 store <32 x i8> %res, ptr %a1112 ret void1113}1114 1115define <2 x i16> @lshr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {1116; CHECK-LABEL: lshr_v2i16:1117; CHECK: // %bb.0:1118; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11119; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01120; CHECK-NEXT: ptrue p0.s, vl21121; CHECK-NEXT: and z1.s, z1.s, #0xffff1122; CHECK-NEXT: and z0.s, z0.s, #0xffff1123; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s1124; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01125; CHECK-NEXT: ret1126;1127; NONEON-NOSVE-LABEL: lshr_v2i16:1128; NONEON-NOSVE: // %bb.0:1129; NONEON-NOSVE-NEXT: sub sp, sp, #321130; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321131; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1132; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1133; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1134; NONEON-NOSVE-NEXT: ldrh w10, [sp, #16]1135; NONEON-NOSVE-NEXT: ldrh w11, [sp, #8]1136; NONEON-NOSVE-NEXT: lsr w8, w9, w81137; NONEON-NOSVE-NEXT: lsr w9, w11, w101138; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #24]1139; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1140; NONEON-NOSVE-NEXT: add sp, sp, #321141; NONEON-NOSVE-NEXT: ret1142 %res = lshr <2 x i16> %op1, %op21143 ret <2 x i16> %res1144}1145 1146define <4 x i16> @lshr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {1147; CHECK-LABEL: lshr_v4i16:1148; CHECK: // %bb.0:1149; CHECK-NEXT: ptrue p0.h, vl41150; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01151; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11152; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h1153; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01154; CHECK-NEXT: ret1155;1156; NONEON-NOSVE-LABEL: lshr_v4i16:1157; NONEON-NOSVE: // %bb.0:1158; NONEON-NOSVE-NEXT: sub sp, sp, #321159; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321160; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1161; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1162; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1163; NONEON-NOSVE-NEXT: lsr w8, w9, w81164; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1165; NONEON-NOSVE-NEXT: strh w8, [sp, #30]1166; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1167; NONEON-NOSVE-NEXT: lsr w8, w9, w81168; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1169; NONEON-NOSVE-NEXT: strh w8, [sp, #28]1170; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1171; NONEON-NOSVE-NEXT: lsr w8, w9, w81172; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1173; NONEON-NOSVE-NEXT: strh w8, [sp, #26]1174; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]1175; NONEON-NOSVE-NEXT: lsr w8, w9, w81176; NONEON-NOSVE-NEXT: strh w8, [sp, #24]1177; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1178; NONEON-NOSVE-NEXT: add sp, sp, #321179; NONEON-NOSVE-NEXT: ret1180 %res = lshr <4 x i16> %op1, %op21181 ret <4 x i16> %res1182}1183 1184define <8 x i16> @lshr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {1185; CHECK-LABEL: lshr_v8i16:1186; CHECK: // %bb.0:1187; CHECK-NEXT: ptrue p0.h, vl81188; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01189; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11190; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h1191; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01192; CHECK-NEXT: ret1193;1194; NONEON-NOSVE-LABEL: lshr_v8i16:1195; NONEON-NOSVE: // %bb.0:1196; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1197; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481198; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]1199; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1200; NONEON-NOSVE-NEXT: lsr w8, w9, w81201; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1202; NONEON-NOSVE-NEXT: strh w8, [sp, #46]1203; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]1204; NONEON-NOSVE-NEXT: lsr w8, w9, w81205; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1206; NONEON-NOSVE-NEXT: strh w8, [sp, #44]1207; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]1208; NONEON-NOSVE-NEXT: lsr w8, w9, w81209; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1210; NONEON-NOSVE-NEXT: strh w8, [sp, #42]1211; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]1212; NONEON-NOSVE-NEXT: lsr w8, w9, w81213; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]1214; NONEON-NOSVE-NEXT: strh w8, [sp, #40]1215; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1216; NONEON-NOSVE-NEXT: lsr w8, w9, w81217; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]1218; NONEON-NOSVE-NEXT: strh w8, [sp, #38]1219; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1220; NONEON-NOSVE-NEXT: lsr w8, w9, w81221; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]1222; NONEON-NOSVE-NEXT: strh w8, [sp, #36]1223; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1224; NONEON-NOSVE-NEXT: lsr w8, w9, w81225; NONEON-NOSVE-NEXT: ldrh w9, [sp]1226; NONEON-NOSVE-NEXT: strh w8, [sp, #34]1227; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]1228; NONEON-NOSVE-NEXT: lsr w8, w9, w81229; NONEON-NOSVE-NEXT: strh w8, [sp, #32]1230; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1231; NONEON-NOSVE-NEXT: add sp, sp, #481232; NONEON-NOSVE-NEXT: ret1233 %res = lshr <8 x i16> %op1, %op21234 ret <8 x i16> %res1235}1236 1237define void @lshr_v16i16(ptr %a, ptr %b) {1238; CHECK-LABEL: lshr_v16i16:1239; CHECK: // %bb.0:1240; CHECK-NEXT: ldp q0, q3, [x1]1241; CHECK-NEXT: ptrue p0.h, vl81242; CHECK-NEXT: ldp q1, q2, [x0]1243; CHECK-NEXT: lsrr z0.h, p0/m, z0.h, z1.h1244; CHECK-NEXT: lsr z2.h, p0/m, z2.h, z3.h1245; CHECK-NEXT: stp q0, q2, [x0]1246; CHECK-NEXT: ret1247;1248; NONEON-NOSVE-LABEL: lshr_v16i16:1249; NONEON-NOSVE: // %bb.0:1250; NONEON-NOSVE-NEXT: sub sp, sp, #961251; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961252; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1253; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1254; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1255; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1256; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]1257; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46]1258; NONEON-NOSVE-NEXT: lsr w8, w9, w81259; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44]1260; NONEON-NOSVE-NEXT: strh w8, [sp, #94]1261; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]1262; NONEON-NOSVE-NEXT: lsr w8, w9, w81263; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42]1264; NONEON-NOSVE-NEXT: strh w8, [sp, #92]1265; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]1266; NONEON-NOSVE-NEXT: lsr w8, w9, w81267; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40]1268; NONEON-NOSVE-NEXT: strh w8, [sp, #90]1269; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]1270; NONEON-NOSVE-NEXT: lsr w8, w9, w81271; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38]1272; NONEON-NOSVE-NEXT: strh w8, [sp, #88]1273; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]1274; NONEON-NOSVE-NEXT: lsr w8, w9, w81275; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36]1276; NONEON-NOSVE-NEXT: strh w8, [sp, #86]1277; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]1278; NONEON-NOSVE-NEXT: lsr w8, w9, w81279; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34]1280; NONEON-NOSVE-NEXT: strh w8, [sp, #84]1281; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]1282; NONEON-NOSVE-NEXT: lsr w8, w9, w81283; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32]1284; NONEON-NOSVE-NEXT: strh w8, [sp, #82]1285; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]1286; NONEON-NOSVE-NEXT: lsr w8, w9, w81287; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1288; NONEON-NOSVE-NEXT: strh w8, [sp, #80]1289; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]1290; NONEON-NOSVE-NEXT: lsr w8, w9, w81291; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1292; NONEON-NOSVE-NEXT: strh w8, [sp, #78]1293; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]1294; NONEON-NOSVE-NEXT: lsr w8, w9, w81295; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1296; NONEON-NOSVE-NEXT: strh w8, [sp, #76]1297; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]1298; NONEON-NOSVE-NEXT: lsr w8, w9, w81299; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1300; NONEON-NOSVE-NEXT: strh w8, [sp, #74]1301; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]1302; NONEON-NOSVE-NEXT: lsr w8, w9, w81303; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]1304; NONEON-NOSVE-NEXT: strh w8, [sp, #72]1305; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1306; NONEON-NOSVE-NEXT: lsr w8, w9, w81307; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]1308; NONEON-NOSVE-NEXT: strh w8, [sp, #70]1309; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1310; NONEON-NOSVE-NEXT: lsr w8, w9, w81311; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]1312; NONEON-NOSVE-NEXT: strh w8, [sp, #68]1313; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1314; NONEON-NOSVE-NEXT: lsr w8, w9, w81315; NONEON-NOSVE-NEXT: ldrh w9, [sp]1316; NONEON-NOSVE-NEXT: strh w8, [sp, #66]1317; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]1318; NONEON-NOSVE-NEXT: lsr w8, w9, w81319; NONEON-NOSVE-NEXT: strh w8, [sp, #64]1320; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1321; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1322; NONEON-NOSVE-NEXT: add sp, sp, #961323; NONEON-NOSVE-NEXT: ret1324 %op1 = load <16 x i16>, ptr %a1325 %op2 = load <16 x i16>, ptr %b1326 %res = lshr <16 x i16> %op1, %op21327 store <16 x i16> %res, ptr %a1328 ret void1329}1330 1331define <2 x i32> @lshr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {1332; CHECK-LABEL: lshr_v2i32:1333; CHECK: // %bb.0:1334; CHECK-NEXT: ptrue p0.s, vl21335; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01336; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11337; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s1338; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01339; CHECK-NEXT: ret1340;1341; NONEON-NOSVE-LABEL: lshr_v2i32:1342; NONEON-NOSVE: // %bb.0:1343; NONEON-NOSVE-NEXT: sub sp, sp, #321344; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321345; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1346; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1347; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1348; NONEON-NOSVE-NEXT: lsr w11, w10, w81349; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1350; NONEON-NOSVE-NEXT: lsr w8, w9, w81351; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]1352; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1353; NONEON-NOSVE-NEXT: add sp, sp, #321354; NONEON-NOSVE-NEXT: ret1355 %res = lshr <2 x i32> %op1, %op21356 ret <2 x i32> %res1357}1358 1359define <4 x i32> @lshr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {1360; CHECK-LABEL: lshr_v4i32:1361; CHECK: // %bb.0:1362; CHECK-NEXT: ptrue p0.s, vl41363; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01364; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11365; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s1366; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01367; CHECK-NEXT: ret1368;1369; NONEON-NOSVE-LABEL: lshr_v4i32:1370; NONEON-NOSVE: // %bb.0:1371; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1372; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481373; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1374; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]1375; NONEON-NOSVE-NEXT: lsr w11, w10, w81376; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]1377; NONEON-NOSVE-NEXT: lsr w8, w9, w81378; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]1379; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]1380; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1381; NONEON-NOSVE-NEXT: lsr w11, w10, w81382; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1383; NONEON-NOSVE-NEXT: lsr w8, w9, w81384; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]1385; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1386; NONEON-NOSVE-NEXT: add sp, sp, #481387; NONEON-NOSVE-NEXT: ret1388 %res = lshr <4 x i32> %op1, %op21389 ret <4 x i32> %res1390}1391 1392define void @lshr_v8i32(ptr %a, ptr %b) {1393; CHECK-LABEL: lshr_v8i32:1394; CHECK: // %bb.0:1395; CHECK-NEXT: ldp q0, q3, [x1]1396; CHECK-NEXT: ptrue p0.s, vl41397; CHECK-NEXT: ldp q1, q2, [x0]1398; CHECK-NEXT: lsrr z0.s, p0/m, z0.s, z1.s1399; CHECK-NEXT: lsr z2.s, p0/m, z2.s, z3.s1400; CHECK-NEXT: stp q0, q2, [x0]1401; CHECK-NEXT: ret1402;1403; NONEON-NOSVE-LABEL: lshr_v8i32:1404; NONEON-NOSVE: // %bb.0:1405; NONEON-NOSVE-NEXT: sub sp, sp, #961406; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961407; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1408; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1409; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1410; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1411; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]1412; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]1413; NONEON-NOSVE-NEXT: lsr w11, w10, w81414; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]1415; NONEON-NOSVE-NEXT: lsr w8, w9, w81416; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]1417; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]1418; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]1419; NONEON-NOSVE-NEXT: lsr w11, w10, w81420; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]1421; NONEON-NOSVE-NEXT: lsr w8, w9, w81422; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1423; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]1424; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]1425; NONEON-NOSVE-NEXT: lsr w11, w10, w81426; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]1427; NONEON-NOSVE-NEXT: lsr w8, w9, w81428; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]1429; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]1430; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1431; NONEON-NOSVE-NEXT: lsr w11, w10, w81432; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1433; NONEON-NOSVE-NEXT: lsr w8, w9, w81434; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]1435; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1436; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1437; NONEON-NOSVE-NEXT: add sp, sp, #961438; NONEON-NOSVE-NEXT: ret1439 %op1 = load <8 x i32>, ptr %a1440 %op2 = load <8 x i32>, ptr %b1441 %res = lshr <8 x i32> %op1, %op21442 store <8 x i32> %res, ptr %a1443 ret void1444}1445 1446define <1 x i64> @lshr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {1447; CHECK-LABEL: lshr_v1i64:1448; CHECK: // %bb.0:1449; CHECK-NEXT: ptrue p0.d, vl11450; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01451; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11452; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d1453; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01454; CHECK-NEXT: ret1455;1456; NONEON-NOSVE-LABEL: lshr_v1i64:1457; NONEON-NOSVE: // %bb.0:1458; NONEON-NOSVE-NEXT: sub sp, sp, #161459; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161460; NONEON-NOSVE-NEXT: fmov x8, d11461; NONEON-NOSVE-NEXT: fmov x9, d01462; NONEON-NOSVE-NEXT: lsr x8, x9, x81463; NONEON-NOSVE-NEXT: str x8, [sp, #8]1464; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]1465; NONEON-NOSVE-NEXT: add sp, sp, #161466; NONEON-NOSVE-NEXT: ret1467 %res = lshr <1 x i64> %op1, %op21468 ret <1 x i64> %res1469}1470 1471define <2 x i64> @lshr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {1472; CHECK-LABEL: lshr_v2i64:1473; CHECK: // %bb.0:1474; CHECK-NEXT: ptrue p0.d, vl21475; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01476; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11477; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d1478; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01479; CHECK-NEXT: ret1480;1481; NONEON-NOSVE-LABEL: lshr_v2i64:1482; NONEON-NOSVE: // %bb.0:1483; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1484; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481485; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]1486; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]1487; NONEON-NOSVE-NEXT: lsr x11, x10, x81488; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]1489; NONEON-NOSVE-NEXT: lsr x8, x9, x81490; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]1491; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1492; NONEON-NOSVE-NEXT: add sp, sp, #481493; NONEON-NOSVE-NEXT: ret1494 %res = lshr <2 x i64> %op1, %op21495 ret <2 x i64> %res1496}1497 1498define void @lshr_v4i64(ptr %a, ptr %b) {1499; CHECK-LABEL: lshr_v4i64:1500; CHECK: // %bb.0:1501; CHECK-NEXT: ldp q0, q3, [x1]1502; CHECK-NEXT: ptrue p0.d, vl21503; CHECK-NEXT: ldp q1, q2, [x0]1504; CHECK-NEXT: lsrr z0.d, p0/m, z0.d, z1.d1505; CHECK-NEXT: lsr z2.d, p0/m, z2.d, z3.d1506; CHECK-NEXT: stp q0, q2, [x0]1507; CHECK-NEXT: ret1508;1509; NONEON-NOSVE-LABEL: lshr_v4i64:1510; NONEON-NOSVE: // %bb.0:1511; NONEON-NOSVE-NEXT: sub sp, sp, #961512; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961513; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1514; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1515; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1516; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1517; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]1518; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]1519; NONEON-NOSVE-NEXT: lsr x11, x10, x81520; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]1521; NONEON-NOSVE-NEXT: lsr x8, x9, x81522; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]1523; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]1524; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]1525; NONEON-NOSVE-NEXT: lsr x11, x10, x81526; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]1527; NONEON-NOSVE-NEXT: lsr x8, x9, x81528; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]1529; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1530; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1531; NONEON-NOSVE-NEXT: add sp, sp, #961532; NONEON-NOSVE-NEXT: ret1533 %op1 = load <4 x i64>, ptr %a1534 %op2 = load <4 x i64>, ptr %b1535 %res = lshr <4 x i64> %op1, %op21536 store <4 x i64> %res, ptr %a1537 ret void1538}1539 1540;1541; SHL1542;1543 1544define <2 x i8> @shl_v2i8(<2 x i8> %op1, <2 x i8> %op2) {1545; CHECK-LABEL: shl_v2i8:1546; CHECK: // %bb.0:1547; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11548; CHECK-NEXT: ptrue p0.s, vl21549; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01550; CHECK-NEXT: and z1.s, z1.s, #0xff1551; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s1552; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01553; CHECK-NEXT: ret1554;1555; NONEON-NOSVE-LABEL: shl_v2i8:1556; NONEON-NOSVE: // %bb.0:1557; NONEON-NOSVE-NEXT: sub sp, sp, #321558; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321559; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1560; NONEON-NOSVE-NEXT: ldrb w9, [sp, #20]1561; NONEON-NOSVE-NEXT: ldr w10, [sp, #12]1562; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1563; NONEON-NOSVE-NEXT: lsl w11, w10, w91564; NONEON-NOSVE-NEXT: ldr w9, [sp, #8]1565; NONEON-NOSVE-NEXT: lsl w8, w9, w81566; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]1567; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1568; NONEON-NOSVE-NEXT: add sp, sp, #321569; NONEON-NOSVE-NEXT: ret1570 %res = shl <2 x i8> %op1, %op21571 ret <2 x i8> %res1572}1573 1574define <4 x i8> @shl_v4i8(<4 x i8> %op1, <4 x i8> %op2) {1575; CHECK-LABEL: shl_v4i8:1576; CHECK: // %bb.0:1577; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11578; CHECK-NEXT: ptrue p0.h, vl41579; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01580; CHECK-NEXT: and z1.h, z1.h, #0xff1581; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h1582; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01583; CHECK-NEXT: ret1584;1585; NONEON-NOSVE-LABEL: shl_v4i8:1586; NONEON-NOSVE: // %bb.0:1587; NONEON-NOSVE-NEXT: sub sp, sp, #321588; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321589; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1590; NONEON-NOSVE-NEXT: ldrb w11, [sp, #22]1591; NONEON-NOSVE-NEXT: ldrh w12, [sp, #14]1592; NONEON-NOSVE-NEXT: ldrb w10, [sp, #20]1593; NONEON-NOSVE-NEXT: ldrb w9, [sp, #18]1594; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1595; NONEON-NOSVE-NEXT: lsl w11, w12, w111596; NONEON-NOSVE-NEXT: strh w11, [sp, #30]1597; NONEON-NOSVE-NEXT: ldrh w11, [sp, #12]1598; NONEON-NOSVE-NEXT: lsl w10, w11, w101599; NONEON-NOSVE-NEXT: strh w10, [sp, #28]1600; NONEON-NOSVE-NEXT: ldrh w10, [sp, #10]1601; NONEON-NOSVE-NEXT: lsl w9, w10, w91602; NONEON-NOSVE-NEXT: strh w9, [sp, #26]1603; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1604; NONEON-NOSVE-NEXT: lsl w8, w9, w81605; NONEON-NOSVE-NEXT: strh w8, [sp, #24]1606; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1607; NONEON-NOSVE-NEXT: add sp, sp, #321608; NONEON-NOSVE-NEXT: ret1609 %res = shl <4 x i8> %op1, %op21610 ret <4 x i8> %res1611}1612 1613define <8 x i8> @shl_v8i8(<8 x i8> %op1, <8 x i8> %op2) {1614; CHECK-LABEL: shl_v8i8:1615; CHECK: // %bb.0:1616; CHECK-NEXT: ptrue p0.b, vl81617; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01618; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11619; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b1620; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01621; CHECK-NEXT: ret1622;1623; NONEON-NOSVE-LABEL: shl_v8i8:1624; NONEON-NOSVE: // %bb.0:1625; NONEON-NOSVE-NEXT: sub sp, sp, #321626; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321627; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1628; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1629; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1630; NONEON-NOSVE-NEXT: lsl w8, w9, w81631; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1632; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1633; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1634; NONEON-NOSVE-NEXT: lsl w8, w9, w81635; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1636; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1637; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1638; NONEON-NOSVE-NEXT: lsl w8, w9, w81639; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1640; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1641; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1642; NONEON-NOSVE-NEXT: lsl w8, w9, w81643; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1644; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1645; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1646; NONEON-NOSVE-NEXT: lsl w8, w9, w81647; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1648; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1649; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1650; NONEON-NOSVE-NEXT: lsl w8, w9, w81651; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1652; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1653; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1654; NONEON-NOSVE-NEXT: lsl w8, w9, w81655; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1656; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1657; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1658; NONEON-NOSVE-NEXT: lsl w8, w9, w81659; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1660; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1661; NONEON-NOSVE-NEXT: add sp, sp, #321662; NONEON-NOSVE-NEXT: ret1663 %res = shl <8 x i8> %op1, %op21664 ret <8 x i8> %res1665}1666 1667define <16 x i8> @shl_v16i8(<16 x i8> %op1, <16 x i8> %op2) {1668; CHECK-LABEL: shl_v16i8:1669; CHECK: // %bb.0:1670; CHECK-NEXT: ptrue p0.b, vl161671; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01672; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11673; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b1674; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01675; CHECK-NEXT: ret1676;1677; NONEON-NOSVE-LABEL: shl_v16i8:1678; NONEON-NOSVE: // %bb.0:1679; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1680; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481681; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]1682; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1683; NONEON-NOSVE-NEXT: lsl w8, w9, w81684; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1685; NONEON-NOSVE-NEXT: strb w8, [sp, #47]1686; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]1687; NONEON-NOSVE-NEXT: lsl w8, w9, w81688; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1689; NONEON-NOSVE-NEXT: strb w8, [sp, #46]1690; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]1691; NONEON-NOSVE-NEXT: lsl w8, w9, w81692; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1693; NONEON-NOSVE-NEXT: strb w8, [sp, #45]1694; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]1695; NONEON-NOSVE-NEXT: lsl w8, w9, w81696; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1697; NONEON-NOSVE-NEXT: strb w8, [sp, #44]1698; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]1699; NONEON-NOSVE-NEXT: lsl w8, w9, w81700; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1701; NONEON-NOSVE-NEXT: strb w8, [sp, #43]1702; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]1703; NONEON-NOSVE-NEXT: lsl w8, w9, w81704; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1705; NONEON-NOSVE-NEXT: strb w8, [sp, #42]1706; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]1707; NONEON-NOSVE-NEXT: lsl w8, w9, w81708; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1709; NONEON-NOSVE-NEXT: strb w8, [sp, #41]1710; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]1711; NONEON-NOSVE-NEXT: lsl w8, w9, w81712; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1713; NONEON-NOSVE-NEXT: strb w8, [sp, #40]1714; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1715; NONEON-NOSVE-NEXT: lsl w8, w9, w81716; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]1717; NONEON-NOSVE-NEXT: strb w8, [sp, #39]1718; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1719; NONEON-NOSVE-NEXT: lsl w8, w9, w81720; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]1721; NONEON-NOSVE-NEXT: strb w8, [sp, #38]1722; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1723; NONEON-NOSVE-NEXT: lsl w8, w9, w81724; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]1725; NONEON-NOSVE-NEXT: strb w8, [sp, #37]1726; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1727; NONEON-NOSVE-NEXT: lsl w8, w9, w81728; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1729; NONEON-NOSVE-NEXT: strb w8, [sp, #36]1730; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1731; NONEON-NOSVE-NEXT: lsl w8, w9, w81732; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]1733; NONEON-NOSVE-NEXT: strb w8, [sp, #35]1734; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1735; NONEON-NOSVE-NEXT: lsl w8, w9, w81736; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]1737; NONEON-NOSVE-NEXT: strb w8, [sp, #34]1738; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1739; NONEON-NOSVE-NEXT: lsl w8, w9, w81740; NONEON-NOSVE-NEXT: ldrb w9, [sp]1741; NONEON-NOSVE-NEXT: strb w8, [sp, #33]1742; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1743; NONEON-NOSVE-NEXT: lsl w8, w9, w81744; NONEON-NOSVE-NEXT: strb w8, [sp, #32]1745; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1746; NONEON-NOSVE-NEXT: add sp, sp, #481747; NONEON-NOSVE-NEXT: ret1748 %res = shl <16 x i8> %op1, %op21749 ret <16 x i8> %res1750}1751 1752define void @shl_v32i8(ptr %a, ptr %b) {1753; CHECK-LABEL: shl_v32i8:1754; CHECK: // %bb.0:1755; CHECK-NEXT: ldp q0, q3, [x1]1756; CHECK-NEXT: ptrue p0.b, vl161757; CHECK-NEXT: ldp q1, q2, [x0]1758; CHECK-NEXT: lslr z0.b, p0/m, z0.b, z1.b1759; CHECK-NEXT: lsl z2.b, p0/m, z2.b, z3.b1760; CHECK-NEXT: stp q0, q2, [x0]1761; CHECK-NEXT: ret1762;1763; NONEON-NOSVE-LABEL: shl_v32i8:1764; NONEON-NOSVE: // %bb.0:1765; NONEON-NOSVE-NEXT: sub sp, sp, #961766; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961767; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1768; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1769; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1770; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1771; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63]1772; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47]1773; NONEON-NOSVE-NEXT: lsl w8, w9, w81774; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46]1775; NONEON-NOSVE-NEXT: strb w8, [sp, #95]1776; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62]1777; NONEON-NOSVE-NEXT: lsl w8, w9, w81778; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45]1779; NONEON-NOSVE-NEXT: strb w8, [sp, #94]1780; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61]1781; NONEON-NOSVE-NEXT: lsl w8, w9, w81782; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44]1783; NONEON-NOSVE-NEXT: strb w8, [sp, #93]1784; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60]1785; NONEON-NOSVE-NEXT: lsl w8, w9, w81786; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43]1787; NONEON-NOSVE-NEXT: strb w8, [sp, #92]1788; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59]1789; NONEON-NOSVE-NEXT: lsl w8, w9, w81790; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42]1791; NONEON-NOSVE-NEXT: strb w8, [sp, #91]1792; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58]1793; NONEON-NOSVE-NEXT: lsl w8, w9, w81794; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41]1795; NONEON-NOSVE-NEXT: strb w8, [sp, #90]1796; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57]1797; NONEON-NOSVE-NEXT: lsl w8, w9, w81798; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40]1799; NONEON-NOSVE-NEXT: strb w8, [sp, #89]1800; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56]1801; NONEON-NOSVE-NEXT: lsl w8, w9, w81802; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39]1803; NONEON-NOSVE-NEXT: strb w8, [sp, #88]1804; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55]1805; NONEON-NOSVE-NEXT: lsl w8, w9, w81806; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38]1807; NONEON-NOSVE-NEXT: strb w8, [sp, #87]1808; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54]1809; NONEON-NOSVE-NEXT: lsl w8, w9, w81810; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37]1811; NONEON-NOSVE-NEXT: strb w8, [sp, #86]1812; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53]1813; NONEON-NOSVE-NEXT: lsl w8, w9, w81814; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36]1815; NONEON-NOSVE-NEXT: strb w8, [sp, #85]1816; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52]1817; NONEON-NOSVE-NEXT: lsl w8, w9, w81818; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35]1819; NONEON-NOSVE-NEXT: strb w8, [sp, #84]1820; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51]1821; NONEON-NOSVE-NEXT: lsl w8, w9, w81822; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34]1823; NONEON-NOSVE-NEXT: strb w8, [sp, #83]1824; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50]1825; NONEON-NOSVE-NEXT: lsl w8, w9, w81826; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33]1827; NONEON-NOSVE-NEXT: strb w8, [sp, #82]1828; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49]1829; NONEON-NOSVE-NEXT: lsl w8, w9, w81830; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32]1831; NONEON-NOSVE-NEXT: strb w8, [sp, #81]1832; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48]1833; NONEON-NOSVE-NEXT: lsl w8, w9, w81834; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1835; NONEON-NOSVE-NEXT: strb w8, [sp, #80]1836; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]1837; NONEON-NOSVE-NEXT: lsl w8, w9, w81838; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1839; NONEON-NOSVE-NEXT: strb w8, [sp, #79]1840; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]1841; NONEON-NOSVE-NEXT: lsl w8, w9, w81842; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1843; NONEON-NOSVE-NEXT: strb w8, [sp, #78]1844; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]1845; NONEON-NOSVE-NEXT: lsl w8, w9, w81846; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1847; NONEON-NOSVE-NEXT: strb w8, [sp, #77]1848; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]1849; NONEON-NOSVE-NEXT: lsl w8, w9, w81850; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1851; NONEON-NOSVE-NEXT: strb w8, [sp, #76]1852; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]1853; NONEON-NOSVE-NEXT: lsl w8, w9, w81854; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1855; NONEON-NOSVE-NEXT: strb w8, [sp, #75]1856; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]1857; NONEON-NOSVE-NEXT: lsl w8, w9, w81858; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1859; NONEON-NOSVE-NEXT: strb w8, [sp, #74]1860; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]1861; NONEON-NOSVE-NEXT: lsl w8, w9, w81862; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1863; NONEON-NOSVE-NEXT: strb w8, [sp, #73]1864; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]1865; NONEON-NOSVE-NEXT: lsl w8, w9, w81866; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1867; NONEON-NOSVE-NEXT: strb w8, [sp, #72]1868; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1869; NONEON-NOSVE-NEXT: lsl w8, w9, w81870; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]1871; NONEON-NOSVE-NEXT: strb w8, [sp, #71]1872; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1873; NONEON-NOSVE-NEXT: lsl w8, w9, w81874; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]1875; NONEON-NOSVE-NEXT: strb w8, [sp, #70]1876; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1877; NONEON-NOSVE-NEXT: lsl w8, w9, w81878; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]1879; NONEON-NOSVE-NEXT: strb w8, [sp, #69]1880; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1881; NONEON-NOSVE-NEXT: lsl w8, w9, w81882; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1883; NONEON-NOSVE-NEXT: strb w8, [sp, #68]1884; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1885; NONEON-NOSVE-NEXT: lsl w8, w9, w81886; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]1887; NONEON-NOSVE-NEXT: strb w8, [sp, #67]1888; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1889; NONEON-NOSVE-NEXT: lsl w8, w9, w81890; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]1891; NONEON-NOSVE-NEXT: strb w8, [sp, #66]1892; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1893; NONEON-NOSVE-NEXT: lsl w8, w9, w81894; NONEON-NOSVE-NEXT: ldrb w9, [sp]1895; NONEON-NOSVE-NEXT: strb w8, [sp, #65]1896; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1897; NONEON-NOSVE-NEXT: lsl w8, w9, w81898; NONEON-NOSVE-NEXT: strb w8, [sp, #64]1899; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1900; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1901; NONEON-NOSVE-NEXT: add sp, sp, #961902; NONEON-NOSVE-NEXT: ret1903 %op1 = load <32 x i8>, ptr %a1904 %op2 = load <32 x i8>, ptr %b1905 %res = shl <32 x i8> %op1, %op21906 store <32 x i8> %res, ptr %a1907 ret void1908}1909 1910define <4 x i16> @shl_v4i16(<4 x i16> %op1, <4 x i16> %op2) {1911; CHECK-LABEL: shl_v4i16:1912; CHECK: // %bb.0:1913; CHECK-NEXT: ptrue p0.h, vl41914; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01915; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11916; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h1917; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01918; CHECK-NEXT: ret1919;1920; NONEON-NOSVE-LABEL: shl_v4i16:1921; NONEON-NOSVE: // %bb.0:1922; NONEON-NOSVE-NEXT: sub sp, sp, #321923; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321924; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1925; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1926; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1927; NONEON-NOSVE-NEXT: lsl w8, w9, w81928; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1929; NONEON-NOSVE-NEXT: strh w8, [sp, #30]1930; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1931; NONEON-NOSVE-NEXT: lsl w8, w9, w81932; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1933; NONEON-NOSVE-NEXT: strh w8, [sp, #28]1934; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1935; NONEON-NOSVE-NEXT: lsl w8, w9, w81936; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1937; NONEON-NOSVE-NEXT: strh w8, [sp, #26]1938; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]1939; NONEON-NOSVE-NEXT: lsl w8, w9, w81940; NONEON-NOSVE-NEXT: strh w8, [sp, #24]1941; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1942; NONEON-NOSVE-NEXT: add sp, sp, #321943; NONEON-NOSVE-NEXT: ret1944 %res = shl <4 x i16> %op1, %op21945 ret <4 x i16> %res1946}1947 1948define <8 x i16> @shl_v8i16(<8 x i16> %op1, <8 x i16> %op2) {1949; CHECK-LABEL: shl_v8i16:1950; CHECK: // %bb.0:1951; CHECK-NEXT: ptrue p0.h, vl81952; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01953; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11954; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h1955; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01956; CHECK-NEXT: ret1957;1958; NONEON-NOSVE-LABEL: shl_v8i16:1959; NONEON-NOSVE: // %bb.0:1960; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1961; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481962; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]1963; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1964; NONEON-NOSVE-NEXT: lsl w8, w9, w81965; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1966; NONEON-NOSVE-NEXT: strh w8, [sp, #46]1967; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]1968; NONEON-NOSVE-NEXT: lsl w8, w9, w81969; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1970; NONEON-NOSVE-NEXT: strh w8, [sp, #44]1971; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]1972; NONEON-NOSVE-NEXT: lsl w8, w9, w81973; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1974; NONEON-NOSVE-NEXT: strh w8, [sp, #42]1975; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]1976; NONEON-NOSVE-NEXT: lsl w8, w9, w81977; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]1978; NONEON-NOSVE-NEXT: strh w8, [sp, #40]1979; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1980; NONEON-NOSVE-NEXT: lsl w8, w9, w81981; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]1982; NONEON-NOSVE-NEXT: strh w8, [sp, #38]1983; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1984; NONEON-NOSVE-NEXT: lsl w8, w9, w81985; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]1986; NONEON-NOSVE-NEXT: strh w8, [sp, #36]1987; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1988; NONEON-NOSVE-NEXT: lsl w8, w9, w81989; NONEON-NOSVE-NEXT: ldrh w9, [sp]1990; NONEON-NOSVE-NEXT: strh w8, [sp, #34]1991; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]1992; NONEON-NOSVE-NEXT: lsl w8, w9, w81993; NONEON-NOSVE-NEXT: strh w8, [sp, #32]1994; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1995; NONEON-NOSVE-NEXT: add sp, sp, #481996; NONEON-NOSVE-NEXT: ret1997 %res = shl <8 x i16> %op1, %op21998 ret <8 x i16> %res1999}2000 2001define void @shl_v16i16(ptr %a, ptr %b) {2002; CHECK-LABEL: shl_v16i16:2003; CHECK: // %bb.0:2004; CHECK-NEXT: ldp q0, q3, [x1]2005; CHECK-NEXT: ptrue p0.h, vl82006; CHECK-NEXT: ldp q1, q2, [x0]2007; CHECK-NEXT: lslr z0.h, p0/m, z0.h, z1.h2008; CHECK-NEXT: lsl z2.h, p0/m, z2.h, z3.h2009; CHECK-NEXT: stp q0, q2, [x0]2010; CHECK-NEXT: ret2011;2012; NONEON-NOSVE-LABEL: shl_v16i16:2013; NONEON-NOSVE: // %bb.0:2014; NONEON-NOSVE-NEXT: sub sp, sp, #962015; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962016; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2017; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2018; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2019; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2020; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]2021; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46]2022; NONEON-NOSVE-NEXT: lsl w8, w9, w82023; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44]2024; NONEON-NOSVE-NEXT: strh w8, [sp, #94]2025; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]2026; NONEON-NOSVE-NEXT: lsl w8, w9, w82027; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42]2028; NONEON-NOSVE-NEXT: strh w8, [sp, #92]2029; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]2030; NONEON-NOSVE-NEXT: lsl w8, w9, w82031; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40]2032; NONEON-NOSVE-NEXT: strh w8, [sp, #90]2033; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]2034; NONEON-NOSVE-NEXT: lsl w8, w9, w82035; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38]2036; NONEON-NOSVE-NEXT: strh w8, [sp, #88]2037; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]2038; NONEON-NOSVE-NEXT: lsl w8, w9, w82039; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36]2040; NONEON-NOSVE-NEXT: strh w8, [sp, #86]2041; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]2042; NONEON-NOSVE-NEXT: lsl w8, w9, w82043; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34]2044; NONEON-NOSVE-NEXT: strh w8, [sp, #84]2045; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]2046; NONEON-NOSVE-NEXT: lsl w8, w9, w82047; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32]2048; NONEON-NOSVE-NEXT: strh w8, [sp, #82]2049; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]2050; NONEON-NOSVE-NEXT: lsl w8, w9, w82051; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2052; NONEON-NOSVE-NEXT: strh w8, [sp, #80]2053; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]2054; NONEON-NOSVE-NEXT: lsl w8, w9, w82055; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2056; NONEON-NOSVE-NEXT: strh w8, [sp, #78]2057; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]2058; NONEON-NOSVE-NEXT: lsl w8, w9, w82059; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2060; NONEON-NOSVE-NEXT: strh w8, [sp, #76]2061; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]2062; NONEON-NOSVE-NEXT: lsl w8, w9, w82063; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2064; NONEON-NOSVE-NEXT: strh w8, [sp, #74]2065; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]2066; NONEON-NOSVE-NEXT: lsl w8, w9, w82067; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]2068; NONEON-NOSVE-NEXT: strh w8, [sp, #72]2069; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2070; NONEON-NOSVE-NEXT: lsl w8, w9, w82071; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]2072; NONEON-NOSVE-NEXT: strh w8, [sp, #70]2073; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2074; NONEON-NOSVE-NEXT: lsl w8, w9, w82075; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]2076; NONEON-NOSVE-NEXT: strh w8, [sp, #68]2077; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2078; NONEON-NOSVE-NEXT: lsl w8, w9, w82079; NONEON-NOSVE-NEXT: ldrh w9, [sp]2080; NONEON-NOSVE-NEXT: strh w8, [sp, #66]2081; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2082; NONEON-NOSVE-NEXT: lsl w8, w9, w82083; NONEON-NOSVE-NEXT: strh w8, [sp, #64]2084; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2085; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2086; NONEON-NOSVE-NEXT: add sp, sp, #962087; NONEON-NOSVE-NEXT: ret2088 %op1 = load <16 x i16>, ptr %a2089 %op2 = load <16 x i16>, ptr %b2090 %res = shl <16 x i16> %op1, %op22091 store <16 x i16> %res, ptr %a2092 ret void2093}2094 2095define <2 x i32> @shl_v2i32(<2 x i32> %op1, <2 x i32> %op2) {2096; CHECK-LABEL: shl_v2i32:2097; CHECK: // %bb.0:2098; CHECK-NEXT: ptrue p0.s, vl22099; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02100; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12101; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s2102; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02103; CHECK-NEXT: ret2104;2105; NONEON-NOSVE-LABEL: shl_v2i32:2106; NONEON-NOSVE: // %bb.0:2107; NONEON-NOSVE-NEXT: sub sp, sp, #322108; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322109; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2110; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2111; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2112; NONEON-NOSVE-NEXT: lsl w11, w10, w82113; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2114; NONEON-NOSVE-NEXT: lsl w8, w9, w82115; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]2116; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2117; NONEON-NOSVE-NEXT: add sp, sp, #322118; NONEON-NOSVE-NEXT: ret2119 %res = shl <2 x i32> %op1, %op22120 ret <2 x i32> %res2121}2122 2123define <4 x i32> @shl_v4i32(<4 x i32> %op1, <4 x i32> %op2) {2124; CHECK-LABEL: shl_v4i32:2125; CHECK: // %bb.0:2126; CHECK-NEXT: ptrue p0.s, vl42127; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02128; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12129; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s2130; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02131; CHECK-NEXT: ret2132;2133; NONEON-NOSVE-LABEL: shl_v4i32:2134; NONEON-NOSVE: // %bb.0:2135; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2136; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482137; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2138; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]2139; NONEON-NOSVE-NEXT: lsl w11, w10, w82140; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]2141; NONEON-NOSVE-NEXT: lsl w8, w9, w82142; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]2143; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]2144; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2145; NONEON-NOSVE-NEXT: lsl w11, w10, w82146; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2147; NONEON-NOSVE-NEXT: lsl w8, w9, w82148; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]2149; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2150; NONEON-NOSVE-NEXT: add sp, sp, #482151; NONEON-NOSVE-NEXT: ret2152 %res = shl <4 x i32> %op1, %op22153 ret <4 x i32> %res2154}2155 2156define void @shl_v8i32(ptr %a, ptr %b) {2157; CHECK-LABEL: shl_v8i32:2158; CHECK: // %bb.0:2159; CHECK-NEXT: ldp q0, q3, [x1]2160; CHECK-NEXT: ptrue p0.s, vl42161; CHECK-NEXT: ldp q1, q2, [x0]2162; CHECK-NEXT: lslr z0.s, p0/m, z0.s, z1.s2163; CHECK-NEXT: lsl z2.s, p0/m, z2.s, z3.s2164; CHECK-NEXT: stp q0, q2, [x0]2165; CHECK-NEXT: ret2166;2167; NONEON-NOSVE-LABEL: shl_v8i32:2168; NONEON-NOSVE: // %bb.0:2169; NONEON-NOSVE-NEXT: sub sp, sp, #962170; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962171; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2172; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2173; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2174; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2175; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]2176; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]2177; NONEON-NOSVE-NEXT: lsl w11, w10, w82178; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]2179; NONEON-NOSVE-NEXT: lsl w8, w9, w82180; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]2181; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]2182; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]2183; NONEON-NOSVE-NEXT: lsl w11, w10, w82184; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]2185; NONEON-NOSVE-NEXT: lsl w8, w9, w82186; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2187; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]2188; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]2189; NONEON-NOSVE-NEXT: lsl w11, w10, w82190; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]2191; NONEON-NOSVE-NEXT: lsl w8, w9, w82192; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]2193; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]2194; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2195; NONEON-NOSVE-NEXT: lsl w11, w10, w82196; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2197; NONEON-NOSVE-NEXT: lsl w8, w9, w82198; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]2199; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2200; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2201; NONEON-NOSVE-NEXT: add sp, sp, #962202; NONEON-NOSVE-NEXT: ret2203 %op1 = load <8 x i32>, ptr %a2204 %op2 = load <8 x i32>, ptr %b2205 %res = shl <8 x i32> %op1, %op22206 store <8 x i32> %res, ptr %a2207 ret void2208}2209 2210define <1 x i64> @shl_v1i64(<1 x i64> %op1, <1 x i64> %op2) {2211; CHECK-LABEL: shl_v1i64:2212; CHECK: // %bb.0:2213; CHECK-NEXT: ptrue p0.d, vl12214; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02215; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12216; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d2217; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02218; CHECK-NEXT: ret2219;2220; NONEON-NOSVE-LABEL: shl_v1i64:2221; NONEON-NOSVE: // %bb.0:2222; NONEON-NOSVE-NEXT: sub sp, sp, #162223; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162224; NONEON-NOSVE-NEXT: fmov x8, d12225; NONEON-NOSVE-NEXT: fmov x9, d02226; NONEON-NOSVE-NEXT: lsl x8, x9, x82227; NONEON-NOSVE-NEXT: str x8, [sp, #8]2228; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2229; NONEON-NOSVE-NEXT: add sp, sp, #162230; NONEON-NOSVE-NEXT: ret2231 %res = shl <1 x i64> %op1, %op22232 ret <1 x i64> %res2233}2234 2235define <2 x i64> @shl_v2i64(<2 x i64> %op1, <2 x i64> %op2) {2236; CHECK-LABEL: shl_v2i64:2237; CHECK: // %bb.0:2238; CHECK-NEXT: ptrue p0.d, vl22239; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02240; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12241; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d2242; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02243; CHECK-NEXT: ret2244;2245; NONEON-NOSVE-LABEL: shl_v2i64:2246; NONEON-NOSVE: // %bb.0:2247; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2248; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482249; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]2250; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]2251; NONEON-NOSVE-NEXT: lsl x11, x10, x82252; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]2253; NONEON-NOSVE-NEXT: lsl x8, x9, x82254; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]2255; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2256; NONEON-NOSVE-NEXT: add sp, sp, #482257; NONEON-NOSVE-NEXT: ret2258 %res = shl <2 x i64> %op1, %op22259 ret <2 x i64> %res2260}2261 2262define void @shl_v4i64(ptr %a, ptr %b) {2263; CHECK-LABEL: shl_v4i64:2264; CHECK: // %bb.0:2265; CHECK-NEXT: ldp q0, q3, [x1]2266; CHECK-NEXT: ptrue p0.d, vl22267; CHECK-NEXT: ldp q1, q2, [x0]2268; CHECK-NEXT: lslr z0.d, p0/m, z0.d, z1.d2269; CHECK-NEXT: lsl z2.d, p0/m, z2.d, z3.d2270; CHECK-NEXT: stp q0, q2, [x0]2271; CHECK-NEXT: ret2272;2273; NONEON-NOSVE-LABEL: shl_v4i64:2274; NONEON-NOSVE: // %bb.0:2275; NONEON-NOSVE-NEXT: sub sp, sp, #962276; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962277; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2278; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2279; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2280; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2281; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]2282; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]2283; NONEON-NOSVE-NEXT: lsl x11, x10, x82284; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]2285; NONEON-NOSVE-NEXT: lsl x8, x9, x82286; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]2287; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]2288; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]2289; NONEON-NOSVE-NEXT: lsl x11, x10, x82290; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]2291; NONEON-NOSVE-NEXT: lsl x8, x9, x82292; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]2293; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2294; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2295; NONEON-NOSVE-NEXT: add sp, sp, #962296; NONEON-NOSVE-NEXT: ret2297 %op1 = load <4 x i64>, ptr %a2298 %op2 = load <4 x i64>, ptr %b2299 %res = shl <4 x i64> %op1, %op22300 store <4 x i64> %res, ptr %a2301 ret void2302}2303