948 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 6 7target triple = "aarch64-unknown-linux-gnu"8 9define <4 x i8> @sdiv_v4i8(<4 x i8> %op1) {10; CHECK-LABEL: sdiv_v4i8:11; CHECK: // %bb.0:12; CHECK-NEXT: ptrue p0.h, vl413; CHECK-NEXT: // kill: def $d0 killed $d0 def $z014; CHECK-NEXT: sxtb z0.h, p0/m, z0.h15; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #516; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z017; CHECK-NEXT: ret18;19; NONEON-NOSVE-LABEL: sdiv_v4i8:20; NONEON-NOSVE: // %bb.0:21; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!22; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1623; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]24; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]25; NONEON-NOSVE-NEXT: ldrh w10, [sp, #2]26; NONEON-NOSVE-NEXT: ldrh w12, [sp]27; NONEON-NOSVE-NEXT: sxtb w11, w828; NONEON-NOSVE-NEXT: sxtb w13, w929; NONEON-NOSVE-NEXT: sxtb w14, w1030; NONEON-NOSVE-NEXT: sxtb w15, w1231; NONEON-NOSVE-NEXT: ubfx w11, w11, #10, #532; NONEON-NOSVE-NEXT: ubfx w13, w13, #10, #533; NONEON-NOSVE-NEXT: ubfx w14, w14, #10, #534; NONEON-NOSVE-NEXT: add w8, w8, w1135; NONEON-NOSVE-NEXT: ubfx w11, w15, #10, #536; NONEON-NOSVE-NEXT: add w9, w9, w1337; NONEON-NOSVE-NEXT: sxtb w8, w838; NONEON-NOSVE-NEXT: add w10, w10, w1439; NONEON-NOSVE-NEXT: sxtb w9, w940; NONEON-NOSVE-NEXT: add w11, w12, w1141; NONEON-NOSVE-NEXT: sxtb w10, w1042; NONEON-NOSVE-NEXT: lsr w8, w8, #543; NONEON-NOSVE-NEXT: sxtb w11, w1144; NONEON-NOSVE-NEXT: lsr w9, w9, #545; NONEON-NOSVE-NEXT: lsr w10, w10, #546; NONEON-NOSVE-NEXT: strh w8, [sp, #14]47; NONEON-NOSVE-NEXT: lsr w8, w11, #548; NONEON-NOSVE-NEXT: strh w9, [sp, #12]49; NONEON-NOSVE-NEXT: strh w10, [sp, #10]50; NONEON-NOSVE-NEXT: strh w8, [sp, #8]51; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]52; NONEON-NOSVE-NEXT: add sp, sp, #1653; NONEON-NOSVE-NEXT: ret54 %res = sdiv <4 x i8> %op1, shufflevector (<4 x i8> insertelement (<4 x i8> poison, i8 32, i32 0), <4 x i8> poison, <4 x i32> zeroinitializer)55 ret <4 x i8> %res56}57 58define <8 x i8> @sdiv_v8i8(<8 x i8> %op1) {59; CHECK-LABEL: sdiv_v8i8:60; CHECK: // %bb.0:61; CHECK-NEXT: ptrue p0.b, vl862; CHECK-NEXT: // kill: def $d0 killed $d0 def $z063; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #564; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z065; CHECK-NEXT: ret66;67; NONEON-NOSVE-LABEL: sdiv_v8i8:68; NONEON-NOSVE: // %bb.0:69; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!70; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1671; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7]72; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #573; NONEON-NOSVE-NEXT: add w8, w8, w974; NONEON-NOSVE-NEXT: sxtb w8, w875; NONEON-NOSVE-NEXT: lsr w8, w8, #576; NONEON-NOSVE-NEXT: strb w8, [sp, #15]77; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6]78; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #579; NONEON-NOSVE-NEXT: add w8, w8, w980; NONEON-NOSVE-NEXT: sxtb w8, w881; NONEON-NOSVE-NEXT: lsr w8, w8, #582; NONEON-NOSVE-NEXT: strb w8, [sp, #14]83; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5]84; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #585; NONEON-NOSVE-NEXT: add w8, w8, w986; NONEON-NOSVE-NEXT: sxtb w8, w887; NONEON-NOSVE-NEXT: lsr w8, w8, #588; NONEON-NOSVE-NEXT: strb w8, [sp, #13]89; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4]90; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #591; NONEON-NOSVE-NEXT: add w8, w8, w992; NONEON-NOSVE-NEXT: sxtb w8, w893; NONEON-NOSVE-NEXT: lsr w8, w8, #594; NONEON-NOSVE-NEXT: strb w8, [sp, #12]95; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3]96; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #597; NONEON-NOSVE-NEXT: add w8, w8, w998; NONEON-NOSVE-NEXT: sxtb w8, w899; NONEON-NOSVE-NEXT: lsr w8, w8, #5100; NONEON-NOSVE-NEXT: strb w8, [sp, #11]101; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2]102; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5103; NONEON-NOSVE-NEXT: add w8, w8, w9104; NONEON-NOSVE-NEXT: sxtb w8, w8105; NONEON-NOSVE-NEXT: lsr w8, w8, #5106; NONEON-NOSVE-NEXT: strb w8, [sp, #10]107; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1]108; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5109; NONEON-NOSVE-NEXT: add w8, w8, w9110; NONEON-NOSVE-NEXT: sxtb w8, w8111; NONEON-NOSVE-NEXT: lsr w8, w8, #5112; NONEON-NOSVE-NEXT: strb w8, [sp, #9]113; NONEON-NOSVE-NEXT: ldrsb w8, [sp]114; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5115; NONEON-NOSVE-NEXT: add w8, w8, w9116; NONEON-NOSVE-NEXT: sxtb w8, w8117; NONEON-NOSVE-NEXT: lsr w8, w8, #5118; NONEON-NOSVE-NEXT: strb w8, [sp, #8]119; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]120; NONEON-NOSVE-NEXT: add sp, sp, #16121; NONEON-NOSVE-NEXT: ret122 %res = sdiv <8 x i8> %op1, shufflevector (<8 x i8> insertelement (<8 x i8> poison, i8 32, i32 0), <8 x i8> poison, <8 x i32> zeroinitializer)123 ret <8 x i8> %res124}125 126define <16 x i8> @sdiv_v16i8(<16 x i8> %op1) {127; CHECK-LABEL: sdiv_v16i8:128; CHECK: // %bb.0:129; CHECK-NEXT: ptrue p0.b, vl16130; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0131; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #5132; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0133; CHECK-NEXT: ret134;135; NONEON-NOSVE-LABEL: sdiv_v16i8:136; NONEON-NOSVE: // %bb.0:137; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!138; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32139; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15]140; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5141; NONEON-NOSVE-NEXT: add w8, w8, w9142; NONEON-NOSVE-NEXT: sxtb w8, w8143; NONEON-NOSVE-NEXT: lsr w8, w8, #5144; NONEON-NOSVE-NEXT: strb w8, [sp, #31]145; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14]146; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5147; NONEON-NOSVE-NEXT: add w8, w8, w9148; NONEON-NOSVE-NEXT: sxtb w8, w8149; NONEON-NOSVE-NEXT: lsr w8, w8, #5150; NONEON-NOSVE-NEXT: strb w8, [sp, #30]151; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13]152; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5153; NONEON-NOSVE-NEXT: add w8, w8, w9154; NONEON-NOSVE-NEXT: sxtb w8, w8155; NONEON-NOSVE-NEXT: lsr w8, w8, #5156; NONEON-NOSVE-NEXT: strb w8, [sp, #29]157; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12]158; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5159; NONEON-NOSVE-NEXT: add w8, w8, w9160; NONEON-NOSVE-NEXT: sxtb w8, w8161; NONEON-NOSVE-NEXT: lsr w8, w8, #5162; NONEON-NOSVE-NEXT: strb w8, [sp, #28]163; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11]164; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5165; NONEON-NOSVE-NEXT: add w8, w8, w9166; NONEON-NOSVE-NEXT: sxtb w8, w8167; NONEON-NOSVE-NEXT: lsr w8, w8, #5168; NONEON-NOSVE-NEXT: strb w8, [sp, #27]169; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10]170; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5171; NONEON-NOSVE-NEXT: add w8, w8, w9172; NONEON-NOSVE-NEXT: sxtb w8, w8173; NONEON-NOSVE-NEXT: lsr w8, w8, #5174; NONEON-NOSVE-NEXT: strb w8, [sp, #26]175; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9]176; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5177; NONEON-NOSVE-NEXT: add w8, w8, w9178; NONEON-NOSVE-NEXT: sxtb w8, w8179; NONEON-NOSVE-NEXT: lsr w8, w8, #5180; NONEON-NOSVE-NEXT: strb w8, [sp, #25]181; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8]182; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5183; NONEON-NOSVE-NEXT: add w8, w8, w9184; NONEON-NOSVE-NEXT: sxtb w8, w8185; NONEON-NOSVE-NEXT: lsr w8, w8, #5186; NONEON-NOSVE-NEXT: strb w8, [sp, #24]187; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7]188; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5189; NONEON-NOSVE-NEXT: add w8, w8, w9190; NONEON-NOSVE-NEXT: sxtb w8, w8191; NONEON-NOSVE-NEXT: lsr w8, w8, #5192; NONEON-NOSVE-NEXT: strb w8, [sp, #23]193; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6]194; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5195; NONEON-NOSVE-NEXT: add w8, w8, w9196; NONEON-NOSVE-NEXT: sxtb w8, w8197; NONEON-NOSVE-NEXT: lsr w8, w8, #5198; NONEON-NOSVE-NEXT: strb w8, [sp, #22]199; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5]200; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5201; NONEON-NOSVE-NEXT: add w8, w8, w9202; NONEON-NOSVE-NEXT: sxtb w8, w8203; NONEON-NOSVE-NEXT: lsr w8, w8, #5204; NONEON-NOSVE-NEXT: strb w8, [sp, #21]205; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4]206; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5207; NONEON-NOSVE-NEXT: add w8, w8, w9208; NONEON-NOSVE-NEXT: sxtb w8, w8209; NONEON-NOSVE-NEXT: lsr w8, w8, #5210; NONEON-NOSVE-NEXT: strb w8, [sp, #20]211; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3]212; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5213; NONEON-NOSVE-NEXT: add w8, w8, w9214; NONEON-NOSVE-NEXT: sxtb w8, w8215; NONEON-NOSVE-NEXT: lsr w8, w8, #5216; NONEON-NOSVE-NEXT: strb w8, [sp, #19]217; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2]218; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5219; NONEON-NOSVE-NEXT: add w8, w8, w9220; NONEON-NOSVE-NEXT: sxtb w8, w8221; NONEON-NOSVE-NEXT: lsr w8, w8, #5222; NONEON-NOSVE-NEXT: strb w8, [sp, #18]223; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1]224; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5225; NONEON-NOSVE-NEXT: add w8, w8, w9226; NONEON-NOSVE-NEXT: sxtb w8, w8227; NONEON-NOSVE-NEXT: lsr w8, w8, #5228; NONEON-NOSVE-NEXT: strb w8, [sp, #17]229; NONEON-NOSVE-NEXT: ldrsb w8, [sp]230; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5231; NONEON-NOSVE-NEXT: add w8, w8, w9232; NONEON-NOSVE-NEXT: sxtb w8, w8233; NONEON-NOSVE-NEXT: lsr w8, w8, #5234; NONEON-NOSVE-NEXT: strb w8, [sp, #16]235; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]236; NONEON-NOSVE-NEXT: add sp, sp, #32237; NONEON-NOSVE-NEXT: ret238 %res = sdiv <16 x i8> %op1, shufflevector (<16 x i8> insertelement (<16 x i8> poison, i8 32, i32 0), <16 x i8> poison, <16 x i32> zeroinitializer)239 ret <16 x i8> %res240}241 242define void @sdiv_v32i8(ptr %a) {243; CHECK-LABEL: sdiv_v32i8:244; CHECK: // %bb.0:245; CHECK-NEXT: ldp q0, q1, [x0]246; CHECK-NEXT: ptrue p0.b, vl16247; CHECK-NEXT: asrd z0.b, p0/m, z0.b, #5248; CHECK-NEXT: asrd z1.b, p0/m, z1.b, #5249; CHECK-NEXT: stp q0, q1, [x0]250; CHECK-NEXT: ret251;252; NONEON-NOSVE-LABEL: sdiv_v32i8:253; NONEON-NOSVE: // %bb.0:254; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]255; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!256; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64257; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]258; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5259; NONEON-NOSVE-NEXT: add w8, w8, w9260; NONEON-NOSVE-NEXT: sxtb w8, w8261; NONEON-NOSVE-NEXT: lsr w8, w8, #5262; NONEON-NOSVE-NEXT: strb w8, [sp, #63]263; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]264; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5265; NONEON-NOSVE-NEXT: add w8, w8, w9266; NONEON-NOSVE-NEXT: sxtb w8, w8267; NONEON-NOSVE-NEXT: lsr w8, w8, #5268; NONEON-NOSVE-NEXT: strb w8, [sp, #62]269; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]270; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5271; NONEON-NOSVE-NEXT: add w8, w8, w9272; NONEON-NOSVE-NEXT: sxtb w8, w8273; NONEON-NOSVE-NEXT: lsr w8, w8, #5274; NONEON-NOSVE-NEXT: strb w8, [sp, #61]275; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]276; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5277; NONEON-NOSVE-NEXT: add w8, w8, w9278; NONEON-NOSVE-NEXT: sxtb w8, w8279; NONEON-NOSVE-NEXT: lsr w8, w8, #5280; NONEON-NOSVE-NEXT: strb w8, [sp, #60]281; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]282; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5283; NONEON-NOSVE-NEXT: add w8, w8, w9284; NONEON-NOSVE-NEXT: sxtb w8, w8285; NONEON-NOSVE-NEXT: lsr w8, w8, #5286; NONEON-NOSVE-NEXT: strb w8, [sp, #59]287; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]288; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5289; NONEON-NOSVE-NEXT: add w8, w8, w9290; NONEON-NOSVE-NEXT: sxtb w8, w8291; NONEON-NOSVE-NEXT: lsr w8, w8, #5292; NONEON-NOSVE-NEXT: strb w8, [sp, #58]293; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]294; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5295; NONEON-NOSVE-NEXT: add w8, w8, w9296; NONEON-NOSVE-NEXT: sxtb w8, w8297; NONEON-NOSVE-NEXT: lsr w8, w8, #5298; NONEON-NOSVE-NEXT: strb w8, [sp, #57]299; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]300; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5301; NONEON-NOSVE-NEXT: add w8, w8, w9302; NONEON-NOSVE-NEXT: sxtb w8, w8303; NONEON-NOSVE-NEXT: lsr w8, w8, #5304; NONEON-NOSVE-NEXT: strb w8, [sp, #56]305; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]306; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5307; NONEON-NOSVE-NEXT: add w8, w8, w9308; NONEON-NOSVE-NEXT: sxtb w8, w8309; NONEON-NOSVE-NEXT: lsr w8, w8, #5310; NONEON-NOSVE-NEXT: strb w8, [sp, #55]311; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]312; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5313; NONEON-NOSVE-NEXT: add w8, w8, w9314; NONEON-NOSVE-NEXT: sxtb w8, w8315; NONEON-NOSVE-NEXT: lsr w8, w8, #5316; NONEON-NOSVE-NEXT: strb w8, [sp, #54]317; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]318; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5319; NONEON-NOSVE-NEXT: add w8, w8, w9320; NONEON-NOSVE-NEXT: sxtb w8, w8321; NONEON-NOSVE-NEXT: lsr w8, w8, #5322; NONEON-NOSVE-NEXT: strb w8, [sp, #53]323; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]324; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5325; NONEON-NOSVE-NEXT: add w8, w8, w9326; NONEON-NOSVE-NEXT: sxtb w8, w8327; NONEON-NOSVE-NEXT: lsr w8, w8, #5328; NONEON-NOSVE-NEXT: strb w8, [sp, #52]329; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]330; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5331; NONEON-NOSVE-NEXT: add w8, w8, w9332; NONEON-NOSVE-NEXT: sxtb w8, w8333; NONEON-NOSVE-NEXT: lsr w8, w8, #5334; NONEON-NOSVE-NEXT: strb w8, [sp, #51]335; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]336; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5337; NONEON-NOSVE-NEXT: add w8, w8, w9338; NONEON-NOSVE-NEXT: sxtb w8, w8339; NONEON-NOSVE-NEXT: lsr w8, w8, #5340; NONEON-NOSVE-NEXT: strb w8, [sp, #50]341; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]342; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5343; NONEON-NOSVE-NEXT: add w8, w8, w9344; NONEON-NOSVE-NEXT: sxtb w8, w8345; NONEON-NOSVE-NEXT: lsr w8, w8, #5346; NONEON-NOSVE-NEXT: strb w8, [sp, #49]347; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]348; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5349; NONEON-NOSVE-NEXT: add w8, w8, w9350; NONEON-NOSVE-NEXT: sxtb w8, w8351; NONEON-NOSVE-NEXT: lsr w8, w8, #5352; NONEON-NOSVE-NEXT: strb w8, [sp, #48]353; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15]354; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5355; NONEON-NOSVE-NEXT: add w8, w8, w9356; NONEON-NOSVE-NEXT: sxtb w8, w8357; NONEON-NOSVE-NEXT: lsr w8, w8, #5358; NONEON-NOSVE-NEXT: strb w8, [sp, #47]359; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14]360; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5361; NONEON-NOSVE-NEXT: add w8, w8, w9362; NONEON-NOSVE-NEXT: sxtb w8, w8363; NONEON-NOSVE-NEXT: lsr w8, w8, #5364; NONEON-NOSVE-NEXT: strb w8, [sp, #46]365; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13]366; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5367; NONEON-NOSVE-NEXT: add w8, w8, w9368; NONEON-NOSVE-NEXT: sxtb w8, w8369; NONEON-NOSVE-NEXT: lsr w8, w8, #5370; NONEON-NOSVE-NEXT: strb w8, [sp, #45]371; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12]372; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5373; NONEON-NOSVE-NEXT: add w8, w8, w9374; NONEON-NOSVE-NEXT: sxtb w8, w8375; NONEON-NOSVE-NEXT: lsr w8, w8, #5376; NONEON-NOSVE-NEXT: strb w8, [sp, #44]377; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11]378; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5379; NONEON-NOSVE-NEXT: add w8, w8, w9380; NONEON-NOSVE-NEXT: sxtb w8, w8381; NONEON-NOSVE-NEXT: lsr w8, w8, #5382; NONEON-NOSVE-NEXT: strb w8, [sp, #43]383; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10]384; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5385; NONEON-NOSVE-NEXT: add w8, w8, w9386; NONEON-NOSVE-NEXT: sxtb w8, w8387; NONEON-NOSVE-NEXT: lsr w8, w8, #5388; NONEON-NOSVE-NEXT: strb w8, [sp, #42]389; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9]390; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5391; NONEON-NOSVE-NEXT: add w8, w8, w9392; NONEON-NOSVE-NEXT: sxtb w8, w8393; NONEON-NOSVE-NEXT: lsr w8, w8, #5394; NONEON-NOSVE-NEXT: strb w8, [sp, #41]395; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8]396; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5397; NONEON-NOSVE-NEXT: add w8, w8, w9398; NONEON-NOSVE-NEXT: sxtb w8, w8399; NONEON-NOSVE-NEXT: lsr w8, w8, #5400; NONEON-NOSVE-NEXT: strb w8, [sp, #40]401; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7]402; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5403; NONEON-NOSVE-NEXT: add w8, w8, w9404; NONEON-NOSVE-NEXT: sxtb w8, w8405; NONEON-NOSVE-NEXT: lsr w8, w8, #5406; NONEON-NOSVE-NEXT: strb w8, [sp, #39]407; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6]408; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5409; NONEON-NOSVE-NEXT: add w8, w8, w9410; NONEON-NOSVE-NEXT: sxtb w8, w8411; NONEON-NOSVE-NEXT: lsr w8, w8, #5412; NONEON-NOSVE-NEXT: strb w8, [sp, #38]413; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5]414; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5415; NONEON-NOSVE-NEXT: add w8, w8, w9416; NONEON-NOSVE-NEXT: sxtb w8, w8417; NONEON-NOSVE-NEXT: lsr w8, w8, #5418; NONEON-NOSVE-NEXT: strb w8, [sp, #37]419; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4]420; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5421; NONEON-NOSVE-NEXT: add w8, w8, w9422; NONEON-NOSVE-NEXT: sxtb w8, w8423; NONEON-NOSVE-NEXT: lsr w8, w8, #5424; NONEON-NOSVE-NEXT: strb w8, [sp, #36]425; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3]426; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5427; NONEON-NOSVE-NEXT: add w8, w8, w9428; NONEON-NOSVE-NEXT: sxtb w8, w8429; NONEON-NOSVE-NEXT: lsr w8, w8, #5430; NONEON-NOSVE-NEXT: strb w8, [sp, #35]431; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2]432; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5433; NONEON-NOSVE-NEXT: add w8, w8, w9434; NONEON-NOSVE-NEXT: sxtb w8, w8435; NONEON-NOSVE-NEXT: lsr w8, w8, #5436; NONEON-NOSVE-NEXT: strb w8, [sp, #34]437; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1]438; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5439; NONEON-NOSVE-NEXT: add w8, w8, w9440; NONEON-NOSVE-NEXT: sxtb w8, w8441; NONEON-NOSVE-NEXT: lsr w8, w8, #5442; NONEON-NOSVE-NEXT: strb w8, [sp, #33]443; NONEON-NOSVE-NEXT: ldrsb w8, [sp]444; NONEON-NOSVE-NEXT: ubfx w9, w8, #10, #5445; NONEON-NOSVE-NEXT: add w8, w8, w9446; NONEON-NOSVE-NEXT: sxtb w8, w8447; NONEON-NOSVE-NEXT: lsr w8, w8, #5448; NONEON-NOSVE-NEXT: strb w8, [sp, #32]449; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]450; NONEON-NOSVE-NEXT: stp q0, q1, [x0]451; NONEON-NOSVE-NEXT: add sp, sp, #64452; NONEON-NOSVE-NEXT: ret453 %op1 = load <32 x i8>, ptr %a454 %res = sdiv <32 x i8> %op1, shufflevector (<32 x i8> insertelement (<32 x i8> poison, i8 32, i32 0), <32 x i8> poison, <32 x i32> zeroinitializer)455 store <32 x i8> %res, ptr %a456 ret void457}458 459define <2 x i16> @sdiv_v2i16(<2 x i16> %op1) {460; CHECK-LABEL: sdiv_v2i16:461; CHECK: // %bb.0:462; CHECK-NEXT: ptrue p0.s, vl2463; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0464; CHECK-NEXT: sxth z0.s, p0/m, z0.s465; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5466; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0467; CHECK-NEXT: ret468;469; NONEON-NOSVE-LABEL: sdiv_v2i16:470; NONEON-NOSVE: // %bb.0:471; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!472; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16473; NONEON-NOSVE-NEXT: ldp w9, w8, [sp]474; NONEON-NOSVE-NEXT: sxth w10, w8475; NONEON-NOSVE-NEXT: sxth w11, w9476; NONEON-NOSVE-NEXT: ubfx w10, w10, #26, #5477; NONEON-NOSVE-NEXT: ubfx w11, w11, #26, #5478; NONEON-NOSVE-NEXT: add w8, w8, w10479; NONEON-NOSVE-NEXT: add w9, w9, w11480; NONEON-NOSVE-NEXT: sbfx w8, w8, #5, #11481; NONEON-NOSVE-NEXT: sbfx w9, w9, #5, #11482; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #8]483; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]484; NONEON-NOSVE-NEXT: add sp, sp, #16485; NONEON-NOSVE-NEXT: ret486 %res = sdiv <2 x i16> %op1, shufflevector (<2 x i16> insertelement (<2 x i16> poison, i16 32, i32 0), <2 x i16> poison, <2 x i32> zeroinitializer)487 ret <2 x i16> %res488}489 490define <4 x i16> @sdiv_v4i16(<4 x i16> %op1) {491; CHECK-LABEL: sdiv_v4i16:492; CHECK: // %bb.0:493; CHECK-NEXT: ptrue p0.h, vl4494; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0495; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5496; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0497; CHECK-NEXT: ret498;499; NONEON-NOSVE-LABEL: sdiv_v4i16:500; NONEON-NOSVE: // %bb.0:501; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!502; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16503; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]504; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5505; NONEON-NOSVE-NEXT: add w8, w8, w9506; NONEON-NOSVE-NEXT: sxth w8, w8507; NONEON-NOSVE-NEXT: lsr w8, w8, #5508; NONEON-NOSVE-NEXT: strh w8, [sp, #14]509; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]510; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5511; NONEON-NOSVE-NEXT: add w8, w8, w9512; NONEON-NOSVE-NEXT: sxth w8, w8513; NONEON-NOSVE-NEXT: lsr w8, w8, #5514; NONEON-NOSVE-NEXT: strh w8, [sp, #12]515; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]516; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5517; NONEON-NOSVE-NEXT: add w8, w8, w9518; NONEON-NOSVE-NEXT: sxth w8, w8519; NONEON-NOSVE-NEXT: lsr w8, w8, #5520; NONEON-NOSVE-NEXT: strh w8, [sp, #10]521; NONEON-NOSVE-NEXT: ldrsh w8, [sp]522; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5523; NONEON-NOSVE-NEXT: add w8, w8, w9524; NONEON-NOSVE-NEXT: sxth w8, w8525; NONEON-NOSVE-NEXT: lsr w8, w8, #5526; NONEON-NOSVE-NEXT: strh w8, [sp, #8]527; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]528; NONEON-NOSVE-NEXT: add sp, sp, #16529; NONEON-NOSVE-NEXT: ret530 %res = sdiv <4 x i16> %op1, shufflevector (<4 x i16> insertelement (<4 x i16> poison, i16 32, i32 0), <4 x i16> poison, <4 x i32> zeroinitializer)531 ret <4 x i16> %res532}533 534define <8 x i16> @sdiv_v8i16(<8 x i16> %op1) {535; CHECK-LABEL: sdiv_v8i16:536; CHECK: // %bb.0:537; CHECK-NEXT: ptrue p0.h, vl8538; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0539; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5540; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0541; CHECK-NEXT: ret542;543; NONEON-NOSVE-LABEL: sdiv_v8i16:544; NONEON-NOSVE: // %bb.0:545; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!546; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32547; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]548; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5549; NONEON-NOSVE-NEXT: add w8, w8, w9550; NONEON-NOSVE-NEXT: sxth w8, w8551; NONEON-NOSVE-NEXT: lsr w8, w8, #5552; NONEON-NOSVE-NEXT: strh w8, [sp, #30]553; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]554; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5555; NONEON-NOSVE-NEXT: add w8, w8, w9556; NONEON-NOSVE-NEXT: sxth w8, w8557; NONEON-NOSVE-NEXT: lsr w8, w8, #5558; NONEON-NOSVE-NEXT: strh w8, [sp, #28]559; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]560; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5561; NONEON-NOSVE-NEXT: add w8, w8, w9562; NONEON-NOSVE-NEXT: sxth w8, w8563; NONEON-NOSVE-NEXT: lsr w8, w8, #5564; NONEON-NOSVE-NEXT: strh w8, [sp, #26]565; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]566; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5567; NONEON-NOSVE-NEXT: add w8, w8, w9568; NONEON-NOSVE-NEXT: sxth w8, w8569; NONEON-NOSVE-NEXT: lsr w8, w8, #5570; NONEON-NOSVE-NEXT: strh w8, [sp, #24]571; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]572; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5573; NONEON-NOSVE-NEXT: add w8, w8, w9574; NONEON-NOSVE-NEXT: sxth w8, w8575; NONEON-NOSVE-NEXT: lsr w8, w8, #5576; NONEON-NOSVE-NEXT: strh w8, [sp, #22]577; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]578; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5579; NONEON-NOSVE-NEXT: add w8, w8, w9580; NONEON-NOSVE-NEXT: sxth w8, w8581; NONEON-NOSVE-NEXT: lsr w8, w8, #5582; NONEON-NOSVE-NEXT: strh w8, [sp, #20]583; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]584; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5585; NONEON-NOSVE-NEXT: add w8, w8, w9586; NONEON-NOSVE-NEXT: sxth w8, w8587; NONEON-NOSVE-NEXT: lsr w8, w8, #5588; NONEON-NOSVE-NEXT: strh w8, [sp, #18]589; NONEON-NOSVE-NEXT: ldrsh w8, [sp]590; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5591; NONEON-NOSVE-NEXT: add w8, w8, w9592; NONEON-NOSVE-NEXT: sxth w8, w8593; NONEON-NOSVE-NEXT: lsr w8, w8, #5594; NONEON-NOSVE-NEXT: strh w8, [sp, #16]595; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]596; NONEON-NOSVE-NEXT: add sp, sp, #32597; NONEON-NOSVE-NEXT: ret598 %res = sdiv <8 x i16> %op1, shufflevector (<8 x i16> insertelement (<8 x i16> poison, i16 32, i32 0), <8 x i16> poison, <8 x i32> zeroinitializer)599 ret <8 x i16> %res600}601 602define void @sdiv_v16i16(ptr %a) {603; CHECK-LABEL: sdiv_v16i16:604; CHECK: // %bb.0:605; CHECK-NEXT: ldp q0, q1, [x0]606; CHECK-NEXT: ptrue p0.h, vl8607; CHECK-NEXT: asrd z0.h, p0/m, z0.h, #5608; CHECK-NEXT: asrd z1.h, p0/m, z1.h, #5609; CHECK-NEXT: stp q0, q1, [x0]610; CHECK-NEXT: ret611;612; NONEON-NOSVE-LABEL: sdiv_v16i16:613; NONEON-NOSVE: // %bb.0:614; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]615; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!616; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64617; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]618; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5619; NONEON-NOSVE-NEXT: add w8, w8, w9620; NONEON-NOSVE-NEXT: sxth w8, w8621; NONEON-NOSVE-NEXT: lsr w8, w8, #5622; NONEON-NOSVE-NEXT: strh w8, [sp, #62]623; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]624; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5625; NONEON-NOSVE-NEXT: add w8, w8, w9626; NONEON-NOSVE-NEXT: sxth w8, w8627; NONEON-NOSVE-NEXT: lsr w8, w8, #5628; NONEON-NOSVE-NEXT: strh w8, [sp, #60]629; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]630; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5631; NONEON-NOSVE-NEXT: add w8, w8, w9632; NONEON-NOSVE-NEXT: sxth w8, w8633; NONEON-NOSVE-NEXT: lsr w8, w8, #5634; NONEON-NOSVE-NEXT: strh w8, [sp, #58]635; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]636; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5637; NONEON-NOSVE-NEXT: add w8, w8, w9638; NONEON-NOSVE-NEXT: sxth w8, w8639; NONEON-NOSVE-NEXT: lsr w8, w8, #5640; NONEON-NOSVE-NEXT: strh w8, [sp, #56]641; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]642; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5643; NONEON-NOSVE-NEXT: add w8, w8, w9644; NONEON-NOSVE-NEXT: sxth w8, w8645; NONEON-NOSVE-NEXT: lsr w8, w8, #5646; NONEON-NOSVE-NEXT: strh w8, [sp, #54]647; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]648; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5649; NONEON-NOSVE-NEXT: add w8, w8, w9650; NONEON-NOSVE-NEXT: sxth w8, w8651; NONEON-NOSVE-NEXT: lsr w8, w8, #5652; NONEON-NOSVE-NEXT: strh w8, [sp, #52]653; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]654; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5655; NONEON-NOSVE-NEXT: add w8, w8, w9656; NONEON-NOSVE-NEXT: sxth w8, w8657; NONEON-NOSVE-NEXT: lsr w8, w8, #5658; NONEON-NOSVE-NEXT: strh w8, [sp, #50]659; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]660; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5661; NONEON-NOSVE-NEXT: add w8, w8, w9662; NONEON-NOSVE-NEXT: sxth w8, w8663; NONEON-NOSVE-NEXT: lsr w8, w8, #5664; NONEON-NOSVE-NEXT: strh w8, [sp, #48]665; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]666; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5667; NONEON-NOSVE-NEXT: add w8, w8, w9668; NONEON-NOSVE-NEXT: sxth w8, w8669; NONEON-NOSVE-NEXT: lsr w8, w8, #5670; NONEON-NOSVE-NEXT: strh w8, [sp, #46]671; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]672; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5673; NONEON-NOSVE-NEXT: add w8, w8, w9674; NONEON-NOSVE-NEXT: sxth w8, w8675; NONEON-NOSVE-NEXT: lsr w8, w8, #5676; NONEON-NOSVE-NEXT: strh w8, [sp, #44]677; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]678; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5679; NONEON-NOSVE-NEXT: add w8, w8, w9680; NONEON-NOSVE-NEXT: sxth w8, w8681; NONEON-NOSVE-NEXT: lsr w8, w8, #5682; NONEON-NOSVE-NEXT: strh w8, [sp, #42]683; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]684; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5685; NONEON-NOSVE-NEXT: add w8, w8, w9686; NONEON-NOSVE-NEXT: sxth w8, w8687; NONEON-NOSVE-NEXT: lsr w8, w8, #5688; NONEON-NOSVE-NEXT: strh w8, [sp, #40]689; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]690; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5691; NONEON-NOSVE-NEXT: add w8, w8, w9692; NONEON-NOSVE-NEXT: sxth w8, w8693; NONEON-NOSVE-NEXT: lsr w8, w8, #5694; NONEON-NOSVE-NEXT: strh w8, [sp, #38]695; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]696; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5697; NONEON-NOSVE-NEXT: add w8, w8, w9698; NONEON-NOSVE-NEXT: sxth w8, w8699; NONEON-NOSVE-NEXT: lsr w8, w8, #5700; NONEON-NOSVE-NEXT: strh w8, [sp, #36]701; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]702; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5703; NONEON-NOSVE-NEXT: add w8, w8, w9704; NONEON-NOSVE-NEXT: sxth w8, w8705; NONEON-NOSVE-NEXT: lsr w8, w8, #5706; NONEON-NOSVE-NEXT: strh w8, [sp, #34]707; NONEON-NOSVE-NEXT: ldrsh w8, [sp]708; NONEON-NOSVE-NEXT: ubfx w9, w8, #26, #5709; NONEON-NOSVE-NEXT: add w8, w8, w9710; NONEON-NOSVE-NEXT: sxth w8, w8711; NONEON-NOSVE-NEXT: lsr w8, w8, #5712; NONEON-NOSVE-NEXT: strh w8, [sp, #32]713; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]714; NONEON-NOSVE-NEXT: stp q0, q1, [x0]715; NONEON-NOSVE-NEXT: add sp, sp, #64716; NONEON-NOSVE-NEXT: ret717 %op1 = load <16 x i16>, ptr %a718 %res = sdiv <16 x i16> %op1, shufflevector (<16 x i16> insertelement (<16 x i16> poison, i16 32, i32 0), <16 x i16> poison, <16 x i32> zeroinitializer)719 store <16 x i16> %res, ptr %a720 ret void721}722 723define <2 x i32> @sdiv_v2i32(<2 x i32> %op1) {724; CHECK-LABEL: sdiv_v2i32:725; CHECK: // %bb.0:726; CHECK-NEXT: ptrue p0.s, vl2727; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0728; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5729; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0730; CHECK-NEXT: ret731;732; NONEON-NOSVE-LABEL: sdiv_v2i32:733; NONEON-NOSVE: // %bb.0:734; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!735; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16736; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]737; NONEON-NOSVE-NEXT: asr w9, w8, #31738; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27739; NONEON-NOSVE-NEXT: asr w10, w8, #5740; NONEON-NOSVE-NEXT: ldr w8, [sp]741; NONEON-NOSVE-NEXT: asr w9, w8, #31742; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27743; NONEON-NOSVE-NEXT: asr w8, w8, #5744; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8]745; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]746; NONEON-NOSVE-NEXT: add sp, sp, #16747; NONEON-NOSVE-NEXT: ret748 %res = sdiv <2 x i32> %op1, shufflevector (<2 x i32> insertelement (<2 x i32> poison, i32 32, i32 0), <2 x i32> poison, <2 x i32> zeroinitializer)749 ret <2 x i32> %res750}751 752define <4 x i32> @sdiv_v4i32(<4 x i32> %op1) {753; CHECK-LABEL: sdiv_v4i32:754; CHECK: // %bb.0:755; CHECK-NEXT: ptrue p0.s, vl4756; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0757; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5758; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0759; CHECK-NEXT: ret760;761; NONEON-NOSVE-LABEL: sdiv_v4i32:762; NONEON-NOSVE: // %bb.0:763; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!764; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32765; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]766; NONEON-NOSVE-NEXT: asr w9, w8, #31767; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27768; NONEON-NOSVE-NEXT: asr w10, w8, #5769; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]770; NONEON-NOSVE-NEXT: asr w9, w8, #31771; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27772; NONEON-NOSVE-NEXT: asr w8, w8, #5773; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #24]774; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]775; NONEON-NOSVE-NEXT: asr w9, w8, #31776; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27777; NONEON-NOSVE-NEXT: asr w10, w8, #5778; NONEON-NOSVE-NEXT: ldr w8, [sp]779; NONEON-NOSVE-NEXT: asr w9, w8, #31780; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27781; NONEON-NOSVE-NEXT: asr w8, w8, #5782; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #16]783; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]784; NONEON-NOSVE-NEXT: add sp, sp, #32785; NONEON-NOSVE-NEXT: ret786 %res = sdiv <4 x i32> %op1, shufflevector (<4 x i32> insertelement (<4 x i32> poison, i32 32, i32 0), <4 x i32> poison, <4 x i32> zeroinitializer)787 ret <4 x i32> %res788}789 790define void @sdiv_v8i32(ptr %a) {791; CHECK-LABEL: sdiv_v8i32:792; CHECK: // %bb.0:793; CHECK-NEXT: ldp q0, q1, [x0]794; CHECK-NEXT: ptrue p0.s, vl4795; CHECK-NEXT: asrd z0.s, p0/m, z0.s, #5796; CHECK-NEXT: asrd z1.s, p0/m, z1.s, #5797; CHECK-NEXT: stp q0, q1, [x0]798; CHECK-NEXT: ret799;800; NONEON-NOSVE-LABEL: sdiv_v8i32:801; NONEON-NOSVE: // %bb.0:802; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]803; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!804; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64805; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]806; NONEON-NOSVE-NEXT: asr w9, w8, #31807; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27808; NONEON-NOSVE-NEXT: asr w10, w8, #5809; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]810; NONEON-NOSVE-NEXT: asr w9, w8, #31811; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27812; NONEON-NOSVE-NEXT: asr w8, w8, #5813; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #56]814; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]815; NONEON-NOSVE-NEXT: asr w9, w8, #31816; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27817; NONEON-NOSVE-NEXT: asr w10, w8, #5818; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]819; NONEON-NOSVE-NEXT: asr w9, w8, #31820; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27821; NONEON-NOSVE-NEXT: asr w8, w8, #5822; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #48]823; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]824; NONEON-NOSVE-NEXT: asr w9, w8, #31825; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27826; NONEON-NOSVE-NEXT: asr w10, w8, #5827; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]828; NONEON-NOSVE-NEXT: asr w9, w8, #31829; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27830; NONEON-NOSVE-NEXT: asr w8, w8, #5831; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #40]832; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]833; NONEON-NOSVE-NEXT: asr w9, w8, #31834; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27835; NONEON-NOSVE-NEXT: asr w10, w8, #5836; NONEON-NOSVE-NEXT: ldr w8, [sp]837; NONEON-NOSVE-NEXT: asr w9, w8, #31838; NONEON-NOSVE-NEXT: add w8, w8, w9, lsr #27839; NONEON-NOSVE-NEXT: asr w8, w8, #5840; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #32]841; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]842; NONEON-NOSVE-NEXT: stp q0, q1, [x0]843; NONEON-NOSVE-NEXT: add sp, sp, #64844; NONEON-NOSVE-NEXT: ret845 %op1 = load <8 x i32>, ptr %a846 %res = sdiv <8 x i32> %op1, shufflevector (<8 x i32> insertelement (<8 x i32> poison, i32 32, i32 0), <8 x i32> poison, <8 x i32> zeroinitializer)847 store <8 x i32> %res, ptr %a848 ret void849}850 851define <1 x i64> @sdiv_v1i64(<1 x i64> %op1) {852; CHECK-LABEL: sdiv_v1i64:853; CHECK: // %bb.0:854; CHECK-NEXT: ptrue p0.d, vl1855; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0856; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5857; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0858; CHECK-NEXT: ret859;860; NONEON-NOSVE-LABEL: sdiv_v1i64:861; NONEON-NOSVE: // %bb.0:862; NONEON-NOSVE-NEXT: sub sp, sp, #16863; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16864; NONEON-NOSVE-NEXT: fmov x8, d0865; NONEON-NOSVE-NEXT: asr x9, x8, #63866; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59867; NONEON-NOSVE-NEXT: asr x8, x8, #5868; NONEON-NOSVE-NEXT: str x8, [sp, #8]869; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]870; NONEON-NOSVE-NEXT: add sp, sp, #16871; NONEON-NOSVE-NEXT: ret872 %res = sdiv <1 x i64> %op1, shufflevector (<1 x i64> insertelement (<1 x i64> poison, i64 32, i32 0), <1 x i64> poison, <1 x i32> zeroinitializer)873 ret <1 x i64> %res874}875 876; Vector i64 sdiv are not legal for NEON so use SVE when available.877define <2 x i64> @sdiv_v2i64(<2 x i64> %op1) {878; CHECK-LABEL: sdiv_v2i64:879; CHECK: // %bb.0:880; CHECK-NEXT: ptrue p0.d, vl2881; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0882; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5883; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0884; CHECK-NEXT: ret885;886; NONEON-NOSVE-LABEL: sdiv_v2i64:887; NONEON-NOSVE: // %bb.0:888; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!889; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32890; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]891; NONEON-NOSVE-NEXT: asr x9, x8, #63892; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59893; NONEON-NOSVE-NEXT: asr x10, x8, #5894; NONEON-NOSVE-NEXT: ldr x8, [sp]895; NONEON-NOSVE-NEXT: asr x9, x8, #63896; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59897; NONEON-NOSVE-NEXT: asr x8, x8, #5898; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #16]899; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]900; NONEON-NOSVE-NEXT: add sp, sp, #32901; NONEON-NOSVE-NEXT: ret902 %res = sdiv <2 x i64> %op1, shufflevector (<2 x i64> insertelement (<2 x i64> poison, i64 32, i32 0), <2 x i64> poison, <2 x i32> zeroinitializer)903 ret <2 x i64> %res904}905 906define void @sdiv_v4i64(ptr %a) {907; CHECK-LABEL: sdiv_v4i64:908; CHECK: // %bb.0:909; CHECK-NEXT: ldp q0, q1, [x0]910; CHECK-NEXT: ptrue p0.d, vl2911; CHECK-NEXT: asrd z0.d, p0/m, z0.d, #5912; CHECK-NEXT: asrd z1.d, p0/m, z1.d, #5913; CHECK-NEXT: stp q0, q1, [x0]914; CHECK-NEXT: ret915;916; NONEON-NOSVE-LABEL: sdiv_v4i64:917; NONEON-NOSVE: // %bb.0:918; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]919; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!920; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64921; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]922; NONEON-NOSVE-NEXT: asr x9, x8, #63923; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59924; NONEON-NOSVE-NEXT: asr x10, x8, #5925; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]926; NONEON-NOSVE-NEXT: asr x9, x8, #63927; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59928; NONEON-NOSVE-NEXT: asr x8, x8, #5929; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #48]930; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]931; NONEON-NOSVE-NEXT: asr x9, x8, #63932; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59933; NONEON-NOSVE-NEXT: asr x10, x8, #5934; NONEON-NOSVE-NEXT: ldr x8, [sp]935; NONEON-NOSVE-NEXT: asr x9, x8, #63936; NONEON-NOSVE-NEXT: add x8, x8, x9, lsr #59937; NONEON-NOSVE-NEXT: asr x8, x8, #5938; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #32]939; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]940; NONEON-NOSVE-NEXT: stp q0, q1, [x0]941; NONEON-NOSVE-NEXT: add sp, sp, #64942; NONEON-NOSVE-NEXT: ret943 %op1 = load <4 x i64>, ptr %a944 %res = sdiv <4 x i64> %op1, shufflevector (<4 x i64> insertelement (<4 x i64> poison, i64 32, i32 0), <4 x i64> poison, <4 x i32> zeroinitializer)945 store <4 x i64> %res, ptr %a946 ret void947}948