brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.0 KiB · e9b2f53 Raw
1299 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 void @add_v4i8(ptr %a, ptr %b) {10; CHECK-LABEL: add_v4i8:11; CHECK:       // %bb.0:12; CHECK-NEXT:    ptrue p0.h, vl413; CHECK-NEXT:    ld1b { z0.h }, p0/z, [x0]14; CHECK-NEXT:    ld1b { z1.h }, p0/z, [x1]15; CHECK-NEXT:    add z0.h, z0.h, z1.h16; CHECK-NEXT:    st1b { z0.h }, p0, [x0]17; CHECK-NEXT:    ret18;19; NONEON-NOSVE-LABEL: add_v4i8:20; NONEON-NOSVE:       // %bb.0:21; NONEON-NOSVE-NEXT:    ldrb w8, [x0, #3]22; NONEON-NOSVE-NEXT:    ldrb w9, [x1, #3]23; NONEON-NOSVE-NEXT:    ldrb w10, [x0, #2]24; NONEON-NOSVE-NEXT:    ldrb w11, [x0, #1]25; NONEON-NOSVE-NEXT:    ldrb w12, [x1, #2]26; NONEON-NOSVE-NEXT:    ldrb w13, [x0]27; NONEON-NOSVE-NEXT:    add w8, w8, w928; NONEON-NOSVE-NEXT:    ldrb w14, [x1, #1]29; NONEON-NOSVE-NEXT:    ldrb w9, [x1]30; NONEON-NOSVE-NEXT:    add w10, w10, w1231; NONEON-NOSVE-NEXT:    strb w8, [x0, #3]32; NONEON-NOSVE-NEXT:    add w8, w11, w1433; NONEON-NOSVE-NEXT:    add w9, w13, w934; NONEON-NOSVE-NEXT:    strb w10, [x0, #2]35; NONEON-NOSVE-NEXT:    strb w8, [x0, #1]36; NONEON-NOSVE-NEXT:    strb w9, [x0]37; NONEON-NOSVE-NEXT:    ret38  %op1 = load <4 x i8>, ptr %a39  %op2 = load <4 x i8>, ptr %b40  %res = add <4 x i8> %op1, %op241  store <4 x i8> %res, ptr %a42  ret void43}44 45define void @add_v8i8(ptr %a, ptr %b) {46; CHECK-LABEL: add_v8i8:47; CHECK:       // %bb.0:48; CHECK-NEXT:    ldr d0, [x0]49; CHECK-NEXT:    ldr d1, [x1]50; CHECK-NEXT:    add z0.b, z0.b, z1.b51; CHECK-NEXT:    str d0, [x0]52; CHECK-NEXT:    ret53;54; NONEON-NOSVE-LABEL: add_v8i8:55; NONEON-NOSVE:       // %bb.0:56; NONEON-NOSVE-NEXT:    sub sp, sp, #3257; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 3258; NONEON-NOSVE-NEXT:    ldr d0, [x1]59; NONEON-NOSVE-NEXT:    ldr d1, [x0]60; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #8]61; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]62; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]63; NONEON-NOSVE-NEXT:    add w8, w9, w864; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]65; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]66; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]67; NONEON-NOSVE-NEXT:    add w8, w9, w868; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]69; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]70; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]71; NONEON-NOSVE-NEXT:    add w8, w9, w872; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]73; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]74; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]75; NONEON-NOSVE-NEXT:    add w8, w9, w876; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]77; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]78; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]79; NONEON-NOSVE-NEXT:    add w8, w9, w880; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]81; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]82; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]83; NONEON-NOSVE-NEXT:    add w8, w9, w884; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]85; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]86; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]87; NONEON-NOSVE-NEXT:    add w8, w9, w888; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]89; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]90; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]91; NONEON-NOSVE-NEXT:    add w8, w9, w892; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]93; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]94; NONEON-NOSVE-NEXT:    str d0, [x0]95; NONEON-NOSVE-NEXT:    add sp, sp, #3296; NONEON-NOSVE-NEXT:    ret97  %op1 = load <8 x i8>, ptr %a98  %op2 = load <8 x i8>, ptr %b99  %res = add <8 x i8> %op1, %op2100  store <8 x i8> %res, ptr %a101  ret void102}103 104define void @add_v16i8(ptr %a, ptr %b) {105; CHECK-LABEL: add_v16i8:106; CHECK:       // %bb.0:107; CHECK-NEXT:    ldr q0, [x0]108; CHECK-NEXT:    ldr q1, [x1]109; CHECK-NEXT:    add z0.b, z0.b, z1.b110; CHECK-NEXT:    str q0, [x0]111; CHECK-NEXT:    ret112;113; NONEON-NOSVE-LABEL: add_v16i8:114; NONEON-NOSVE:       // %bb.0:115; NONEON-NOSVE-NEXT:    ldr q0, [x1]116; NONEON-NOSVE-NEXT:    ldr q1, [x0]117; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!118; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48119; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]120; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]121; NONEON-NOSVE-NEXT:    add w8, w9, w8122; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]123; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]124; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]125; NONEON-NOSVE-NEXT:    add w8, w9, w8126; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]127; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]128; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]129; NONEON-NOSVE-NEXT:    add w8, w9, w8130; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]131; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]132; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]133; NONEON-NOSVE-NEXT:    add w8, w9, w8134; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]135; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]136; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]137; NONEON-NOSVE-NEXT:    add w8, w9, w8138; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]139; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]140; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]141; NONEON-NOSVE-NEXT:    add w8, w9, w8142; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]143; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]144; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]145; NONEON-NOSVE-NEXT:    add w8, w9, w8146; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]147; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]148; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]149; NONEON-NOSVE-NEXT:    add w8, w9, w8150; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]151; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]152; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]153; NONEON-NOSVE-NEXT:    add w8, w9, w8154; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]155; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]156; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]157; NONEON-NOSVE-NEXT:    add w8, w9, w8158; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]159; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]160; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]161; NONEON-NOSVE-NEXT:    add w8, w9, w8162; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]163; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]164; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]165; NONEON-NOSVE-NEXT:    add w8, w9, w8166; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]167; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]168; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]169; NONEON-NOSVE-NEXT:    add w8, w9, w8170; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]171; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]172; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]173; NONEON-NOSVE-NEXT:    add w8, w9, w8174; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]175; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]176; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]177; NONEON-NOSVE-NEXT:    add w8, w9, w8178; NONEON-NOSVE-NEXT:    ldrb w9, [sp]179; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]180; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]181; NONEON-NOSVE-NEXT:    add w8, w9, w8182; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]183; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]184; NONEON-NOSVE-NEXT:    str q0, [x0]185; NONEON-NOSVE-NEXT:    add sp, sp, #48186; NONEON-NOSVE-NEXT:    ret187  %op1 = load <16 x i8>, ptr %a188  %op2 = load <16 x i8>, ptr %b189  %res = add <16 x i8> %op1, %op2190  store <16 x i8> %res, ptr %a191  ret void192}193 194define void @add_v32i8(ptr %a, ptr %b) {195; CHECK-LABEL: add_v32i8:196; CHECK:       // %bb.0:197; CHECK-NEXT:    ldp q0, q3, [x1]198; CHECK-NEXT:    ldp q1, q2, [x0]199; CHECK-NEXT:    add z0.b, z1.b, z0.b200; CHECK-NEXT:    add z1.b, z2.b, z3.b201; CHECK-NEXT:    stp q0, q1, [x0]202; CHECK-NEXT:    ret203;204; NONEON-NOSVE-LABEL: add_v32i8:205; NONEON-NOSVE:       // %bb.0:206; NONEON-NOSVE-NEXT:    sub sp, sp, #96207; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96208; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]209; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]210; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]211; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]212; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]213; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]214; NONEON-NOSVE-NEXT:    add w8, w9, w8215; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]216; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]217; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]218; NONEON-NOSVE-NEXT:    add w8, w9, w8219; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]220; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]221; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]222; NONEON-NOSVE-NEXT:    add w8, w9, w8223; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]224; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]225; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]226; NONEON-NOSVE-NEXT:    add w8, w9, w8227; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]228; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]229; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]230; NONEON-NOSVE-NEXT:    add w8, w9, w8231; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]232; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]233; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]234; NONEON-NOSVE-NEXT:    add w8, w9, w8235; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]236; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]237; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]238; NONEON-NOSVE-NEXT:    add w8, w9, w8239; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]240; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]241; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]242; NONEON-NOSVE-NEXT:    add w8, w9, w8243; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]244; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]245; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]246; NONEON-NOSVE-NEXT:    add w8, w9, w8247; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]248; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]249; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]250; NONEON-NOSVE-NEXT:    add w8, w9, w8251; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]252; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]253; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]254; NONEON-NOSVE-NEXT:    add w8, w9, w8255; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]256; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]257; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]258; NONEON-NOSVE-NEXT:    add w8, w9, w8259; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]260; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]261; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]262; NONEON-NOSVE-NEXT:    add w8, w9, w8263; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]264; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]265; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]266; NONEON-NOSVE-NEXT:    add w8, w9, w8267; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]268; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]269; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]270; NONEON-NOSVE-NEXT:    add w8, w9, w8271; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]272; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]273; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]274; NONEON-NOSVE-NEXT:    add w8, w9, w8275; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]276; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]277; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]278; NONEON-NOSVE-NEXT:    add w8, w9, w8279; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]280; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]281; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]282; NONEON-NOSVE-NEXT:    add w8, w9, w8283; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]284; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]285; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]286; NONEON-NOSVE-NEXT:    add w8, w9, w8287; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]288; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]289; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]290; NONEON-NOSVE-NEXT:    add w8, w9, w8291; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]292; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]293; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]294; NONEON-NOSVE-NEXT:    add w8, w9, w8295; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]296; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]297; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]298; NONEON-NOSVE-NEXT:    add w8, w9, w8299; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]300; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]301; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]302; NONEON-NOSVE-NEXT:    add w8, w9, w8303; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]304; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]305; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]306; NONEON-NOSVE-NEXT:    add w8, w9, w8307; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]308; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]309; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]310; NONEON-NOSVE-NEXT:    add w8, w9, w8311; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]312; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]313; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]314; NONEON-NOSVE-NEXT:    add w8, w9, w8315; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]316; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]317; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]318; NONEON-NOSVE-NEXT:    add w8, w9, w8319; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]320; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]321; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]322; NONEON-NOSVE-NEXT:    add w8, w9, w8323; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]324; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]325; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]326; NONEON-NOSVE-NEXT:    add w8, w9, w8327; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]328; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]329; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]330; NONEON-NOSVE-NEXT:    add w8, w9, w8331; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]332; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]333; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]334; NONEON-NOSVE-NEXT:    add w8, w9, w8335; NONEON-NOSVE-NEXT:    ldrb w9, [sp]336; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]337; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]338; NONEON-NOSVE-NEXT:    add w8, w9, w8339; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]340; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]341; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]342; NONEON-NOSVE-NEXT:    add sp, sp, #96343; NONEON-NOSVE-NEXT:    ret344  %op1 = load <32 x i8>, ptr %a345  %op2 = load <32 x i8>, ptr %b346  %res = add <32 x i8> %op1, %op2347  store <32 x i8> %res, ptr %a348  ret void349}350 351define void @add_v2i16(ptr %a, ptr %b, ptr %c) {352; CHECK-LABEL: add_v2i16:353; CHECK:       // %bb.0:354; CHECK-NEXT:    ptrue p0.s, vl2355; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0]356; CHECK-NEXT:    ld1h { z1.s }, p0/z, [x1]357; CHECK-NEXT:    add z0.s, z0.s, z1.s358; CHECK-NEXT:    st1h { z0.s }, p0, [x0]359; CHECK-NEXT:    ret360;361; NONEON-NOSVE-LABEL: add_v2i16:362; NONEON-NOSVE:       // %bb.0:363; NONEON-NOSVE-NEXT:    ldrh w8, [x0]364; NONEON-NOSVE-NEXT:    ldrh w9, [x1]365; NONEON-NOSVE-NEXT:    ldrh w10, [x0, #2]366; NONEON-NOSVE-NEXT:    ldrh w11, [x1, #2]367; NONEON-NOSVE-NEXT:    add w8, w8, w9368; NONEON-NOSVE-NEXT:    add w9, w10, w11369; NONEON-NOSVE-NEXT:    strh w8, [x0]370; NONEON-NOSVE-NEXT:    strh w9, [x0, #2]371; NONEON-NOSVE-NEXT:    ret372  %op1 = load <2 x i16>, ptr %a373  %op2 = load <2 x i16>, ptr %b374  %res = add <2 x i16> %op1, %op2375  store <2 x i16> %res, ptr %a376  ret void377}378 379define void @add_v4i16(ptr %a, ptr %b, ptr %c) {380; CHECK-LABEL: add_v4i16:381; CHECK:       // %bb.0:382; CHECK-NEXT:    ldr d0, [x0]383; CHECK-NEXT:    ldr d1, [x1]384; CHECK-NEXT:    add z0.h, z0.h, z1.h385; CHECK-NEXT:    str d0, [x0]386; CHECK-NEXT:    ret387;388; NONEON-NOSVE-LABEL: add_v4i16:389; NONEON-NOSVE:       // %bb.0:390; NONEON-NOSVE-NEXT:    sub sp, sp, #32391; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32392; NONEON-NOSVE-NEXT:    ldr d0, [x1]393; NONEON-NOSVE-NEXT:    ldr d1, [x0]394; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #8]395; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]396; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]397; NONEON-NOSVE-NEXT:    add w8, w9, w8398; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]399; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]400; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]401; NONEON-NOSVE-NEXT:    add w8, w9, w8402; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]403; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]404; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]405; NONEON-NOSVE-NEXT:    add w8, w9, w8406; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]407; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]408; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]409; NONEON-NOSVE-NEXT:    add w8, w9, w8410; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]411; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]412; NONEON-NOSVE-NEXT:    str d0, [x0]413; NONEON-NOSVE-NEXT:    add sp, sp, #32414; NONEON-NOSVE-NEXT:    ret415  %op1 = load <4 x i16>, ptr %a416  %op2 = load <4 x i16>, ptr %b417  %res = add <4 x i16> %op1, %op2418  store <4 x i16> %res, ptr %a419  ret void420}421 422define void @add_v8i16(ptr %a, ptr %b, ptr %c) {423; CHECK-LABEL: add_v8i16:424; CHECK:       // %bb.0:425; CHECK-NEXT:    ldr q0, [x0]426; CHECK-NEXT:    ldr q1, [x1]427; CHECK-NEXT:    add z0.h, z0.h, z1.h428; CHECK-NEXT:    str q0, [x0]429; CHECK-NEXT:    ret430;431; NONEON-NOSVE-LABEL: add_v8i16:432; NONEON-NOSVE:       // %bb.0:433; NONEON-NOSVE-NEXT:    ldr q0, [x1]434; NONEON-NOSVE-NEXT:    ldr q1, [x0]435; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!436; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48437; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]438; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]439; NONEON-NOSVE-NEXT:    add w8, w9, w8440; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]441; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]442; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]443; NONEON-NOSVE-NEXT:    add w8, w9, w8444; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]445; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]446; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]447; NONEON-NOSVE-NEXT:    add w8, w9, w8448; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]449; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]450; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]451; NONEON-NOSVE-NEXT:    add w8, w9, w8452; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]453; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]454; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]455; NONEON-NOSVE-NEXT:    add w8, w9, w8456; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]457; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]458; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]459; NONEON-NOSVE-NEXT:    add w8, w9, w8460; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]461; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]462; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]463; NONEON-NOSVE-NEXT:    add w8, w9, w8464; NONEON-NOSVE-NEXT:    ldrh w9, [sp]465; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]466; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]467; NONEON-NOSVE-NEXT:    add w8, w9, w8468; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]469; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]470; NONEON-NOSVE-NEXT:    str q0, [x0]471; NONEON-NOSVE-NEXT:    add sp, sp, #48472; NONEON-NOSVE-NEXT:    ret473  %op1 = load <8 x i16>, ptr %a474  %op2 = load <8 x i16>, ptr %b475  %res = add <8 x i16> %op1, %op2476  store <8 x i16> %res, ptr %a477  ret void478}479 480define void @add_v16i16(ptr %a, ptr %b, ptr %c) {481; CHECK-LABEL: add_v16i16:482; CHECK:       // %bb.0:483; CHECK-NEXT:    ldp q0, q3, [x1]484; CHECK-NEXT:    ldp q1, q2, [x0]485; CHECK-NEXT:    add z0.h, z1.h, z0.h486; CHECK-NEXT:    add z1.h, z2.h, z3.h487; CHECK-NEXT:    stp q0, q1, [x0]488; CHECK-NEXT:    ret489;490; NONEON-NOSVE-LABEL: add_v16i16:491; NONEON-NOSVE:       // %bb.0:492; NONEON-NOSVE-NEXT:    sub sp, sp, #96493; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96494; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]495; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]496; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]497; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]498; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]499; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]500; NONEON-NOSVE-NEXT:    add w8, w9, w8501; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]502; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]503; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]504; NONEON-NOSVE-NEXT:    add w8, w9, w8505; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]506; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]507; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]508; NONEON-NOSVE-NEXT:    add w8, w9, w8509; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]510; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]511; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]512; NONEON-NOSVE-NEXT:    add w8, w9, w8513; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]514; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]515; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]516; NONEON-NOSVE-NEXT:    add w8, w9, w8517; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]518; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]519; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]520; NONEON-NOSVE-NEXT:    add w8, w9, w8521; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]522; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]523; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]524; NONEON-NOSVE-NEXT:    add w8, w9, w8525; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]526; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]527; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]528; NONEON-NOSVE-NEXT:    add w8, w9, w8529; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]530; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]531; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]532; NONEON-NOSVE-NEXT:    add w8, w9, w8533; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]534; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]535; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]536; NONEON-NOSVE-NEXT:    add w8, w9, w8537; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]538; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]539; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]540; NONEON-NOSVE-NEXT:    add w8, w9, w8541; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]542; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]543; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]544; NONEON-NOSVE-NEXT:    add w8, w9, w8545; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]546; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]547; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]548; NONEON-NOSVE-NEXT:    add w8, w9, w8549; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]550; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]551; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]552; NONEON-NOSVE-NEXT:    add w8, w9, w8553; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]554; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]555; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]556; NONEON-NOSVE-NEXT:    add w8, w9, w8557; NONEON-NOSVE-NEXT:    ldrh w9, [sp]558; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]559; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]560; NONEON-NOSVE-NEXT:    add w8, w9, w8561; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]562; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]563; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]564; NONEON-NOSVE-NEXT:    add sp, sp, #96565; NONEON-NOSVE-NEXT:    ret566  %op1 = load <16 x i16>, ptr %a567  %op2 = load <16 x i16>, ptr %b568  %res = add <16 x i16> %op1, %op2569  store <16 x i16> %res, ptr %a570  ret void571}572 573define void @abs_v2i32(ptr %a) {574; CHECK-LABEL: abs_v2i32:575; CHECK:       // %bb.0:576; CHECK-NEXT:    ptrue p0.s, vl2577; CHECK-NEXT:    ldr d0, [x0]578; CHECK-NEXT:    abs z0.s, p0/m, z0.s579; CHECK-NEXT:    str d0, [x0]580; CHECK-NEXT:    ret581;582; NONEON-NOSVE-LABEL: abs_v2i32:583; NONEON-NOSVE:       // %bb.0:584; NONEON-NOSVE-NEXT:    ldr d0, [x0]585; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!586; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16587; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]588; NONEON-NOSVE-NEXT:    cmp w8, #0589; NONEON-NOSVE-NEXT:    cneg w9, w8, mi590; NONEON-NOSVE-NEXT:    ldr w8, [sp]591; NONEON-NOSVE-NEXT:    cmp w8, #0592; NONEON-NOSVE-NEXT:    cneg w8, w8, mi593; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8]594; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]595; NONEON-NOSVE-NEXT:    str d0, [x0]596; NONEON-NOSVE-NEXT:    add sp, sp, #16597; NONEON-NOSVE-NEXT:    ret598  %op1 = load <2 x i32>, ptr %a599  %res = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %op1, i1 false)600  store <2 x i32> %res, ptr %a601  ret void602}603 604define void @abs_v4i32(ptr %a) {605; CHECK-LABEL: abs_v4i32:606; CHECK:       // %bb.0:607; CHECK-NEXT:    ptrue p0.s, vl4608; CHECK-NEXT:    ldr q0, [x0]609; CHECK-NEXT:    abs z0.s, p0/m, z0.s610; CHECK-NEXT:    str q0, [x0]611; CHECK-NEXT:    ret612;613; NONEON-NOSVE-LABEL: abs_v4i32:614; NONEON-NOSVE:       // %bb.0:615; NONEON-NOSVE-NEXT:    ldr q0, [x0]616; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!617; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32618; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]619; NONEON-NOSVE-NEXT:    cmp w8, #0620; NONEON-NOSVE-NEXT:    cneg w9, w8, mi621; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]622; NONEON-NOSVE-NEXT:    cmp w8, #0623; NONEON-NOSVE-NEXT:    cneg w8, w8, mi624; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]625; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]626; NONEON-NOSVE-NEXT:    cmp w8, #0627; NONEON-NOSVE-NEXT:    cneg w9, w8, mi628; NONEON-NOSVE-NEXT:    ldr w8, [sp]629; NONEON-NOSVE-NEXT:    cmp w8, #0630; NONEON-NOSVE-NEXT:    cneg w8, w8, mi631; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]632; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]633; NONEON-NOSVE-NEXT:    str q0, [x0]634; NONEON-NOSVE-NEXT:    add sp, sp, #32635; NONEON-NOSVE-NEXT:    ret636  %op1 = load <4 x i32>, ptr %a637  %res = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %op1, i1 false)638  store <4 x i32> %res, ptr %a639  ret void640}641 642define void @abs_v8i32(ptr %a) {643; CHECK-LABEL: abs_v8i32:644; CHECK:       // %bb.0:645; CHECK-NEXT:    ldp q0, q1, [x0]646; CHECK-NEXT:    ptrue p0.s, vl4647; CHECK-NEXT:    abs z0.s, p0/m, z0.s648; CHECK-NEXT:    abs z1.s, p0/m, z1.s649; CHECK-NEXT:    stp q0, q1, [x0]650; CHECK-NEXT:    ret651;652; NONEON-NOSVE-LABEL: abs_v8i32:653; NONEON-NOSVE:       // %bb.0:654; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]655; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!656; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64657; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]658; NONEON-NOSVE-NEXT:    cmp w8, #0659; NONEON-NOSVE-NEXT:    cneg w9, w8, mi660; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]661; NONEON-NOSVE-NEXT:    cmp w8, #0662; NONEON-NOSVE-NEXT:    cneg w8, w8, mi663; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]664; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]665; NONEON-NOSVE-NEXT:    cmp w8, #0666; NONEON-NOSVE-NEXT:    cneg w9, w8, mi667; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]668; NONEON-NOSVE-NEXT:    cmp w8, #0669; NONEON-NOSVE-NEXT:    cneg w8, w8, mi670; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]671; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]672; NONEON-NOSVE-NEXT:    cmp w8, #0673; NONEON-NOSVE-NEXT:    cneg w9, w8, mi674; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]675; NONEON-NOSVE-NEXT:    cmp w8, #0676; NONEON-NOSVE-NEXT:    cneg w8, w8, mi677; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]678; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]679; NONEON-NOSVE-NEXT:    cmp w8, #0680; NONEON-NOSVE-NEXT:    cneg w9, w8, mi681; NONEON-NOSVE-NEXT:    ldr w8, [sp]682; NONEON-NOSVE-NEXT:    cmp w8, #0683; NONEON-NOSVE-NEXT:    cneg w8, w8, mi684; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]685; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]686; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]687; NONEON-NOSVE-NEXT:    add sp, sp, #64688; NONEON-NOSVE-NEXT:    ret689  %op1 = load <8 x i32>, ptr %a690  %res = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %op1, i1 false)691  store <8 x i32> %res, ptr %a692  ret void693}694 695define void @abs_v2i64(ptr %a) {696; CHECK-LABEL: abs_v2i64:697; CHECK:       // %bb.0:698; CHECK-NEXT:    ptrue p0.d, vl2699; CHECK-NEXT:    ldr q0, [x0]700; CHECK-NEXT:    abs z0.d, p0/m, z0.d701; CHECK-NEXT:    str q0, [x0]702; CHECK-NEXT:    ret703;704; NONEON-NOSVE-LABEL: abs_v2i64:705; NONEON-NOSVE:       // %bb.0:706; NONEON-NOSVE-NEXT:    ldr q0, [x0]707; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!708; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32709; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]710; NONEON-NOSVE-NEXT:    cmp x8, #0711; NONEON-NOSVE-NEXT:    cneg x9, x8, mi712; NONEON-NOSVE-NEXT:    ldr x8, [sp]713; NONEON-NOSVE-NEXT:    cmp x8, #0714; NONEON-NOSVE-NEXT:    cneg x8, x8, mi715; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #16]716; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]717; NONEON-NOSVE-NEXT:    str q0, [x0]718; NONEON-NOSVE-NEXT:    add sp, sp, #32719; NONEON-NOSVE-NEXT:    ret720  %op1 = load <2 x i64>, ptr %a721  %res = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %op1, i1 false)722  store <2 x i64> %res, ptr %a723  ret void724}725 726define void @abs_v4i64(ptr %a) {727; CHECK-LABEL: abs_v4i64:728; CHECK:       // %bb.0:729; CHECK-NEXT:    ldp q0, q1, [x0]730; CHECK-NEXT:    ptrue p0.d, vl2731; CHECK-NEXT:    abs z0.d, p0/m, z0.d732; CHECK-NEXT:    abs z1.d, p0/m, z1.d733; CHECK-NEXT:    stp q0, q1, [x0]734; CHECK-NEXT:    ret735;736; NONEON-NOSVE-LABEL: abs_v4i64:737; NONEON-NOSVE:       // %bb.0:738; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]739; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!740; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64741; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]742; NONEON-NOSVE-NEXT:    cmp x8, #0743; NONEON-NOSVE-NEXT:    cneg x9, x8, mi744; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]745; NONEON-NOSVE-NEXT:    cmp x8, #0746; NONEON-NOSVE-NEXT:    cneg x8, x8, mi747; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]748; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]749; NONEON-NOSVE-NEXT:    cmp x8, #0750; NONEON-NOSVE-NEXT:    cneg x9, x8, mi751; NONEON-NOSVE-NEXT:    ldr x8, [sp]752; NONEON-NOSVE-NEXT:    cmp x8, #0753; NONEON-NOSVE-NEXT:    cneg x8, x8, mi754; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]755; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]756; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]757; NONEON-NOSVE-NEXT:    add sp, sp, #64758; NONEON-NOSVE-NEXT:    ret759  %op1 = load <4 x i64>, ptr %a760  %res = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %op1, i1 false)761  store <4 x i64> %res, ptr %a762  ret void763}764 765define void @fadd_v2f16(ptr %a, ptr %b) {766; CHECK-LABEL: fadd_v2f16:767; CHECK:       // %bb.0:768; CHECK-NEXT:    ptrue p0.h, vl4769; CHECK-NEXT:    ldr s0, [x0]770; CHECK-NEXT:    ldr s1, [x1]771; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h772; CHECK-NEXT:    str s0, [x0]773; CHECK-NEXT:    ret774;775; NONEON-NOSVE-LABEL: fadd_v2f16:776; NONEON-NOSVE:       // %bb.0:777; NONEON-NOSVE-NEXT:    ldr w8, [x0]778; NONEON-NOSVE-NEXT:    str w8, [sp, #-48]!779; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48780; NONEON-NOSVE-NEXT:    ldr w8, [x1]781; NONEON-NOSVE-NEXT:    str w8, [sp, #8]782; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]783; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]784; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]785; NONEON-NOSVE-NEXT:    ldr h1, [sp, #18]786; NONEON-NOSVE-NEXT:    fcvt s0, h0787; NONEON-NOSVE-NEXT:    fcvt s1, h1788; NONEON-NOSVE-NEXT:    fadd s0, s1, s0789; NONEON-NOSVE-NEXT:    ldr h1, [sp, #16]790; NONEON-NOSVE-NEXT:    fcvt s1, h1791; NONEON-NOSVE-NEXT:    fcvt h0, s0792; NONEON-NOSVE-NEXT:    str h0, [sp, #34]793; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]794; NONEON-NOSVE-NEXT:    fcvt s0, h0795; NONEON-NOSVE-NEXT:    fadd s0, s1, s0796; NONEON-NOSVE-NEXT:    fcvt h0, s0797; NONEON-NOSVE-NEXT:    str h0, [sp, #32]798; NONEON-NOSVE-NEXT:    ldr d0, [sp, #32]799; NONEON-NOSVE-NEXT:    str d0, [sp, #40]800; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40]801; NONEON-NOSVE-NEXT:    str w8, [x0]802; NONEON-NOSVE-NEXT:    add sp, sp, #48803; NONEON-NOSVE-NEXT:    ret804  %op1 = load <2 x half>, ptr %a805  %op2 = load <2 x half>, ptr %b806  %res = fadd <2 x half> %op1, %op2807  store <2 x half> %res, ptr %a808  ret void809}810 811define void @fadd_v4f16(ptr %a, ptr %b) {812; CHECK-LABEL: fadd_v4f16:813; CHECK:       // %bb.0:814; CHECK-NEXT:    ptrue p0.h, vl4815; CHECK-NEXT:    ldr d0, [x0]816; CHECK-NEXT:    ldr d1, [x1]817; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h818; CHECK-NEXT:    str d0, [x0]819; CHECK-NEXT:    ret820;821; NONEON-NOSVE-LABEL: fadd_v4f16:822; NONEON-NOSVE:       // %bb.0:823; NONEON-NOSVE-NEXT:    sub sp, sp, #32824; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32825; NONEON-NOSVE-NEXT:    ldr d0, [x1]826; NONEON-NOSVE-NEXT:    ldr d1, [x0]827; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #8]828; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]829; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]830; NONEON-NOSVE-NEXT:    fcvt s0, h0831; NONEON-NOSVE-NEXT:    fcvt s1, h1832; NONEON-NOSVE-NEXT:    fadd s0, s1, s0833; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]834; NONEON-NOSVE-NEXT:    fcvt s1, h1835; NONEON-NOSVE-NEXT:    fcvt h0, s0836; NONEON-NOSVE-NEXT:    str h0, [sp, #30]837; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]838; NONEON-NOSVE-NEXT:    fcvt s0, h0839; NONEON-NOSVE-NEXT:    fadd s0, s1, s0840; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]841; NONEON-NOSVE-NEXT:    fcvt s1, h1842; NONEON-NOSVE-NEXT:    fcvt h0, s0843; NONEON-NOSVE-NEXT:    str h0, [sp, #28]844; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]845; NONEON-NOSVE-NEXT:    fcvt s0, h0846; NONEON-NOSVE-NEXT:    fadd s0, s1, s0847; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]848; NONEON-NOSVE-NEXT:    fcvt s1, h1849; NONEON-NOSVE-NEXT:    fcvt h0, s0850; NONEON-NOSVE-NEXT:    str h0, [sp, #26]851; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]852; NONEON-NOSVE-NEXT:    fcvt s0, h0853; NONEON-NOSVE-NEXT:    fadd s0, s1, s0854; NONEON-NOSVE-NEXT:    fcvt h0, s0855; NONEON-NOSVE-NEXT:    str h0, [sp, #24]856; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]857; NONEON-NOSVE-NEXT:    str d0, [x0]858; NONEON-NOSVE-NEXT:    add sp, sp, #32859; NONEON-NOSVE-NEXT:    ret860  %op1 = load <4 x half>, ptr %a861  %op2 = load <4 x half>, ptr %b862  %res = fadd <4 x half> %op1, %op2863  store <4 x half> %res, ptr %a864  ret void865}866 867define void @fadd_v8f16(ptr %a, ptr %b) {868; CHECK-LABEL: fadd_v8f16:869; CHECK:       // %bb.0:870; CHECK-NEXT:    ptrue p0.h, vl8871; CHECK-NEXT:    ldr q0, [x0]872; CHECK-NEXT:    ldr q1, [x1]873; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h874; CHECK-NEXT:    str q0, [x0]875; CHECK-NEXT:    ret876;877; NONEON-NOSVE-LABEL: fadd_v8f16:878; NONEON-NOSVE:       // %bb.0:879; NONEON-NOSVE-NEXT:    ldr q0, [x1]880; NONEON-NOSVE-NEXT:    ldr q1, [x0]881; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!882; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48883; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]884; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]885; NONEON-NOSVE-NEXT:    fcvt s0, h0886; NONEON-NOSVE-NEXT:    fcvt s1, h1887; NONEON-NOSVE-NEXT:    fadd s0, s1, s0888; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]889; NONEON-NOSVE-NEXT:    fcvt s1, h1890; NONEON-NOSVE-NEXT:    fcvt h0, s0891; NONEON-NOSVE-NEXT:    str h0, [sp, #46]892; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]893; NONEON-NOSVE-NEXT:    fcvt s0, h0894; NONEON-NOSVE-NEXT:    fadd s0, s1, s0895; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]896; NONEON-NOSVE-NEXT:    fcvt s1, h1897; NONEON-NOSVE-NEXT:    fcvt h0, s0898; NONEON-NOSVE-NEXT:    str h0, [sp, #44]899; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]900; NONEON-NOSVE-NEXT:    fcvt s0, h0901; NONEON-NOSVE-NEXT:    fadd s0, s1, s0902; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]903; NONEON-NOSVE-NEXT:    fcvt s1, h1904; NONEON-NOSVE-NEXT:    fcvt h0, s0905; NONEON-NOSVE-NEXT:    str h0, [sp, #42]906; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]907; NONEON-NOSVE-NEXT:    fcvt s0, h0908; NONEON-NOSVE-NEXT:    fadd s0, s1, s0909; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]910; NONEON-NOSVE-NEXT:    fcvt s1, h1911; NONEON-NOSVE-NEXT:    fcvt h0, s0912; NONEON-NOSVE-NEXT:    str h0, [sp, #40]913; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]914; NONEON-NOSVE-NEXT:    fcvt s0, h0915; NONEON-NOSVE-NEXT:    fadd s0, s1, s0916; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]917; NONEON-NOSVE-NEXT:    fcvt s1, h1918; NONEON-NOSVE-NEXT:    fcvt h0, s0919; NONEON-NOSVE-NEXT:    str h0, [sp, #38]920; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]921; NONEON-NOSVE-NEXT:    fcvt s0, h0922; NONEON-NOSVE-NEXT:    fadd s0, s1, s0923; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]924; NONEON-NOSVE-NEXT:    fcvt s1, h1925; NONEON-NOSVE-NEXT:    fcvt h0, s0926; NONEON-NOSVE-NEXT:    str h0, [sp, #36]927; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]928; NONEON-NOSVE-NEXT:    fcvt s0, h0929; NONEON-NOSVE-NEXT:    fadd s0, s1, s0930; NONEON-NOSVE-NEXT:    ldr h1, [sp]931; NONEON-NOSVE-NEXT:    fcvt s1, h1932; NONEON-NOSVE-NEXT:    fcvt h0, s0933; NONEON-NOSVE-NEXT:    str h0, [sp, #34]934; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]935; NONEON-NOSVE-NEXT:    fcvt s0, h0936; NONEON-NOSVE-NEXT:    fadd s0, s1, s0937; NONEON-NOSVE-NEXT:    fcvt h0, s0938; NONEON-NOSVE-NEXT:    str h0, [sp, #32]939; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]940; NONEON-NOSVE-NEXT:    str q0, [x0]941; NONEON-NOSVE-NEXT:    add sp, sp, #48942; NONEON-NOSVE-NEXT:    ret943  %op1 = load <8 x half>, ptr %a944  %op2 = load <8 x half>, ptr %b945  %res = fadd <8 x half> %op1, %op2946  store <8 x half> %res, ptr %a947  ret void948}949 950define void @fadd_v16f16(ptr %a, ptr %b) {951; CHECK-LABEL: fadd_v16f16:952; CHECK:       // %bb.0:953; CHECK-NEXT:    ldp q0, q3, [x1]954; CHECK-NEXT:    ptrue p0.h, vl8955; CHECK-NEXT:    ldp q1, q2, [x0]956; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h957; CHECK-NEXT:    fadd z2.h, p0/m, z2.h, z3.h958; CHECK-NEXT:    stp q0, q2, [x0]959; CHECK-NEXT:    ret960;961; NONEON-NOSVE-LABEL: fadd_v16f16:962; NONEON-NOSVE:       // %bb.0:963; NONEON-NOSVE-NEXT:    sub sp, sp, #96964; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96965; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]966; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]967; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]968; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]969; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]970; NONEON-NOSVE-NEXT:    ldr h1, [sp, #46]971; NONEON-NOSVE-NEXT:    fcvt s0, h0972; NONEON-NOSVE-NEXT:    fcvt s1, h1973; NONEON-NOSVE-NEXT:    fadd s0, s1, s0974; NONEON-NOSVE-NEXT:    ldr h1, [sp, #44]975; NONEON-NOSVE-NEXT:    fcvt s1, h1976; NONEON-NOSVE-NEXT:    fcvt h0, s0977; NONEON-NOSVE-NEXT:    str h0, [sp, #94]978; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]979; NONEON-NOSVE-NEXT:    fcvt s0, h0980; NONEON-NOSVE-NEXT:    fadd s0, s1, s0981; NONEON-NOSVE-NEXT:    ldr h1, [sp, #42]982; NONEON-NOSVE-NEXT:    fcvt s1, h1983; NONEON-NOSVE-NEXT:    fcvt h0, s0984; NONEON-NOSVE-NEXT:    str h0, [sp, #92]985; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]986; NONEON-NOSVE-NEXT:    fcvt s0, h0987; NONEON-NOSVE-NEXT:    fadd s0, s1, s0988; NONEON-NOSVE-NEXT:    ldr h1, [sp, #40]989; NONEON-NOSVE-NEXT:    fcvt s1, h1990; NONEON-NOSVE-NEXT:    fcvt h0, s0991; NONEON-NOSVE-NEXT:    str h0, [sp, #90]992; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]993; NONEON-NOSVE-NEXT:    fcvt s0, h0994; NONEON-NOSVE-NEXT:    fadd s0, s1, s0995; NONEON-NOSVE-NEXT:    ldr h1, [sp, #38]996; NONEON-NOSVE-NEXT:    fcvt s1, h1997; NONEON-NOSVE-NEXT:    fcvt h0, s0998; NONEON-NOSVE-NEXT:    str h0, [sp, #88]999; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]1000; NONEON-NOSVE-NEXT:    fcvt s0, h01001; NONEON-NOSVE-NEXT:    fadd s0, s1, s01002; NONEON-NOSVE-NEXT:    ldr h1, [sp, #36]1003; NONEON-NOSVE-NEXT:    fcvt s1, h11004; NONEON-NOSVE-NEXT:    fcvt h0, s01005; NONEON-NOSVE-NEXT:    str h0, [sp, #86]1006; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]1007; NONEON-NOSVE-NEXT:    fcvt s0, h01008; NONEON-NOSVE-NEXT:    fadd s0, s1, s01009; NONEON-NOSVE-NEXT:    ldr h1, [sp, #34]1010; NONEON-NOSVE-NEXT:    fcvt s1, h11011; NONEON-NOSVE-NEXT:    fcvt h0, s01012; NONEON-NOSVE-NEXT:    str h0, [sp, #84]1013; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]1014; NONEON-NOSVE-NEXT:    fcvt s0, h01015; NONEON-NOSVE-NEXT:    fadd s0, s1, s01016; NONEON-NOSVE-NEXT:    ldr h1, [sp, #32]1017; NONEON-NOSVE-NEXT:    fcvt s1, h11018; NONEON-NOSVE-NEXT:    fcvt h0, s01019; NONEON-NOSVE-NEXT:    str h0, [sp, #82]1020; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]1021; NONEON-NOSVE-NEXT:    fcvt s0, h01022; NONEON-NOSVE-NEXT:    fadd s0, s1, s01023; NONEON-NOSVE-NEXT:    ldr h1, [sp, #14]1024; NONEON-NOSVE-NEXT:    fcvt s1, h11025; NONEON-NOSVE-NEXT:    fcvt h0, s01026; NONEON-NOSVE-NEXT:    str h0, [sp, #80]1027; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]1028; NONEON-NOSVE-NEXT:    fcvt s0, h01029; NONEON-NOSVE-NEXT:    fadd s0, s1, s01030; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]1031; NONEON-NOSVE-NEXT:    fcvt s1, h11032; NONEON-NOSVE-NEXT:    fcvt h0, s01033; NONEON-NOSVE-NEXT:    str h0, [sp, #78]1034; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]1035; NONEON-NOSVE-NEXT:    fcvt s0, h01036; NONEON-NOSVE-NEXT:    fadd s0, s1, s01037; NONEON-NOSVE-NEXT:    ldr h1, [sp, #10]1038; NONEON-NOSVE-NEXT:    fcvt s1, h11039; NONEON-NOSVE-NEXT:    fcvt h0, s01040; NONEON-NOSVE-NEXT:    str h0, [sp, #76]1041; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]1042; NONEON-NOSVE-NEXT:    fcvt s0, h01043; NONEON-NOSVE-NEXT:    fadd s0, s1, s01044; NONEON-NOSVE-NEXT:    ldr h1, [sp, #8]1045; NONEON-NOSVE-NEXT:    fcvt s1, h11046; NONEON-NOSVE-NEXT:    fcvt h0, s01047; NONEON-NOSVE-NEXT:    str h0, [sp, #74]1048; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]1049; NONEON-NOSVE-NEXT:    fcvt s0, h01050; NONEON-NOSVE-NEXT:    fadd s0, s1, s01051; NONEON-NOSVE-NEXT:    ldr h1, [sp, #6]1052; NONEON-NOSVE-NEXT:    fcvt s1, h11053; NONEON-NOSVE-NEXT:    fcvt h0, s01054; NONEON-NOSVE-NEXT:    str h0, [sp, #72]1055; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]1056; NONEON-NOSVE-NEXT:    fcvt s0, h01057; NONEON-NOSVE-NEXT:    fadd s0, s1, s01058; NONEON-NOSVE-NEXT:    ldr h1, [sp, #4]1059; NONEON-NOSVE-NEXT:    fcvt s1, h11060; NONEON-NOSVE-NEXT:    fcvt h0, s01061; NONEON-NOSVE-NEXT:    str h0, [sp, #70]1062; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]1063; NONEON-NOSVE-NEXT:    fcvt s0, h01064; NONEON-NOSVE-NEXT:    fadd s0, s1, s01065; NONEON-NOSVE-NEXT:    ldr h1, [sp, #2]1066; NONEON-NOSVE-NEXT:    fcvt s1, h11067; NONEON-NOSVE-NEXT:    fcvt h0, s01068; NONEON-NOSVE-NEXT:    str h0, [sp, #68]1069; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]1070; NONEON-NOSVE-NEXT:    fcvt s0, h01071; NONEON-NOSVE-NEXT:    fadd s0, s1, s01072; NONEON-NOSVE-NEXT:    ldr h1, [sp]1073; NONEON-NOSVE-NEXT:    fcvt s1, h11074; NONEON-NOSVE-NEXT:    fcvt h0, s01075; NONEON-NOSVE-NEXT:    str h0, [sp, #66]1076; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]1077; NONEON-NOSVE-NEXT:    fcvt s0, h01078; NONEON-NOSVE-NEXT:    fadd s0, s1, s01079; NONEON-NOSVE-NEXT:    fcvt h0, s01080; NONEON-NOSVE-NEXT:    str h0, [sp, #64]1081; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1082; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1083; NONEON-NOSVE-NEXT:    add sp, sp, #961084; NONEON-NOSVE-NEXT:    ret1085  %op1 = load <16 x half>, ptr %a1086  %op2 = load <16 x half>, ptr %b1087  %res = fadd <16 x half> %op1, %op21088  store <16 x half> %res, ptr %a1089  ret void1090}1091 1092define void @fadd_v2f32(ptr %a, ptr %b) {1093; CHECK-LABEL: fadd_v2f32:1094; CHECK:       // %bb.0:1095; CHECK-NEXT:    ptrue p0.s, vl21096; CHECK-NEXT:    ldr d0, [x0]1097; CHECK-NEXT:    ldr d1, [x1]1098; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s1099; CHECK-NEXT:    str d0, [x0]1100; CHECK-NEXT:    ret1101;1102; NONEON-NOSVE-LABEL: fadd_v2f32:1103; NONEON-NOSVE:       // %bb.0:1104; NONEON-NOSVE-NEXT:    sub sp, sp, #321105; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 321106; NONEON-NOSVE-NEXT:    ldr d0, [x1]1107; NONEON-NOSVE-NEXT:    ldr d1, [x0]1108; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #8]1109; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp, #8]1110; NONEON-NOSVE-NEXT:    ldr s0, [sp, #20]1111; NONEON-NOSVE-NEXT:    fadd s3, s2, s01112; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]1113; NONEON-NOSVE-NEXT:    fadd s0, s1, s01114; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #24]1115; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1116; NONEON-NOSVE-NEXT:    str d0, [x0]1117; NONEON-NOSVE-NEXT:    add sp, sp, #321118; NONEON-NOSVE-NEXT:    ret1119  %op1 = load <2 x float>, ptr %a1120  %op2 = load <2 x float>, ptr %b1121  %res = fadd <2 x float> %op1, %op21122  store <2 x float> %res, ptr %a1123  ret void1124}1125 1126define void @fadd_v4f32(ptr %a, ptr %b) {1127; CHECK-LABEL: fadd_v4f32:1128; CHECK:       // %bb.0:1129; CHECK-NEXT:    ptrue p0.s, vl41130; CHECK-NEXT:    ldr q0, [x0]1131; CHECK-NEXT:    ldr q1, [x1]1132; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s1133; CHECK-NEXT:    str q0, [x0]1134; CHECK-NEXT:    ret1135;1136; NONEON-NOSVE-LABEL: fadd_v4f32:1137; NONEON-NOSVE:       // %bb.0:1138; NONEON-NOSVE-NEXT:    ldr q0, [x1]1139; NONEON-NOSVE-NEXT:    ldr q1, [x0]1140; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!1141; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481142; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp, #8]1143; NONEON-NOSVE-NEXT:    ldr s0, [sp, #28]1144; NONEON-NOSVE-NEXT:    fadd s3, s2, s01145; NONEON-NOSVE-NEXT:    ldr s0, [sp, #24]1146; NONEON-NOSVE-NEXT:    fadd s0, s1, s01147; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp]1148; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #40]1149; NONEON-NOSVE-NEXT:    ldr s0, [sp, #20]1150; NONEON-NOSVE-NEXT:    fadd s3, s2, s01151; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]1152; NONEON-NOSVE-NEXT:    fadd s0, s1, s01153; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #32]1154; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1155; NONEON-NOSVE-NEXT:    str q0, [x0]1156; NONEON-NOSVE-NEXT:    add sp, sp, #481157; NONEON-NOSVE-NEXT:    ret1158  %op1 = load <4 x float>, ptr %a1159  %op2 = load <4 x float>, ptr %b1160  %res = fadd <4 x float> %op1, %op21161  store <4 x float> %res, ptr %a1162  ret void1163}1164 1165define void @fadd_v8f32(ptr %a, ptr %b) {1166; CHECK-LABEL: fadd_v8f32:1167; CHECK:       // %bb.0:1168; CHECK-NEXT:    ldp q0, q3, [x1]1169; CHECK-NEXT:    ptrue p0.s, vl41170; CHECK-NEXT:    ldp q1, q2, [x0]1171; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s1172; CHECK-NEXT:    fadd z2.s, p0/m, z2.s, z3.s1173; CHECK-NEXT:    stp q0, q2, [x0]1174; CHECK-NEXT:    ret1175;1176; NONEON-NOSVE-LABEL: fadd_v8f32:1177; NONEON-NOSVE:       // %bb.0:1178; NONEON-NOSVE-NEXT:    sub sp, sp, #961179; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961180; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1181; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1182; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1183; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1184; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp, #40]1185; NONEON-NOSVE-NEXT:    ldr s0, [sp, #60]1186; NONEON-NOSVE-NEXT:    fadd s3, s2, s01187; NONEON-NOSVE-NEXT:    ldr s0, [sp, #56]1188; NONEON-NOSVE-NEXT:    fadd s0, s1, s01189; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp, #32]1190; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #88]1191; NONEON-NOSVE-NEXT:    ldr s0, [sp, #52]1192; NONEON-NOSVE-NEXT:    fadd s3, s2, s01193; NONEON-NOSVE-NEXT:    ldr s0, [sp, #48]1194; NONEON-NOSVE-NEXT:    fadd s0, s1, s01195; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp, #8]1196; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #80]1197; NONEON-NOSVE-NEXT:    ldr s0, [sp, #28]1198; NONEON-NOSVE-NEXT:    fadd s3, s2, s01199; NONEON-NOSVE-NEXT:    ldr s0, [sp, #24]1200; NONEON-NOSVE-NEXT:    fadd s0, s1, s01201; NONEON-NOSVE-NEXT:    ldp s1, s2, [sp]1202; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #72]1203; NONEON-NOSVE-NEXT:    ldr s0, [sp, #20]1204; NONEON-NOSVE-NEXT:    fadd s3, s2, s01205; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]1206; NONEON-NOSVE-NEXT:    fadd s0, s1, s01207; NONEON-NOSVE-NEXT:    stp s0, s3, [sp, #64]1208; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1209; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1210; NONEON-NOSVE-NEXT:    add sp, sp, #961211; NONEON-NOSVE-NEXT:    ret1212  %op1 = load <8 x float>, ptr %a1213  %op2 = load <8 x float>, ptr %b1214  %res = fadd <8 x float> %op1, %op21215  store <8 x float> %res, ptr %a1216  ret void1217}1218 1219define void @fadd_v2f64(ptr %a, ptr %b) {1220; CHECK-LABEL: fadd_v2f64:1221; CHECK:       // %bb.0:1222; CHECK-NEXT:    ptrue p0.d, vl21223; CHECK-NEXT:    ldr q0, [x0]1224; CHECK-NEXT:    ldr q1, [x1]1225; CHECK-NEXT:    fadd z0.d, p0/m, z0.d, z1.d1226; CHECK-NEXT:    str q0, [x0]1227; CHECK-NEXT:    ret1228;1229; NONEON-NOSVE-LABEL: fadd_v2f64:1230; NONEON-NOSVE:       // %bb.0:1231; NONEON-NOSVE-NEXT:    ldr q0, [x1]1232; NONEON-NOSVE-NEXT:    ldr q1, [x0]1233; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!1234; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 481235; NONEON-NOSVE-NEXT:    ldp d1, d2, [sp]1236; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1237; NONEON-NOSVE-NEXT:    fadd d3, d2, d01238; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]1239; NONEON-NOSVE-NEXT:    fadd d0, d1, d01240; NONEON-NOSVE-NEXT:    stp d0, d3, [sp, #32]1241; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]1242; NONEON-NOSVE-NEXT:    str q0, [x0]1243; NONEON-NOSVE-NEXT:    add sp, sp, #481244; NONEON-NOSVE-NEXT:    ret1245  %op1 = load <2 x double>, ptr %a1246  %op2 = load <2 x double>, ptr %b1247  %res = fadd <2 x double> %op1, %op21248  store <2 x double> %res, ptr %a1249  ret void1250}1251 1252define void @fadd_v4f64(ptr %a, ptr %b) {1253; CHECK-LABEL: fadd_v4f64:1254; CHECK:       // %bb.0:1255; CHECK-NEXT:    ldp q0, q3, [x1]1256; CHECK-NEXT:    ptrue p0.d, vl21257; CHECK-NEXT:    ldp q1, q2, [x0]1258; CHECK-NEXT:    fadd z0.d, p0/m, z0.d, z1.d1259; CHECK-NEXT:    fadd z2.d, p0/m, z2.d, z3.d1260; CHECK-NEXT:    stp q0, q2, [x0]1261; CHECK-NEXT:    ret1262;1263; NONEON-NOSVE-LABEL: fadd_v4f64:1264; NONEON-NOSVE:       // %bb.0:1265; NONEON-NOSVE-NEXT:    sub sp, sp, #961266; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 961267; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]1268; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]1269; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]1270; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]1271; NONEON-NOSVE-NEXT:    ldp d1, d2, [sp, #32]1272; NONEON-NOSVE-NEXT:    ldr d0, [sp, #56]1273; NONEON-NOSVE-NEXT:    fadd d3, d2, d01274; NONEON-NOSVE-NEXT:    ldr d0, [sp, #48]1275; NONEON-NOSVE-NEXT:    fadd d0, d1, d01276; NONEON-NOSVE-NEXT:    ldp d1, d2, [sp]1277; NONEON-NOSVE-NEXT:    stp d0, d3, [sp, #80]1278; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]1279; NONEON-NOSVE-NEXT:    fadd d3, d2, d01280; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]1281; NONEON-NOSVE-NEXT:    fadd d0, d1, d01282; NONEON-NOSVE-NEXT:    stp d0, d3, [sp, #64]1283; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]1284; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]1285; NONEON-NOSVE-NEXT:    add sp, sp, #961286; NONEON-NOSVE-NEXT:    ret1287  %op1 = load <4 x double>, ptr %a1288  %op2 = load <4 x double>, ptr %b1289  %res = fadd <4 x double> %op1, %op21290  store <4 x double> %res, ptr %a1291  ret void1292}1293 1294declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)1295declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)1296declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)1297declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1)1298declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)1299