brintos

brintos / llvm-project-archived public Read only

0
0
Text · 80.6 KiB · c4b6c0e Raw
2103 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve2 -force-streaming-compatible  < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; SREM10;11 12define <4 x i8> @srem_v4i8(<4 x i8> %op1, <4 x i8> %op2) {13; CHECK-LABEL: srem_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:    ptrue p1.s, vl419; CHECK-NEXT:    sxtb z0.h, p0/m, z0.h20; CHECK-NEXT:    sxtb z1.h, p0/m, z1.h21; CHECK-NEXT:    sunpklo z2.s, z1.h22; CHECK-NEXT:    sunpklo z3.s, z0.h23; CHECK-NEXT:    sdivr z2.s, p1/m, z2.s, z3.s24; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h25; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h26; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z027; CHECK-NEXT:    ret28;29; NONEON-NOSVE-LABEL: srem_v4i8:30; NONEON-NOSVE:       // %bb.0:31; NONEON-NOSVE-NEXT:    sub sp, sp, #3232; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 3233; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]34; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]35; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]36; NONEON-NOSVE-NEXT:    ldrsb w11, [sp, #20]37; NONEON-NOSVE-NEXT:    ldrsb w12, [sp, #12]38; NONEON-NOSVE-NEXT:    ldrsb w14, [sp, #18]39; NONEON-NOSVE-NEXT:    ldrsb w15, [sp, #10]40; NONEON-NOSVE-NEXT:    sdiv w10, w9, w841; NONEON-NOSVE-NEXT:    ldrsb w17, [sp, #16]42; NONEON-NOSVE-NEXT:    ldrsb w18, [sp, #8]43; NONEON-NOSVE-NEXT:    sdiv w13, w12, w1144; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w945; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]46; NONEON-NOSVE-NEXT:    sdiv w16, w15, w1447; NONEON-NOSVE-NEXT:    msub w9, w13, w11, w1248; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]49; NONEON-NOSVE-NEXT:    sdiv w0, w18, w1750; NONEON-NOSVE-NEXT:    msub w10, w16, w14, w1551; NONEON-NOSVE-NEXT:    strh w10, [sp, #26]52; NONEON-NOSVE-NEXT:    msub w8, w0, w17, w1853; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]54; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]55; NONEON-NOSVE-NEXT:    add sp, sp, #3256; NONEON-NOSVE-NEXT:    ret57  %res = srem <4 x i8> %op1, %op258  ret <4 x i8> %res59}60 61define <8 x i8> @srem_v8i8(<8 x i8> %op1, <8 x i8> %op2) {62; CHECK-LABEL: srem_v8i8:63; CHECK:       // %bb.0:64; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z165; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z066; CHECK-NEXT:    sunpklo z2.h, z1.b67; CHECK-NEXT:    sunpklo z3.h, z0.b68; CHECK-NEXT:    ptrue p0.s, vl469; CHECK-NEXT:    sunpklo z4.s, z2.h70; CHECK-NEXT:    sunpklo z5.s, z3.h71; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #872; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #873; CHECK-NEXT:    sunpklo z2.s, z2.h74; CHECK-NEXT:    sunpklo z3.s, z3.h75; CHECK-NEXT:    sdivr z4.s, p0/m, z4.s, z5.s76; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s77; CHECK-NEXT:    ptrue p0.h, vl478; CHECK-NEXT:    uzp1 z3.h, z4.h, z4.h79; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h80; CHECK-NEXT:    splice z2.h, p0, { z3.h, z4.h }81; CHECK-NEXT:    ptrue p0.b, vl882; CHECK-NEXT:    uzp1 z2.b, z2.b, z2.b83; CHECK-NEXT:    mls z0.b, p0/m, z2.b, z1.b84; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z085; CHECK-NEXT:    ret86;87; NONEON-NOSVE-LABEL: srem_v8i8:88; NONEON-NOSVE:       // %bb.0:89; NONEON-NOSVE-NEXT:    sub sp, sp, #3290; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 3291; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]92; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]93; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]94; NONEON-NOSVE-NEXT:    sdiv w10, w9, w895; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w996; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]97; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]98; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]99; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8100; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9101; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]102; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]103; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]104; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8105; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9106; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]107; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]108; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]109; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8110; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9111; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]112; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]113; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]114; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8115; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9116; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]117; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]118; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]119; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8120; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9121; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]122; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]123; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]124; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8125; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9126; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]127; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]128; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]129; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8130; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9131; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]132; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]133; NONEON-NOSVE-NEXT:    add sp, sp, #32134; NONEON-NOSVE-NEXT:    ret135  %res = srem <8 x i8> %op1, %op2136  ret <8 x i8> %res137}138 139define <16 x i8> @srem_v16i8(<16 x i8> %op1, <16 x i8> %op2) {140; CHECK-LABEL: srem_v16i8:141; CHECK:       // %bb.0:142; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1143; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0144; CHECK-NEXT:    sunpklo z2.h, z1.b145; CHECK-NEXT:    sunpklo z3.h, z0.b146; CHECK-NEXT:    ptrue p0.s, vl4147; CHECK-NEXT:    sunpklo z4.s, z2.h148; CHECK-NEXT:    sunpklo z5.s, z3.h149; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8150; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8151; CHECK-NEXT:    sunpklo z2.s, z2.h152; CHECK-NEXT:    sunpklo z3.s, z3.h153; CHECK-NEXT:    sdivr z4.s, p0/m, z4.s, z5.s154; CHECK-NEXT:    movprfx z5, z0155; CHECK-NEXT:    ext z5.b, z5.b, z0.b, #8156; CHECK-NEXT:    sunpklo z5.h, z5.b157; CHECK-NEXT:    sunpklo z7.s, z5.h158; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8159; CHECK-NEXT:    sunpklo z5.s, z5.h160; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s161; CHECK-NEXT:    movprfx z3, z1162; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8163; CHECK-NEXT:    sunpklo z3.h, z3.b164; CHECK-NEXT:    sunpklo z6.s, z3.h165; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8166; CHECK-NEXT:    sunpklo z3.s, z3.h167; CHECK-NEXT:    sdivr z6.s, p0/m, z6.s, z7.s168; CHECK-NEXT:    sdivr z3.s, p0/m, z3.s, z5.s169; CHECK-NEXT:    uzp1 z4.h, z4.h, z4.h170; CHECK-NEXT:    ptrue p0.h, vl4171; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h172; CHECK-NEXT:    uzp1 z6.h, z6.h, z6.h173; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }174; CHECK-NEXT:    uzp1 z4.b, z2.b, z2.b175; CHECK-NEXT:    uzp1 z7.h, z3.h, z3.h176; CHECK-NEXT:    splice z3.h, p0, { z6.h, z7.h }177; CHECK-NEXT:    ptrue p0.b, vl8178; CHECK-NEXT:    uzp1 z5.b, z3.b, z3.b179; CHECK-NEXT:    splice z2.b, p0, { z4.b, z5.b }180; CHECK-NEXT:    ptrue p0.b, vl16181; CHECK-NEXT:    mls z0.b, p0/m, z2.b, z1.b182; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0183; CHECK-NEXT:    ret184;185; NONEON-NOSVE-LABEL: srem_v16i8:186; NONEON-NOSVE:       // %bb.0:187; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!188; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48189; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]190; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]191; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8192; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9193; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]194; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]195; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]196; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8197; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9198; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]199; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]200; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]201; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8202; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9203; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]204; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]205; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]206; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8207; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9208; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]209; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]210; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]211; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8212; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9213; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]214; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]215; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]216; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8217; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9218; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]219; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]220; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]221; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8222; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9223; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]224; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]225; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]226; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8227; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9228; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]229; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]230; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]231; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8232; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9233; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]234; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]235; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]236; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8237; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9238; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]239; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]240; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]241; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8242; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9243; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]244; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]245; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]246; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8247; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9248; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]249; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]250; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]251; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8252; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9253; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]254; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]255; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]256; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8257; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9258; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]259; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]260; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]261; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8262; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9263; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]264; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]265; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]266; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8267; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9268; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]269; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]270; NONEON-NOSVE-NEXT:    add sp, sp, #48271; NONEON-NOSVE-NEXT:    ret272  %res = srem <16 x i8> %op1, %op2273  ret <16 x i8> %res274}275 276define void @srem_v32i8(ptr %a, ptr %b) {277; CHECK-LABEL: srem_v32i8:278; CHECK:       // %bb.0:279; CHECK-NEXT:    ldr q0, [x0, #16]280; CHECK-NEXT:    ldr q1, [x1, #16]281; CHECK-NEXT:    ptrue p0.s, vl4282; CHECK-NEXT:    sunpklo z2.h, z1.b283; CHECK-NEXT:    sunpklo z3.h, z0.b284; CHECK-NEXT:    sunpklo z4.s, z2.h285; CHECK-NEXT:    sunpklo z5.s, z3.h286; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8287; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8288; CHECK-NEXT:    sunpklo z2.s, z2.h289; CHECK-NEXT:    sunpklo z3.s, z3.h290; CHECK-NEXT:    sdivr z4.s, p0/m, z4.s, z5.s291; CHECK-NEXT:    movprfx z5, z3292; CHECK-NEXT:    sdiv z5.s, p0/m, z5.s, z2.s293; CHECK-NEXT:    movprfx z2, z1294; CHECK-NEXT:    ext z2.b, z2.b, z1.b, #8295; CHECK-NEXT:    movprfx z3, z0296; CHECK-NEXT:    ext z3.b, z3.b, z0.b, #8297; CHECK-NEXT:    sunpklo z7.h, z2.b298; CHECK-NEXT:    sunpklo z16.h, z3.b299; CHECK-NEXT:    sunpklo z2.s, z7.h300; CHECK-NEXT:    sunpklo z3.s, z16.h301; CHECK-NEXT:    ext z7.b, z7.b, z7.b, #8302; CHECK-NEXT:    ext z16.b, z16.b, z16.b, #8303; CHECK-NEXT:    sunpklo z7.s, z7.h304; CHECK-NEXT:    movprfx z6, z3305; CHECK-NEXT:    sdiv z6.s, p0/m, z6.s, z2.s306; CHECK-NEXT:    ldr q2, [x0]307; CHECK-NEXT:    ldr q3, [x1]308; CHECK-NEXT:    sunpklo z16.s, z16.h309; CHECK-NEXT:    sunpklo z17.h, z3.b310; CHECK-NEXT:    sunpklo z18.h, z2.b311; CHECK-NEXT:    sdivr z7.s, p0/m, z7.s, z16.s312; CHECK-NEXT:    sunpklo z19.s, z17.h313; CHECK-NEXT:    sunpklo z20.s, z18.h314; CHECK-NEXT:    ext z17.b, z17.b, z17.b, #8315; CHECK-NEXT:    ext z18.b, z18.b, z18.b, #8316; CHECK-NEXT:    sunpklo z17.s, z17.h317; CHECK-NEXT:    sunpklo z18.s, z18.h318; CHECK-NEXT:    sdivr z19.s, p0/m, z19.s, z20.s319; CHECK-NEXT:    movprfx z20, z2320; CHECK-NEXT:    ext z20.b, z20.b, z2.b, #8321; CHECK-NEXT:    sunpklo z20.h, z20.b322; CHECK-NEXT:    sunpklo z22.s, z20.h323; CHECK-NEXT:    ext z20.b, z20.b, z20.b, #8324; CHECK-NEXT:    sunpklo z20.s, z20.h325; CHECK-NEXT:    sdivr z17.s, p0/m, z17.s, z18.s326; CHECK-NEXT:    movprfx z18, z3327; CHECK-NEXT:    ext z18.b, z18.b, z3.b, #8328; CHECK-NEXT:    sunpklo z18.h, z18.b329; CHECK-NEXT:    sunpklo z21.s, z18.h330; CHECK-NEXT:    ext z18.b, z18.b, z18.b, #8331; CHECK-NEXT:    sunpklo z18.s, z18.h332; CHECK-NEXT:    sdivr z21.s, p0/m, z21.s, z22.s333; CHECK-NEXT:    uzp1 z22.h, z4.h, z4.h334; CHECK-NEXT:    uzp1 z23.h, z5.h, z5.h335; CHECK-NEXT:    sdivr z18.s, p0/m, z18.s, z20.s336; CHECK-NEXT:    uzp1 z19.h, z19.h, z19.h337; CHECK-NEXT:    ptrue p0.h, vl4338; CHECK-NEXT:    uzp1 z20.h, z17.h, z17.h339; CHECK-NEXT:    uzp1 z16.h, z6.h, z6.h340; CHECK-NEXT:    uzp1 z17.h, z7.h, z7.h341; CHECK-NEXT:    splice z7.h, p0, { z22.h, z23.h }342; CHECK-NEXT:    uzp1 z4.h, z21.h, z21.h343; CHECK-NEXT:    splice z6.h, p0, { z19.h, z20.h }344; CHECK-NEXT:    uzp1 z5.h, z18.h, z18.h345; CHECK-NEXT:    splice z4.h, p0, { z4.h, z5.h }346; CHECK-NEXT:    splice z5.h, p0, { z16.h, z17.h }347; CHECK-NEXT:    uzp1 z16.b, z6.b, z6.b348; CHECK-NEXT:    uzp1 z6.b, z7.b, z7.b349; CHECK-NEXT:    ptrue p0.b, vl8350; CHECK-NEXT:    uzp1 z17.b, z4.b, z4.b351; CHECK-NEXT:    uzp1 z7.b, z5.b, z5.b352; CHECK-NEXT:    splice z4.b, p0, { z16.b, z17.b }353; CHECK-NEXT:    splice z5.b, p0, { z6.b, z7.b }354; CHECK-NEXT:    ptrue p0.b, vl16355; CHECK-NEXT:    mls z2.b, p0/m, z4.b, z3.b356; CHECK-NEXT:    mls z0.b, p0/m, z5.b, z1.b357; CHECK-NEXT:    stp q2, q0, [x0]358; CHECK-NEXT:    ret359;360; NONEON-NOSVE-LABEL: srem_v32i8:361; NONEON-NOSVE:       // %bb.0:362; NONEON-NOSVE-NEXT:    sub sp, sp, #96363; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96364; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]365; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]366; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]367; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]368; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #63]369; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #47]370; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8371; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9372; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #46]373; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]374; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #62]375; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8376; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9377; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #45]378; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]379; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #61]380; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8381; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9382; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #44]383; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]384; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #60]385; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8386; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9387; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #43]388; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]389; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #59]390; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8391; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9392; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #42]393; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]394; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #58]395; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8396; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9397; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #41]398; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]399; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #57]400; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8401; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9402; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #40]403; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]404; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #56]405; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8406; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9407; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #39]408; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]409; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #55]410; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8411; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9412; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #38]413; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]414; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #54]415; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8416; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9417; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #37]418; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]419; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #53]420; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8421; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9422; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #36]423; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]424; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #52]425; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8426; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9427; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #35]428; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]429; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #51]430; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8431; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9432; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #34]433; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]434; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #50]435; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8436; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9437; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #33]438; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]439; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #49]440; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8441; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9442; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #32]443; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]444; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #48]445; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8446; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9447; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]448; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]449; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]450; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8451; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9452; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]453; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]454; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]455; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8456; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9457; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]458; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]459; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]460; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8461; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9462; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]463; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]464; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]465; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8466; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9467; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]468; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]469; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]470; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8471; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9472; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]473; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]474; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]475; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8476; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9477; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]478; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]479; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]480; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8481; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9482; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]483; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]484; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]485; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8486; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9487; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]488; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]489; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]490; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8491; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9492; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]493; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]494; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]495; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8496; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9497; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]498; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]499; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]500; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8501; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9502; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]503; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]504; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]505; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8506; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9507; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]508; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]509; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]510; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8511; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9512; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]513; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]514; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]515; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8516; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9517; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]518; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]519; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]520; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8521; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9522; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]523; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]524; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]525; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8526; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9527; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]528; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]529; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]530; NONEON-NOSVE-NEXT:    add sp, sp, #96531; NONEON-NOSVE-NEXT:    ret532  %op1 = load <32 x i8>, ptr %a533  %op2 = load <32 x i8>, ptr %b534  %res = srem <32 x i8> %op1, %op2535  store <32 x i8> %res, ptr %a536  ret void537}538 539define <4 x i16> @srem_v4i16(<4 x i16> %op1, <4 x i16> %op2) {540; CHECK-LABEL: srem_v4i16:541; CHECK:       // %bb.0:542; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1543; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0544; CHECK-NEXT:    sunpklo z2.s, z1.h545; CHECK-NEXT:    sunpklo z3.s, z0.h546; CHECK-NEXT:    ptrue p0.s, vl4547; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s548; CHECK-NEXT:    ptrue p0.h, vl4549; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h550; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h551; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0552; CHECK-NEXT:    ret553;554; NONEON-NOSVE-LABEL: srem_v4i16:555; NONEON-NOSVE:       // %bb.0:556; NONEON-NOSVE-NEXT:    sub sp, sp, #32557; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32558; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]559; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]560; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]561; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8562; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9563; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]564; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]565; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]566; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8567; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9568; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]569; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]570; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]571; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8572; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9573; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]574; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]575; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]576; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8577; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9578; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]579; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]580; NONEON-NOSVE-NEXT:    add sp, sp, #32581; NONEON-NOSVE-NEXT:    ret582  %res = srem <4 x i16> %op1, %op2583  ret <4 x i16> %res584}585 586define <8 x i16> @srem_v8i16(<8 x i16> %op1, <8 x i16> %op2) {587; CHECK-LABEL: srem_v8i16:588; CHECK:       // %bb.0:589; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1590; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0591; CHECK-NEXT:    sunpklo z2.s, z1.h592; CHECK-NEXT:    sunpklo z3.s, z0.h593; CHECK-NEXT:    movprfx z4, z0594; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #8595; CHECK-NEXT:    ptrue p0.s, vl4596; CHECK-NEXT:    sunpklo z4.s, z4.h597; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s598; CHECK-NEXT:    movprfx z3, z1599; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8600; CHECK-NEXT:    sunpklo z3.s, z3.h601; CHECK-NEXT:    sdivr z3.s, p0/m, z3.s, z4.s602; CHECK-NEXT:    ptrue p0.h, vl4603; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h604; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h605; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }606; CHECK-NEXT:    ptrue p0.h, vl8607; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h608; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0609; CHECK-NEXT:    ret610;611; NONEON-NOSVE-LABEL: srem_v8i16:612; NONEON-NOSVE:       // %bb.0:613; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!614; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48615; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]616; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]617; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8618; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9619; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]620; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]621; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]622; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8623; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9624; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]625; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]626; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]627; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8628; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9629; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]630; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]631; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]632; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8633; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9634; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]635; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]636; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]637; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8638; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9639; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]640; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]641; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]642; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8643; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9644; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]645; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]646; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]647; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8648; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9649; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]650; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]651; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]652; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8653; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9654; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]655; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]656; NONEON-NOSVE-NEXT:    add sp, sp, #48657; NONEON-NOSVE-NEXT:    ret658  %res = srem <8 x i16> %op1, %op2659  ret <8 x i16> %res660}661 662define void @srem_v16i16(ptr %a, ptr %b) {663; CHECK-LABEL: srem_v16i16:664; CHECK:       // %bb.0:665; CHECK-NEXT:    ldp q4, q1, [x1]666; CHECK-NEXT:    ptrue p0.s, vl4667; CHECK-NEXT:    ldr q0, [x0, #16]668; CHECK-NEXT:    sunpklo z2.s, z1.h669; CHECK-NEXT:    sunpklo z3.s, z0.h670; CHECK-NEXT:    sunpklo z5.s, z4.h671; CHECK-NEXT:    movprfx z16, z0672; CHECK-NEXT:    ext z16.b, z16.b, z0.b, #8673; CHECK-NEXT:    sdivr z2.s, p0/m, z2.s, z3.s674; CHECK-NEXT:    ldr q3, [x0]675; CHECK-NEXT:    sunpklo z16.s, z16.h676; CHECK-NEXT:    sunpklo z6.s, z3.h677; CHECK-NEXT:    movprfx z7, z3678; CHECK-NEXT:    ext z7.b, z7.b, z3.b, #8679; CHECK-NEXT:    sunpklo z7.s, z7.h680; CHECK-NEXT:    sdivr z5.s, p0/m, z5.s, z6.s681; CHECK-NEXT:    movprfx z6, z4682; CHECK-NEXT:    ext z6.b, z6.b, z4.b, #8683; CHECK-NEXT:    sunpklo z6.s, z6.h684; CHECK-NEXT:    sdivr z6.s, p0/m, z6.s, z7.s685; CHECK-NEXT:    movprfx z7, z1686; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #8687; CHECK-NEXT:    sunpklo z7.s, z7.h688; CHECK-NEXT:    sdivr z7.s, p0/m, z7.s, z16.s689; CHECK-NEXT:    uzp1 z16.h, z5.h, z5.h690; CHECK-NEXT:    ptrue p0.h, vl4691; CHECK-NEXT:    uzp1 z17.h, z6.h, z6.h692; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h693; CHECK-NEXT:    splice z2.h, p0, { z16.h, z17.h }694; CHECK-NEXT:    uzp1 z6.h, z7.h, z7.h695; CHECK-NEXT:    splice z5.h, p0, { z5.h, z6.h }696; CHECK-NEXT:    ptrue p0.h, vl8697; CHECK-NEXT:    msb z2.h, p0/m, z4.h, z3.h698; CHECK-NEXT:    mls z0.h, p0/m, z5.h, z1.h699; CHECK-NEXT:    stp q2, q0, [x0]700; CHECK-NEXT:    ret701;702; NONEON-NOSVE-LABEL: srem_v16i16:703; NONEON-NOSVE:       // %bb.0:704; NONEON-NOSVE-NEXT:    sub sp, sp, #96705; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96706; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]707; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]708; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]709; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]710; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #62]711; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]712; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8713; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9714; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #44]715; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]716; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #60]717; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8718; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9719; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]720; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]721; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #58]722; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8723; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9724; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #40]725; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]726; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #56]727; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8728; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9729; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #38]730; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]731; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #54]732; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8733; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9734; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #36]735; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]736; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #52]737; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8738; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9739; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #34]740; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]741; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #50]742; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8743; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9744; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #32]745; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]746; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #48]747; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8748; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9749; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]750; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]751; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]752; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8753; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9754; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]755; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]756; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]757; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8758; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9759; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]760; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]761; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]762; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8763; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9764; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]765; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]766; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]767; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8768; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9769; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]770; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]771; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]772; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8773; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9774; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]775; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]776; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]777; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8778; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9779; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]780; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]781; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]782; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8783; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9784; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]785; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]786; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]787; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8788; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9789; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]790; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]791; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]792; NONEON-NOSVE-NEXT:    add sp, sp, #96793; NONEON-NOSVE-NEXT:    ret794  %op1 = load <16 x i16>, ptr %a795  %op2 = load <16 x i16>, ptr %b796  %res = srem <16 x i16> %op1, %op2797  store <16 x i16> %res, ptr %a798  ret void799}800 801define <2 x i32> @srem_v2i32(<2 x i32> %op1, <2 x i32> %op2) {802; CHECK-LABEL: srem_v2i32:803; CHECK:       // %bb.0:804; CHECK-NEXT:    ptrue p0.s, vl2805; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1806; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0807; CHECK-NEXT:    movprfx z2, z0808; CHECK-NEXT:    sdiv z2.s, p0/m, z2.s, z1.s809; CHECK-NEXT:    mls z0.s, p0/m, z2.s, z1.s810; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0811; CHECK-NEXT:    ret812;813; NONEON-NOSVE-LABEL: srem_v2i32:814; NONEON-NOSVE:       // %bb.0:815; NONEON-NOSVE-NEXT:    sub sp, sp, #32816; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32817; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]818; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #8]819; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]820; NONEON-NOSVE-NEXT:    sdiv w10, w11, w8821; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w11822; NONEON-NOSVE-NEXT:    str w8, [sp, #28]823; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]824; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8825; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9826; NONEON-NOSVE-NEXT:    str w8, [sp, #24]827; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]828; NONEON-NOSVE-NEXT:    add sp, sp, #32829; NONEON-NOSVE-NEXT:    ret830  %res = srem <2 x i32> %op1, %op2831  ret <2 x i32> %res832}833 834define <4 x i32> @srem_v4i32(<4 x i32> %op1, <4 x i32> %op2) {835; CHECK-LABEL: srem_v4i32:836; CHECK:       // %bb.0:837; CHECK-NEXT:    ptrue p0.s, vl4838; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1839; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0840; CHECK-NEXT:    movprfx z2, z0841; CHECK-NEXT:    sdiv z2.s, p0/m, z2.s, z1.s842; CHECK-NEXT:    mls z0.s, p0/m, z2.s, z1.s843; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0844; CHECK-NEXT:    ret845;846; NONEON-NOSVE-LABEL: srem_v4i32:847; NONEON-NOSVE:       // %bb.0:848; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!849; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48850; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #8]851; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]852; NONEON-NOSVE-NEXT:    sdiv w10, w11, w8853; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w11854; NONEON-NOSVE-NEXT:    str w8, [sp, #44]855; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]856; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8857; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w9858; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]859; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]860; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8861; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9862; NONEON-NOSVE-NEXT:    ldr w9, [sp]863; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #36]864; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]865; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8866; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9867; NONEON-NOSVE-NEXT:    str w8, [sp, #32]868; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]869; NONEON-NOSVE-NEXT:    add sp, sp, #48870; NONEON-NOSVE-NEXT:    ret871  %res = srem <4 x i32> %op1, %op2872  ret <4 x i32> %res873}874 875define void @srem_v8i32(ptr %a, ptr %b) {876; CHECK-LABEL: srem_v8i32:877; CHECK:       // %bb.0:878; CHECK-NEXT:    ldp q0, q3, [x1]879; CHECK-NEXT:    ptrue p0.s, vl4880; CHECK-NEXT:    ldp q1, q2, [x0]881; CHECK-NEXT:    movprfx z4, z1882; CHECK-NEXT:    sdiv z4.s, p0/m, z4.s, z0.s883; CHECK-NEXT:    movprfx z5, z2884; CHECK-NEXT:    sdiv z5.s, p0/m, z5.s, z3.s885; CHECK-NEXT:    msb z0.s, p0/m, z4.s, z1.s886; CHECK-NEXT:    mls z2.s, p0/m, z5.s, z3.s887; CHECK-NEXT:    stp q0, q2, [x0]888; CHECK-NEXT:    ret889;890; NONEON-NOSVE-LABEL: srem_v8i32:891; NONEON-NOSVE:       // %bb.0:892; NONEON-NOSVE-NEXT:    sub sp, sp, #96893; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96894; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]895; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]896; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]897; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]898; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #40]899; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]900; NONEON-NOSVE-NEXT:    sdiv w10, w11, w8901; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w11902; NONEON-NOSVE-NEXT:    str w8, [sp, #92]903; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]904; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8905; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w9906; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]907; NONEON-NOSVE-NEXT:    ldr w9, [sp, #36]908; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8909; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9910; NONEON-NOSVE-NEXT:    ldr w9, [sp, #32]911; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #84]912; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]913; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8914; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w9915; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]916; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]917; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8918; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9919; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #76]920; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]921; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #4]922; NONEON-NOSVE-NEXT:    sdiv w10, w11, w8923; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w11924; NONEON-NOSVE-NEXT:    str w8, [sp, #72]925; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]926; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8927; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w9928; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]929; NONEON-NOSVE-NEXT:    ldr w9, [sp]930; NONEON-NOSVE-NEXT:    sdiv w10, w9, w8931; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w9932; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]933; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]934; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]935; NONEON-NOSVE-NEXT:    add sp, sp, #96936; NONEON-NOSVE-NEXT:    ret937  %op1 = load <8 x i32>, ptr %a938  %op2 = load <8 x i32>, ptr %b939  %res = srem <8 x i32> %op1, %op2940  store <8 x i32> %res, ptr %a941  ret void942}943 944define <1 x i64> @srem_v1i64(<1 x i64> %op1, <1 x i64> %op2) {945; CHECK-LABEL: srem_v1i64:946; CHECK:       // %bb.0:947; CHECK-NEXT:    ptrue p0.d, vl1948; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1949; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0950; CHECK-NEXT:    movprfx z2, z0951; CHECK-NEXT:    sdiv z2.d, p0/m, z2.d, z1.d952; CHECK-NEXT:    mls z0.d, p0/m, z2.d, z1.d953; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0954; CHECK-NEXT:    ret955;956; NONEON-NOSVE-LABEL: srem_v1i64:957; NONEON-NOSVE:       // %bb.0:958; NONEON-NOSVE-NEXT:    sub sp, sp, #16959; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16960; NONEON-NOSVE-NEXT:    fmov x8, d1961; NONEON-NOSVE-NEXT:    fmov x9, d0962; NONEON-NOSVE-NEXT:    sdiv x10, x9, x8963; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x9964; NONEON-NOSVE-NEXT:    str x8, [sp, #8]965; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]966; NONEON-NOSVE-NEXT:    add sp, sp, #16967; NONEON-NOSVE-NEXT:    ret968  %res = srem <1 x i64> %op1, %op2969  ret <1 x i64> %res970}971 972define <2 x i64> @srem_v2i64(<2 x i64> %op1, <2 x i64> %op2) {973; CHECK-LABEL: srem_v2i64:974; CHECK:       // %bb.0:975; CHECK-NEXT:    ptrue p0.d, vl2976; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1977; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0978; CHECK-NEXT:    movprfx z2, z0979; CHECK-NEXT:    sdiv z2.d, p0/m, z2.d, z1.d980; CHECK-NEXT:    mls z0.d, p0/m, z2.d, z1.d981; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0982; CHECK-NEXT:    ret983;984; NONEON-NOSVE-LABEL: srem_v2i64:985; NONEON-NOSVE:       // %bb.0:986; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!987; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48988; NONEON-NOSVE-NEXT:    ldp x9, x11, [sp]989; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]990; NONEON-NOSVE-NEXT:    sdiv x10, x11, x8991; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x11992; NONEON-NOSVE-NEXT:    str x8, [sp, #40]993; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]994; NONEON-NOSVE-NEXT:    sdiv x10, x9, x8995; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x9996; NONEON-NOSVE-NEXT:    str x8, [sp, #32]997; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]998; NONEON-NOSVE-NEXT:    add sp, sp, #48999; NONEON-NOSVE-NEXT:    ret1000  %res = srem <2 x i64> %op1, %op21001  ret <2 x i64> %res1002}1003 1004define void @srem_v4i64(ptr %a, ptr %b) {1005; CHECK-LABEL: srem_v4i64:1006; CHECK:       // %bb.0:1007; CHECK-NEXT:    ldp q0, q3, [x1]1008; CHECK-NEXT:    ptrue p0.d, vl21009; CHECK-NEXT:    ldp q1, q2, [x0]1010; CHECK-NEXT:    movprfx z4, z11011; CHECK-NEXT:    sdiv z4.d, p0/m, z4.d, z0.d1012; CHECK-NEXT:    movprfx z5, z21013; CHECK-NEXT:    sdiv z5.d, p0/m, z5.d, z3.d1014; CHECK-NEXT:    msb z0.d, p0/m, z4.d, z1.d1015; CHECK-NEXT:    mls z2.d, p0/m, z5.d, z3.d1016; CHECK-NEXT:    stp q0, q2, [x0]1017; CHECK-NEXT:    ret1018;1019; NONEON-NOSVE-LABEL: srem_v4i64:1020; NONEON-NOSVE:       // %bb.0:1021; NONEON-NOSVE-NEXT:    sub sp, sp, #961022; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961023; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1024; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1025; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1026; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1027; NONEON-NOSVE-NEXT:    ldp x9, x11, [sp, #32]1028; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]1029; NONEON-NOSVE-NEXT:    sdiv x10, x11, x81030; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x111031; NONEON-NOSVE-NEXT:    str x8, [sp, #88]1032; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]1033; NONEON-NOSVE-NEXT:    sdiv x10, x9, x81034; NONEON-NOSVE-NEXT:    msub x11, x10, x8, x91035; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]1036; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]1037; NONEON-NOSVE-NEXT:    sdiv x10, x9, x81038; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x91039; NONEON-NOSVE-NEXT:    ldr x9, [sp]1040; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #72]1041; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]1042; NONEON-NOSVE-NEXT:    sdiv x10, x9, x81043; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x91044; NONEON-NOSVE-NEXT:    str x8, [sp, #64]1045; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1046; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1047; NONEON-NOSVE-NEXT:    add sp, sp, #961048; NONEON-NOSVE-NEXT:    ret1049  %op1 = load <4 x i64>, ptr %a1050  %op2 = load <4 x i64>, ptr %b1051  %res = srem <4 x i64> %op1, %op21052  store <4 x i64> %res, ptr %a1053  ret void1054}1055 1056;1057; UREM1058;1059 1060define <4 x i8> @urem_v4i8(<4 x i8> %op1, <4 x i8> %op2) {1061; CHECK-LABEL: urem_v4i8:1062; CHECK:       // %bb.0:1063; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z11064; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01065; CHECK-NEXT:    ptrue p0.s, vl41066; CHECK-NEXT:    and z0.h, z0.h, #0xff1067; CHECK-NEXT:    and z1.h, z1.h, #0xff1068; CHECK-NEXT:    uunpklo z2.s, z1.h1069; CHECK-NEXT:    uunpklo z3.s, z0.h1070; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1071; CHECK-NEXT:    ptrue p0.h, vl41072; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h1073; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h1074; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z01075; CHECK-NEXT:    ret1076;1077; NONEON-NOSVE-LABEL: urem_v4i8:1078; NONEON-NOSVE:       // %bb.0:1079; NONEON-NOSVE-NEXT:    sub sp, sp, #321080; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 321081; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]1082; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1083; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]1084; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #20]1085; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #12]1086; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #18]1087; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #10]1088; NONEON-NOSVE-NEXT:    udiv w10, w9, w81089; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #16]1090; NONEON-NOSVE-NEXT:    ldrb w18, [sp, #8]1091; NONEON-NOSVE-NEXT:    udiv w13, w12, w111092; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91093; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]1094; NONEON-NOSVE-NEXT:    udiv w16, w15, w141095; NONEON-NOSVE-NEXT:    msub w9, w13, w11, w121096; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]1097; NONEON-NOSVE-NEXT:    udiv w0, w18, w171098; NONEON-NOSVE-NEXT:    msub w10, w16, w14, w151099; NONEON-NOSVE-NEXT:    strh w10, [sp, #26]1100; NONEON-NOSVE-NEXT:    msub w8, w0, w17, w181101; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]1102; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1103; NONEON-NOSVE-NEXT:    add sp, sp, #321104; NONEON-NOSVE-NEXT:    ret1105  %res = urem <4 x i8> %op1, %op21106  ret <4 x i8> %res1107}1108 1109define <8 x i8> @urem_v8i8(<8 x i8> %op1, <8 x i8> %op2) {1110; CHECK-LABEL: urem_v8i8:1111; CHECK:       // %bb.0:1112; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z11113; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01114; CHECK-NEXT:    uunpklo z2.h, z1.b1115; CHECK-NEXT:    uunpklo z3.h, z0.b1116; CHECK-NEXT:    ptrue p0.s, vl41117; CHECK-NEXT:    uunpklo z4.s, z2.h1118; CHECK-NEXT:    uunpklo z5.s, z3.h1119; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #81120; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #81121; CHECK-NEXT:    uunpklo z2.s, z2.h1122; CHECK-NEXT:    uunpklo z3.s, z3.h1123; CHECK-NEXT:    udivr z4.s, p0/m, z4.s, z5.s1124; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1125; CHECK-NEXT:    ptrue p0.h, vl41126; CHECK-NEXT:    uzp1 z3.h, z4.h, z4.h1127; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h1128; CHECK-NEXT:    splice z2.h, p0, { z3.h, z4.h }1129; CHECK-NEXT:    ptrue p0.b, vl81130; CHECK-NEXT:    uzp1 z2.b, z2.b, z2.b1131; CHECK-NEXT:    mls z0.b, p0/m, z2.b, z1.b1132; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z01133; CHECK-NEXT:    ret1134;1135; NONEON-NOSVE-LABEL: urem_v8i8:1136; NONEON-NOSVE:       // %bb.0:1137; NONEON-NOSVE-NEXT:    sub sp, sp, #321138; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 321139; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]1140; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]1141; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]1142; NONEON-NOSVE-NEXT:    udiv w10, w9, w81143; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91144; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]1145; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]1146; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1147; NONEON-NOSVE-NEXT:    udiv w10, w9, w81148; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91149; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]1150; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]1151; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]1152; NONEON-NOSVE-NEXT:    udiv w10, w9, w81153; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91154; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]1155; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]1156; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]1157; NONEON-NOSVE-NEXT:    udiv w10, w9, w81158; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91159; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]1160; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]1161; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]1162; NONEON-NOSVE-NEXT:    udiv w10, w9, w81163; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91164; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]1165; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]1166; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]1167; NONEON-NOSVE-NEXT:    udiv w10, w9, w81168; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91169; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]1170; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]1171; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]1172; NONEON-NOSVE-NEXT:    udiv w10, w9, w81173; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91174; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]1175; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]1176; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]1177; NONEON-NOSVE-NEXT:    udiv w10, w9, w81178; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91179; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]1180; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1181; NONEON-NOSVE-NEXT:    add sp, sp, #321182; NONEON-NOSVE-NEXT:    ret1183  %res = urem <8 x i8> %op1, %op21184  ret <8 x i8> %res1185}1186 1187define <16 x i8> @urem_v16i8(<16 x i8> %op1, <16 x i8> %op2) {1188; CHECK-LABEL: urem_v16i8:1189; CHECK:       // %bb.0:1190; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z11191; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01192; CHECK-NEXT:    uunpklo z2.h, z1.b1193; CHECK-NEXT:    uunpklo z3.h, z0.b1194; CHECK-NEXT:    ptrue p0.s, vl41195; CHECK-NEXT:    uunpklo z4.s, z2.h1196; CHECK-NEXT:    uunpklo z5.s, z3.h1197; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #81198; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #81199; CHECK-NEXT:    uunpklo z2.s, z2.h1200; CHECK-NEXT:    uunpklo z3.s, z3.h1201; CHECK-NEXT:    udivr z4.s, p0/m, z4.s, z5.s1202; CHECK-NEXT:    movprfx z5, z01203; CHECK-NEXT:    ext z5.b, z5.b, z0.b, #81204; CHECK-NEXT:    uunpklo z5.h, z5.b1205; CHECK-NEXT:    uunpklo z7.s, z5.h1206; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #81207; CHECK-NEXT:    uunpklo z5.s, z5.h1208; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1209; CHECK-NEXT:    movprfx z3, z11210; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81211; CHECK-NEXT:    uunpklo z3.h, z3.b1212; CHECK-NEXT:    uunpklo z6.s, z3.h1213; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #81214; CHECK-NEXT:    uunpklo z3.s, z3.h1215; CHECK-NEXT:    udivr z6.s, p0/m, z6.s, z7.s1216; CHECK-NEXT:    udivr z3.s, p0/m, z3.s, z5.s1217; CHECK-NEXT:    uzp1 z4.h, z4.h, z4.h1218; CHECK-NEXT:    ptrue p0.h, vl41219; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h1220; CHECK-NEXT:    uzp1 z6.h, z6.h, z6.h1221; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }1222; CHECK-NEXT:    uzp1 z4.b, z2.b, z2.b1223; CHECK-NEXT:    uzp1 z7.h, z3.h, z3.h1224; CHECK-NEXT:    splice z3.h, p0, { z6.h, z7.h }1225; CHECK-NEXT:    ptrue p0.b, vl81226; CHECK-NEXT:    uzp1 z5.b, z3.b, z3.b1227; CHECK-NEXT:    splice z2.b, p0, { z4.b, z5.b }1228; CHECK-NEXT:    ptrue p0.b, vl161229; CHECK-NEXT:    mls z0.b, p0/m, z2.b, z1.b1230; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z01231; CHECK-NEXT:    ret1232;1233; NONEON-NOSVE-LABEL: urem_v16i8:1234; NONEON-NOSVE:       // %bb.0:1235; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!1236; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481237; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]1238; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]1239; NONEON-NOSVE-NEXT:    udiv w10, w9, w81240; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91241; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]1242; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]1243; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]1244; NONEON-NOSVE-NEXT:    udiv w10, w9, w81245; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91246; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]1247; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]1248; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]1249; NONEON-NOSVE-NEXT:    udiv w10, w9, w81250; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91251; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]1252; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]1253; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]1254; NONEON-NOSVE-NEXT:    udiv w10, w9, w81255; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91256; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]1257; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]1258; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]1259; NONEON-NOSVE-NEXT:    udiv w10, w9, w81260; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91261; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]1262; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]1263; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]1264; NONEON-NOSVE-NEXT:    udiv w10, w9, w81265; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91266; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]1267; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]1268; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]1269; NONEON-NOSVE-NEXT:    udiv w10, w9, w81270; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91271; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]1272; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]1273; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]1274; NONEON-NOSVE-NEXT:    udiv w10, w9, w81275; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91276; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]1277; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]1278; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]1279; NONEON-NOSVE-NEXT:    udiv w10, w9, w81280; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91281; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]1282; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]1283; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1284; NONEON-NOSVE-NEXT:    udiv w10, w9, w81285; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91286; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]1287; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]1288; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]1289; NONEON-NOSVE-NEXT:    udiv w10, w9, w81290; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91291; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]1292; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]1293; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]1294; NONEON-NOSVE-NEXT:    udiv w10, w9, w81295; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91296; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]1297; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]1298; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]1299; NONEON-NOSVE-NEXT:    udiv w10, w9, w81300; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91301; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]1302; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]1303; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]1304; NONEON-NOSVE-NEXT:    udiv w10, w9, w81305; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91306; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]1307; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]1308; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]1309; NONEON-NOSVE-NEXT:    udiv w10, w9, w81310; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91311; NONEON-NOSVE-NEXT:    ldrb w9, [sp]1312; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]1313; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]1314; NONEON-NOSVE-NEXT:    udiv w10, w9, w81315; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91316; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]1317; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1318; NONEON-NOSVE-NEXT:    add sp, sp, #481319; NONEON-NOSVE-NEXT:    ret1320  %res = urem <16 x i8> %op1, %op21321  ret <16 x i8> %res1322}1323 1324define void @urem_v32i8(ptr %a, ptr %b) {1325; CHECK-LABEL: urem_v32i8:1326; CHECK:       // %bb.0:1327; CHECK-NEXT:    ldr q0, [x0, #16]1328; CHECK-NEXT:    ldr q1, [x1, #16]1329; CHECK-NEXT:    ptrue p0.s, vl41330; CHECK-NEXT:    uunpklo z2.h, z1.b1331; CHECK-NEXT:    uunpklo z3.h, z0.b1332; CHECK-NEXT:    uunpklo z4.s, z2.h1333; CHECK-NEXT:    uunpklo z5.s, z3.h1334; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #81335; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #81336; CHECK-NEXT:    uunpklo z2.s, z2.h1337; CHECK-NEXT:    uunpklo z3.s, z3.h1338; CHECK-NEXT:    udivr z4.s, p0/m, z4.s, z5.s1339; CHECK-NEXT:    movprfx z5, z31340; CHECK-NEXT:    udiv z5.s, p0/m, z5.s, z2.s1341; CHECK-NEXT:    movprfx z2, z11342; CHECK-NEXT:    ext z2.b, z2.b, z1.b, #81343; CHECK-NEXT:    movprfx z3, z01344; CHECK-NEXT:    ext z3.b, z3.b, z0.b, #81345; CHECK-NEXT:    uunpklo z7.h, z2.b1346; CHECK-NEXT:    uunpklo z16.h, z3.b1347; CHECK-NEXT:    uunpklo z2.s, z7.h1348; CHECK-NEXT:    uunpklo z3.s, z16.h1349; CHECK-NEXT:    ext z7.b, z7.b, z7.b, #81350; CHECK-NEXT:    ext z16.b, z16.b, z16.b, #81351; CHECK-NEXT:    uunpklo z7.s, z7.h1352; CHECK-NEXT:    movprfx z6, z31353; CHECK-NEXT:    udiv z6.s, p0/m, z6.s, z2.s1354; CHECK-NEXT:    ldr q2, [x0]1355; CHECK-NEXT:    ldr q3, [x1]1356; CHECK-NEXT:    uunpklo z16.s, z16.h1357; CHECK-NEXT:    uunpklo z17.h, z3.b1358; CHECK-NEXT:    uunpklo z18.h, z2.b1359; CHECK-NEXT:    udivr z7.s, p0/m, z7.s, z16.s1360; CHECK-NEXT:    uunpklo z19.s, z17.h1361; CHECK-NEXT:    uunpklo z20.s, z18.h1362; CHECK-NEXT:    ext z17.b, z17.b, z17.b, #81363; CHECK-NEXT:    ext z18.b, z18.b, z18.b, #81364; CHECK-NEXT:    uunpklo z17.s, z17.h1365; CHECK-NEXT:    uunpklo z18.s, z18.h1366; CHECK-NEXT:    udivr z19.s, p0/m, z19.s, z20.s1367; CHECK-NEXT:    movprfx z20, z21368; CHECK-NEXT:    ext z20.b, z20.b, z2.b, #81369; CHECK-NEXT:    uunpklo z20.h, z20.b1370; CHECK-NEXT:    uunpklo z22.s, z20.h1371; CHECK-NEXT:    ext z20.b, z20.b, z20.b, #81372; CHECK-NEXT:    uunpklo z20.s, z20.h1373; CHECK-NEXT:    udivr z17.s, p0/m, z17.s, z18.s1374; CHECK-NEXT:    movprfx z18, z31375; CHECK-NEXT:    ext z18.b, z18.b, z3.b, #81376; CHECK-NEXT:    uunpklo z18.h, z18.b1377; CHECK-NEXT:    uunpklo z21.s, z18.h1378; CHECK-NEXT:    ext z18.b, z18.b, z18.b, #81379; CHECK-NEXT:    uunpklo z18.s, z18.h1380; CHECK-NEXT:    udivr z21.s, p0/m, z21.s, z22.s1381; CHECK-NEXT:    uzp1 z22.h, z4.h, z4.h1382; CHECK-NEXT:    uzp1 z23.h, z5.h, z5.h1383; CHECK-NEXT:    udivr z18.s, p0/m, z18.s, z20.s1384; CHECK-NEXT:    uzp1 z19.h, z19.h, z19.h1385; CHECK-NEXT:    ptrue p0.h, vl41386; CHECK-NEXT:    uzp1 z20.h, z17.h, z17.h1387; CHECK-NEXT:    uzp1 z16.h, z6.h, z6.h1388; CHECK-NEXT:    uzp1 z17.h, z7.h, z7.h1389; CHECK-NEXT:    splice z7.h, p0, { z22.h, z23.h }1390; CHECK-NEXT:    uzp1 z4.h, z21.h, z21.h1391; CHECK-NEXT:    splice z6.h, p0, { z19.h, z20.h }1392; CHECK-NEXT:    uzp1 z5.h, z18.h, z18.h1393; CHECK-NEXT:    splice z4.h, p0, { z4.h, z5.h }1394; CHECK-NEXT:    splice z5.h, p0, { z16.h, z17.h }1395; CHECK-NEXT:    uzp1 z16.b, z6.b, z6.b1396; CHECK-NEXT:    uzp1 z6.b, z7.b, z7.b1397; CHECK-NEXT:    ptrue p0.b, vl81398; CHECK-NEXT:    uzp1 z17.b, z4.b, z4.b1399; CHECK-NEXT:    uzp1 z7.b, z5.b, z5.b1400; CHECK-NEXT:    splice z4.b, p0, { z16.b, z17.b }1401; CHECK-NEXT:    splice z5.b, p0, { z6.b, z7.b }1402; CHECK-NEXT:    ptrue p0.b, vl161403; CHECK-NEXT:    mls z2.b, p0/m, z4.b, z3.b1404; CHECK-NEXT:    mls z0.b, p0/m, z5.b, z1.b1405; CHECK-NEXT:    stp q2, q0, [x0]1406; CHECK-NEXT:    ret1407;1408; NONEON-NOSVE-LABEL: urem_v32i8:1409; NONEON-NOSVE:       // %bb.0:1410; NONEON-NOSVE-NEXT:    sub sp, sp, #961411; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961412; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1413; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1414; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1415; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1416; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]1417; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]1418; NONEON-NOSVE-NEXT:    udiv w10, w9, w81419; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91420; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]1421; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]1422; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]1423; NONEON-NOSVE-NEXT:    udiv w10, w9, w81424; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91425; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]1426; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]1427; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]1428; NONEON-NOSVE-NEXT:    udiv w10, w9, w81429; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91430; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]1431; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]1432; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]1433; NONEON-NOSVE-NEXT:    udiv w10, w9, w81434; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91435; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]1436; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]1437; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]1438; NONEON-NOSVE-NEXT:    udiv w10, w9, w81439; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91440; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]1441; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]1442; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]1443; NONEON-NOSVE-NEXT:    udiv w10, w9, w81444; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91445; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]1446; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]1447; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]1448; NONEON-NOSVE-NEXT:    udiv w10, w9, w81449; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91450; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]1451; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]1452; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]1453; NONEON-NOSVE-NEXT:    udiv w10, w9, w81454; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91455; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]1456; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]1457; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]1458; NONEON-NOSVE-NEXT:    udiv w10, w9, w81459; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91460; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]1461; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]1462; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]1463; NONEON-NOSVE-NEXT:    udiv w10, w9, w81464; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91465; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]1466; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]1467; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]1468; NONEON-NOSVE-NEXT:    udiv w10, w9, w81469; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91470; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]1471; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]1472; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]1473; NONEON-NOSVE-NEXT:    udiv w10, w9, w81474; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91475; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]1476; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]1477; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]1478; NONEON-NOSVE-NEXT:    udiv w10, w9, w81479; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91480; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]1481; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]1482; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]1483; NONEON-NOSVE-NEXT:    udiv w10, w9, w81484; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91485; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]1486; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]1487; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]1488; NONEON-NOSVE-NEXT:    udiv w10, w9, w81489; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91490; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]1491; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]1492; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]1493; NONEON-NOSVE-NEXT:    udiv w10, w9, w81494; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91495; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]1496; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]1497; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]1498; NONEON-NOSVE-NEXT:    udiv w10, w9, w81499; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91500; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]1501; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]1502; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]1503; NONEON-NOSVE-NEXT:    udiv w10, w9, w81504; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91505; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]1506; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]1507; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]1508; NONEON-NOSVE-NEXT:    udiv w10, w9, w81509; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91510; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]1511; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]1512; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]1513; NONEON-NOSVE-NEXT:    udiv w10, w9, w81514; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91515; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]1516; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]1517; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]1518; NONEON-NOSVE-NEXT:    udiv w10, w9, w81519; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91520; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]1521; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]1522; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]1523; NONEON-NOSVE-NEXT:    udiv w10, w9, w81524; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91525; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]1526; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]1527; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]1528; NONEON-NOSVE-NEXT:    udiv w10, w9, w81529; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91530; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]1531; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]1532; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]1533; NONEON-NOSVE-NEXT:    udiv w10, w9, w81534; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91535; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]1536; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]1537; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]1538; NONEON-NOSVE-NEXT:    udiv w10, w9, w81539; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91540; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]1541; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]1542; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]1543; NONEON-NOSVE-NEXT:    udiv w10, w9, w81544; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91545; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]1546; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]1547; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]1548; NONEON-NOSVE-NEXT:    udiv w10, w9, w81549; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91550; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]1551; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]1552; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]1553; NONEON-NOSVE-NEXT:    udiv w10, w9, w81554; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91555; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]1556; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]1557; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]1558; NONEON-NOSVE-NEXT:    udiv w10, w9, w81559; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91560; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]1561; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]1562; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]1563; NONEON-NOSVE-NEXT:    udiv w10, w9, w81564; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91565; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]1566; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]1567; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]1568; NONEON-NOSVE-NEXT:    udiv w10, w9, w81569; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91570; NONEON-NOSVE-NEXT:    ldrb w9, [sp]1571; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]1572; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]1573; NONEON-NOSVE-NEXT:    udiv w10, w9, w81574; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91575; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]1576; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1577; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1578; NONEON-NOSVE-NEXT:    add sp, sp, #961579; NONEON-NOSVE-NEXT:    ret1580  %op1 = load <32 x i8>, ptr %a1581  %op2 = load <32 x i8>, ptr %b1582  %res = urem <32 x i8> %op1, %op21583  store <32 x i8> %res, ptr %a1584  ret void1585}1586 1587define <4 x i16> @urem_v4i16(<4 x i16> %op1, <4 x i16> %op2) {1588; CHECK-LABEL: urem_v4i16:1589; CHECK:       // %bb.0:1590; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z11591; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01592; CHECK-NEXT:    uunpklo z2.s, z1.h1593; CHECK-NEXT:    uunpklo z3.s, z0.h1594; CHECK-NEXT:    ptrue p0.s, vl41595; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1596; CHECK-NEXT:    ptrue p0.h, vl41597; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h1598; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h1599; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z01600; CHECK-NEXT:    ret1601;1602; NONEON-NOSVE-LABEL: urem_v4i16:1603; NONEON-NOSVE:       // %bb.0:1604; NONEON-NOSVE-NEXT:    sub sp, sp, #321605; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 321606; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]1607; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]1608; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]1609; NONEON-NOSVE-NEXT:    udiv w10, w9, w81610; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91611; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]1612; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]1613; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]1614; NONEON-NOSVE-NEXT:    udiv w10, w9, w81615; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91616; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]1617; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]1618; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]1619; NONEON-NOSVE-NEXT:    udiv w10, w9, w81620; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91621; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]1622; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]1623; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]1624; NONEON-NOSVE-NEXT:    udiv w10, w9, w81625; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91626; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]1627; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1628; NONEON-NOSVE-NEXT:    add sp, sp, #321629; NONEON-NOSVE-NEXT:    ret1630  %res = urem <4 x i16> %op1, %op21631  ret <4 x i16> %res1632}1633 1634define <8 x i16> @urem_v8i16(<8 x i16> %op1, <8 x i16> %op2) {1635; CHECK-LABEL: urem_v8i16:1636; CHECK:       // %bb.0:1637; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z11638; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01639; CHECK-NEXT:    uunpklo z2.s, z1.h1640; CHECK-NEXT:    uunpklo z3.s, z0.h1641; CHECK-NEXT:    movprfx z4, z01642; CHECK-NEXT:    ext z4.b, z4.b, z0.b, #81643; CHECK-NEXT:    ptrue p0.s, vl41644; CHECK-NEXT:    uunpklo z4.s, z4.h1645; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1646; CHECK-NEXT:    movprfx z3, z11647; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #81648; CHECK-NEXT:    uunpklo z3.s, z3.h1649; CHECK-NEXT:    udivr z3.s, p0/m, z3.s, z4.s1650; CHECK-NEXT:    ptrue p0.h, vl41651; CHECK-NEXT:    uzp1 z4.h, z2.h, z2.h1652; CHECK-NEXT:    uzp1 z5.h, z3.h, z3.h1653; CHECK-NEXT:    splice z2.h, p0, { z4.h, z5.h }1654; CHECK-NEXT:    ptrue p0.h, vl81655; CHECK-NEXT:    mls z0.h, p0/m, z2.h, z1.h1656; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z01657; CHECK-NEXT:    ret1658;1659; NONEON-NOSVE-LABEL: urem_v8i16:1660; NONEON-NOSVE:       // %bb.0:1661; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!1662; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481663; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]1664; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]1665; NONEON-NOSVE-NEXT:    udiv w10, w9, w81666; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91667; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]1668; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]1669; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]1670; NONEON-NOSVE-NEXT:    udiv w10, w9, w81671; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91672; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]1673; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]1674; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]1675; NONEON-NOSVE-NEXT:    udiv w10, w9, w81676; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91677; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]1678; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]1679; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]1680; NONEON-NOSVE-NEXT:    udiv w10, w9, w81681; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91682; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]1683; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]1684; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]1685; NONEON-NOSVE-NEXT:    udiv w10, w9, w81686; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91687; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]1688; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]1689; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]1690; NONEON-NOSVE-NEXT:    udiv w10, w9, w81691; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91692; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]1693; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]1694; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]1695; NONEON-NOSVE-NEXT:    udiv w10, w9, w81696; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91697; NONEON-NOSVE-NEXT:    ldrh w9, [sp]1698; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]1699; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]1700; NONEON-NOSVE-NEXT:    udiv w10, w9, w81701; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91702; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]1703; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1704; NONEON-NOSVE-NEXT:    add sp, sp, #481705; NONEON-NOSVE-NEXT:    ret1706  %res = urem <8 x i16> %op1, %op21707  ret <8 x i16> %res1708}1709 1710define void @urem_v16i16(ptr %a, ptr %b) {1711; CHECK-LABEL: urem_v16i16:1712; CHECK:       // %bb.0:1713; CHECK-NEXT:    ldp q4, q1, [x1]1714; CHECK-NEXT:    ptrue p0.s, vl41715; CHECK-NEXT:    ldr q0, [x0, #16]1716; CHECK-NEXT:    uunpklo z2.s, z1.h1717; CHECK-NEXT:    uunpklo z3.s, z0.h1718; CHECK-NEXT:    uunpklo z5.s, z4.h1719; CHECK-NEXT:    movprfx z16, z01720; CHECK-NEXT:    ext z16.b, z16.b, z0.b, #81721; CHECK-NEXT:    udivr z2.s, p0/m, z2.s, z3.s1722; CHECK-NEXT:    ldr q3, [x0]1723; CHECK-NEXT:    uunpklo z16.s, z16.h1724; CHECK-NEXT:    uunpklo z6.s, z3.h1725; CHECK-NEXT:    movprfx z7, z31726; CHECK-NEXT:    ext z7.b, z7.b, z3.b, #81727; CHECK-NEXT:    uunpklo z7.s, z7.h1728; CHECK-NEXT:    udivr z5.s, p0/m, z5.s, z6.s1729; CHECK-NEXT:    movprfx z6, z41730; CHECK-NEXT:    ext z6.b, z6.b, z4.b, #81731; CHECK-NEXT:    uunpklo z6.s, z6.h1732; CHECK-NEXT:    udivr z6.s, p0/m, z6.s, z7.s1733; CHECK-NEXT:    movprfx z7, z11734; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #81735; CHECK-NEXT:    uunpklo z7.s, z7.h1736; CHECK-NEXT:    udivr z7.s, p0/m, z7.s, z16.s1737; CHECK-NEXT:    uzp1 z16.h, z5.h, z5.h1738; CHECK-NEXT:    ptrue p0.h, vl41739; CHECK-NEXT:    uzp1 z17.h, z6.h, z6.h1740; CHECK-NEXT:    uzp1 z5.h, z2.h, z2.h1741; CHECK-NEXT:    splice z2.h, p0, { z16.h, z17.h }1742; CHECK-NEXT:    uzp1 z6.h, z7.h, z7.h1743; CHECK-NEXT:    splice z5.h, p0, { z5.h, z6.h }1744; CHECK-NEXT:    ptrue p0.h, vl81745; CHECK-NEXT:    msb z2.h, p0/m, z4.h, z3.h1746; CHECK-NEXT:    mls z0.h, p0/m, z5.h, z1.h1747; CHECK-NEXT:    stp q2, q0, [x0]1748; CHECK-NEXT:    ret1749;1750; NONEON-NOSVE-LABEL: urem_v16i16:1751; NONEON-NOSVE:       // %bb.0:1752; NONEON-NOSVE-NEXT:    sub sp, sp, #961753; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961754; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1755; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1756; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1757; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1758; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]1759; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]1760; NONEON-NOSVE-NEXT:    udiv w10, w9, w81761; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91762; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]1763; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]1764; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]1765; NONEON-NOSVE-NEXT:    udiv w10, w9, w81766; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91767; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]1768; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]1769; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]1770; NONEON-NOSVE-NEXT:    udiv w10, w9, w81771; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91772; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]1773; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]1774; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]1775; NONEON-NOSVE-NEXT:    udiv w10, w9, w81776; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91777; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]1778; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]1779; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]1780; NONEON-NOSVE-NEXT:    udiv w10, w9, w81781; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91782; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]1783; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]1784; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]1785; NONEON-NOSVE-NEXT:    udiv w10, w9, w81786; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91787; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]1788; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]1789; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]1790; NONEON-NOSVE-NEXT:    udiv w10, w9, w81791; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91792; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]1793; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]1794; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]1795; NONEON-NOSVE-NEXT:    udiv w10, w9, w81796; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91797; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]1798; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]1799; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]1800; NONEON-NOSVE-NEXT:    udiv w10, w9, w81801; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91802; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]1803; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]1804; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]1805; NONEON-NOSVE-NEXT:    udiv w10, w9, w81806; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91807; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]1808; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]1809; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]1810; NONEON-NOSVE-NEXT:    udiv w10, w9, w81811; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91812; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]1813; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]1814; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]1815; NONEON-NOSVE-NEXT:    udiv w10, w9, w81816; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91817; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]1818; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]1819; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]1820; NONEON-NOSVE-NEXT:    udiv w10, w9, w81821; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91822; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]1823; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]1824; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]1825; NONEON-NOSVE-NEXT:    udiv w10, w9, w81826; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91827; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]1828; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]1829; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]1830; NONEON-NOSVE-NEXT:    udiv w10, w9, w81831; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91832; NONEON-NOSVE-NEXT:    ldrh w9, [sp]1833; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]1834; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]1835; NONEON-NOSVE-NEXT:    udiv w10, w9, w81836; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91837; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]1838; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1839; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1840; NONEON-NOSVE-NEXT:    add sp, sp, #961841; NONEON-NOSVE-NEXT:    ret1842  %op1 = load <16 x i16>, ptr %a1843  %op2 = load <16 x i16>, ptr %b1844  %res = urem <16 x i16> %op1, %op21845  store <16 x i16> %res, ptr %a1846  ret void1847}1848 1849define <2 x i32> @urem_v2i32(<2 x i32> %op1, <2 x i32> %op2) {1850; CHECK-LABEL: urem_v2i32:1851; CHECK:       // %bb.0:1852; CHECK-NEXT:    ptrue p0.s, vl21853; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z11854; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01855; CHECK-NEXT:    movprfx z2, z01856; CHECK-NEXT:    udiv z2.s, p0/m, z2.s, z1.s1857; CHECK-NEXT:    mls z0.s, p0/m, z2.s, z1.s1858; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z01859; CHECK-NEXT:    ret1860;1861; NONEON-NOSVE-LABEL: urem_v2i32:1862; NONEON-NOSVE:       // %bb.0:1863; NONEON-NOSVE-NEXT:    sub sp, sp, #321864; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 321865; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]1866; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #8]1867; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]1868; NONEON-NOSVE-NEXT:    udiv w10, w11, w81869; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w111870; NONEON-NOSVE-NEXT:    str w8, [sp, #28]1871; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]1872; NONEON-NOSVE-NEXT:    udiv w10, w9, w81873; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91874; NONEON-NOSVE-NEXT:    str w8, [sp, #24]1875; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1876; NONEON-NOSVE-NEXT:    add sp, sp, #321877; NONEON-NOSVE-NEXT:    ret1878  %res = urem <2 x i32> %op1, %op21879  ret <2 x i32> %res1880}1881 1882define <4 x i32> @urem_v4i32(<4 x i32> %op1, <4 x i32> %op2) {1883; CHECK-LABEL: urem_v4i32:1884; CHECK:       // %bb.0:1885; CHECK-NEXT:    ptrue p0.s, vl41886; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z11887; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z01888; CHECK-NEXT:    movprfx z2, z01889; CHECK-NEXT:    udiv z2.s, p0/m, z2.s, z1.s1890; CHECK-NEXT:    mls z0.s, p0/m, z2.s, z1.s1891; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z01892; CHECK-NEXT:    ret1893;1894; NONEON-NOSVE-LABEL: urem_v4i32:1895; NONEON-NOSVE:       // %bb.0:1896; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!1897; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481898; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #8]1899; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]1900; NONEON-NOSVE-NEXT:    udiv w10, w11, w81901; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w111902; NONEON-NOSVE-NEXT:    str w8, [sp, #44]1903; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]1904; NONEON-NOSVE-NEXT:    udiv w10, w9, w81905; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w91906; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]1907; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]1908; NONEON-NOSVE-NEXT:    udiv w10, w9, w81909; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91910; NONEON-NOSVE-NEXT:    ldr w9, [sp]1911; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #36]1912; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]1913; NONEON-NOSVE-NEXT:    udiv w10, w9, w81914; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91915; NONEON-NOSVE-NEXT:    str w8, [sp, #32]1916; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1917; NONEON-NOSVE-NEXT:    add sp, sp, #481918; NONEON-NOSVE-NEXT:    ret1919  %res = urem <4 x i32> %op1, %op21920  ret <4 x i32> %res1921}1922 1923define void @urem_v8i32(ptr %a, ptr %b) {1924; CHECK-LABEL: urem_v8i32:1925; CHECK:       // %bb.0:1926; CHECK-NEXT:    ldp q0, q3, [x1]1927; CHECK-NEXT:    ptrue p0.s, vl41928; CHECK-NEXT:    ldp q1, q2, [x0]1929; CHECK-NEXT:    movprfx z4, z11930; CHECK-NEXT:    udiv z4.s, p0/m, z4.s, z0.s1931; CHECK-NEXT:    movprfx z5, z21932; CHECK-NEXT:    udiv z5.s, p0/m, z5.s, z3.s1933; CHECK-NEXT:    msb z0.s, p0/m, z4.s, z1.s1934; CHECK-NEXT:    mls z2.s, p0/m, z5.s, z3.s1935; CHECK-NEXT:    stp q0, q2, [x0]1936; CHECK-NEXT:    ret1937;1938; NONEON-NOSVE-LABEL: urem_v8i32:1939; NONEON-NOSVE:       // %bb.0:1940; NONEON-NOSVE-NEXT:    sub sp, sp, #961941; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961942; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1943; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1944; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1945; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1946; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #40]1947; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]1948; NONEON-NOSVE-NEXT:    udiv w10, w11, w81949; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w111950; NONEON-NOSVE-NEXT:    str w8, [sp, #92]1951; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]1952; NONEON-NOSVE-NEXT:    udiv w10, w9, w81953; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w91954; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]1955; NONEON-NOSVE-NEXT:    ldr w9, [sp, #36]1956; NONEON-NOSVE-NEXT:    udiv w10, w9, w81957; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91958; NONEON-NOSVE-NEXT:    ldr w9, [sp, #32]1959; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #84]1960; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]1961; NONEON-NOSVE-NEXT:    udiv w10, w9, w81962; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w91963; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]1964; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]1965; NONEON-NOSVE-NEXT:    udiv w10, w9, w81966; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91967; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #76]1968; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]1969; NONEON-NOSVE-NEXT:    ldp w9, w11, [sp, #4]1970; NONEON-NOSVE-NEXT:    udiv w10, w11, w81971; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w111972; NONEON-NOSVE-NEXT:    str w8, [sp, #72]1973; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]1974; NONEON-NOSVE-NEXT:    udiv w10, w9, w81975; NONEON-NOSVE-NEXT:    msub w11, w10, w8, w91976; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]1977; NONEON-NOSVE-NEXT:    ldr w9, [sp]1978; NONEON-NOSVE-NEXT:    udiv w10, w9, w81979; NONEON-NOSVE-NEXT:    msub w8, w10, w8, w91980; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]1981; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1982; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1983; NONEON-NOSVE-NEXT:    add sp, sp, #961984; NONEON-NOSVE-NEXT:    ret1985  %op1 = load <8 x i32>, ptr %a1986  %op2 = load <8 x i32>, ptr %b1987  %res = urem <8 x i32> %op1, %op21988  store <8 x i32> %res, ptr %a1989  ret void1990}1991 1992define <1 x i64> @urem_v1i64(<1 x i64> %op1, <1 x i64> %op2) {1993; CHECK-LABEL: urem_v1i64:1994; CHECK:       // %bb.0:1995; CHECK-NEXT:    ptrue p0.d, vl11996; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z11997; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z01998; CHECK-NEXT:    movprfx z2, z01999; CHECK-NEXT:    udiv z2.d, p0/m, z2.d, z1.d2000; CHECK-NEXT:    mls z0.d, p0/m, z2.d, z1.d2001; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z02002; CHECK-NEXT:    ret2003;2004; NONEON-NOSVE-LABEL: urem_v1i64:2005; NONEON-NOSVE:       // %bb.0:2006; NONEON-NOSVE-NEXT:    sub sp, sp, #162007; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 162008; NONEON-NOSVE-NEXT:    fmov x8, d12009; NONEON-NOSVE-NEXT:    fmov x9, d02010; NONEON-NOSVE-NEXT:    udiv x10, x9, x82011; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x92012; NONEON-NOSVE-NEXT:    str x8, [sp, #8]2013; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]2014; NONEON-NOSVE-NEXT:    add sp, sp, #162015; NONEON-NOSVE-NEXT:    ret2016  %res = urem <1 x i64> %op1, %op22017  ret <1 x i64> %res2018}2019 2020define <2 x i64> @urem_v2i64(<2 x i64> %op1, <2 x i64> %op2) {2021; CHECK-LABEL: urem_v2i64:2022; CHECK:       // %bb.0:2023; CHECK-NEXT:    ptrue p0.d, vl22024; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z12025; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z02026; CHECK-NEXT:    movprfx z2, z02027; CHECK-NEXT:    udiv z2.d, p0/m, z2.d, z1.d2028; CHECK-NEXT:    mls z0.d, p0/m, z2.d, z1.d2029; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z02030; CHECK-NEXT:    ret2031;2032; NONEON-NOSVE-LABEL: urem_v2i64:2033; NONEON-NOSVE:       // %bb.0:2034; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!2035; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 482036; NONEON-NOSVE-NEXT:    ldp x9, x11, [sp]2037; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]2038; NONEON-NOSVE-NEXT:    udiv x10, x11, x82039; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x112040; NONEON-NOSVE-NEXT:    str x8, [sp, #40]2041; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]2042; NONEON-NOSVE-NEXT:    udiv x10, x9, x82043; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x92044; NONEON-NOSVE-NEXT:    str x8, [sp, #32]2045; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]2046; NONEON-NOSVE-NEXT:    add sp, sp, #482047; NONEON-NOSVE-NEXT:    ret2048  %res = urem <2 x i64> %op1, %op22049  ret <2 x i64> %res2050}2051 2052define void @urem_v4i64(ptr %a, ptr %b) {2053; CHECK-LABEL: urem_v4i64:2054; CHECK:       // %bb.0:2055; CHECK-NEXT:    ldp q0, q3, [x1]2056; CHECK-NEXT:    ptrue p0.d, vl22057; CHECK-NEXT:    ldp q1, q2, [x0]2058; CHECK-NEXT:    movprfx z4, z12059; CHECK-NEXT:    udiv z4.d, p0/m, z4.d, z0.d2060; CHECK-NEXT:    movprfx z5, z22061; CHECK-NEXT:    udiv z5.d, p0/m, z5.d, z3.d2062; CHECK-NEXT:    msb z0.d, p0/m, z4.d, z1.d2063; CHECK-NEXT:    mls z2.d, p0/m, z5.d, z3.d2064; CHECK-NEXT:    stp q0, q2, [x0]2065; CHECK-NEXT:    ret2066;2067; NONEON-NOSVE-LABEL: urem_v4i64:2068; NONEON-NOSVE:       // %bb.0:2069; NONEON-NOSVE-NEXT:    sub sp, sp, #962070; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 962071; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]2072; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]2073; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]2074; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]2075; NONEON-NOSVE-NEXT:    ldp x9, x11, [sp, #32]2076; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]2077; NONEON-NOSVE-NEXT:    udiv x10, x11, x82078; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x112079; NONEON-NOSVE-NEXT:    str x8, [sp, #88]2080; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]2081; NONEON-NOSVE-NEXT:    udiv x10, x9, x82082; NONEON-NOSVE-NEXT:    msub x11, x10, x8, x92083; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]2084; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]2085; NONEON-NOSVE-NEXT:    udiv x10, x9, x82086; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x92087; NONEON-NOSVE-NEXT:    ldr x9, [sp]2088; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #72]2089; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]2090; NONEON-NOSVE-NEXT:    udiv x10, x9, x82091; NONEON-NOSVE-NEXT:    msub x8, x10, x8, x92092; NONEON-NOSVE-NEXT:    str x8, [sp, #64]2093; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]2094; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]2095; NONEON-NOSVE-NEXT:    add sp, sp, #962096; NONEON-NOSVE-NEXT:    ret2097  %op1 = load <4 x i64>, ptr %a2098  %op2 = load <4 x i64>, ptr %b2099  %res = urem <4 x i64> %op1, %op22100  store <4 x i64> %res, ptr %a2101  ret void2102}2103