3900 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; FADD10;11 12define <2 x half> @fadd_v2f16(<2 x half> %op1, <2 x half> %op2) {13; CHECK-LABEL: fadd_v2f16:14; CHECK: // %bb.0:15; CHECK-NEXT: ptrue p0.h, vl416; CHECK-NEXT: // kill: def $d0 killed $d0 def $z017; CHECK-NEXT: // kill: def $d1 killed $d1 def $z118; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h19; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z020; CHECK-NEXT: ret21;22; NONEON-NOSVE-LABEL: fadd_v2f16:23; NONEON-NOSVE: // %bb.0:24; NONEON-NOSVE-NEXT: sub sp, sp, #3225; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3226; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]27; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]28; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]29; NONEON-NOSVE-NEXT: fcvt s0, h030; NONEON-NOSVE-NEXT: fcvt s1, h131; NONEON-NOSVE-NEXT: fadd s0, s1, s032; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]33; NONEON-NOSVE-NEXT: fcvt s1, h134; NONEON-NOSVE-NEXT: fcvt h0, s035; NONEON-NOSVE-NEXT: str h0, [sp, #30]36; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]37; NONEON-NOSVE-NEXT: fcvt s0, h038; NONEON-NOSVE-NEXT: fadd s0, s1, s039; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]40; NONEON-NOSVE-NEXT: fcvt s1, h141; NONEON-NOSVE-NEXT: fcvt h0, s042; NONEON-NOSVE-NEXT: str h0, [sp, #28]43; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]44; NONEON-NOSVE-NEXT: fcvt s0, h045; NONEON-NOSVE-NEXT: fadd s0, s1, s046; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]47; NONEON-NOSVE-NEXT: fcvt s1, h148; NONEON-NOSVE-NEXT: fcvt h0, s049; NONEON-NOSVE-NEXT: str h0, [sp, #26]50; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]51; NONEON-NOSVE-NEXT: fcvt s0, h052; NONEON-NOSVE-NEXT: fadd s0, s1, s053; NONEON-NOSVE-NEXT: fcvt h0, s054; NONEON-NOSVE-NEXT: str h0, [sp, #24]55; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]56; NONEON-NOSVE-NEXT: add sp, sp, #3257; NONEON-NOSVE-NEXT: ret58 %res = fadd <2 x half> %op1, %op259 ret <2 x half> %res60}61 62define <4 x half> @fadd_v4f16(<4 x half> %op1, <4 x half> %op2) {63; CHECK-LABEL: fadd_v4f16:64; CHECK: // %bb.0:65; CHECK-NEXT: ptrue p0.h, vl466; CHECK-NEXT: // kill: def $d0 killed $d0 def $z067; CHECK-NEXT: // kill: def $d1 killed $d1 def $z168; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h69; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z070; CHECK-NEXT: ret71;72; NONEON-NOSVE-LABEL: fadd_v4f16:73; NONEON-NOSVE: // %bb.0:74; NONEON-NOSVE-NEXT: sub sp, sp, #3275; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3276; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]77; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]78; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]79; NONEON-NOSVE-NEXT: fcvt s0, h080; NONEON-NOSVE-NEXT: fcvt s1, h181; NONEON-NOSVE-NEXT: fadd s0, s1, s082; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]83; NONEON-NOSVE-NEXT: fcvt s1, h184; NONEON-NOSVE-NEXT: fcvt h0, s085; NONEON-NOSVE-NEXT: str h0, [sp, #30]86; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]87; NONEON-NOSVE-NEXT: fcvt s0, h088; NONEON-NOSVE-NEXT: fadd s0, s1, s089; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]90; NONEON-NOSVE-NEXT: fcvt s1, h191; NONEON-NOSVE-NEXT: fcvt h0, s092; NONEON-NOSVE-NEXT: str h0, [sp, #28]93; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]94; NONEON-NOSVE-NEXT: fcvt s0, h095; NONEON-NOSVE-NEXT: fadd s0, s1, s096; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]97; NONEON-NOSVE-NEXT: fcvt s1, h198; NONEON-NOSVE-NEXT: fcvt h0, s099; NONEON-NOSVE-NEXT: str h0, [sp, #26]100; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]101; NONEON-NOSVE-NEXT: fcvt s0, h0102; NONEON-NOSVE-NEXT: fadd s0, s1, s0103; NONEON-NOSVE-NEXT: fcvt h0, s0104; NONEON-NOSVE-NEXT: str h0, [sp, #24]105; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]106; NONEON-NOSVE-NEXT: add sp, sp, #32107; NONEON-NOSVE-NEXT: ret108 %res = fadd <4 x half> %op1, %op2109 ret <4 x half> %res110}111 112define <8 x half> @fadd_v8f16(<8 x half> %op1, <8 x half> %op2) {113; CHECK-LABEL: fadd_v8f16:114; CHECK: // %bb.0:115; CHECK-NEXT: ptrue p0.h, vl8116; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0117; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1118; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h119; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0120; CHECK-NEXT: ret121;122; NONEON-NOSVE-LABEL: fadd_v8f16:123; NONEON-NOSVE: // %bb.0:124; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!125; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48126; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]127; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]128; NONEON-NOSVE-NEXT: fcvt s0, h0129; NONEON-NOSVE-NEXT: fcvt s1, h1130; NONEON-NOSVE-NEXT: fadd s0, s1, s0131; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]132; NONEON-NOSVE-NEXT: fcvt s1, h1133; NONEON-NOSVE-NEXT: fcvt h0, s0134; NONEON-NOSVE-NEXT: str h0, [sp, #46]135; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]136; NONEON-NOSVE-NEXT: fcvt s0, h0137; NONEON-NOSVE-NEXT: fadd s0, s1, s0138; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]139; NONEON-NOSVE-NEXT: fcvt s1, h1140; NONEON-NOSVE-NEXT: fcvt h0, s0141; NONEON-NOSVE-NEXT: str h0, [sp, #44]142; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]143; NONEON-NOSVE-NEXT: fcvt s0, h0144; NONEON-NOSVE-NEXT: fadd s0, s1, s0145; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]146; NONEON-NOSVE-NEXT: fcvt s1, h1147; NONEON-NOSVE-NEXT: fcvt h0, s0148; NONEON-NOSVE-NEXT: str h0, [sp, #42]149; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]150; NONEON-NOSVE-NEXT: fcvt s0, h0151; NONEON-NOSVE-NEXT: fadd s0, s1, s0152; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]153; NONEON-NOSVE-NEXT: fcvt s1, h1154; NONEON-NOSVE-NEXT: fcvt h0, s0155; NONEON-NOSVE-NEXT: str h0, [sp, #40]156; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]157; NONEON-NOSVE-NEXT: fcvt s0, h0158; NONEON-NOSVE-NEXT: fadd s0, s1, s0159; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]160; NONEON-NOSVE-NEXT: fcvt s1, h1161; NONEON-NOSVE-NEXT: fcvt h0, s0162; NONEON-NOSVE-NEXT: str h0, [sp, #38]163; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]164; NONEON-NOSVE-NEXT: fcvt s0, h0165; NONEON-NOSVE-NEXT: fadd s0, s1, s0166; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]167; NONEON-NOSVE-NEXT: fcvt s1, h1168; NONEON-NOSVE-NEXT: fcvt h0, s0169; NONEON-NOSVE-NEXT: str h0, [sp, #36]170; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]171; NONEON-NOSVE-NEXT: fcvt s0, h0172; NONEON-NOSVE-NEXT: fadd s0, s1, s0173; NONEON-NOSVE-NEXT: ldr h1, [sp]174; NONEON-NOSVE-NEXT: fcvt s1, h1175; NONEON-NOSVE-NEXT: fcvt h0, s0176; NONEON-NOSVE-NEXT: str h0, [sp, #34]177; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]178; NONEON-NOSVE-NEXT: fcvt s0, h0179; NONEON-NOSVE-NEXT: fadd s0, s1, s0180; NONEON-NOSVE-NEXT: fcvt h0, s0181; NONEON-NOSVE-NEXT: str h0, [sp, #32]182; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]183; NONEON-NOSVE-NEXT: add sp, sp, #48184; NONEON-NOSVE-NEXT: ret185 %res = fadd <8 x half> %op1, %op2186 ret <8 x half> %res187}188 189define void @fadd_v16f16(ptr %a, ptr %b) {190; CHECK-LABEL: fadd_v16f16:191; CHECK: // %bb.0:192; CHECK-NEXT: ldp q0, q3, [x1]193; CHECK-NEXT: ptrue p0.h, vl8194; CHECK-NEXT: ldp q1, q2, [x0]195; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h196; CHECK-NEXT: fadd z2.h, p0/m, z2.h, z3.h197; CHECK-NEXT: stp q0, q2, [x0]198; CHECK-NEXT: ret199;200; NONEON-NOSVE-LABEL: fadd_v16f16:201; NONEON-NOSVE: // %bb.0:202; NONEON-NOSVE-NEXT: sub sp, sp, #96203; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96204; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]205; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]206; NONEON-NOSVE-NEXT: stp q2, q3, [sp]207; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]208; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]209; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]210; NONEON-NOSVE-NEXT: fcvt s0, h0211; NONEON-NOSVE-NEXT: fcvt s1, h1212; NONEON-NOSVE-NEXT: fadd s0, s1, s0213; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]214; NONEON-NOSVE-NEXT: fcvt s1, h1215; NONEON-NOSVE-NEXT: fcvt h0, s0216; NONEON-NOSVE-NEXT: str h0, [sp, #94]217; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]218; NONEON-NOSVE-NEXT: fcvt s0, h0219; NONEON-NOSVE-NEXT: fadd s0, s1, s0220; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]221; NONEON-NOSVE-NEXT: fcvt s1, h1222; NONEON-NOSVE-NEXT: fcvt h0, s0223; NONEON-NOSVE-NEXT: str h0, [sp, #92]224; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]225; NONEON-NOSVE-NEXT: fcvt s0, h0226; NONEON-NOSVE-NEXT: fadd s0, s1, s0227; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]228; NONEON-NOSVE-NEXT: fcvt s1, h1229; NONEON-NOSVE-NEXT: fcvt h0, s0230; NONEON-NOSVE-NEXT: str h0, [sp, #90]231; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]232; NONEON-NOSVE-NEXT: fcvt s0, h0233; NONEON-NOSVE-NEXT: fadd s0, s1, s0234; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]235; NONEON-NOSVE-NEXT: fcvt s1, h1236; NONEON-NOSVE-NEXT: fcvt h0, s0237; NONEON-NOSVE-NEXT: str h0, [sp, #88]238; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]239; NONEON-NOSVE-NEXT: fcvt s0, h0240; NONEON-NOSVE-NEXT: fadd s0, s1, s0241; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]242; NONEON-NOSVE-NEXT: fcvt s1, h1243; NONEON-NOSVE-NEXT: fcvt h0, s0244; NONEON-NOSVE-NEXT: str h0, [sp, #86]245; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]246; NONEON-NOSVE-NEXT: fcvt s0, h0247; NONEON-NOSVE-NEXT: fadd s0, s1, s0248; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]249; NONEON-NOSVE-NEXT: fcvt s1, h1250; NONEON-NOSVE-NEXT: fcvt h0, s0251; NONEON-NOSVE-NEXT: str h0, [sp, #84]252; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]253; NONEON-NOSVE-NEXT: fcvt s0, h0254; NONEON-NOSVE-NEXT: fadd s0, s1, s0255; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]256; NONEON-NOSVE-NEXT: fcvt s1, h1257; NONEON-NOSVE-NEXT: fcvt h0, s0258; NONEON-NOSVE-NEXT: str h0, [sp, #82]259; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]260; NONEON-NOSVE-NEXT: fcvt s0, h0261; NONEON-NOSVE-NEXT: fadd s0, s1, s0262; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]263; NONEON-NOSVE-NEXT: fcvt s1, h1264; NONEON-NOSVE-NEXT: fcvt h0, s0265; NONEON-NOSVE-NEXT: str h0, [sp, #80]266; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]267; NONEON-NOSVE-NEXT: fcvt s0, h0268; NONEON-NOSVE-NEXT: fadd s0, s1, s0269; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]270; NONEON-NOSVE-NEXT: fcvt s1, h1271; NONEON-NOSVE-NEXT: fcvt h0, s0272; NONEON-NOSVE-NEXT: str h0, [sp, #78]273; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]274; NONEON-NOSVE-NEXT: fcvt s0, h0275; NONEON-NOSVE-NEXT: fadd s0, s1, s0276; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]277; NONEON-NOSVE-NEXT: fcvt s1, h1278; NONEON-NOSVE-NEXT: fcvt h0, s0279; NONEON-NOSVE-NEXT: str h0, [sp, #76]280; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]281; NONEON-NOSVE-NEXT: fcvt s0, h0282; NONEON-NOSVE-NEXT: fadd s0, s1, s0283; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]284; NONEON-NOSVE-NEXT: fcvt s1, h1285; NONEON-NOSVE-NEXT: fcvt h0, s0286; NONEON-NOSVE-NEXT: str h0, [sp, #74]287; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]288; NONEON-NOSVE-NEXT: fcvt s0, h0289; NONEON-NOSVE-NEXT: fadd s0, s1, s0290; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]291; NONEON-NOSVE-NEXT: fcvt s1, h1292; NONEON-NOSVE-NEXT: fcvt h0, s0293; NONEON-NOSVE-NEXT: str h0, [sp, #72]294; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]295; NONEON-NOSVE-NEXT: fcvt s0, h0296; NONEON-NOSVE-NEXT: fadd s0, s1, s0297; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]298; NONEON-NOSVE-NEXT: fcvt s1, h1299; NONEON-NOSVE-NEXT: fcvt h0, s0300; NONEON-NOSVE-NEXT: str h0, [sp, #70]301; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]302; NONEON-NOSVE-NEXT: fcvt s0, h0303; NONEON-NOSVE-NEXT: fadd s0, s1, s0304; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]305; NONEON-NOSVE-NEXT: fcvt s1, h1306; NONEON-NOSVE-NEXT: fcvt h0, s0307; NONEON-NOSVE-NEXT: str h0, [sp, #68]308; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]309; NONEON-NOSVE-NEXT: fcvt s0, h0310; NONEON-NOSVE-NEXT: fadd s0, s1, s0311; NONEON-NOSVE-NEXT: ldr h1, [sp]312; NONEON-NOSVE-NEXT: fcvt s1, h1313; NONEON-NOSVE-NEXT: fcvt h0, s0314; NONEON-NOSVE-NEXT: str h0, [sp, #66]315; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]316; NONEON-NOSVE-NEXT: fcvt s0, h0317; NONEON-NOSVE-NEXT: fadd s0, s1, s0318; NONEON-NOSVE-NEXT: fcvt h0, s0319; NONEON-NOSVE-NEXT: str h0, [sp, #64]320; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]321; NONEON-NOSVE-NEXT: stp q0, q1, [x0]322; NONEON-NOSVE-NEXT: add sp, sp, #96323; NONEON-NOSVE-NEXT: ret324 %op1 = load <16 x half>, ptr %a325 %op2 = load <16 x half>, ptr %b326 %res = fadd <16 x half> %op1, %op2327 store <16 x half> %res, ptr %a328 ret void329}330 331define <2 x float> @fadd_v2f32(<2 x float> %op1, <2 x float> %op2) {332; CHECK-LABEL: fadd_v2f32:333; CHECK: // %bb.0:334; CHECK-NEXT: ptrue p0.s, vl2335; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0336; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1337; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s338; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0339; CHECK-NEXT: ret340;341; NONEON-NOSVE-LABEL: fadd_v2f32:342; NONEON-NOSVE: // %bb.0:343; NONEON-NOSVE-NEXT: sub sp, sp, #32344; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32345; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]346; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]347; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]348; NONEON-NOSVE-NEXT: fadd s3, s2, s0349; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]350; NONEON-NOSVE-NEXT: fadd s0, s1, s0351; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]352; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]353; NONEON-NOSVE-NEXT: add sp, sp, #32354; NONEON-NOSVE-NEXT: ret355 %res = fadd <2 x float> %op1, %op2356 ret <2 x float> %res357}358 359define <4 x float> @fadd_v4f32(<4 x float> %op1, <4 x float> %op2) {360; CHECK-LABEL: fadd_v4f32:361; CHECK: // %bb.0:362; CHECK-NEXT: ptrue p0.s, vl4363; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0364; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1365; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s366; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0367; CHECK-NEXT: ret368;369; NONEON-NOSVE-LABEL: fadd_v4f32:370; NONEON-NOSVE: // %bb.0:371; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!372; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48373; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]374; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]375; NONEON-NOSVE-NEXT: fadd s3, s2, s0376; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]377; NONEON-NOSVE-NEXT: fadd s0, s1, s0378; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]379; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]380; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]381; NONEON-NOSVE-NEXT: fadd s3, s2, s0382; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]383; NONEON-NOSVE-NEXT: fadd s0, s1, s0384; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]385; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]386; NONEON-NOSVE-NEXT: add sp, sp, #48387; NONEON-NOSVE-NEXT: ret388 %res = fadd <4 x float> %op1, %op2389 ret <4 x float> %res390}391 392define void @fadd_v8f32(ptr %a, ptr %b) {393; CHECK-LABEL: fadd_v8f32:394; CHECK: // %bb.0:395; CHECK-NEXT: ldp q0, q3, [x1]396; CHECK-NEXT: ptrue p0.s, vl4397; CHECK-NEXT: ldp q1, q2, [x0]398; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s399; CHECK-NEXT: fadd z2.s, p0/m, z2.s, z3.s400; CHECK-NEXT: stp q0, q2, [x0]401; CHECK-NEXT: ret402;403; NONEON-NOSVE-LABEL: fadd_v8f32:404; NONEON-NOSVE: // %bb.0:405; NONEON-NOSVE-NEXT: sub sp, sp, #96406; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96407; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]408; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]409; NONEON-NOSVE-NEXT: stp q2, q3, [sp]410; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]411; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]412; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]413; NONEON-NOSVE-NEXT: fadd s3, s2, s0414; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]415; NONEON-NOSVE-NEXT: fadd s0, s1, s0416; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]417; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]418; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]419; NONEON-NOSVE-NEXT: fadd s3, s2, s0420; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]421; NONEON-NOSVE-NEXT: fadd s0, s1, s0422; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]423; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]424; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]425; NONEON-NOSVE-NEXT: fadd s3, s2, s0426; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]427; NONEON-NOSVE-NEXT: fadd s0, s1, s0428; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]429; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]430; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]431; NONEON-NOSVE-NEXT: fadd s3, s2, s0432; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]433; NONEON-NOSVE-NEXT: fadd s0, s1, s0434; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]435; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]436; NONEON-NOSVE-NEXT: stp q0, q1, [x0]437; NONEON-NOSVE-NEXT: add sp, sp, #96438; NONEON-NOSVE-NEXT: ret439 %op1 = load <8 x float>, ptr %a440 %op2 = load <8 x float>, ptr %b441 %res = fadd <8 x float> %op1, %op2442 store <8 x float> %res, ptr %a443 ret void444}445 446define <2 x double> @fadd_v2f64(<2 x double> %op1, <2 x double> %op2) {447; CHECK-LABEL: fadd_v2f64:448; CHECK: // %bb.0:449; CHECK-NEXT: ptrue p0.d, vl2450; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0451; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1452; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d453; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0454; CHECK-NEXT: ret455;456; NONEON-NOSVE-LABEL: fadd_v2f64:457; NONEON-NOSVE: // %bb.0:458; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!459; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48460; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]461; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]462; NONEON-NOSVE-NEXT: fadd d3, d2, d0463; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]464; NONEON-NOSVE-NEXT: fadd d0, d1, d0465; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]466; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]467; NONEON-NOSVE-NEXT: add sp, sp, #48468; NONEON-NOSVE-NEXT: ret469 %res = fadd <2 x double> %op1, %op2470 ret <2 x double> %res471}472 473define void @fadd_v4f64(ptr %a, ptr %b) {474; CHECK-LABEL: fadd_v4f64:475; CHECK: // %bb.0:476; CHECK-NEXT: ldp q0, q3, [x1]477; CHECK-NEXT: ptrue p0.d, vl2478; CHECK-NEXT: ldp q1, q2, [x0]479; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d480; CHECK-NEXT: fadd z2.d, p0/m, z2.d, z3.d481; CHECK-NEXT: stp q0, q2, [x0]482; CHECK-NEXT: ret483;484; NONEON-NOSVE-LABEL: fadd_v4f64:485; NONEON-NOSVE: // %bb.0:486; NONEON-NOSVE-NEXT: sub sp, sp, #96487; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96488; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]489; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]490; NONEON-NOSVE-NEXT: stp q2, q3, [sp]491; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]492; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]493; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]494; NONEON-NOSVE-NEXT: fadd d3, d2, d0495; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]496; NONEON-NOSVE-NEXT: fadd d0, d1, d0497; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]498; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]499; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]500; NONEON-NOSVE-NEXT: fadd d3, d2, d0501; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]502; NONEON-NOSVE-NEXT: fadd d0, d1, d0503; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]504; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]505; NONEON-NOSVE-NEXT: stp q0, q1, [x0]506; NONEON-NOSVE-NEXT: add sp, sp, #96507; NONEON-NOSVE-NEXT: ret508 %op1 = load <4 x double>, ptr %a509 %op2 = load <4 x double>, ptr %b510 %res = fadd <4 x double> %op1, %op2511 store <4 x double> %res, ptr %a512 ret void513}514 515;516; FDIV517;518 519define <2 x half> @fdiv_v2f16(<2 x half> %op1, <2 x half> %op2) {520; CHECK-LABEL: fdiv_v2f16:521; CHECK: // %bb.0:522; CHECK-NEXT: ptrue p0.h, vl4523; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0524; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1525; CHECK-NEXT: fdiv z0.h, p0/m, z0.h, z1.h526; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0527; CHECK-NEXT: ret528;529; NONEON-NOSVE-LABEL: fdiv_v2f16:530; NONEON-NOSVE: // %bb.0:531; NONEON-NOSVE-NEXT: sub sp, sp, #32532; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32533; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]534; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]535; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]536; NONEON-NOSVE-NEXT: fcvt s0, h0537; NONEON-NOSVE-NEXT: fcvt s1, h1538; NONEON-NOSVE-NEXT: fdiv s0, s1, s0539; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]540; NONEON-NOSVE-NEXT: fcvt s1, h1541; NONEON-NOSVE-NEXT: fcvt h0, s0542; NONEON-NOSVE-NEXT: str h0, [sp, #30]543; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]544; NONEON-NOSVE-NEXT: fcvt s0, h0545; NONEON-NOSVE-NEXT: fdiv s0, s1, s0546; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]547; NONEON-NOSVE-NEXT: fcvt s1, h1548; NONEON-NOSVE-NEXT: fcvt h0, s0549; NONEON-NOSVE-NEXT: str h0, [sp, #28]550; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]551; NONEON-NOSVE-NEXT: fcvt s0, h0552; NONEON-NOSVE-NEXT: fdiv s0, s1, s0553; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]554; NONEON-NOSVE-NEXT: fcvt s1, h1555; NONEON-NOSVE-NEXT: fcvt h0, s0556; NONEON-NOSVE-NEXT: str h0, [sp, #26]557; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]558; NONEON-NOSVE-NEXT: fcvt s0, h0559; NONEON-NOSVE-NEXT: fdiv s0, s1, s0560; NONEON-NOSVE-NEXT: fcvt h0, s0561; NONEON-NOSVE-NEXT: str h0, [sp, #24]562; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]563; NONEON-NOSVE-NEXT: add sp, sp, #32564; NONEON-NOSVE-NEXT: ret565 %res = fdiv <2 x half> %op1, %op2566 ret <2 x half> %res567}568 569define <4 x half> @fdiv_v4f16(<4 x half> %op1, <4 x half> %op2) {570; CHECK-LABEL: fdiv_v4f16:571; CHECK: // %bb.0:572; CHECK-NEXT: ptrue p0.h, vl4573; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0574; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1575; CHECK-NEXT: fdiv z0.h, p0/m, z0.h, z1.h576; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0577; CHECK-NEXT: ret578;579; NONEON-NOSVE-LABEL: fdiv_v4f16:580; NONEON-NOSVE: // %bb.0:581; NONEON-NOSVE-NEXT: sub sp, sp, #32582; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32583; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]584; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]585; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]586; NONEON-NOSVE-NEXT: fcvt s0, h0587; NONEON-NOSVE-NEXT: fcvt s1, h1588; NONEON-NOSVE-NEXT: fdiv s0, s1, s0589; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]590; NONEON-NOSVE-NEXT: fcvt s1, h1591; NONEON-NOSVE-NEXT: fcvt h0, s0592; NONEON-NOSVE-NEXT: str h0, [sp, #30]593; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]594; NONEON-NOSVE-NEXT: fcvt s0, h0595; NONEON-NOSVE-NEXT: fdiv s0, s1, s0596; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]597; NONEON-NOSVE-NEXT: fcvt s1, h1598; NONEON-NOSVE-NEXT: fcvt h0, s0599; NONEON-NOSVE-NEXT: str h0, [sp, #28]600; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]601; NONEON-NOSVE-NEXT: fcvt s0, h0602; NONEON-NOSVE-NEXT: fdiv s0, s1, s0603; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]604; NONEON-NOSVE-NEXT: fcvt s1, h1605; NONEON-NOSVE-NEXT: fcvt h0, s0606; NONEON-NOSVE-NEXT: str h0, [sp, #26]607; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]608; NONEON-NOSVE-NEXT: fcvt s0, h0609; NONEON-NOSVE-NEXT: fdiv s0, s1, s0610; NONEON-NOSVE-NEXT: fcvt h0, s0611; NONEON-NOSVE-NEXT: str h0, [sp, #24]612; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]613; NONEON-NOSVE-NEXT: add sp, sp, #32614; NONEON-NOSVE-NEXT: ret615 %res = fdiv <4 x half> %op1, %op2616 ret <4 x half> %res617}618 619define <8 x half> @fdiv_v8f16(<8 x half> %op1, <8 x half> %op2) {620; CHECK-LABEL: fdiv_v8f16:621; CHECK: // %bb.0:622; CHECK-NEXT: ptrue p0.h, vl8623; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0624; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1625; CHECK-NEXT: fdiv z0.h, p0/m, z0.h, z1.h626; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0627; CHECK-NEXT: ret628;629; NONEON-NOSVE-LABEL: fdiv_v8f16:630; NONEON-NOSVE: // %bb.0:631; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!632; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48633; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]634; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]635; NONEON-NOSVE-NEXT: fcvt s0, h0636; NONEON-NOSVE-NEXT: fcvt s1, h1637; NONEON-NOSVE-NEXT: fdiv s0, s1, s0638; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]639; NONEON-NOSVE-NEXT: fcvt s1, h1640; NONEON-NOSVE-NEXT: fcvt h0, s0641; NONEON-NOSVE-NEXT: str h0, [sp, #46]642; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]643; NONEON-NOSVE-NEXT: fcvt s0, h0644; NONEON-NOSVE-NEXT: fdiv s0, s1, s0645; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]646; NONEON-NOSVE-NEXT: fcvt s1, h1647; NONEON-NOSVE-NEXT: fcvt h0, s0648; NONEON-NOSVE-NEXT: str h0, [sp, #44]649; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]650; NONEON-NOSVE-NEXT: fcvt s0, h0651; NONEON-NOSVE-NEXT: fdiv s0, s1, s0652; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]653; NONEON-NOSVE-NEXT: fcvt s1, h1654; NONEON-NOSVE-NEXT: fcvt h0, s0655; NONEON-NOSVE-NEXT: str h0, [sp, #42]656; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]657; NONEON-NOSVE-NEXT: fcvt s0, h0658; NONEON-NOSVE-NEXT: fdiv s0, s1, s0659; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]660; NONEON-NOSVE-NEXT: fcvt s1, h1661; NONEON-NOSVE-NEXT: fcvt h0, s0662; NONEON-NOSVE-NEXT: str h0, [sp, #40]663; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]664; NONEON-NOSVE-NEXT: fcvt s0, h0665; NONEON-NOSVE-NEXT: fdiv s0, s1, s0666; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]667; NONEON-NOSVE-NEXT: fcvt s1, h1668; NONEON-NOSVE-NEXT: fcvt h0, s0669; NONEON-NOSVE-NEXT: str h0, [sp, #38]670; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]671; NONEON-NOSVE-NEXT: fcvt s0, h0672; NONEON-NOSVE-NEXT: fdiv s0, s1, s0673; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]674; NONEON-NOSVE-NEXT: fcvt s1, h1675; NONEON-NOSVE-NEXT: fcvt h0, s0676; NONEON-NOSVE-NEXT: str h0, [sp, #36]677; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]678; NONEON-NOSVE-NEXT: fcvt s0, h0679; NONEON-NOSVE-NEXT: fdiv s0, s1, s0680; NONEON-NOSVE-NEXT: ldr h1, [sp]681; NONEON-NOSVE-NEXT: fcvt s1, h1682; NONEON-NOSVE-NEXT: fcvt h0, s0683; NONEON-NOSVE-NEXT: str h0, [sp, #34]684; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]685; NONEON-NOSVE-NEXT: fcvt s0, h0686; NONEON-NOSVE-NEXT: fdiv s0, s1, s0687; NONEON-NOSVE-NEXT: fcvt h0, s0688; NONEON-NOSVE-NEXT: str h0, [sp, #32]689; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]690; NONEON-NOSVE-NEXT: add sp, sp, #48691; NONEON-NOSVE-NEXT: ret692 %res = fdiv <8 x half> %op1, %op2693 ret <8 x half> %res694}695 696define void @fdiv_v16f16(ptr %a, ptr %b) {697; CHECK-LABEL: fdiv_v16f16:698; CHECK: // %bb.0:699; CHECK-NEXT: ldp q0, q3, [x1]700; CHECK-NEXT: ptrue p0.h, vl8701; CHECK-NEXT: ldp q1, q2, [x0]702; CHECK-NEXT: fdivr z0.h, p0/m, z0.h, z1.h703; CHECK-NEXT: fdiv z2.h, p0/m, z2.h, z3.h704; CHECK-NEXT: stp q0, q2, [x0]705; CHECK-NEXT: ret706;707; NONEON-NOSVE-LABEL: fdiv_v16f16:708; NONEON-NOSVE: // %bb.0:709; NONEON-NOSVE-NEXT: sub sp, sp, #96710; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96711; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]712; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]713; NONEON-NOSVE-NEXT: stp q2, q3, [sp]714; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]715; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]716; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]717; NONEON-NOSVE-NEXT: fcvt s0, h0718; NONEON-NOSVE-NEXT: fcvt s1, h1719; NONEON-NOSVE-NEXT: fdiv s0, s1, s0720; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]721; NONEON-NOSVE-NEXT: fcvt s1, h1722; NONEON-NOSVE-NEXT: fcvt h0, s0723; NONEON-NOSVE-NEXT: str h0, [sp, #94]724; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]725; NONEON-NOSVE-NEXT: fcvt s0, h0726; NONEON-NOSVE-NEXT: fdiv s0, s1, s0727; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]728; NONEON-NOSVE-NEXT: fcvt s1, h1729; NONEON-NOSVE-NEXT: fcvt h0, s0730; NONEON-NOSVE-NEXT: str h0, [sp, #92]731; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]732; NONEON-NOSVE-NEXT: fcvt s0, h0733; NONEON-NOSVE-NEXT: fdiv s0, s1, s0734; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]735; NONEON-NOSVE-NEXT: fcvt s1, h1736; NONEON-NOSVE-NEXT: fcvt h0, s0737; NONEON-NOSVE-NEXT: str h0, [sp, #90]738; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]739; NONEON-NOSVE-NEXT: fcvt s0, h0740; NONEON-NOSVE-NEXT: fdiv s0, s1, s0741; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]742; NONEON-NOSVE-NEXT: fcvt s1, h1743; NONEON-NOSVE-NEXT: fcvt h0, s0744; NONEON-NOSVE-NEXT: str h0, [sp, #88]745; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]746; NONEON-NOSVE-NEXT: fcvt s0, h0747; NONEON-NOSVE-NEXT: fdiv s0, s1, s0748; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]749; NONEON-NOSVE-NEXT: fcvt s1, h1750; NONEON-NOSVE-NEXT: fcvt h0, s0751; NONEON-NOSVE-NEXT: str h0, [sp, #86]752; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]753; NONEON-NOSVE-NEXT: fcvt s0, h0754; NONEON-NOSVE-NEXT: fdiv s0, s1, s0755; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]756; NONEON-NOSVE-NEXT: fcvt s1, h1757; NONEON-NOSVE-NEXT: fcvt h0, s0758; NONEON-NOSVE-NEXT: str h0, [sp, #84]759; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]760; NONEON-NOSVE-NEXT: fcvt s0, h0761; NONEON-NOSVE-NEXT: fdiv s0, s1, s0762; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]763; NONEON-NOSVE-NEXT: fcvt s1, h1764; NONEON-NOSVE-NEXT: fcvt h0, s0765; NONEON-NOSVE-NEXT: str h0, [sp, #82]766; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]767; NONEON-NOSVE-NEXT: fcvt s0, h0768; NONEON-NOSVE-NEXT: fdiv s0, s1, s0769; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]770; NONEON-NOSVE-NEXT: fcvt s1, h1771; NONEON-NOSVE-NEXT: fcvt h0, s0772; NONEON-NOSVE-NEXT: str h0, [sp, #80]773; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]774; NONEON-NOSVE-NEXT: fcvt s0, h0775; NONEON-NOSVE-NEXT: fdiv s0, s1, s0776; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]777; NONEON-NOSVE-NEXT: fcvt s1, h1778; NONEON-NOSVE-NEXT: fcvt h0, s0779; NONEON-NOSVE-NEXT: str h0, [sp, #78]780; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]781; NONEON-NOSVE-NEXT: fcvt s0, h0782; NONEON-NOSVE-NEXT: fdiv s0, s1, s0783; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]784; NONEON-NOSVE-NEXT: fcvt s1, h1785; NONEON-NOSVE-NEXT: fcvt h0, s0786; NONEON-NOSVE-NEXT: str h0, [sp, #76]787; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]788; NONEON-NOSVE-NEXT: fcvt s0, h0789; NONEON-NOSVE-NEXT: fdiv s0, s1, s0790; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]791; NONEON-NOSVE-NEXT: fcvt s1, h1792; NONEON-NOSVE-NEXT: fcvt h0, s0793; NONEON-NOSVE-NEXT: str h0, [sp, #74]794; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]795; NONEON-NOSVE-NEXT: fcvt s0, h0796; NONEON-NOSVE-NEXT: fdiv s0, s1, s0797; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]798; NONEON-NOSVE-NEXT: fcvt s1, h1799; NONEON-NOSVE-NEXT: fcvt h0, s0800; NONEON-NOSVE-NEXT: str h0, [sp, #72]801; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]802; NONEON-NOSVE-NEXT: fcvt s0, h0803; NONEON-NOSVE-NEXT: fdiv s0, s1, s0804; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]805; NONEON-NOSVE-NEXT: fcvt s1, h1806; NONEON-NOSVE-NEXT: fcvt h0, s0807; NONEON-NOSVE-NEXT: str h0, [sp, #70]808; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]809; NONEON-NOSVE-NEXT: fcvt s0, h0810; NONEON-NOSVE-NEXT: fdiv s0, s1, s0811; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]812; NONEON-NOSVE-NEXT: fcvt s1, h1813; NONEON-NOSVE-NEXT: fcvt h0, s0814; NONEON-NOSVE-NEXT: str h0, [sp, #68]815; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]816; NONEON-NOSVE-NEXT: fcvt s0, h0817; NONEON-NOSVE-NEXT: fdiv s0, s1, s0818; NONEON-NOSVE-NEXT: ldr h1, [sp]819; NONEON-NOSVE-NEXT: fcvt s1, h1820; NONEON-NOSVE-NEXT: fcvt h0, s0821; NONEON-NOSVE-NEXT: str h0, [sp, #66]822; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]823; NONEON-NOSVE-NEXT: fcvt s0, h0824; NONEON-NOSVE-NEXT: fdiv s0, s1, s0825; NONEON-NOSVE-NEXT: fcvt h0, s0826; NONEON-NOSVE-NEXT: str h0, [sp, #64]827; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]828; NONEON-NOSVE-NEXT: stp q0, q1, [x0]829; NONEON-NOSVE-NEXT: add sp, sp, #96830; NONEON-NOSVE-NEXT: ret831 %op1 = load <16 x half>, ptr %a832 %op2 = load <16 x half>, ptr %b833 %res = fdiv <16 x half> %op1, %op2834 store <16 x half> %res, ptr %a835 ret void836}837 838define <2 x float> @fdiv_v2f32(<2 x float> %op1, <2 x float> %op2) {839; CHECK-LABEL: fdiv_v2f32:840; CHECK: // %bb.0:841; CHECK-NEXT: ptrue p0.s, vl2842; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0843; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1844; CHECK-NEXT: fdiv z0.s, p0/m, z0.s, z1.s845; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0846; CHECK-NEXT: ret847;848; NONEON-NOSVE-LABEL: fdiv_v2f32:849; NONEON-NOSVE: // %bb.0:850; NONEON-NOSVE-NEXT: sub sp, sp, #32851; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32852; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]853; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]854; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]855; NONEON-NOSVE-NEXT: fdiv s3, s2, s0856; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]857; NONEON-NOSVE-NEXT: fdiv s0, s1, s0858; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]859; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]860; NONEON-NOSVE-NEXT: add sp, sp, #32861; NONEON-NOSVE-NEXT: ret862 %res = fdiv <2 x float> %op1, %op2863 ret <2 x float> %res864}865 866define <4 x float> @fdiv_v4f32(<4 x float> %op1, <4 x float> %op2) {867; CHECK-LABEL: fdiv_v4f32:868; CHECK: // %bb.0:869; CHECK-NEXT: ptrue p0.s, vl4870; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0871; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1872; CHECK-NEXT: fdiv z0.s, p0/m, z0.s, z1.s873; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0874; CHECK-NEXT: ret875;876; NONEON-NOSVE-LABEL: fdiv_v4f32:877; NONEON-NOSVE: // %bb.0:878; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!879; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48880; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]881; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]882; NONEON-NOSVE-NEXT: fdiv s3, s2, s0883; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]884; NONEON-NOSVE-NEXT: fdiv s0, s1, s0885; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]886; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]887; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]888; NONEON-NOSVE-NEXT: fdiv s3, s2, s0889; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]890; NONEON-NOSVE-NEXT: fdiv s0, s1, s0891; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]892; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]893; NONEON-NOSVE-NEXT: add sp, sp, #48894; NONEON-NOSVE-NEXT: ret895 %res = fdiv <4 x float> %op1, %op2896 ret <4 x float> %res897}898 899define void @fdiv_v8f32(ptr %a, ptr %b) {900; CHECK-LABEL: fdiv_v8f32:901; CHECK: // %bb.0:902; CHECK-NEXT: ldp q0, q3, [x1]903; CHECK-NEXT: ptrue p0.s, vl4904; CHECK-NEXT: ldp q1, q2, [x0]905; CHECK-NEXT: fdivr z0.s, p0/m, z0.s, z1.s906; CHECK-NEXT: fdiv z2.s, p0/m, z2.s, z3.s907; CHECK-NEXT: stp q0, q2, [x0]908; CHECK-NEXT: ret909;910; NONEON-NOSVE-LABEL: fdiv_v8f32:911; NONEON-NOSVE: // %bb.0:912; NONEON-NOSVE-NEXT: sub sp, sp, #96913; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96914; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]915; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]916; NONEON-NOSVE-NEXT: stp q2, q3, [sp]917; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]918; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]919; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]920; NONEON-NOSVE-NEXT: fdiv s3, s2, s0921; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]922; NONEON-NOSVE-NEXT: fdiv s0, s1, s0923; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]924; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]925; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]926; NONEON-NOSVE-NEXT: fdiv s3, s2, s0927; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]928; NONEON-NOSVE-NEXT: fdiv s0, s1, s0929; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]930; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]931; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]932; NONEON-NOSVE-NEXT: fdiv s3, s2, s0933; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]934; NONEON-NOSVE-NEXT: fdiv s0, s1, s0935; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]936; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]937; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]938; NONEON-NOSVE-NEXT: fdiv s3, s2, s0939; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]940; NONEON-NOSVE-NEXT: fdiv s0, s1, s0941; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]942; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]943; NONEON-NOSVE-NEXT: stp q0, q1, [x0]944; NONEON-NOSVE-NEXT: add sp, sp, #96945; NONEON-NOSVE-NEXT: ret946 %op1 = load <8 x float>, ptr %a947 %op2 = load <8 x float>, ptr %b948 %res = fdiv <8 x float> %op1, %op2949 store <8 x float> %res, ptr %a950 ret void951}952 953define <2 x double> @fdiv_v2f64(<2 x double> %op1, <2 x double> %op2) {954; CHECK-LABEL: fdiv_v2f64:955; CHECK: // %bb.0:956; CHECK-NEXT: ptrue p0.d, vl2957; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0958; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1959; CHECK-NEXT: fdiv z0.d, p0/m, z0.d, z1.d960; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0961; CHECK-NEXT: ret962;963; NONEON-NOSVE-LABEL: fdiv_v2f64:964; NONEON-NOSVE: // %bb.0:965; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!966; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48967; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]968; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]969; NONEON-NOSVE-NEXT: fdiv d3, d2, d0970; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]971; NONEON-NOSVE-NEXT: fdiv d0, d1, d0972; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]973; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]974; NONEON-NOSVE-NEXT: add sp, sp, #48975; NONEON-NOSVE-NEXT: ret976 %res = fdiv <2 x double> %op1, %op2977 ret <2 x double> %res978}979 980define void @fdiv_v4f64(ptr %a, ptr %b) {981; CHECK-LABEL: fdiv_v4f64:982; CHECK: // %bb.0:983; CHECK-NEXT: ldp q0, q3, [x1]984; CHECK-NEXT: ptrue p0.d, vl2985; CHECK-NEXT: ldp q1, q2, [x0]986; CHECK-NEXT: fdivr z0.d, p0/m, z0.d, z1.d987; CHECK-NEXT: fdiv z2.d, p0/m, z2.d, z3.d988; CHECK-NEXT: stp q0, q2, [x0]989; CHECK-NEXT: ret990;991; NONEON-NOSVE-LABEL: fdiv_v4f64:992; NONEON-NOSVE: // %bb.0:993; NONEON-NOSVE-NEXT: sub sp, sp, #96994; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96995; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]996; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]997; NONEON-NOSVE-NEXT: stp q2, q3, [sp]998; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]999; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]1000; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]1001; NONEON-NOSVE-NEXT: fdiv d3, d2, d01002; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]1003; NONEON-NOSVE-NEXT: fdiv d0, d1, d01004; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]1005; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]1006; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1007; NONEON-NOSVE-NEXT: fdiv d3, d2, d01008; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]1009; NONEON-NOSVE-NEXT: fdiv d0, d1, d01010; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]1011; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1012; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1013; NONEON-NOSVE-NEXT: add sp, sp, #961014; NONEON-NOSVE-NEXT: ret1015 %op1 = load <4 x double>, ptr %a1016 %op2 = load <4 x double>, ptr %b1017 %res = fdiv <4 x double> %op1, %op21018 store <4 x double> %res, ptr %a1019 ret void1020}1021 1022;1023; FMA1024;1025 1026define <2 x half> @fma_v2f16(<2 x half> %op1, <2 x half> %op2, <2 x half> %op3) {1027; CHECK-LABEL: fma_v2f16:1028; CHECK: // %bb.0:1029; CHECK-NEXT: ptrue p0.h, vl41030; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01031; CHECK-NEXT: // kill: def $d2 killed $d2 def $z21032; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11033; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h1034; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01035; CHECK-NEXT: ret1036;1037; NONEON-NOSVE-LABEL: fma_v2f16:1038; NONEON-NOSVE: // %bb.0:1039; NONEON-NOSVE-NEXT: sub sp, sp, #321040; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321041; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8]1042; NONEON-NOSVE-NEXT: str d0, [sp]1043; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1044; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1045; NONEON-NOSVE-NEXT: ldr h2, [sp, #6]1046; NONEON-NOSVE-NEXT: fcvt s0, h01047; NONEON-NOSVE-NEXT: fcvt s1, h11048; NONEON-NOSVE-NEXT: fcvt s2, h21049; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01050; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1051; NONEON-NOSVE-NEXT: ldr h2, [sp, #4]1052; NONEON-NOSVE-NEXT: fcvt s1, h11053; NONEON-NOSVE-NEXT: fcvt s2, h21054; NONEON-NOSVE-NEXT: fcvt h0, s01055; NONEON-NOSVE-NEXT: str h0, [sp, #30]1056; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1057; NONEON-NOSVE-NEXT: fcvt s0, h01058; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01059; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1060; NONEON-NOSVE-NEXT: ldr h2, [sp, #2]1061; NONEON-NOSVE-NEXT: fcvt s1, h11062; NONEON-NOSVE-NEXT: fcvt s2, h21063; NONEON-NOSVE-NEXT: fcvt h0, s01064; NONEON-NOSVE-NEXT: str h0, [sp, #28]1065; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1066; NONEON-NOSVE-NEXT: fcvt s0, h01067; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01068; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1069; NONEON-NOSVE-NEXT: ldr h2, [sp]1070; NONEON-NOSVE-NEXT: fcvt s1, h11071; NONEON-NOSVE-NEXT: fcvt s2, h21072; NONEON-NOSVE-NEXT: fcvt h0, s01073; NONEON-NOSVE-NEXT: str h0, [sp, #26]1074; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1075; NONEON-NOSVE-NEXT: fcvt s0, h01076; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01077; NONEON-NOSVE-NEXT: fcvt h0, s01078; NONEON-NOSVE-NEXT: str h0, [sp, #24]1079; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1080; NONEON-NOSVE-NEXT: add sp, sp, #321081; NONEON-NOSVE-NEXT: ret1082 %res = call <2 x half> @llvm.fma.v2f16(<2 x half> %op1, <2 x half> %op2, <2 x half> %op3)1083 ret <2 x half> %res1084}1085 1086define <4 x half> @fma_v4f16(<4 x half> %op1, <4 x half> %op2, <4 x half> %op3) {1087; CHECK-LABEL: fma_v4f16:1088; CHECK: // %bb.0:1089; CHECK-NEXT: ptrue p0.h, vl41090; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01091; CHECK-NEXT: // kill: def $d2 killed $d2 def $z21092; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11093; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h1094; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01095; CHECK-NEXT: ret1096;1097; NONEON-NOSVE-LABEL: fma_v4f16:1098; NONEON-NOSVE: // %bb.0:1099; NONEON-NOSVE-NEXT: sub sp, sp, #321100; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321101; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8]1102; NONEON-NOSVE-NEXT: str d0, [sp]1103; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1104; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1105; NONEON-NOSVE-NEXT: ldr h2, [sp, #6]1106; NONEON-NOSVE-NEXT: fcvt s0, h01107; NONEON-NOSVE-NEXT: fcvt s1, h11108; NONEON-NOSVE-NEXT: fcvt s2, h21109; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01110; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1111; NONEON-NOSVE-NEXT: ldr h2, [sp, #4]1112; NONEON-NOSVE-NEXT: fcvt s1, h11113; NONEON-NOSVE-NEXT: fcvt s2, h21114; NONEON-NOSVE-NEXT: fcvt h0, s01115; NONEON-NOSVE-NEXT: str h0, [sp, #30]1116; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1117; NONEON-NOSVE-NEXT: fcvt s0, h01118; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01119; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1120; NONEON-NOSVE-NEXT: ldr h2, [sp, #2]1121; NONEON-NOSVE-NEXT: fcvt s1, h11122; NONEON-NOSVE-NEXT: fcvt s2, h21123; NONEON-NOSVE-NEXT: fcvt h0, s01124; NONEON-NOSVE-NEXT: str h0, [sp, #28]1125; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1126; NONEON-NOSVE-NEXT: fcvt s0, h01127; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01128; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1129; NONEON-NOSVE-NEXT: ldr h2, [sp]1130; NONEON-NOSVE-NEXT: fcvt s1, h11131; NONEON-NOSVE-NEXT: fcvt s2, h21132; NONEON-NOSVE-NEXT: fcvt h0, s01133; NONEON-NOSVE-NEXT: str h0, [sp, #26]1134; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1135; NONEON-NOSVE-NEXT: fcvt s0, h01136; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01137; NONEON-NOSVE-NEXT: fcvt h0, s01138; NONEON-NOSVE-NEXT: str h0, [sp, #24]1139; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1140; NONEON-NOSVE-NEXT: add sp, sp, #321141; NONEON-NOSVE-NEXT: ret1142 %res = call <4 x half> @llvm.fma.v4f16(<4 x half> %op1, <4 x half> %op2, <4 x half> %op3)1143 ret <4 x half> %res1144}1145 1146define <8 x half> @fma_v8f16(<8 x half> %op1, <8 x half> %op2, <8 x half> %op3) {1147; CHECK-LABEL: fma_v8f16:1148; CHECK: // %bb.0:1149; CHECK-NEXT: ptrue p0.h, vl81150; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01151; CHECK-NEXT: // kill: def $q2 killed $q2 def $z21152; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11153; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h1154; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01155; CHECK-NEXT: ret1156;1157; NONEON-NOSVE-LABEL: fma_v8f16:1158; NONEON-NOSVE: // %bb.0:1159; NONEON-NOSVE-NEXT: sub sp, sp, #641160; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641161; NONEON-NOSVE-NEXT: stp q1, q2, [sp, #16]1162; NONEON-NOSVE-NEXT: str q0, [sp]1163; NONEON-NOSVE-NEXT: ldr h0, [sp, #46]1164; NONEON-NOSVE-NEXT: ldr h1, [sp, #30]1165; NONEON-NOSVE-NEXT: ldr h2, [sp, #14]1166; NONEON-NOSVE-NEXT: fcvt s0, h01167; NONEON-NOSVE-NEXT: fcvt s1, h11168; NONEON-NOSVE-NEXT: fcvt s2, h21169; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01170; NONEON-NOSVE-NEXT: ldr h1, [sp, #28]1171; NONEON-NOSVE-NEXT: ldr h2, [sp, #12]1172; NONEON-NOSVE-NEXT: fcvt s1, h11173; NONEON-NOSVE-NEXT: fcvt s2, h21174; NONEON-NOSVE-NEXT: fcvt h0, s01175; NONEON-NOSVE-NEXT: str h0, [sp, #62]1176; NONEON-NOSVE-NEXT: ldr h0, [sp, #44]1177; NONEON-NOSVE-NEXT: fcvt s0, h01178; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01179; NONEON-NOSVE-NEXT: ldr h1, [sp, #26]1180; NONEON-NOSVE-NEXT: ldr h2, [sp, #10]1181; NONEON-NOSVE-NEXT: fcvt s1, h11182; NONEON-NOSVE-NEXT: fcvt s2, h21183; NONEON-NOSVE-NEXT: fcvt h0, s01184; NONEON-NOSVE-NEXT: str h0, [sp, #60]1185; NONEON-NOSVE-NEXT: ldr h0, [sp, #42]1186; NONEON-NOSVE-NEXT: fcvt s0, h01187; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01188; NONEON-NOSVE-NEXT: ldr h1, [sp, #24]1189; NONEON-NOSVE-NEXT: ldr h2, [sp, #8]1190; NONEON-NOSVE-NEXT: fcvt s1, h11191; NONEON-NOSVE-NEXT: fcvt s2, h21192; NONEON-NOSVE-NEXT: fcvt h0, s01193; NONEON-NOSVE-NEXT: str h0, [sp, #58]1194; NONEON-NOSVE-NEXT: ldr h0, [sp, #40]1195; NONEON-NOSVE-NEXT: fcvt s0, h01196; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01197; NONEON-NOSVE-NEXT: ldr h1, [sp, #22]1198; NONEON-NOSVE-NEXT: ldr h2, [sp, #6]1199; NONEON-NOSVE-NEXT: fcvt s1, h11200; NONEON-NOSVE-NEXT: fcvt s2, h21201; NONEON-NOSVE-NEXT: fcvt h0, s01202; NONEON-NOSVE-NEXT: str h0, [sp, #56]1203; NONEON-NOSVE-NEXT: ldr h0, [sp, #38]1204; NONEON-NOSVE-NEXT: fcvt s0, h01205; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01206; NONEON-NOSVE-NEXT: ldr h1, [sp, #20]1207; NONEON-NOSVE-NEXT: ldr h2, [sp, #4]1208; NONEON-NOSVE-NEXT: fcvt s1, h11209; NONEON-NOSVE-NEXT: fcvt s2, h21210; NONEON-NOSVE-NEXT: fcvt h0, s01211; NONEON-NOSVE-NEXT: str h0, [sp, #54]1212; NONEON-NOSVE-NEXT: ldr h0, [sp, #36]1213; NONEON-NOSVE-NEXT: fcvt s0, h01214; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01215; NONEON-NOSVE-NEXT: ldr h1, [sp, #18]1216; NONEON-NOSVE-NEXT: ldr h2, [sp, #2]1217; NONEON-NOSVE-NEXT: fcvt s1, h11218; NONEON-NOSVE-NEXT: fcvt s2, h21219; NONEON-NOSVE-NEXT: fcvt h0, s01220; NONEON-NOSVE-NEXT: str h0, [sp, #52]1221; NONEON-NOSVE-NEXT: ldr h0, [sp, #34]1222; NONEON-NOSVE-NEXT: fcvt s0, h01223; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01224; NONEON-NOSVE-NEXT: ldr h1, [sp, #16]1225; NONEON-NOSVE-NEXT: ldr h2, [sp]1226; NONEON-NOSVE-NEXT: fcvt s1, h11227; NONEON-NOSVE-NEXT: fcvt s2, h21228; NONEON-NOSVE-NEXT: fcvt h0, s01229; NONEON-NOSVE-NEXT: str h0, [sp, #50]1230; NONEON-NOSVE-NEXT: ldr h0, [sp, #32]1231; NONEON-NOSVE-NEXT: fcvt s0, h01232; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01233; NONEON-NOSVE-NEXT: fcvt h0, s01234; NONEON-NOSVE-NEXT: str h0, [sp, #48]1235; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]1236; NONEON-NOSVE-NEXT: add sp, sp, #641237; NONEON-NOSVE-NEXT: ret1238 %res = call <8 x half> @llvm.fma.v8f16(<8 x half> %op1, <8 x half> %op2, <8 x half> %op3)1239 ret <8 x half> %res1240}1241 1242define void @fma_v16f16(ptr %a, ptr %b, ptr %c) {1243; CHECK-LABEL: fma_v16f16:1244; CHECK: // %bb.0:1245; CHECK-NEXT: ldp q0, q4, [x1]1246; CHECK-NEXT: ptrue p0.h, vl81247; CHECK-NEXT: ldp q1, q5, [x2]1248; CHECK-NEXT: ldp q2, q3, [x0]1249; CHECK-NEXT: fmad z0.h, p0/m, z2.h, z1.h1250; CHECK-NEXT: fmad z3.h, p0/m, z4.h, z5.h1251; CHECK-NEXT: stp q0, q3, [x0]1252; CHECK-NEXT: ret1253;1254; NONEON-NOSVE-LABEL: fma_v16f16:1255; NONEON-NOSVE: // %bb.0:1256; NONEON-NOSVE-NEXT: sub sp, sp, #1281257; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1281258; NONEON-NOSVE-NEXT: ldp q1, q0, [x2]1259; NONEON-NOSVE-NEXT: ldp q2, q3, [x1]1260; NONEON-NOSVE-NEXT: ldp q4, q5, [x0]1261; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #64]1262; NONEON-NOSVE-NEXT: stp q4, q2, [sp]1263; NONEON-NOSVE-NEXT: ldr h0, [sp, #94]1264; NONEON-NOSVE-NEXT: stp q1, q5, [sp, #32]1265; NONEON-NOSVE-NEXT: ldr h1, [sp, #78]1266; NONEON-NOSVE-NEXT: ldr h2, [sp, #62]1267; NONEON-NOSVE-NEXT: fcvt s0, h01268; NONEON-NOSVE-NEXT: fcvt s1, h11269; NONEON-NOSVE-NEXT: fcvt s2, h21270; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01271; NONEON-NOSVE-NEXT: ldr h1, [sp, #76]1272; NONEON-NOSVE-NEXT: ldr h2, [sp, #60]1273; NONEON-NOSVE-NEXT: fcvt s1, h11274; NONEON-NOSVE-NEXT: fcvt s2, h21275; NONEON-NOSVE-NEXT: fcvt h0, s01276; NONEON-NOSVE-NEXT: str h0, [sp, #126]1277; NONEON-NOSVE-NEXT: ldr h0, [sp, #92]1278; NONEON-NOSVE-NEXT: fcvt s0, h01279; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01280; NONEON-NOSVE-NEXT: ldr h1, [sp, #74]1281; NONEON-NOSVE-NEXT: ldr h2, [sp, #58]1282; NONEON-NOSVE-NEXT: fcvt s1, h11283; NONEON-NOSVE-NEXT: fcvt s2, h21284; NONEON-NOSVE-NEXT: fcvt h0, s01285; NONEON-NOSVE-NEXT: str h0, [sp, #124]1286; NONEON-NOSVE-NEXT: ldr h0, [sp, #90]1287; NONEON-NOSVE-NEXT: fcvt s0, h01288; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01289; NONEON-NOSVE-NEXT: ldr h1, [sp, #72]1290; NONEON-NOSVE-NEXT: ldr h2, [sp, #56]1291; NONEON-NOSVE-NEXT: fcvt s1, h11292; NONEON-NOSVE-NEXT: fcvt s2, h21293; NONEON-NOSVE-NEXT: fcvt h0, s01294; NONEON-NOSVE-NEXT: str h0, [sp, #122]1295; NONEON-NOSVE-NEXT: ldr h0, [sp, #88]1296; NONEON-NOSVE-NEXT: fcvt s0, h01297; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01298; NONEON-NOSVE-NEXT: ldr h1, [sp, #70]1299; NONEON-NOSVE-NEXT: ldr h2, [sp, #54]1300; NONEON-NOSVE-NEXT: fcvt s1, h11301; NONEON-NOSVE-NEXT: fcvt s2, h21302; NONEON-NOSVE-NEXT: fcvt h0, s01303; NONEON-NOSVE-NEXT: str h0, [sp, #120]1304; NONEON-NOSVE-NEXT: ldr h0, [sp, #86]1305; NONEON-NOSVE-NEXT: fcvt s0, h01306; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01307; NONEON-NOSVE-NEXT: ldr h1, [sp, #68]1308; NONEON-NOSVE-NEXT: ldr h2, [sp, #52]1309; NONEON-NOSVE-NEXT: fcvt s1, h11310; NONEON-NOSVE-NEXT: fcvt s2, h21311; NONEON-NOSVE-NEXT: fcvt h0, s01312; NONEON-NOSVE-NEXT: str h0, [sp, #118]1313; NONEON-NOSVE-NEXT: ldr h0, [sp, #84]1314; NONEON-NOSVE-NEXT: fcvt s0, h01315; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01316; NONEON-NOSVE-NEXT: ldr h1, [sp, #66]1317; NONEON-NOSVE-NEXT: ldr h2, [sp, #50]1318; NONEON-NOSVE-NEXT: fcvt s1, h11319; NONEON-NOSVE-NEXT: fcvt s2, h21320; NONEON-NOSVE-NEXT: fcvt h0, s01321; NONEON-NOSVE-NEXT: str h0, [sp, #116]1322; NONEON-NOSVE-NEXT: ldr h0, [sp, #82]1323; NONEON-NOSVE-NEXT: fcvt s0, h01324; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01325; NONEON-NOSVE-NEXT: ldr h1, [sp, #64]1326; NONEON-NOSVE-NEXT: ldr h2, [sp, #48]1327; NONEON-NOSVE-NEXT: fcvt s1, h11328; NONEON-NOSVE-NEXT: fcvt s2, h21329; NONEON-NOSVE-NEXT: fcvt h0, s01330; NONEON-NOSVE-NEXT: str h0, [sp, #114]1331; NONEON-NOSVE-NEXT: ldr h0, [sp, #80]1332; NONEON-NOSVE-NEXT: fcvt s0, h01333; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01334; NONEON-NOSVE-NEXT: ldr h1, [sp, #30]1335; NONEON-NOSVE-NEXT: ldr h2, [sp, #14]1336; NONEON-NOSVE-NEXT: fcvt s1, h11337; NONEON-NOSVE-NEXT: fcvt s2, h21338; NONEON-NOSVE-NEXT: fcvt h0, s01339; NONEON-NOSVE-NEXT: str h0, [sp, #112]1340; NONEON-NOSVE-NEXT: ldr h0, [sp, #46]1341; NONEON-NOSVE-NEXT: fcvt s0, h01342; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01343; NONEON-NOSVE-NEXT: ldr h1, [sp, #28]1344; NONEON-NOSVE-NEXT: ldr h2, [sp, #12]1345; NONEON-NOSVE-NEXT: fcvt s1, h11346; NONEON-NOSVE-NEXT: fcvt s2, h21347; NONEON-NOSVE-NEXT: fcvt h0, s01348; NONEON-NOSVE-NEXT: str h0, [sp, #110]1349; NONEON-NOSVE-NEXT: ldr h0, [sp, #44]1350; NONEON-NOSVE-NEXT: fcvt s0, h01351; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01352; NONEON-NOSVE-NEXT: ldr h1, [sp, #26]1353; NONEON-NOSVE-NEXT: ldr h2, [sp, #10]1354; NONEON-NOSVE-NEXT: fcvt s1, h11355; NONEON-NOSVE-NEXT: fcvt s2, h21356; NONEON-NOSVE-NEXT: fcvt h0, s01357; NONEON-NOSVE-NEXT: str h0, [sp, #108]1358; NONEON-NOSVE-NEXT: ldr h0, [sp, #42]1359; NONEON-NOSVE-NEXT: fcvt s0, h01360; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01361; NONEON-NOSVE-NEXT: ldr h1, [sp, #24]1362; NONEON-NOSVE-NEXT: ldr h2, [sp, #8]1363; NONEON-NOSVE-NEXT: fcvt s1, h11364; NONEON-NOSVE-NEXT: fcvt s2, h21365; NONEON-NOSVE-NEXT: fcvt h0, s01366; NONEON-NOSVE-NEXT: str h0, [sp, #106]1367; NONEON-NOSVE-NEXT: ldr h0, [sp, #40]1368; NONEON-NOSVE-NEXT: fcvt s0, h01369; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01370; NONEON-NOSVE-NEXT: ldr h1, [sp, #22]1371; NONEON-NOSVE-NEXT: ldr h2, [sp, #6]1372; NONEON-NOSVE-NEXT: fcvt s1, h11373; NONEON-NOSVE-NEXT: fcvt s2, h21374; NONEON-NOSVE-NEXT: fcvt h0, s01375; NONEON-NOSVE-NEXT: str h0, [sp, #104]1376; NONEON-NOSVE-NEXT: ldr h0, [sp, #38]1377; NONEON-NOSVE-NEXT: fcvt s0, h01378; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01379; NONEON-NOSVE-NEXT: ldr h1, [sp, #20]1380; NONEON-NOSVE-NEXT: ldr h2, [sp, #4]1381; NONEON-NOSVE-NEXT: fcvt s1, h11382; NONEON-NOSVE-NEXT: fcvt s2, h21383; NONEON-NOSVE-NEXT: fcvt h0, s01384; NONEON-NOSVE-NEXT: str h0, [sp, #102]1385; NONEON-NOSVE-NEXT: ldr h0, [sp, #36]1386; NONEON-NOSVE-NEXT: fcvt s0, h01387; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01388; NONEON-NOSVE-NEXT: ldr h1, [sp, #18]1389; NONEON-NOSVE-NEXT: ldr h2, [sp, #2]1390; NONEON-NOSVE-NEXT: fcvt s1, h11391; NONEON-NOSVE-NEXT: fcvt s2, h21392; NONEON-NOSVE-NEXT: fcvt h0, s01393; NONEON-NOSVE-NEXT: str h0, [sp, #100]1394; NONEON-NOSVE-NEXT: ldr h0, [sp, #34]1395; NONEON-NOSVE-NEXT: fcvt s0, h01396; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01397; NONEON-NOSVE-NEXT: ldr h1, [sp, #16]1398; NONEON-NOSVE-NEXT: ldr h2, [sp]1399; NONEON-NOSVE-NEXT: fcvt s1, h11400; NONEON-NOSVE-NEXT: fcvt s2, h21401; NONEON-NOSVE-NEXT: fcvt h0, s01402; NONEON-NOSVE-NEXT: str h0, [sp, #98]1403; NONEON-NOSVE-NEXT: ldr h0, [sp, #32]1404; NONEON-NOSVE-NEXT: fcvt s0, h01405; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01406; NONEON-NOSVE-NEXT: fcvt h0, s01407; NONEON-NOSVE-NEXT: str h0, [sp, #96]1408; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]1409; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1410; NONEON-NOSVE-NEXT: add sp, sp, #1281411; NONEON-NOSVE-NEXT: ret1412 %op1 = load <16 x half>, ptr %a1413 %op2 = load <16 x half>, ptr %b1414 %op3 = load <16 x half>, ptr %c1415 %res = call <16 x half> @llvm.fma.v16f16(<16 x half> %op1, <16 x half> %op2, <16 x half> %op3)1416 store <16 x half> %res, ptr %a1417 ret void1418}1419 1420define <2 x float> @fma_v2f32(<2 x float> %op1, <2 x float> %op2, <2 x float> %op3) {1421; CHECK-LABEL: fma_v2f32:1422; CHECK: // %bb.0:1423; CHECK-NEXT: ptrue p0.s, vl21424; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01425; CHECK-NEXT: // kill: def $d2 killed $d2 def $z21426; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11427; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s1428; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01429; CHECK-NEXT: ret1430;1431; NONEON-NOSVE-LABEL: fma_v2f32:1432; NONEON-NOSVE: // %bb.0:1433; NONEON-NOSVE-NEXT: sub sp, sp, #321434; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321435; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #8]1436; NONEON-NOSVE-NEXT: str d0, [sp]1437; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #8]1438; NONEON-NOSVE-NEXT: ldp s2, s4, [sp]1439; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]1440; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01441; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]1442; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01443; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #24]1444; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1445; NONEON-NOSVE-NEXT: add sp, sp, #321446; NONEON-NOSVE-NEXT: ret1447 %res = call <2 x float> @llvm.fma.v2f32(<2 x float> %op1, <2 x float> %op2, <2 x float> %op3)1448 ret <2 x float> %res1449}1450 1451define <4 x float> @fma_v4f32(<4 x float> %op1, <4 x float> %op2, <4 x float> %op3) {1452; CHECK-LABEL: fma_v4f32:1453; CHECK: // %bb.0:1454; CHECK-NEXT: ptrue p0.s, vl41455; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01456; CHECK-NEXT: // kill: def $q2 killed $q2 def $z21457; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11458; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s1459; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01460; CHECK-NEXT: ret1461;1462; NONEON-NOSVE-LABEL: fma_v4f32:1463; NONEON-NOSVE: // %bb.0:1464; NONEON-NOSVE-NEXT: sub sp, sp, #641465; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641466; NONEON-NOSVE-NEXT: stp q1, q2, [sp, #16]1467; NONEON-NOSVE-NEXT: str q0, [sp]1468; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #24]1469; NONEON-NOSVE-NEXT: ldp s2, s4, [sp, #8]1470; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]1471; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01472; NONEON-NOSVE-NEXT: ldr s0, [sp, #40]1473; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01474; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #16]1475; NONEON-NOSVE-NEXT: ldp s2, s4, [sp]1476; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #56]1477; NONEON-NOSVE-NEXT: ldr s0, [sp, #36]1478; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01479; NONEON-NOSVE-NEXT: ldr s0, [sp, #32]1480; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01481; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #48]1482; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]1483; NONEON-NOSVE-NEXT: add sp, sp, #641484; NONEON-NOSVE-NEXT: ret1485 %res = call <4 x float> @llvm.fma.v4f32(<4 x float> %op1, <4 x float> %op2, <4 x float> %op3)1486 ret <4 x float> %res1487}1488 1489define void @fma_v8f32(ptr %a, ptr %b, ptr %c) {1490; CHECK-LABEL: fma_v8f32:1491; CHECK: // %bb.0:1492; CHECK-NEXT: ldp q0, q4, [x1]1493; CHECK-NEXT: ptrue p0.s, vl41494; CHECK-NEXT: ldp q1, q5, [x2]1495; CHECK-NEXT: ldp q2, q3, [x0]1496; CHECK-NEXT: fmad z0.s, p0/m, z2.s, z1.s1497; CHECK-NEXT: fmad z3.s, p0/m, z4.s, z5.s1498; CHECK-NEXT: stp q0, q3, [x0]1499; CHECK-NEXT: ret1500;1501; NONEON-NOSVE-LABEL: fma_v8f32:1502; NONEON-NOSVE: // %bb.0:1503; NONEON-NOSVE-NEXT: sub sp, sp, #1281504; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1281505; NONEON-NOSVE-NEXT: ldp q1, q0, [x2]1506; NONEON-NOSVE-NEXT: ldp q2, q3, [x1]1507; NONEON-NOSVE-NEXT: ldp q4, q5, [x0]1508; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #64]1509; NONEON-NOSVE-NEXT: stp q4, q2, [sp]1510; NONEON-NOSVE-NEXT: ldr s0, [sp, #92]1511; NONEON-NOSVE-NEXT: stp q1, q5, [sp, #32]1512; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #72]1513; NONEON-NOSVE-NEXT: ldp s2, s4, [sp, #56]1514; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01515; NONEON-NOSVE-NEXT: ldr s0, [sp, #88]1516; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01517; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #64]1518; NONEON-NOSVE-NEXT: ldp s2, s4, [sp, #48]1519; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #120]1520; NONEON-NOSVE-NEXT: ldr s0, [sp, #84]1521; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01522; NONEON-NOSVE-NEXT: ldr s0, [sp, #80]1523; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01524; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #24]1525; NONEON-NOSVE-NEXT: ldp s2, s4, [sp, #8]1526; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #112]1527; NONEON-NOSVE-NEXT: ldr s0, [sp, #44]1528; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01529; NONEON-NOSVE-NEXT: ldr s0, [sp, #40]1530; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01531; NONEON-NOSVE-NEXT: ldp s1, s3, [sp, #16]1532; NONEON-NOSVE-NEXT: ldp s2, s4, [sp]1533; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #104]1534; NONEON-NOSVE-NEXT: ldr s0, [sp, #36]1535; NONEON-NOSVE-NEXT: fmadd s5, s4, s3, s01536; NONEON-NOSVE-NEXT: ldr s0, [sp, #32]1537; NONEON-NOSVE-NEXT: fmadd s0, s2, s1, s01538; NONEON-NOSVE-NEXT: stp s0, s5, [sp, #96]1539; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]1540; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1541; NONEON-NOSVE-NEXT: add sp, sp, #1281542; NONEON-NOSVE-NEXT: ret1543 %op1 = load <8 x float>, ptr %a1544 %op2 = load <8 x float>, ptr %b1545 %op3 = load <8 x float>, ptr %c1546 %res = call <8 x float> @llvm.fma.v8f32(<8 x float> %op1, <8 x float> %op2, <8 x float> %op3)1547 store <8 x float> %res, ptr %a1548 ret void1549}1550 1551define <2 x double> @fma_v2f64(<2 x double> %op1, <2 x double> %op2, <2 x double> %op3) {1552; CHECK-LABEL: fma_v2f64:1553; CHECK: // %bb.0:1554; CHECK-NEXT: ptrue p0.d, vl21555; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01556; CHECK-NEXT: // kill: def $q2 killed $q2 def $z21557; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11558; CHECK-NEXT: fmad z0.d, p0/m, z1.d, z2.d1559; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01560; CHECK-NEXT: ret1561;1562; NONEON-NOSVE-LABEL: fma_v2f64:1563; NONEON-NOSVE: // %bb.0:1564; NONEON-NOSVE-NEXT: sub sp, sp, #641565; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641566; NONEON-NOSVE-NEXT: stp q1, q2, [sp, #16]1567; NONEON-NOSVE-NEXT: str q0, [sp]1568; NONEON-NOSVE-NEXT: ldp d1, d3, [sp, #16]1569; NONEON-NOSVE-NEXT: ldp d2, d4, [sp]1570; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]1571; NONEON-NOSVE-NEXT: fmadd d5, d4, d3, d01572; NONEON-NOSVE-NEXT: ldr d0, [sp, #32]1573; NONEON-NOSVE-NEXT: fmadd d0, d2, d1, d01574; NONEON-NOSVE-NEXT: stp d0, d5, [sp, #48]1575; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]1576; NONEON-NOSVE-NEXT: add sp, sp, #641577; NONEON-NOSVE-NEXT: ret1578 %res = call <2 x double> @llvm.fma.v2f64(<2 x double> %op1, <2 x double> %op2, <2 x double> %op3)1579 ret <2 x double> %res1580}1581 1582define void @fma_v4f64(ptr %a, ptr %b, ptr %c) {1583; CHECK-LABEL: fma_v4f64:1584; CHECK: // %bb.0:1585; CHECK-NEXT: ldp q0, q4, [x1]1586; CHECK-NEXT: ptrue p0.d, vl21587; CHECK-NEXT: ldp q1, q5, [x2]1588; CHECK-NEXT: ldp q2, q3, [x0]1589; CHECK-NEXT: fmad z0.d, p0/m, z2.d, z1.d1590; CHECK-NEXT: fmad z3.d, p0/m, z4.d, z5.d1591; CHECK-NEXT: stp q0, q3, [x0]1592; CHECK-NEXT: ret1593;1594; NONEON-NOSVE-LABEL: fma_v4f64:1595; NONEON-NOSVE: // %bb.0:1596; NONEON-NOSVE-NEXT: sub sp, sp, #1281597; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1281598; NONEON-NOSVE-NEXT: ldp q1, q0, [x2]1599; NONEON-NOSVE-NEXT: ldp q2, q3, [x1]1600; NONEON-NOSVE-NEXT: ldp q4, q5, [x0]1601; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #64]1602; NONEON-NOSVE-NEXT: stp q4, q2, [sp]1603; NONEON-NOSVE-NEXT: ldr d0, [sp, #88]1604; NONEON-NOSVE-NEXT: stp q1, q5, [sp, #32]1605; NONEON-NOSVE-NEXT: ldp d1, d3, [sp, #64]1606; NONEON-NOSVE-NEXT: ldp d2, d4, [sp, #48]1607; NONEON-NOSVE-NEXT: fmadd d5, d4, d3, d01608; NONEON-NOSVE-NEXT: ldr d0, [sp, #80]1609; NONEON-NOSVE-NEXT: fmadd d0, d2, d1, d01610; NONEON-NOSVE-NEXT: ldp d1, d3, [sp, #16]1611; NONEON-NOSVE-NEXT: ldp d2, d4, [sp]1612; NONEON-NOSVE-NEXT: stp d0, d5, [sp, #112]1613; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]1614; NONEON-NOSVE-NEXT: fmadd d5, d4, d3, d01615; NONEON-NOSVE-NEXT: ldr d0, [sp, #32]1616; NONEON-NOSVE-NEXT: fmadd d0, d2, d1, d01617; NONEON-NOSVE-NEXT: stp d0, d5, [sp, #96]1618; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]1619; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1620; NONEON-NOSVE-NEXT: add sp, sp, #1281621; NONEON-NOSVE-NEXT: ret1622 %op1 = load <4 x double>, ptr %a1623 %op2 = load <4 x double>, ptr %b1624 %op3 = load <4 x double>, ptr %c1625 %res = call <4 x double> @llvm.fma.v4f64(<4 x double> %op1, <4 x double> %op2, <4 x double> %op3)1626 store <4 x double> %res, ptr %a1627 ret void1628}1629 1630;1631; FMUL1632;1633 1634define <2 x half> @fmul_v2f16(<2 x half> %op1, <2 x half> %op2) {1635; CHECK-LABEL: fmul_v2f16:1636; CHECK: // %bb.0:1637; CHECK-NEXT: ptrue p0.h, vl41638; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01639; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11640; CHECK-NEXT: fmul z0.h, p0/m, z0.h, z1.h1641; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01642; CHECK-NEXT: ret1643;1644; NONEON-NOSVE-LABEL: fmul_v2f16:1645; NONEON-NOSVE: // %bb.0:1646; NONEON-NOSVE-NEXT: sub sp, sp, #321647; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321648; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1649; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1650; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1651; NONEON-NOSVE-NEXT: fcvt s0, h01652; NONEON-NOSVE-NEXT: fcvt s1, h11653; NONEON-NOSVE-NEXT: fmul s0, s1, s01654; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1655; NONEON-NOSVE-NEXT: fcvt s1, h11656; NONEON-NOSVE-NEXT: fcvt h0, s01657; NONEON-NOSVE-NEXT: str h0, [sp, #30]1658; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1659; NONEON-NOSVE-NEXT: fcvt s0, h01660; NONEON-NOSVE-NEXT: fmul s0, s1, s01661; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1662; NONEON-NOSVE-NEXT: fcvt s1, h11663; NONEON-NOSVE-NEXT: fcvt h0, s01664; NONEON-NOSVE-NEXT: str h0, [sp, #28]1665; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1666; NONEON-NOSVE-NEXT: fcvt s0, h01667; NONEON-NOSVE-NEXT: fmul s0, s1, s01668; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1669; NONEON-NOSVE-NEXT: fcvt s1, h11670; NONEON-NOSVE-NEXT: fcvt h0, s01671; NONEON-NOSVE-NEXT: str h0, [sp, #26]1672; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1673; NONEON-NOSVE-NEXT: fcvt s0, h01674; NONEON-NOSVE-NEXT: fmul s0, s1, s01675; NONEON-NOSVE-NEXT: fcvt h0, s01676; NONEON-NOSVE-NEXT: str h0, [sp, #24]1677; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1678; NONEON-NOSVE-NEXT: add sp, sp, #321679; NONEON-NOSVE-NEXT: ret1680 %res = fmul <2 x half> %op1, %op21681 ret <2 x half> %res1682}1683 1684define <4 x half> @fmul_v4f16(<4 x half> %op1, <4 x half> %op2) {1685; CHECK-LABEL: fmul_v4f16:1686; CHECK: // %bb.0:1687; CHECK-NEXT: ptrue p0.h, vl41688; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01689; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11690; CHECK-NEXT: fmul z0.h, p0/m, z0.h, z1.h1691; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01692; CHECK-NEXT: ret1693;1694; NONEON-NOSVE-LABEL: fmul_v4f16:1695; NONEON-NOSVE: // %bb.0:1696; NONEON-NOSVE-NEXT: sub sp, sp, #321697; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321698; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1699; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1700; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1701; NONEON-NOSVE-NEXT: fcvt s0, h01702; NONEON-NOSVE-NEXT: fcvt s1, h11703; NONEON-NOSVE-NEXT: fmul s0, s1, s01704; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1705; NONEON-NOSVE-NEXT: fcvt s1, h11706; NONEON-NOSVE-NEXT: fcvt h0, s01707; NONEON-NOSVE-NEXT: str h0, [sp, #30]1708; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1709; NONEON-NOSVE-NEXT: fcvt s0, h01710; NONEON-NOSVE-NEXT: fmul s0, s1, s01711; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1712; NONEON-NOSVE-NEXT: fcvt s1, h11713; NONEON-NOSVE-NEXT: fcvt h0, s01714; NONEON-NOSVE-NEXT: str h0, [sp, #28]1715; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1716; NONEON-NOSVE-NEXT: fcvt s0, h01717; NONEON-NOSVE-NEXT: fmul s0, s1, s01718; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1719; NONEON-NOSVE-NEXT: fcvt s1, h11720; NONEON-NOSVE-NEXT: fcvt h0, s01721; NONEON-NOSVE-NEXT: str h0, [sp, #26]1722; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1723; NONEON-NOSVE-NEXT: fcvt s0, h01724; NONEON-NOSVE-NEXT: fmul s0, s1, s01725; NONEON-NOSVE-NEXT: fcvt h0, s01726; NONEON-NOSVE-NEXT: str h0, [sp, #24]1727; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1728; NONEON-NOSVE-NEXT: add sp, sp, #321729; NONEON-NOSVE-NEXT: ret1730 %res = fmul <4 x half> %op1, %op21731 ret <4 x half> %res1732}1733 1734define <8 x half> @fmul_v8f16(<8 x half> %op1, <8 x half> %op2) {1735; CHECK-LABEL: fmul_v8f16:1736; CHECK: // %bb.0:1737; CHECK-NEXT: ptrue p0.h, vl81738; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01739; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11740; CHECK-NEXT: fmul z0.h, p0/m, z0.h, z1.h1741; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01742; CHECK-NEXT: ret1743;1744; NONEON-NOSVE-LABEL: fmul_v8f16:1745; NONEON-NOSVE: // %bb.0:1746; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1747; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481748; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]1749; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1750; NONEON-NOSVE-NEXT: fcvt s0, h01751; NONEON-NOSVE-NEXT: fcvt s1, h11752; NONEON-NOSVE-NEXT: fmul s0, s1, s01753; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1754; NONEON-NOSVE-NEXT: fcvt s1, h11755; NONEON-NOSVE-NEXT: fcvt h0, s01756; NONEON-NOSVE-NEXT: str h0, [sp, #46]1757; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]1758; NONEON-NOSVE-NEXT: fcvt s0, h01759; NONEON-NOSVE-NEXT: fmul s0, s1, s01760; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1761; NONEON-NOSVE-NEXT: fcvt s1, h11762; NONEON-NOSVE-NEXT: fcvt h0, s01763; NONEON-NOSVE-NEXT: str h0, [sp, #44]1764; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]1765; NONEON-NOSVE-NEXT: fcvt s0, h01766; NONEON-NOSVE-NEXT: fmul s0, s1, s01767; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1768; NONEON-NOSVE-NEXT: fcvt s1, h11769; NONEON-NOSVE-NEXT: fcvt h0, s01770; NONEON-NOSVE-NEXT: str h0, [sp, #42]1771; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]1772; NONEON-NOSVE-NEXT: fcvt s0, h01773; NONEON-NOSVE-NEXT: fmul s0, s1, s01774; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]1775; NONEON-NOSVE-NEXT: fcvt s1, h11776; NONEON-NOSVE-NEXT: fcvt h0, s01777; NONEON-NOSVE-NEXT: str h0, [sp, #40]1778; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1779; NONEON-NOSVE-NEXT: fcvt s0, h01780; NONEON-NOSVE-NEXT: fmul s0, s1, s01781; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]1782; NONEON-NOSVE-NEXT: fcvt s1, h11783; NONEON-NOSVE-NEXT: fcvt h0, s01784; NONEON-NOSVE-NEXT: str h0, [sp, #38]1785; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1786; NONEON-NOSVE-NEXT: fcvt s0, h01787; NONEON-NOSVE-NEXT: fmul s0, s1, s01788; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1789; NONEON-NOSVE-NEXT: fcvt s1, h11790; NONEON-NOSVE-NEXT: fcvt h0, s01791; NONEON-NOSVE-NEXT: str h0, [sp, #36]1792; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1793; NONEON-NOSVE-NEXT: fcvt s0, h01794; NONEON-NOSVE-NEXT: fmul s0, s1, s01795; NONEON-NOSVE-NEXT: ldr h1, [sp]1796; NONEON-NOSVE-NEXT: fcvt s1, h11797; NONEON-NOSVE-NEXT: fcvt h0, s01798; NONEON-NOSVE-NEXT: str h0, [sp, #34]1799; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1800; NONEON-NOSVE-NEXT: fcvt s0, h01801; NONEON-NOSVE-NEXT: fmul s0, s1, s01802; NONEON-NOSVE-NEXT: fcvt h0, s01803; NONEON-NOSVE-NEXT: str h0, [sp, #32]1804; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1805; NONEON-NOSVE-NEXT: add sp, sp, #481806; NONEON-NOSVE-NEXT: ret1807 %res = fmul <8 x half> %op1, %op21808 ret <8 x half> %res1809}1810 1811define void @fmul_v16f16(ptr %a, ptr %b) {1812; CHECK-LABEL: fmul_v16f16:1813; CHECK: // %bb.0:1814; CHECK-NEXT: ldp q0, q3, [x1]1815; CHECK-NEXT: ptrue p0.h, vl81816; CHECK-NEXT: ldp q1, q2, [x0]1817; CHECK-NEXT: fmul z0.h, p0/m, z0.h, z1.h1818; CHECK-NEXT: fmul z2.h, p0/m, z2.h, z3.h1819; CHECK-NEXT: stp q0, q2, [x0]1820; CHECK-NEXT: ret1821;1822; NONEON-NOSVE-LABEL: fmul_v16f16:1823; NONEON-NOSVE: // %bb.0:1824; NONEON-NOSVE-NEXT: sub sp, sp, #961825; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961826; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1827; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1828; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1829; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1830; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]1831; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]1832; NONEON-NOSVE-NEXT: fcvt s0, h01833; NONEON-NOSVE-NEXT: fcvt s1, h11834; NONEON-NOSVE-NEXT: fmul s0, s1, s01835; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]1836; NONEON-NOSVE-NEXT: fcvt s1, h11837; NONEON-NOSVE-NEXT: fcvt h0, s01838; NONEON-NOSVE-NEXT: str h0, [sp, #94]1839; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]1840; NONEON-NOSVE-NEXT: fcvt s0, h01841; NONEON-NOSVE-NEXT: fmul s0, s1, s01842; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]1843; NONEON-NOSVE-NEXT: fcvt s1, h11844; NONEON-NOSVE-NEXT: fcvt h0, s01845; NONEON-NOSVE-NEXT: str h0, [sp, #92]1846; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]1847; NONEON-NOSVE-NEXT: fcvt s0, h01848; NONEON-NOSVE-NEXT: fmul s0, s1, s01849; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]1850; NONEON-NOSVE-NEXT: fcvt s1, h11851; NONEON-NOSVE-NEXT: fcvt h0, s01852; NONEON-NOSVE-NEXT: str h0, [sp, #90]1853; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]1854; NONEON-NOSVE-NEXT: fcvt s0, h01855; NONEON-NOSVE-NEXT: fmul s0, s1, s01856; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]1857; NONEON-NOSVE-NEXT: fcvt s1, h11858; NONEON-NOSVE-NEXT: fcvt h0, s01859; NONEON-NOSVE-NEXT: str h0, [sp, #88]1860; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]1861; NONEON-NOSVE-NEXT: fcvt s0, h01862; NONEON-NOSVE-NEXT: fmul s0, s1, s01863; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]1864; NONEON-NOSVE-NEXT: fcvt s1, h11865; NONEON-NOSVE-NEXT: fcvt h0, s01866; NONEON-NOSVE-NEXT: str h0, [sp, #86]1867; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]1868; NONEON-NOSVE-NEXT: fcvt s0, h01869; NONEON-NOSVE-NEXT: fmul s0, s1, s01870; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]1871; NONEON-NOSVE-NEXT: fcvt s1, h11872; NONEON-NOSVE-NEXT: fcvt h0, s01873; NONEON-NOSVE-NEXT: str h0, [sp, #84]1874; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]1875; NONEON-NOSVE-NEXT: fcvt s0, h01876; NONEON-NOSVE-NEXT: fmul s0, s1, s01877; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]1878; NONEON-NOSVE-NEXT: fcvt s1, h11879; NONEON-NOSVE-NEXT: fcvt h0, s01880; NONEON-NOSVE-NEXT: str h0, [sp, #82]1881; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]1882; NONEON-NOSVE-NEXT: fcvt s0, h01883; NONEON-NOSVE-NEXT: fmul s0, s1, s01884; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1885; NONEON-NOSVE-NEXT: fcvt s1, h11886; NONEON-NOSVE-NEXT: fcvt h0, s01887; NONEON-NOSVE-NEXT: str h0, [sp, #80]1888; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]1889; NONEON-NOSVE-NEXT: fcvt s0, h01890; NONEON-NOSVE-NEXT: fmul s0, s1, s01891; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1892; NONEON-NOSVE-NEXT: fcvt s1, h11893; NONEON-NOSVE-NEXT: fcvt h0, s01894; NONEON-NOSVE-NEXT: str h0, [sp, #78]1895; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]1896; NONEON-NOSVE-NEXT: fcvt s0, h01897; NONEON-NOSVE-NEXT: fmul s0, s1, s01898; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1899; NONEON-NOSVE-NEXT: fcvt s1, h11900; NONEON-NOSVE-NEXT: fcvt h0, s01901; NONEON-NOSVE-NEXT: str h0, [sp, #76]1902; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]1903; NONEON-NOSVE-NEXT: fcvt s0, h01904; NONEON-NOSVE-NEXT: fmul s0, s1, s01905; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1906; NONEON-NOSVE-NEXT: fcvt s1, h11907; NONEON-NOSVE-NEXT: fcvt h0, s01908; NONEON-NOSVE-NEXT: str h0, [sp, #74]1909; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]1910; NONEON-NOSVE-NEXT: fcvt s0, h01911; NONEON-NOSVE-NEXT: fmul s0, s1, s01912; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]1913; NONEON-NOSVE-NEXT: fcvt s1, h11914; NONEON-NOSVE-NEXT: fcvt h0, s01915; NONEON-NOSVE-NEXT: str h0, [sp, #72]1916; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]1917; NONEON-NOSVE-NEXT: fcvt s0, h01918; NONEON-NOSVE-NEXT: fmul s0, s1, s01919; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]1920; NONEON-NOSVE-NEXT: fcvt s1, h11921; NONEON-NOSVE-NEXT: fcvt h0, s01922; NONEON-NOSVE-NEXT: str h0, [sp, #70]1923; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]1924; NONEON-NOSVE-NEXT: fcvt s0, h01925; NONEON-NOSVE-NEXT: fmul s0, s1, s01926; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1927; NONEON-NOSVE-NEXT: fcvt s1, h11928; NONEON-NOSVE-NEXT: fcvt h0, s01929; NONEON-NOSVE-NEXT: str h0, [sp, #68]1930; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1931; NONEON-NOSVE-NEXT: fcvt s0, h01932; NONEON-NOSVE-NEXT: fmul s0, s1, s01933; NONEON-NOSVE-NEXT: ldr h1, [sp]1934; NONEON-NOSVE-NEXT: fcvt s1, h11935; NONEON-NOSVE-NEXT: fcvt h0, s01936; NONEON-NOSVE-NEXT: str h0, [sp, #66]1937; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]1938; NONEON-NOSVE-NEXT: fcvt s0, h01939; NONEON-NOSVE-NEXT: fmul s0, s1, s01940; NONEON-NOSVE-NEXT: fcvt h0, s01941; NONEON-NOSVE-NEXT: str h0, [sp, #64]1942; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1943; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1944; NONEON-NOSVE-NEXT: add sp, sp, #961945; NONEON-NOSVE-NEXT: ret1946 %op1 = load <16 x half>, ptr %a1947 %op2 = load <16 x half>, ptr %b1948 %res = fmul <16 x half> %op1, %op21949 store <16 x half> %res, ptr %a1950 ret void1951}1952 1953define <2 x float> @fmul_v2f32(<2 x float> %op1, <2 x float> %op2) {1954; CHECK-LABEL: fmul_v2f32:1955; CHECK: // %bb.0:1956; CHECK-NEXT: ptrue p0.s, vl21957; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01958; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11959; CHECK-NEXT: fmul z0.s, p0/m, z0.s, z1.s1960; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01961; CHECK-NEXT: ret1962;1963; NONEON-NOSVE-LABEL: fmul_v2f32:1964; NONEON-NOSVE: // %bb.0:1965; NONEON-NOSVE-NEXT: sub sp, sp, #321966; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321967; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1968; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]1969; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]1970; NONEON-NOSVE-NEXT: fmul s3, s2, s01971; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]1972; NONEON-NOSVE-NEXT: fmul s0, s1, s01973; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]1974; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1975; NONEON-NOSVE-NEXT: add sp, sp, #321976; NONEON-NOSVE-NEXT: ret1977 %res = fmul <2 x float> %op1, %op21978 ret <2 x float> %res1979}1980 1981define <4 x float> @fmul_v4f32(<4 x float> %op1, <4 x float> %op2) {1982; CHECK-LABEL: fmul_v4f32:1983; CHECK: // %bb.0:1984; CHECK-NEXT: ptrue p0.s, vl41985; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01986; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11987; CHECK-NEXT: fmul z0.s, p0/m, z0.s, z1.s1988; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01989; CHECK-NEXT: ret1990;1991; NONEON-NOSVE-LABEL: fmul_v4f32:1992; NONEON-NOSVE: // %bb.0:1993; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1994; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481995; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]1996; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]1997; NONEON-NOSVE-NEXT: fmul s3, s2, s01998; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]1999; NONEON-NOSVE-NEXT: fmul s0, s1, s02000; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]2001; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]2002; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]2003; NONEON-NOSVE-NEXT: fmul s3, s2, s02004; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]2005; NONEON-NOSVE-NEXT: fmul s0, s1, s02006; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]2007; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2008; NONEON-NOSVE-NEXT: add sp, sp, #482009; NONEON-NOSVE-NEXT: ret2010 %res = fmul <4 x float> %op1, %op22011 ret <4 x float> %res2012}2013 2014define void @fmul_v8f32(ptr %a, ptr %b) {2015; CHECK-LABEL: fmul_v8f32:2016; CHECK: // %bb.0:2017; CHECK-NEXT: ldp q0, q3, [x1]2018; CHECK-NEXT: ptrue p0.s, vl42019; CHECK-NEXT: ldp q1, q2, [x0]2020; CHECK-NEXT: fmul z0.s, p0/m, z0.s, z1.s2021; CHECK-NEXT: fmul z2.s, p0/m, z2.s, z3.s2022; CHECK-NEXT: stp q0, q2, [x0]2023; CHECK-NEXT: ret2024;2025; NONEON-NOSVE-LABEL: fmul_v8f32:2026; NONEON-NOSVE: // %bb.0:2027; NONEON-NOSVE-NEXT: sub sp, sp, #962028; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962029; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2030; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2031; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2032; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2033; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]2034; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]2035; NONEON-NOSVE-NEXT: fmul s3, s2, s02036; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]2037; NONEON-NOSVE-NEXT: fmul s0, s1, s02038; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]2039; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]2040; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]2041; NONEON-NOSVE-NEXT: fmul s3, s2, s02042; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]2043; NONEON-NOSVE-NEXT: fmul s0, s1, s02044; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]2045; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]2046; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]2047; NONEON-NOSVE-NEXT: fmul s3, s2, s02048; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]2049; NONEON-NOSVE-NEXT: fmul s0, s1, s02050; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]2051; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]2052; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]2053; NONEON-NOSVE-NEXT: fmul s3, s2, s02054; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]2055; NONEON-NOSVE-NEXT: fmul s0, s1, s02056; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]2057; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2058; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2059; NONEON-NOSVE-NEXT: add sp, sp, #962060; NONEON-NOSVE-NEXT: ret2061 %op1 = load <8 x float>, ptr %a2062 %op2 = load <8 x float>, ptr %b2063 %res = fmul <8 x float> %op1, %op22064 store <8 x float> %res, ptr %a2065 ret void2066}2067 2068define <2 x double> @fmul_v2f64(<2 x double> %op1, <2 x double> %op2) {2069; CHECK-LABEL: fmul_v2f64:2070; CHECK: // %bb.0:2071; CHECK-NEXT: ptrue p0.d, vl22072; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02073; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12074; CHECK-NEXT: fmul z0.d, p0/m, z0.d, z1.d2075; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02076; CHECK-NEXT: ret2077;2078; NONEON-NOSVE-LABEL: fmul_v2f64:2079; NONEON-NOSVE: // %bb.0:2080; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2081; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482082; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]2083; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2084; NONEON-NOSVE-NEXT: fmul d3, d2, d02085; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]2086; NONEON-NOSVE-NEXT: fmul d0, d1, d02087; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]2088; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2089; NONEON-NOSVE-NEXT: add sp, sp, #482090; NONEON-NOSVE-NEXT: ret2091 %res = fmul <2 x double> %op1, %op22092 ret <2 x double> %res2093}2094 2095define void @fmul_v4f64(ptr %a, ptr %b) {2096; CHECK-LABEL: fmul_v4f64:2097; CHECK: // %bb.0:2098; CHECK-NEXT: ldp q0, q3, [x1]2099; CHECK-NEXT: ptrue p0.d, vl22100; CHECK-NEXT: ldp q1, q2, [x0]2101; CHECK-NEXT: fmul z0.d, p0/m, z0.d, z1.d2102; CHECK-NEXT: fmul z2.d, p0/m, z2.d, z3.d2103; CHECK-NEXT: stp q0, q2, [x0]2104; CHECK-NEXT: ret2105;2106; NONEON-NOSVE-LABEL: fmul_v4f64:2107; NONEON-NOSVE: // %bb.0:2108; NONEON-NOSVE-NEXT: sub sp, sp, #962109; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962110; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2111; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2112; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2113; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2114; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]2115; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]2116; NONEON-NOSVE-NEXT: fmul d3, d2, d02117; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]2118; NONEON-NOSVE-NEXT: fmul d0, d1, d02119; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]2120; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]2121; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2122; NONEON-NOSVE-NEXT: fmul d3, d2, d02123; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]2124; NONEON-NOSVE-NEXT: fmul d0, d1, d02125; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]2126; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2127; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2128; NONEON-NOSVE-NEXT: add sp, sp, #962129; NONEON-NOSVE-NEXT: ret2130 %op1 = load <4 x double>, ptr %a2131 %op2 = load <4 x double>, ptr %b2132 %res = fmul <4 x double> %op1, %op22133 store <4 x double> %res, ptr %a2134 ret void2135}2136 2137;2138; FNEG2139;2140 2141define <2 x half> @fneg_v2f16(<2 x half> %op) {2142; CHECK-LABEL: fneg_v2f16:2143; CHECK: // %bb.0:2144; CHECK-NEXT: ptrue p0.h, vl42145; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02146; CHECK-NEXT: fneg z0.h, p0/m, z0.h2147; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02148; CHECK-NEXT: ret2149;2150; NONEON-NOSVE-LABEL: fneg_v2f16:2151; NONEON-NOSVE: // %bb.0:2152; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2153; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162154; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2155; NONEON-NOSVE-NEXT: fmov w8, s02156; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002157; NONEON-NOSVE-NEXT: fmov s0, w82158; NONEON-NOSVE-NEXT: str h0, [sp, #14]2159; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2160; NONEON-NOSVE-NEXT: fmov w8, s02161; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002162; NONEON-NOSVE-NEXT: fmov s0, w82163; NONEON-NOSVE-NEXT: str h0, [sp, #12]2164; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2165; NONEON-NOSVE-NEXT: fmov w8, s02166; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002167; NONEON-NOSVE-NEXT: fmov s0, w82168; NONEON-NOSVE-NEXT: str h0, [sp, #10]2169; NONEON-NOSVE-NEXT: ldr h0, [sp]2170; NONEON-NOSVE-NEXT: fmov w8, s02171; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002172; NONEON-NOSVE-NEXT: fmov s0, w82173; NONEON-NOSVE-NEXT: str h0, [sp, #8]2174; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2175; NONEON-NOSVE-NEXT: add sp, sp, #162176; NONEON-NOSVE-NEXT: ret2177 %res = fneg <2 x half> %op2178 ret <2 x half> %res2179}2180 2181define <4 x half> @fneg_v4f16(<4 x half> %op) {2182; CHECK-LABEL: fneg_v4f16:2183; CHECK: // %bb.0:2184; CHECK-NEXT: ptrue p0.h, vl42185; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02186; CHECK-NEXT: fneg z0.h, p0/m, z0.h2187; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02188; CHECK-NEXT: ret2189;2190; NONEON-NOSVE-LABEL: fneg_v4f16:2191; NONEON-NOSVE: // %bb.0:2192; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2193; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162194; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2195; NONEON-NOSVE-NEXT: fmov w8, s02196; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002197; NONEON-NOSVE-NEXT: fmov s0, w82198; NONEON-NOSVE-NEXT: str h0, [sp, #14]2199; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2200; NONEON-NOSVE-NEXT: fmov w8, s02201; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002202; NONEON-NOSVE-NEXT: fmov s0, w82203; NONEON-NOSVE-NEXT: str h0, [sp, #12]2204; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2205; NONEON-NOSVE-NEXT: fmov w8, s02206; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002207; NONEON-NOSVE-NEXT: fmov s0, w82208; NONEON-NOSVE-NEXT: str h0, [sp, #10]2209; NONEON-NOSVE-NEXT: ldr h0, [sp]2210; NONEON-NOSVE-NEXT: fmov w8, s02211; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002212; NONEON-NOSVE-NEXT: fmov s0, w82213; NONEON-NOSVE-NEXT: str h0, [sp, #8]2214; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2215; NONEON-NOSVE-NEXT: add sp, sp, #162216; NONEON-NOSVE-NEXT: ret2217 %res = fneg <4 x half> %op2218 ret <4 x half> %res2219}2220 2221define <8 x half> @fneg_v8f16(<8 x half> %op) {2222; CHECK-LABEL: fneg_v8f16:2223; CHECK: // %bb.0:2224; CHECK-NEXT: ptrue p0.h, vl82225; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02226; CHECK-NEXT: fneg z0.h, p0/m, z0.h2227; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02228; CHECK-NEXT: ret2229;2230; NONEON-NOSVE-LABEL: fneg_v8f16:2231; NONEON-NOSVE: // %bb.0:2232; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2233; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322234; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]2235; NONEON-NOSVE-NEXT: fmov w8, s02236; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002237; NONEON-NOSVE-NEXT: fmov s0, w82238; NONEON-NOSVE-NEXT: str h0, [sp, #30]2239; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]2240; NONEON-NOSVE-NEXT: fmov w8, s02241; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002242; NONEON-NOSVE-NEXT: fmov s0, w82243; NONEON-NOSVE-NEXT: str h0, [sp, #28]2244; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]2245; NONEON-NOSVE-NEXT: fmov w8, s02246; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002247; NONEON-NOSVE-NEXT: fmov s0, w82248; NONEON-NOSVE-NEXT: str h0, [sp, #26]2249; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]2250; NONEON-NOSVE-NEXT: fmov w8, s02251; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002252; NONEON-NOSVE-NEXT: fmov s0, w82253; NONEON-NOSVE-NEXT: str h0, [sp, #24]2254; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2255; NONEON-NOSVE-NEXT: fmov w8, s02256; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002257; NONEON-NOSVE-NEXT: fmov s0, w82258; NONEON-NOSVE-NEXT: str h0, [sp, #22]2259; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2260; NONEON-NOSVE-NEXT: fmov w8, s02261; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002262; NONEON-NOSVE-NEXT: fmov s0, w82263; NONEON-NOSVE-NEXT: str h0, [sp, #20]2264; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2265; NONEON-NOSVE-NEXT: fmov w8, s02266; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002267; NONEON-NOSVE-NEXT: fmov s0, w82268; NONEON-NOSVE-NEXT: str h0, [sp, #18]2269; NONEON-NOSVE-NEXT: ldr h0, [sp]2270; NONEON-NOSVE-NEXT: fmov w8, s02271; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002272; NONEON-NOSVE-NEXT: fmov s0, w82273; NONEON-NOSVE-NEXT: str h0, [sp, #16]2274; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2275; NONEON-NOSVE-NEXT: add sp, sp, #322276; NONEON-NOSVE-NEXT: ret2277 %res = fneg <8 x half> %op2278 ret <8 x half> %res2279}2280 2281define void @fneg_v16f16(ptr %a, ptr %b) {2282; CHECK-LABEL: fneg_v16f16:2283; CHECK: // %bb.0:2284; CHECK-NEXT: ldp q0, q1, [x0]2285; CHECK-NEXT: ptrue p0.h, vl82286; CHECK-NEXT: fneg z0.h, p0/m, z0.h2287; CHECK-NEXT: fneg z1.h, p0/m, z1.h2288; CHECK-NEXT: stp q0, q1, [x0]2289; CHECK-NEXT: ret2290;2291; NONEON-NOSVE-LABEL: fneg_v16f16:2292; NONEON-NOSVE: // %bb.0:2293; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2294; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2295; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642296; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]2297; NONEON-NOSVE-NEXT: fmov w8, s02298; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002299; NONEON-NOSVE-NEXT: fmov s0, w82300; NONEON-NOSVE-NEXT: str h0, [sp, #62]2301; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]2302; NONEON-NOSVE-NEXT: fmov w8, s02303; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002304; NONEON-NOSVE-NEXT: fmov s0, w82305; NONEON-NOSVE-NEXT: str h0, [sp, #60]2306; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]2307; NONEON-NOSVE-NEXT: fmov w8, s02308; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002309; NONEON-NOSVE-NEXT: fmov s0, w82310; NONEON-NOSVE-NEXT: str h0, [sp, #58]2311; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]2312; NONEON-NOSVE-NEXT: fmov w8, s02313; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002314; NONEON-NOSVE-NEXT: fmov s0, w82315; NONEON-NOSVE-NEXT: str h0, [sp, #56]2316; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]2317; NONEON-NOSVE-NEXT: fmov w8, s02318; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002319; NONEON-NOSVE-NEXT: fmov s0, w82320; NONEON-NOSVE-NEXT: str h0, [sp, #54]2321; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]2322; NONEON-NOSVE-NEXT: fmov w8, s02323; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002324; NONEON-NOSVE-NEXT: fmov s0, w82325; NONEON-NOSVE-NEXT: str h0, [sp, #52]2326; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]2327; NONEON-NOSVE-NEXT: fmov w8, s02328; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002329; NONEON-NOSVE-NEXT: fmov s0, w82330; NONEON-NOSVE-NEXT: str h0, [sp, #50]2331; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]2332; NONEON-NOSVE-NEXT: fmov w8, s02333; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002334; NONEON-NOSVE-NEXT: fmov s0, w82335; NONEON-NOSVE-NEXT: str h0, [sp, #48]2336; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]2337; NONEON-NOSVE-NEXT: fmov w8, s02338; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002339; NONEON-NOSVE-NEXT: fmov s0, w82340; NONEON-NOSVE-NEXT: str h0, [sp, #46]2341; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]2342; NONEON-NOSVE-NEXT: fmov w8, s02343; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002344; NONEON-NOSVE-NEXT: fmov s0, w82345; NONEON-NOSVE-NEXT: str h0, [sp, #44]2346; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]2347; NONEON-NOSVE-NEXT: fmov w8, s02348; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002349; NONEON-NOSVE-NEXT: fmov s0, w82350; NONEON-NOSVE-NEXT: str h0, [sp, #42]2351; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]2352; NONEON-NOSVE-NEXT: fmov w8, s02353; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002354; NONEON-NOSVE-NEXT: fmov s0, w82355; NONEON-NOSVE-NEXT: str h0, [sp, #40]2356; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2357; NONEON-NOSVE-NEXT: fmov w8, s02358; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002359; NONEON-NOSVE-NEXT: fmov s0, w82360; NONEON-NOSVE-NEXT: str h0, [sp, #38]2361; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2362; NONEON-NOSVE-NEXT: fmov w8, s02363; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002364; NONEON-NOSVE-NEXT: fmov s0, w82365; NONEON-NOSVE-NEXT: str h0, [sp, #36]2366; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2367; NONEON-NOSVE-NEXT: fmov w8, s02368; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002369; NONEON-NOSVE-NEXT: fmov s0, w82370; NONEON-NOSVE-NEXT: str h0, [sp, #34]2371; NONEON-NOSVE-NEXT: ldr h0, [sp]2372; NONEON-NOSVE-NEXT: fmov w8, s02373; NONEON-NOSVE-NEXT: eor w8, w8, #0x80002374; NONEON-NOSVE-NEXT: fmov s0, w82375; NONEON-NOSVE-NEXT: str h0, [sp, #32]2376; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2377; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2378; NONEON-NOSVE-NEXT: add sp, sp, #642379; NONEON-NOSVE-NEXT: ret2380 %op = load <16 x half>, ptr %a2381 %res = fneg <16 x half> %op2382 store <16 x half> %res, ptr %a2383 ret void2384}2385 2386define <2 x float> @fneg_v2f32(<2 x float> %op) {2387; CHECK-LABEL: fneg_v2f32:2388; CHECK: // %bb.0:2389; CHECK-NEXT: ptrue p0.s, vl22390; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02391; CHECK-NEXT: fneg z0.s, p0/m, z0.s2392; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02393; CHECK-NEXT: ret2394;2395; NONEON-NOSVE-LABEL: fneg_v2f32:2396; NONEON-NOSVE: // %bb.0:2397; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2398; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162399; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2400; NONEON-NOSVE-NEXT: fneg s1, s02401; NONEON-NOSVE-NEXT: ldr s0, [sp]2402; NONEON-NOSVE-NEXT: fneg s0, s02403; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8]2404; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2405; NONEON-NOSVE-NEXT: add sp, sp, #162406; NONEON-NOSVE-NEXT: ret2407 %res = fneg <2 x float> %op2408 ret <2 x float> %res2409}2410 2411define <4 x float> @fneg_v4f32(<4 x float> %op) {2412; CHECK-LABEL: fneg_v4f32:2413; CHECK: // %bb.0:2414; CHECK-NEXT: ptrue p0.s, vl42415; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02416; CHECK-NEXT: fneg z0.s, p0/m, z0.s2417; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02418; CHECK-NEXT: ret2419;2420; NONEON-NOSVE-LABEL: fneg_v4f32:2421; NONEON-NOSVE: // %bb.0:2422; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2423; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322424; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]2425; NONEON-NOSVE-NEXT: fneg s1, s02426; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]2427; NONEON-NOSVE-NEXT: fneg s0, s02428; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]2429; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2430; NONEON-NOSVE-NEXT: fneg s1, s02431; NONEON-NOSVE-NEXT: ldr s0, [sp]2432; NONEON-NOSVE-NEXT: fneg s0, s02433; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]2434; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2435; NONEON-NOSVE-NEXT: add sp, sp, #322436; NONEON-NOSVE-NEXT: ret2437 %res = fneg <4 x float> %op2438 ret <4 x float> %res2439}2440 2441define void @fneg_v8f32(ptr %a) {2442; CHECK-LABEL: fneg_v8f32:2443; CHECK: // %bb.0:2444; CHECK-NEXT: ldp q0, q1, [x0]2445; CHECK-NEXT: ptrue p0.s, vl42446; CHECK-NEXT: fneg z0.s, p0/m, z0.s2447; CHECK-NEXT: fneg z1.s, p0/m, z1.s2448; CHECK-NEXT: stp q0, q1, [x0]2449; CHECK-NEXT: ret2450;2451; NONEON-NOSVE-LABEL: fneg_v8f32:2452; NONEON-NOSVE: // %bb.0:2453; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2454; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2455; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642456; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]2457; NONEON-NOSVE-NEXT: fneg s1, s02458; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]2459; NONEON-NOSVE-NEXT: fneg s0, s02460; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]2461; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]2462; NONEON-NOSVE-NEXT: fneg s1, s02463; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]2464; NONEON-NOSVE-NEXT: fneg s0, s02465; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]2466; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]2467; NONEON-NOSVE-NEXT: fneg s1, s02468; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]2469; NONEON-NOSVE-NEXT: fneg s0, s02470; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]2471; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2472; NONEON-NOSVE-NEXT: fneg s1, s02473; NONEON-NOSVE-NEXT: ldr s0, [sp]2474; NONEON-NOSVE-NEXT: fneg s0, s02475; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]2476; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2477; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2478; NONEON-NOSVE-NEXT: add sp, sp, #642479; NONEON-NOSVE-NEXT: ret2480 %op = load <8 x float>, ptr %a2481 %res = fneg <8 x float> %op2482 store <8 x float> %res, ptr %a2483 ret void2484}2485 2486define <2 x double> @fneg_v2f64(<2 x double> %op) {2487; CHECK-LABEL: fneg_v2f64:2488; CHECK: // %bb.0:2489; CHECK-NEXT: ptrue p0.d, vl22490; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02491; CHECK-NEXT: fneg z0.d, p0/m, z0.d2492; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02493; CHECK-NEXT: ret2494;2495; NONEON-NOSVE-LABEL: fneg_v2f64:2496; NONEON-NOSVE: // %bb.0:2497; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2498; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322499; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2500; NONEON-NOSVE-NEXT: fneg d1, d02501; NONEON-NOSVE-NEXT: ldr d0, [sp]2502; NONEON-NOSVE-NEXT: fneg d0, d02503; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]2504; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2505; NONEON-NOSVE-NEXT: add sp, sp, #322506; NONEON-NOSVE-NEXT: ret2507 %res = fneg <2 x double> %op2508 ret <2 x double> %res2509}2510 2511define void @fneg_v4f64(ptr %a) {2512; CHECK-LABEL: fneg_v4f64:2513; CHECK: // %bb.0:2514; CHECK-NEXT: ldp q0, q1, [x0]2515; CHECK-NEXT: ptrue p0.d, vl22516; CHECK-NEXT: fneg z0.d, p0/m, z0.d2517; CHECK-NEXT: fneg z1.d, p0/m, z1.d2518; CHECK-NEXT: stp q0, q1, [x0]2519; CHECK-NEXT: ret2520;2521; NONEON-NOSVE-LABEL: fneg_v4f64:2522; NONEON-NOSVE: // %bb.0:2523; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2524; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2525; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642526; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2527; NONEON-NOSVE-NEXT: fneg d1, d02528; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]2529; NONEON-NOSVE-NEXT: fneg d0, d02530; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2531; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2532; NONEON-NOSVE-NEXT: fneg d1, d02533; NONEON-NOSVE-NEXT: ldr d0, [sp]2534; NONEON-NOSVE-NEXT: fneg d0, d02535; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2536; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2537; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2538; NONEON-NOSVE-NEXT: add sp, sp, #642539; NONEON-NOSVE-NEXT: ret2540 %op = load <4 x double>, ptr %a2541 %res = fneg <4 x double> %op2542 store <4 x double> %res, ptr %a2543 ret void2544}2545 2546;2547; FSQRT2548;2549 2550define <2 x half> @fsqrt_v2f16(<2 x half> %op) {2551; CHECK-LABEL: fsqrt_v2f16:2552; CHECK: // %bb.0:2553; CHECK-NEXT: ptrue p0.h, vl42554; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02555; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h2556; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02557; CHECK-NEXT: ret2558;2559; NONEON-NOSVE-LABEL: fsqrt_v2f16:2560; NONEON-NOSVE: // %bb.0:2561; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2562; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162563; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2564; NONEON-NOSVE-NEXT: fcvt s0, h02565; NONEON-NOSVE-NEXT: fsqrt s0, s02566; NONEON-NOSVE-NEXT: fcvt h0, s02567; NONEON-NOSVE-NEXT: str h0, [sp, #14]2568; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2569; NONEON-NOSVE-NEXT: fcvt s0, h02570; NONEON-NOSVE-NEXT: fsqrt s0, s02571; NONEON-NOSVE-NEXT: fcvt h0, s02572; NONEON-NOSVE-NEXT: str h0, [sp, #12]2573; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2574; NONEON-NOSVE-NEXT: fcvt s0, h02575; NONEON-NOSVE-NEXT: fsqrt s0, s02576; NONEON-NOSVE-NEXT: fcvt h0, s02577; NONEON-NOSVE-NEXT: str h0, [sp, #10]2578; NONEON-NOSVE-NEXT: ldr h0, [sp]2579; NONEON-NOSVE-NEXT: fcvt s0, h02580; NONEON-NOSVE-NEXT: fsqrt s0, s02581; NONEON-NOSVE-NEXT: fcvt h0, s02582; NONEON-NOSVE-NEXT: str h0, [sp, #8]2583; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2584; NONEON-NOSVE-NEXT: add sp, sp, #162585; NONEON-NOSVE-NEXT: ret2586 %res = call <2 x half> @llvm.sqrt.v2f16(<2 x half> %op)2587 ret <2 x half> %res2588}2589 2590define <4 x half> @fsqrt_v4f16(<4 x half> %op) {2591; CHECK-LABEL: fsqrt_v4f16:2592; CHECK: // %bb.0:2593; CHECK-NEXT: ptrue p0.h, vl42594; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02595; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h2596; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02597; CHECK-NEXT: ret2598;2599; NONEON-NOSVE-LABEL: fsqrt_v4f16:2600; NONEON-NOSVE: // %bb.0:2601; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2602; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162603; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2604; NONEON-NOSVE-NEXT: fcvt s0, h02605; NONEON-NOSVE-NEXT: fsqrt s0, s02606; NONEON-NOSVE-NEXT: fcvt h0, s02607; NONEON-NOSVE-NEXT: str h0, [sp, #14]2608; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2609; NONEON-NOSVE-NEXT: fcvt s0, h02610; NONEON-NOSVE-NEXT: fsqrt s0, s02611; NONEON-NOSVE-NEXT: fcvt h0, s02612; NONEON-NOSVE-NEXT: str h0, [sp, #12]2613; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2614; NONEON-NOSVE-NEXT: fcvt s0, h02615; NONEON-NOSVE-NEXT: fsqrt s0, s02616; NONEON-NOSVE-NEXT: fcvt h0, s02617; NONEON-NOSVE-NEXT: str h0, [sp, #10]2618; NONEON-NOSVE-NEXT: ldr h0, [sp]2619; NONEON-NOSVE-NEXT: fcvt s0, h02620; NONEON-NOSVE-NEXT: fsqrt s0, s02621; NONEON-NOSVE-NEXT: fcvt h0, s02622; NONEON-NOSVE-NEXT: str h0, [sp, #8]2623; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2624; NONEON-NOSVE-NEXT: add sp, sp, #162625; NONEON-NOSVE-NEXT: ret2626 %res = call <4 x half> @llvm.sqrt.v4f16(<4 x half> %op)2627 ret <4 x half> %res2628}2629 2630define <8 x half> @fsqrt_v8f16(<8 x half> %op) {2631; CHECK-LABEL: fsqrt_v8f16:2632; CHECK: // %bb.0:2633; CHECK-NEXT: ptrue p0.h, vl82634; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02635; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h2636; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02637; CHECK-NEXT: ret2638;2639; NONEON-NOSVE-LABEL: fsqrt_v8f16:2640; NONEON-NOSVE: // %bb.0:2641; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2642; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322643; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]2644; NONEON-NOSVE-NEXT: fcvt s0, h02645; NONEON-NOSVE-NEXT: fsqrt s0, s02646; NONEON-NOSVE-NEXT: fcvt h0, s02647; NONEON-NOSVE-NEXT: str h0, [sp, #30]2648; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]2649; NONEON-NOSVE-NEXT: fcvt s0, h02650; NONEON-NOSVE-NEXT: fsqrt s0, s02651; NONEON-NOSVE-NEXT: fcvt h0, s02652; NONEON-NOSVE-NEXT: str h0, [sp, #28]2653; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]2654; NONEON-NOSVE-NEXT: fcvt s0, h02655; NONEON-NOSVE-NEXT: fsqrt s0, s02656; NONEON-NOSVE-NEXT: fcvt h0, s02657; NONEON-NOSVE-NEXT: str h0, [sp, #26]2658; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]2659; NONEON-NOSVE-NEXT: fcvt s0, h02660; NONEON-NOSVE-NEXT: fsqrt s0, s02661; NONEON-NOSVE-NEXT: fcvt h0, s02662; NONEON-NOSVE-NEXT: str h0, [sp, #24]2663; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2664; NONEON-NOSVE-NEXT: fcvt s0, h02665; NONEON-NOSVE-NEXT: fsqrt s0, s02666; NONEON-NOSVE-NEXT: fcvt h0, s02667; NONEON-NOSVE-NEXT: str h0, [sp, #22]2668; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2669; NONEON-NOSVE-NEXT: fcvt s0, h02670; NONEON-NOSVE-NEXT: fsqrt s0, s02671; NONEON-NOSVE-NEXT: fcvt h0, s02672; NONEON-NOSVE-NEXT: str h0, [sp, #20]2673; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2674; NONEON-NOSVE-NEXT: fcvt s0, h02675; NONEON-NOSVE-NEXT: fsqrt s0, s02676; NONEON-NOSVE-NEXT: fcvt h0, s02677; NONEON-NOSVE-NEXT: str h0, [sp, #18]2678; NONEON-NOSVE-NEXT: ldr h0, [sp]2679; NONEON-NOSVE-NEXT: fcvt s0, h02680; NONEON-NOSVE-NEXT: fsqrt s0, s02681; NONEON-NOSVE-NEXT: fcvt h0, s02682; NONEON-NOSVE-NEXT: str h0, [sp, #16]2683; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2684; NONEON-NOSVE-NEXT: add sp, sp, #322685; NONEON-NOSVE-NEXT: ret2686 %res = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %op)2687 ret <8 x half> %res2688}2689 2690define void @fsqrt_v16f16(ptr %a, ptr %b) {2691; CHECK-LABEL: fsqrt_v16f16:2692; CHECK: // %bb.0:2693; CHECK-NEXT: ldp q0, q1, [x0]2694; CHECK-NEXT: ptrue p0.h, vl82695; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h2696; CHECK-NEXT: fsqrt z1.h, p0/m, z1.h2697; CHECK-NEXT: stp q0, q1, [x0]2698; CHECK-NEXT: ret2699;2700; NONEON-NOSVE-LABEL: fsqrt_v16f16:2701; NONEON-NOSVE: // %bb.0:2702; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2703; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2704; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642705; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]2706; NONEON-NOSVE-NEXT: fcvt s0, h02707; NONEON-NOSVE-NEXT: fsqrt s0, s02708; NONEON-NOSVE-NEXT: fcvt h0, s02709; NONEON-NOSVE-NEXT: str h0, [sp, #62]2710; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]2711; NONEON-NOSVE-NEXT: fcvt s0, h02712; NONEON-NOSVE-NEXT: fsqrt s0, s02713; NONEON-NOSVE-NEXT: fcvt h0, s02714; NONEON-NOSVE-NEXT: str h0, [sp, #60]2715; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]2716; NONEON-NOSVE-NEXT: fcvt s0, h02717; NONEON-NOSVE-NEXT: fsqrt s0, s02718; NONEON-NOSVE-NEXT: fcvt h0, s02719; NONEON-NOSVE-NEXT: str h0, [sp, #58]2720; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]2721; NONEON-NOSVE-NEXT: fcvt s0, h02722; NONEON-NOSVE-NEXT: fsqrt s0, s02723; NONEON-NOSVE-NEXT: fcvt h0, s02724; NONEON-NOSVE-NEXT: str h0, [sp, #56]2725; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]2726; NONEON-NOSVE-NEXT: fcvt s0, h02727; NONEON-NOSVE-NEXT: fsqrt s0, s02728; NONEON-NOSVE-NEXT: fcvt h0, s02729; NONEON-NOSVE-NEXT: str h0, [sp, #54]2730; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]2731; NONEON-NOSVE-NEXT: fcvt s0, h02732; NONEON-NOSVE-NEXT: fsqrt s0, s02733; NONEON-NOSVE-NEXT: fcvt h0, s02734; NONEON-NOSVE-NEXT: str h0, [sp, #52]2735; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]2736; NONEON-NOSVE-NEXT: fcvt s0, h02737; NONEON-NOSVE-NEXT: fsqrt s0, s02738; NONEON-NOSVE-NEXT: fcvt h0, s02739; NONEON-NOSVE-NEXT: str h0, [sp, #50]2740; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]2741; NONEON-NOSVE-NEXT: fcvt s0, h02742; NONEON-NOSVE-NEXT: fsqrt s0, s02743; NONEON-NOSVE-NEXT: fcvt h0, s02744; NONEON-NOSVE-NEXT: str h0, [sp, #48]2745; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]2746; NONEON-NOSVE-NEXT: fcvt s0, h02747; NONEON-NOSVE-NEXT: fsqrt s0, s02748; NONEON-NOSVE-NEXT: fcvt h0, s02749; NONEON-NOSVE-NEXT: str h0, [sp, #46]2750; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]2751; NONEON-NOSVE-NEXT: fcvt s0, h02752; NONEON-NOSVE-NEXT: fsqrt s0, s02753; NONEON-NOSVE-NEXT: fcvt h0, s02754; NONEON-NOSVE-NEXT: str h0, [sp, #44]2755; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]2756; NONEON-NOSVE-NEXT: fcvt s0, h02757; NONEON-NOSVE-NEXT: fsqrt s0, s02758; NONEON-NOSVE-NEXT: fcvt h0, s02759; NONEON-NOSVE-NEXT: str h0, [sp, #42]2760; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]2761; NONEON-NOSVE-NEXT: fcvt s0, h02762; NONEON-NOSVE-NEXT: fsqrt s0, s02763; NONEON-NOSVE-NEXT: fcvt h0, s02764; NONEON-NOSVE-NEXT: str h0, [sp, #40]2765; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]2766; NONEON-NOSVE-NEXT: fcvt s0, h02767; NONEON-NOSVE-NEXT: fsqrt s0, s02768; NONEON-NOSVE-NEXT: fcvt h0, s02769; NONEON-NOSVE-NEXT: str h0, [sp, #38]2770; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]2771; NONEON-NOSVE-NEXT: fcvt s0, h02772; NONEON-NOSVE-NEXT: fsqrt s0, s02773; NONEON-NOSVE-NEXT: fcvt h0, s02774; NONEON-NOSVE-NEXT: str h0, [sp, #36]2775; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]2776; NONEON-NOSVE-NEXT: fcvt s0, h02777; NONEON-NOSVE-NEXT: fsqrt s0, s02778; NONEON-NOSVE-NEXT: fcvt h0, s02779; NONEON-NOSVE-NEXT: str h0, [sp, #34]2780; NONEON-NOSVE-NEXT: ldr h0, [sp]2781; NONEON-NOSVE-NEXT: fcvt s0, h02782; NONEON-NOSVE-NEXT: fsqrt s0, s02783; NONEON-NOSVE-NEXT: fcvt h0, s02784; NONEON-NOSVE-NEXT: str h0, [sp, #32]2785; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2786; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2787; NONEON-NOSVE-NEXT: add sp, sp, #642788; NONEON-NOSVE-NEXT: ret2789 %op = load <16 x half>, ptr %a2790 %res = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %op)2791 store <16 x half> %res, ptr %a2792 ret void2793}2794 2795define <2 x float> @fsqrt_v2f32(<2 x float> %op) {2796; CHECK-LABEL: fsqrt_v2f32:2797; CHECK: // %bb.0:2798; CHECK-NEXT: ptrue p0.s, vl22799; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02800; CHECK-NEXT: fsqrt z0.s, p0/m, z0.s2801; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02802; CHECK-NEXT: ret2803;2804; NONEON-NOSVE-LABEL: fsqrt_v2f32:2805; NONEON-NOSVE: // %bb.0:2806; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2807; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162808; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2809; NONEON-NOSVE-NEXT: fsqrt s1, s02810; NONEON-NOSVE-NEXT: ldr s0, [sp]2811; NONEON-NOSVE-NEXT: fsqrt s0, s02812; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8]2813; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2814; NONEON-NOSVE-NEXT: add sp, sp, #162815; NONEON-NOSVE-NEXT: ret2816 %res = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %op)2817 ret <2 x float> %res2818}2819 2820define <4 x float> @fsqrt_v4f32(<4 x float> %op) {2821; CHECK-LABEL: fsqrt_v4f32:2822; CHECK: // %bb.0:2823; CHECK-NEXT: ptrue p0.s, vl42824; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02825; CHECK-NEXT: fsqrt z0.s, p0/m, z0.s2826; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02827; CHECK-NEXT: ret2828;2829; NONEON-NOSVE-LABEL: fsqrt_v4f32:2830; NONEON-NOSVE: // %bb.0:2831; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2832; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322833; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]2834; NONEON-NOSVE-NEXT: fsqrt s1, s02835; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]2836; NONEON-NOSVE-NEXT: fsqrt s0, s02837; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]2838; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2839; NONEON-NOSVE-NEXT: fsqrt s1, s02840; NONEON-NOSVE-NEXT: ldr s0, [sp]2841; NONEON-NOSVE-NEXT: fsqrt s0, s02842; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]2843; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2844; NONEON-NOSVE-NEXT: add sp, sp, #322845; NONEON-NOSVE-NEXT: ret2846 %res = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %op)2847 ret <4 x float> %res2848}2849 2850define void @fsqrt_v8f32(ptr %a) {2851; CHECK-LABEL: fsqrt_v8f32:2852; CHECK: // %bb.0:2853; CHECK-NEXT: ldp q0, q1, [x0]2854; CHECK-NEXT: ptrue p0.s, vl42855; CHECK-NEXT: fsqrt z0.s, p0/m, z0.s2856; CHECK-NEXT: fsqrt z1.s, p0/m, z1.s2857; CHECK-NEXT: stp q0, q1, [x0]2858; CHECK-NEXT: ret2859;2860; NONEON-NOSVE-LABEL: fsqrt_v8f32:2861; NONEON-NOSVE: // %bb.0:2862; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2863; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2864; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642865; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]2866; NONEON-NOSVE-NEXT: fsqrt s1, s02867; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]2868; NONEON-NOSVE-NEXT: fsqrt s0, s02869; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]2870; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]2871; NONEON-NOSVE-NEXT: fsqrt s1, s02872; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]2873; NONEON-NOSVE-NEXT: fsqrt s0, s02874; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]2875; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]2876; NONEON-NOSVE-NEXT: fsqrt s1, s02877; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]2878; NONEON-NOSVE-NEXT: fsqrt s0, s02879; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]2880; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]2881; NONEON-NOSVE-NEXT: fsqrt s1, s02882; NONEON-NOSVE-NEXT: ldr s0, [sp]2883; NONEON-NOSVE-NEXT: fsqrt s0, s02884; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]2885; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2886; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2887; NONEON-NOSVE-NEXT: add sp, sp, #642888; NONEON-NOSVE-NEXT: ret2889 %op = load <8 x float>, ptr %a2890 %res = call <8 x float> @llvm.sqrt.v8f32(<8 x float> %op)2891 store <8 x float> %res, ptr %a2892 ret void2893}2894 2895define <2 x double> @fsqrt_v2f64(<2 x double> %op) {2896; CHECK-LABEL: fsqrt_v2f64:2897; CHECK: // %bb.0:2898; CHECK-NEXT: ptrue p0.d, vl22899; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02900; CHECK-NEXT: fsqrt z0.d, p0/m, z0.d2901; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02902; CHECK-NEXT: ret2903;2904; NONEON-NOSVE-LABEL: fsqrt_v2f64:2905; NONEON-NOSVE: // %bb.0:2906; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2907; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322908; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2909; NONEON-NOSVE-NEXT: fsqrt d1, d02910; NONEON-NOSVE-NEXT: ldr d0, [sp]2911; NONEON-NOSVE-NEXT: fsqrt d0, d02912; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]2913; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2914; NONEON-NOSVE-NEXT: add sp, sp, #322915; NONEON-NOSVE-NEXT: ret2916 %res = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %op)2917 ret <2 x double> %res2918}2919 2920define void @fsqrt_v4f64(ptr %a) {2921; CHECK-LABEL: fsqrt_v4f64:2922; CHECK: // %bb.0:2923; CHECK-NEXT: ldp q0, q1, [x0]2924; CHECK-NEXT: ptrue p0.d, vl22925; CHECK-NEXT: fsqrt z0.d, p0/m, z0.d2926; CHECK-NEXT: fsqrt z1.d, p0/m, z1.d2927; CHECK-NEXT: stp q0, q1, [x0]2928; CHECK-NEXT: ret2929;2930; NONEON-NOSVE-LABEL: fsqrt_v4f64:2931; NONEON-NOSVE: // %bb.0:2932; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2933; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2934; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642935; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2936; NONEON-NOSVE-NEXT: fsqrt d1, d02937; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]2938; NONEON-NOSVE-NEXT: fsqrt d0, d02939; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2940; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2941; NONEON-NOSVE-NEXT: fsqrt d1, d02942; NONEON-NOSVE-NEXT: ldr d0, [sp]2943; NONEON-NOSVE-NEXT: fsqrt d0, d02944; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2945; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2946; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2947; NONEON-NOSVE-NEXT: add sp, sp, #642948; NONEON-NOSVE-NEXT: ret2949 %op = load <4 x double>, ptr %a2950 %res = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %op)2951 store <4 x double> %res, ptr %a2952 ret void2953}2954 2955;2956; FSUB2957;2958 2959define <2 x half> @fsub_v2f16(<2 x half> %op1, <2 x half> %op2) {2960; CHECK-LABEL: fsub_v2f16:2961; CHECK: // %bb.0:2962; CHECK-NEXT: ptrue p0.h, vl42963; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02964; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12965; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h2966; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02967; CHECK-NEXT: ret2968;2969; NONEON-NOSVE-LABEL: fsub_v2f16:2970; NONEON-NOSVE: // %bb.0:2971; NONEON-NOSVE-NEXT: sub sp, sp, #322972; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322973; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2974; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]2975; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]2976; NONEON-NOSVE-NEXT: fcvt s0, h02977; NONEON-NOSVE-NEXT: fcvt s1, h12978; NONEON-NOSVE-NEXT: fsub s0, s1, s02979; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]2980; NONEON-NOSVE-NEXT: fcvt s1, h12981; NONEON-NOSVE-NEXT: fcvt h0, s02982; NONEON-NOSVE-NEXT: str h0, [sp, #30]2983; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]2984; NONEON-NOSVE-NEXT: fcvt s0, h02985; NONEON-NOSVE-NEXT: fsub s0, s1, s02986; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]2987; NONEON-NOSVE-NEXT: fcvt s1, h12988; NONEON-NOSVE-NEXT: fcvt h0, s02989; NONEON-NOSVE-NEXT: str h0, [sp, #28]2990; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]2991; NONEON-NOSVE-NEXT: fcvt s0, h02992; NONEON-NOSVE-NEXT: fsub s0, s1, s02993; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]2994; NONEON-NOSVE-NEXT: fcvt s1, h12995; NONEON-NOSVE-NEXT: fcvt h0, s02996; NONEON-NOSVE-NEXT: str h0, [sp, #26]2997; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]2998; NONEON-NOSVE-NEXT: fcvt s0, h02999; NONEON-NOSVE-NEXT: fsub s0, s1, s03000; NONEON-NOSVE-NEXT: fcvt h0, s03001; NONEON-NOSVE-NEXT: str h0, [sp, #24]3002; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3003; NONEON-NOSVE-NEXT: add sp, sp, #323004; NONEON-NOSVE-NEXT: ret3005 %res = fsub <2 x half> %op1, %op23006 ret <2 x half> %res3007}3008 3009define <4 x half> @fsub_v4f16(<4 x half> %op1, <4 x half> %op2) {3010; CHECK-LABEL: fsub_v4f16:3011; CHECK: // %bb.0:3012; CHECK-NEXT: ptrue p0.h, vl43013; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03014; CHECK-NEXT: // kill: def $d1 killed $d1 def $z13015; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h3016; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03017; CHECK-NEXT: ret3018;3019; NONEON-NOSVE-LABEL: fsub_v4f16:3020; NONEON-NOSVE: // %bb.0:3021; NONEON-NOSVE-NEXT: sub sp, sp, #323022; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 323023; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]3024; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]3025; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]3026; NONEON-NOSVE-NEXT: fcvt s0, h03027; NONEON-NOSVE-NEXT: fcvt s1, h13028; NONEON-NOSVE-NEXT: fsub s0, s1, s03029; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]3030; NONEON-NOSVE-NEXT: fcvt s1, h13031; NONEON-NOSVE-NEXT: fcvt h0, s03032; NONEON-NOSVE-NEXT: str h0, [sp, #30]3033; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]3034; NONEON-NOSVE-NEXT: fcvt s0, h03035; NONEON-NOSVE-NEXT: fsub s0, s1, s03036; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]3037; NONEON-NOSVE-NEXT: fcvt s1, h13038; NONEON-NOSVE-NEXT: fcvt h0, s03039; NONEON-NOSVE-NEXT: str h0, [sp, #28]3040; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]3041; NONEON-NOSVE-NEXT: fcvt s0, h03042; NONEON-NOSVE-NEXT: fsub s0, s1, s03043; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]3044; NONEON-NOSVE-NEXT: fcvt s1, h13045; NONEON-NOSVE-NEXT: fcvt h0, s03046; NONEON-NOSVE-NEXT: str h0, [sp, #26]3047; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]3048; NONEON-NOSVE-NEXT: fcvt s0, h03049; NONEON-NOSVE-NEXT: fsub s0, s1, s03050; NONEON-NOSVE-NEXT: fcvt h0, s03051; NONEON-NOSVE-NEXT: str h0, [sp, #24]3052; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3053; NONEON-NOSVE-NEXT: add sp, sp, #323054; NONEON-NOSVE-NEXT: ret3055 %res = fsub <4 x half> %op1, %op23056 ret <4 x half> %res3057}3058 3059define <8 x half> @fsub_v8f16(<8 x half> %op1, <8 x half> %op2) {3060; CHECK-LABEL: fsub_v8f16:3061; CHECK: // %bb.0:3062; CHECK-NEXT: ptrue p0.h, vl83063; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03064; CHECK-NEXT: // kill: def $q1 killed $q1 def $z13065; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h3066; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03067; CHECK-NEXT: ret3068;3069; NONEON-NOSVE-LABEL: fsub_v8f16:3070; NONEON-NOSVE: // %bb.0:3071; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!3072; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 483073; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]3074; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]3075; NONEON-NOSVE-NEXT: fcvt s0, h03076; NONEON-NOSVE-NEXT: fcvt s1, h13077; NONEON-NOSVE-NEXT: fsub s0, s1, s03078; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]3079; NONEON-NOSVE-NEXT: fcvt s1, h13080; NONEON-NOSVE-NEXT: fcvt h0, s03081; NONEON-NOSVE-NEXT: str h0, [sp, #46]3082; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]3083; NONEON-NOSVE-NEXT: fcvt s0, h03084; NONEON-NOSVE-NEXT: fsub s0, s1, s03085; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]3086; NONEON-NOSVE-NEXT: fcvt s1, h13087; NONEON-NOSVE-NEXT: fcvt h0, s03088; NONEON-NOSVE-NEXT: str h0, [sp, #44]3089; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]3090; NONEON-NOSVE-NEXT: fcvt s0, h03091; NONEON-NOSVE-NEXT: fsub s0, s1, s03092; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]3093; NONEON-NOSVE-NEXT: fcvt s1, h13094; NONEON-NOSVE-NEXT: fcvt h0, s03095; NONEON-NOSVE-NEXT: str h0, [sp, #42]3096; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]3097; NONEON-NOSVE-NEXT: fcvt s0, h03098; NONEON-NOSVE-NEXT: fsub s0, s1, s03099; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]3100; NONEON-NOSVE-NEXT: fcvt s1, h13101; NONEON-NOSVE-NEXT: fcvt h0, s03102; NONEON-NOSVE-NEXT: str h0, [sp, #40]3103; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]3104; NONEON-NOSVE-NEXT: fcvt s0, h03105; NONEON-NOSVE-NEXT: fsub s0, s1, s03106; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]3107; NONEON-NOSVE-NEXT: fcvt s1, h13108; NONEON-NOSVE-NEXT: fcvt h0, s03109; NONEON-NOSVE-NEXT: str h0, [sp, #38]3110; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]3111; NONEON-NOSVE-NEXT: fcvt s0, h03112; NONEON-NOSVE-NEXT: fsub s0, s1, s03113; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]3114; NONEON-NOSVE-NEXT: fcvt s1, h13115; NONEON-NOSVE-NEXT: fcvt h0, s03116; NONEON-NOSVE-NEXT: str h0, [sp, #36]3117; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]3118; NONEON-NOSVE-NEXT: fcvt s0, h03119; NONEON-NOSVE-NEXT: fsub s0, s1, s03120; NONEON-NOSVE-NEXT: ldr h1, [sp]3121; NONEON-NOSVE-NEXT: fcvt s1, h13122; NONEON-NOSVE-NEXT: fcvt h0, s03123; NONEON-NOSVE-NEXT: str h0, [sp, #34]3124; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]3125; NONEON-NOSVE-NEXT: fcvt s0, h03126; NONEON-NOSVE-NEXT: fsub s0, s1, s03127; NONEON-NOSVE-NEXT: fcvt h0, s03128; NONEON-NOSVE-NEXT: str h0, [sp, #32]3129; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]3130; NONEON-NOSVE-NEXT: add sp, sp, #483131; NONEON-NOSVE-NEXT: ret3132 %res = fsub <8 x half> %op1, %op23133 ret <8 x half> %res3134}3135 3136define void @fsub_v16f16(ptr %a, ptr %b) {3137; CHECK-LABEL: fsub_v16f16:3138; CHECK: // %bb.0:3139; CHECK-NEXT: ldp q0, q3, [x1]3140; CHECK-NEXT: ptrue p0.h, vl83141; CHECK-NEXT: ldp q1, q2, [x0]3142; CHECK-NEXT: fsubr z0.h, p0/m, z0.h, z1.h3143; CHECK-NEXT: fsub z2.h, p0/m, z2.h, z3.h3144; CHECK-NEXT: stp q0, q2, [x0]3145; CHECK-NEXT: ret3146;3147; NONEON-NOSVE-LABEL: fsub_v16f16:3148; NONEON-NOSVE: // %bb.0:3149; NONEON-NOSVE-NEXT: sub sp, sp, #963150; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 963151; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]3152; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]3153; NONEON-NOSVE-NEXT: stp q2, q3, [sp]3154; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]3155; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]3156; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]3157; NONEON-NOSVE-NEXT: fcvt s0, h03158; NONEON-NOSVE-NEXT: fcvt s1, h13159; NONEON-NOSVE-NEXT: fsub s0, s1, s03160; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]3161; NONEON-NOSVE-NEXT: fcvt s1, h13162; NONEON-NOSVE-NEXT: fcvt h0, s03163; NONEON-NOSVE-NEXT: str h0, [sp, #94]3164; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]3165; NONEON-NOSVE-NEXT: fcvt s0, h03166; NONEON-NOSVE-NEXT: fsub s0, s1, s03167; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]3168; NONEON-NOSVE-NEXT: fcvt s1, h13169; NONEON-NOSVE-NEXT: fcvt h0, s03170; NONEON-NOSVE-NEXT: str h0, [sp, #92]3171; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]3172; NONEON-NOSVE-NEXT: fcvt s0, h03173; NONEON-NOSVE-NEXT: fsub s0, s1, s03174; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]3175; NONEON-NOSVE-NEXT: fcvt s1, h13176; NONEON-NOSVE-NEXT: fcvt h0, s03177; NONEON-NOSVE-NEXT: str h0, [sp, #90]3178; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]3179; NONEON-NOSVE-NEXT: fcvt s0, h03180; NONEON-NOSVE-NEXT: fsub s0, s1, s03181; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]3182; NONEON-NOSVE-NEXT: fcvt s1, h13183; NONEON-NOSVE-NEXT: fcvt h0, s03184; NONEON-NOSVE-NEXT: str h0, [sp, #88]3185; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]3186; NONEON-NOSVE-NEXT: fcvt s0, h03187; NONEON-NOSVE-NEXT: fsub s0, s1, s03188; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]3189; NONEON-NOSVE-NEXT: fcvt s1, h13190; NONEON-NOSVE-NEXT: fcvt h0, s03191; NONEON-NOSVE-NEXT: str h0, [sp, #86]3192; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]3193; NONEON-NOSVE-NEXT: fcvt s0, h03194; NONEON-NOSVE-NEXT: fsub s0, s1, s03195; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]3196; NONEON-NOSVE-NEXT: fcvt s1, h13197; NONEON-NOSVE-NEXT: fcvt h0, s03198; NONEON-NOSVE-NEXT: str h0, [sp, #84]3199; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]3200; NONEON-NOSVE-NEXT: fcvt s0, h03201; NONEON-NOSVE-NEXT: fsub s0, s1, s03202; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]3203; NONEON-NOSVE-NEXT: fcvt s1, h13204; NONEON-NOSVE-NEXT: fcvt h0, s03205; NONEON-NOSVE-NEXT: str h0, [sp, #82]3206; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]3207; NONEON-NOSVE-NEXT: fcvt s0, h03208; NONEON-NOSVE-NEXT: fsub s0, s1, s03209; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]3210; NONEON-NOSVE-NEXT: fcvt s1, h13211; NONEON-NOSVE-NEXT: fcvt h0, s03212; NONEON-NOSVE-NEXT: str h0, [sp, #80]3213; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]3214; NONEON-NOSVE-NEXT: fcvt s0, h03215; NONEON-NOSVE-NEXT: fsub s0, s1, s03216; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]3217; NONEON-NOSVE-NEXT: fcvt s1, h13218; NONEON-NOSVE-NEXT: fcvt h0, s03219; NONEON-NOSVE-NEXT: str h0, [sp, #78]3220; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]3221; NONEON-NOSVE-NEXT: fcvt s0, h03222; NONEON-NOSVE-NEXT: fsub s0, s1, s03223; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]3224; NONEON-NOSVE-NEXT: fcvt s1, h13225; NONEON-NOSVE-NEXT: fcvt h0, s03226; NONEON-NOSVE-NEXT: str h0, [sp, #76]3227; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]3228; NONEON-NOSVE-NEXT: fcvt s0, h03229; NONEON-NOSVE-NEXT: fsub s0, s1, s03230; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]3231; NONEON-NOSVE-NEXT: fcvt s1, h13232; NONEON-NOSVE-NEXT: fcvt h0, s03233; NONEON-NOSVE-NEXT: str h0, [sp, #74]3234; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]3235; NONEON-NOSVE-NEXT: fcvt s0, h03236; NONEON-NOSVE-NEXT: fsub s0, s1, s03237; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]3238; NONEON-NOSVE-NEXT: fcvt s1, h13239; NONEON-NOSVE-NEXT: fcvt h0, s03240; NONEON-NOSVE-NEXT: str h0, [sp, #72]3241; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]3242; NONEON-NOSVE-NEXT: fcvt s0, h03243; NONEON-NOSVE-NEXT: fsub s0, s1, s03244; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]3245; NONEON-NOSVE-NEXT: fcvt s1, h13246; NONEON-NOSVE-NEXT: fcvt h0, s03247; NONEON-NOSVE-NEXT: str h0, [sp, #70]3248; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]3249; NONEON-NOSVE-NEXT: fcvt s0, h03250; NONEON-NOSVE-NEXT: fsub s0, s1, s03251; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]3252; NONEON-NOSVE-NEXT: fcvt s1, h13253; NONEON-NOSVE-NEXT: fcvt h0, s03254; NONEON-NOSVE-NEXT: str h0, [sp, #68]3255; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]3256; NONEON-NOSVE-NEXT: fcvt s0, h03257; NONEON-NOSVE-NEXT: fsub s0, s1, s03258; NONEON-NOSVE-NEXT: ldr h1, [sp]3259; NONEON-NOSVE-NEXT: fcvt s1, h13260; NONEON-NOSVE-NEXT: fcvt h0, s03261; NONEON-NOSVE-NEXT: str h0, [sp, #66]3262; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]3263; NONEON-NOSVE-NEXT: fcvt s0, h03264; NONEON-NOSVE-NEXT: fsub s0, s1, s03265; NONEON-NOSVE-NEXT: fcvt h0, s03266; NONEON-NOSVE-NEXT: str h0, [sp, #64]3267; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]3268; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3269; NONEON-NOSVE-NEXT: add sp, sp, #963270; NONEON-NOSVE-NEXT: ret3271 %op1 = load <16 x half>, ptr %a3272 %op2 = load <16 x half>, ptr %b3273 %res = fsub <16 x half> %op1, %op23274 store <16 x half> %res, ptr %a3275 ret void3276}3277 3278define <2 x float> @fsub_v2f32(<2 x float> %op1, <2 x float> %op2) {3279; CHECK-LABEL: fsub_v2f32:3280; CHECK: // %bb.0:3281; CHECK-NEXT: ptrue p0.s, vl23282; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03283; CHECK-NEXT: // kill: def $d1 killed $d1 def $z13284; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s3285; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03286; CHECK-NEXT: ret3287;3288; NONEON-NOSVE-LABEL: fsub_v2f32:3289; NONEON-NOSVE: // %bb.0:3290; NONEON-NOSVE-NEXT: sub sp, sp, #323291; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 323292; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]3293; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]3294; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]3295; NONEON-NOSVE-NEXT: fsub s3, s2, s03296; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]3297; NONEON-NOSVE-NEXT: fsub s0, s1, s03298; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]3299; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3300; NONEON-NOSVE-NEXT: add sp, sp, #323301; NONEON-NOSVE-NEXT: ret3302 %res = fsub <2 x float> %op1, %op23303 ret <2 x float> %res3304}3305 3306define <4 x float> @fsub_v4f32(<4 x float> %op1, <4 x float> %op2) {3307; CHECK-LABEL: fsub_v4f32:3308; CHECK: // %bb.0:3309; CHECK-NEXT: ptrue p0.s, vl43310; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03311; CHECK-NEXT: // kill: def $q1 killed $q1 def $z13312; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s3313; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03314; CHECK-NEXT: ret3315;3316; NONEON-NOSVE-LABEL: fsub_v4f32:3317; NONEON-NOSVE: // %bb.0:3318; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!3319; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 483320; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]3321; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]3322; NONEON-NOSVE-NEXT: fsub s3, s2, s03323; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]3324; NONEON-NOSVE-NEXT: fsub s0, s1, s03325; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]3326; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]3327; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]3328; NONEON-NOSVE-NEXT: fsub s3, s2, s03329; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]3330; NONEON-NOSVE-NEXT: fsub s0, s1, s03331; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]3332; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]3333; NONEON-NOSVE-NEXT: add sp, sp, #483334; NONEON-NOSVE-NEXT: ret3335 %res = fsub <4 x float> %op1, %op23336 ret <4 x float> %res3337}3338 3339define void @fsub_v8f32(ptr %a, ptr %b) {3340; CHECK-LABEL: fsub_v8f32:3341; CHECK: // %bb.0:3342; CHECK-NEXT: ldp q0, q3, [x1]3343; CHECK-NEXT: ptrue p0.s, vl43344; CHECK-NEXT: ldp q1, q2, [x0]3345; CHECK-NEXT: fsubr z0.s, p0/m, z0.s, z1.s3346; CHECK-NEXT: fsub z2.s, p0/m, z2.s, z3.s3347; CHECK-NEXT: stp q0, q2, [x0]3348; CHECK-NEXT: ret3349;3350; NONEON-NOSVE-LABEL: fsub_v8f32:3351; NONEON-NOSVE: // %bb.0:3352; NONEON-NOSVE-NEXT: sub sp, sp, #963353; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 963354; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]3355; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]3356; NONEON-NOSVE-NEXT: stp q2, q3, [sp]3357; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]3358; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]3359; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]3360; NONEON-NOSVE-NEXT: fsub s3, s2, s03361; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]3362; NONEON-NOSVE-NEXT: fsub s0, s1, s03363; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]3364; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]3365; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]3366; NONEON-NOSVE-NEXT: fsub s3, s2, s03367; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]3368; NONEON-NOSVE-NEXT: fsub s0, s1, s03369; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]3370; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]3371; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]3372; NONEON-NOSVE-NEXT: fsub s3, s2, s03373; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]3374; NONEON-NOSVE-NEXT: fsub s0, s1, s03375; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]3376; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]3377; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]3378; NONEON-NOSVE-NEXT: fsub s3, s2, s03379; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]3380; NONEON-NOSVE-NEXT: fsub s0, s1, s03381; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]3382; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]3383; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3384; NONEON-NOSVE-NEXT: add sp, sp, #963385; NONEON-NOSVE-NEXT: ret3386 %op1 = load <8 x float>, ptr %a3387 %op2 = load <8 x float>, ptr %b3388 %res = fsub <8 x float> %op1, %op23389 store <8 x float> %res, ptr %a3390 ret void3391}3392 3393define <2 x double> @fsub_v2f64(<2 x double> %op1, <2 x double> %op2) {3394; CHECK-LABEL: fsub_v2f64:3395; CHECK: // %bb.0:3396; CHECK-NEXT: ptrue p0.d, vl23397; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03398; CHECK-NEXT: // kill: def $q1 killed $q1 def $z13399; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d3400; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03401; CHECK-NEXT: ret3402;3403; NONEON-NOSVE-LABEL: fsub_v2f64:3404; NONEON-NOSVE: // %bb.0:3405; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!3406; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 483407; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]3408; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3409; NONEON-NOSVE-NEXT: fsub d3, d2, d03410; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]3411; NONEON-NOSVE-NEXT: fsub d0, d1, d03412; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]3413; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]3414; NONEON-NOSVE-NEXT: add sp, sp, #483415; NONEON-NOSVE-NEXT: ret3416 %res = fsub <2 x double> %op1, %op23417 ret <2 x double> %res3418}3419 3420define void @fsub_v4f64(ptr %a, ptr %b) {3421; CHECK-LABEL: fsub_v4f64:3422; CHECK: // %bb.0:3423; CHECK-NEXT: ldp q0, q3, [x1]3424; CHECK-NEXT: ptrue p0.d, vl23425; CHECK-NEXT: ldp q1, q2, [x0]3426; CHECK-NEXT: fsubr z0.d, p0/m, z0.d, z1.d3427; CHECK-NEXT: fsub z2.d, p0/m, z2.d, z3.d3428; CHECK-NEXT: stp q0, q2, [x0]3429; CHECK-NEXT: ret3430;3431; NONEON-NOSVE-LABEL: fsub_v4f64:3432; NONEON-NOSVE: // %bb.0:3433; NONEON-NOSVE-NEXT: sub sp, sp, #963434; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 963435; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]3436; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]3437; NONEON-NOSVE-NEXT: stp q2, q3, [sp]3438; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]3439; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]3440; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]3441; NONEON-NOSVE-NEXT: fsub d3, d2, d03442; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]3443; NONEON-NOSVE-NEXT: fsub d0, d1, d03444; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]3445; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]3446; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3447; NONEON-NOSVE-NEXT: fsub d3, d2, d03448; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]3449; NONEON-NOSVE-NEXT: fsub d0, d1, d03450; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]3451; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]3452; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3453; NONEON-NOSVE-NEXT: add sp, sp, #963454; NONEON-NOSVE-NEXT: ret3455 %op1 = load <4 x double>, ptr %a3456 %op2 = load <4 x double>, ptr %b3457 %res = fsub <4 x double> %op1, %op23458 store <4 x double> %res, ptr %a3459 ret void3460}3461 3462;3463; FABS3464;3465 3466define <2 x half> @fabs_v2f16(<2 x half> %op) {3467; CHECK-LABEL: fabs_v2f16:3468; CHECK: // %bb.0:3469; CHECK-NEXT: ptrue p0.h, vl43470; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03471; CHECK-NEXT: fabs z0.h, p0/m, z0.h3472; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03473; CHECK-NEXT: ret3474;3475; NONEON-NOSVE-LABEL: fabs_v2f16:3476; NONEON-NOSVE: // %bb.0:3477; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!3478; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 163479; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]3480; NONEON-NOSVE-NEXT: fmov w8, s03481; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3482; NONEON-NOSVE-NEXT: fmov s0, w83483; NONEON-NOSVE-NEXT: str h0, [sp, #14]3484; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]3485; NONEON-NOSVE-NEXT: fmov w8, s03486; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3487; NONEON-NOSVE-NEXT: fmov s0, w83488; NONEON-NOSVE-NEXT: str h0, [sp, #12]3489; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]3490; NONEON-NOSVE-NEXT: fmov w8, s03491; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3492; NONEON-NOSVE-NEXT: fmov s0, w83493; NONEON-NOSVE-NEXT: str h0, [sp, #10]3494; NONEON-NOSVE-NEXT: ldr h0, [sp]3495; NONEON-NOSVE-NEXT: fmov w8, s03496; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3497; NONEON-NOSVE-NEXT: fmov s0, w83498; NONEON-NOSVE-NEXT: str h0, [sp, #8]3499; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3500; NONEON-NOSVE-NEXT: add sp, sp, #163501; NONEON-NOSVE-NEXT: ret3502 %res = call <2 x half> @llvm.fabs.v2f16(<2 x half> %op)3503 ret <2 x half> %res3504}3505 3506define <4 x half> @fabs_v4f16(<4 x half> %op) {3507; CHECK-LABEL: fabs_v4f16:3508; CHECK: // %bb.0:3509; CHECK-NEXT: ptrue p0.h, vl43510; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03511; CHECK-NEXT: fabs z0.h, p0/m, z0.h3512; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03513; CHECK-NEXT: ret3514;3515; NONEON-NOSVE-LABEL: fabs_v4f16:3516; NONEON-NOSVE: // %bb.0:3517; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!3518; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 163519; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]3520; NONEON-NOSVE-NEXT: fmov w8, s03521; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3522; NONEON-NOSVE-NEXT: fmov s0, w83523; NONEON-NOSVE-NEXT: str h0, [sp, #14]3524; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]3525; NONEON-NOSVE-NEXT: fmov w8, s03526; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3527; NONEON-NOSVE-NEXT: fmov s0, w83528; NONEON-NOSVE-NEXT: str h0, [sp, #12]3529; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]3530; NONEON-NOSVE-NEXT: fmov w8, s03531; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3532; NONEON-NOSVE-NEXT: fmov s0, w83533; NONEON-NOSVE-NEXT: str h0, [sp, #10]3534; NONEON-NOSVE-NEXT: ldr h0, [sp]3535; NONEON-NOSVE-NEXT: fmov w8, s03536; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3537; NONEON-NOSVE-NEXT: fmov s0, w83538; NONEON-NOSVE-NEXT: str h0, [sp, #8]3539; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3540; NONEON-NOSVE-NEXT: add sp, sp, #163541; NONEON-NOSVE-NEXT: ret3542 %res = call <4 x half> @llvm.fabs.v4f16(<4 x half> %op)3543 ret <4 x half> %res3544}3545 3546define <8 x half> @fabs_v8f16(<8 x half> %op) {3547; CHECK-LABEL: fabs_v8f16:3548; CHECK: // %bb.0:3549; CHECK-NEXT: ptrue p0.h, vl83550; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03551; CHECK-NEXT: fabs z0.h, p0/m, z0.h3552; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03553; CHECK-NEXT: ret3554;3555; NONEON-NOSVE-LABEL: fabs_v8f16:3556; NONEON-NOSVE: // %bb.0:3557; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!3558; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 323559; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]3560; NONEON-NOSVE-NEXT: fmov w8, s03561; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3562; NONEON-NOSVE-NEXT: fmov s0, w83563; NONEON-NOSVE-NEXT: str h0, [sp, #30]3564; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]3565; NONEON-NOSVE-NEXT: fmov w8, s03566; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3567; NONEON-NOSVE-NEXT: fmov s0, w83568; NONEON-NOSVE-NEXT: str h0, [sp, #28]3569; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]3570; NONEON-NOSVE-NEXT: fmov w8, s03571; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3572; NONEON-NOSVE-NEXT: fmov s0, w83573; NONEON-NOSVE-NEXT: str h0, [sp, #26]3574; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]3575; NONEON-NOSVE-NEXT: fmov w8, s03576; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3577; NONEON-NOSVE-NEXT: fmov s0, w83578; NONEON-NOSVE-NEXT: str h0, [sp, #24]3579; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]3580; NONEON-NOSVE-NEXT: fmov w8, s03581; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3582; NONEON-NOSVE-NEXT: fmov s0, w83583; NONEON-NOSVE-NEXT: str h0, [sp, #22]3584; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]3585; NONEON-NOSVE-NEXT: fmov w8, s03586; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3587; NONEON-NOSVE-NEXT: fmov s0, w83588; NONEON-NOSVE-NEXT: str h0, [sp, #20]3589; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]3590; NONEON-NOSVE-NEXT: fmov w8, s03591; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3592; NONEON-NOSVE-NEXT: fmov s0, w83593; NONEON-NOSVE-NEXT: str h0, [sp, #18]3594; NONEON-NOSVE-NEXT: ldr h0, [sp]3595; NONEON-NOSVE-NEXT: fmov w8, s03596; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3597; NONEON-NOSVE-NEXT: fmov s0, w83598; NONEON-NOSVE-NEXT: str h0, [sp, #16]3599; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]3600; NONEON-NOSVE-NEXT: add sp, sp, #323601; NONEON-NOSVE-NEXT: ret3602 %res = call <8 x half> @llvm.fabs.v8f16(<8 x half> %op)3603 ret <8 x half> %res3604}3605 3606define void @fabs_v16f16(ptr %a) {3607; CHECK-LABEL: fabs_v16f16:3608; CHECK: // %bb.0:3609; CHECK-NEXT: ldp q0, q1, [x0]3610; CHECK-NEXT: ptrue p0.h, vl83611; CHECK-NEXT: fabs z0.h, p0/m, z0.h3612; CHECK-NEXT: fabs z1.h, p0/m, z1.h3613; CHECK-NEXT: stp q0, q1, [x0]3614; CHECK-NEXT: ret3615;3616; NONEON-NOSVE-LABEL: fabs_v16f16:3617; NONEON-NOSVE: // %bb.0:3618; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]3619; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!3620; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 643621; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]3622; NONEON-NOSVE-NEXT: fmov w8, s03623; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3624; NONEON-NOSVE-NEXT: fmov s0, w83625; NONEON-NOSVE-NEXT: str h0, [sp, #62]3626; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]3627; NONEON-NOSVE-NEXT: fmov w8, s03628; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3629; NONEON-NOSVE-NEXT: fmov s0, w83630; NONEON-NOSVE-NEXT: str h0, [sp, #60]3631; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]3632; NONEON-NOSVE-NEXT: fmov w8, s03633; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3634; NONEON-NOSVE-NEXT: fmov s0, w83635; NONEON-NOSVE-NEXT: str h0, [sp, #58]3636; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]3637; NONEON-NOSVE-NEXT: fmov w8, s03638; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3639; NONEON-NOSVE-NEXT: fmov s0, w83640; NONEON-NOSVE-NEXT: str h0, [sp, #56]3641; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]3642; NONEON-NOSVE-NEXT: fmov w8, s03643; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3644; NONEON-NOSVE-NEXT: fmov s0, w83645; NONEON-NOSVE-NEXT: str h0, [sp, #54]3646; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]3647; NONEON-NOSVE-NEXT: fmov w8, s03648; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3649; NONEON-NOSVE-NEXT: fmov s0, w83650; NONEON-NOSVE-NEXT: str h0, [sp, #52]3651; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]3652; NONEON-NOSVE-NEXT: fmov w8, s03653; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3654; NONEON-NOSVE-NEXT: fmov s0, w83655; NONEON-NOSVE-NEXT: str h0, [sp, #50]3656; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]3657; NONEON-NOSVE-NEXT: fmov w8, s03658; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3659; NONEON-NOSVE-NEXT: fmov s0, w83660; NONEON-NOSVE-NEXT: str h0, [sp, #48]3661; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]3662; NONEON-NOSVE-NEXT: fmov w8, s03663; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3664; NONEON-NOSVE-NEXT: fmov s0, w83665; NONEON-NOSVE-NEXT: str h0, [sp, #46]3666; NONEON-NOSVE-NEXT: ldr h0, [sp, #12]3667; NONEON-NOSVE-NEXT: fmov w8, s03668; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3669; NONEON-NOSVE-NEXT: fmov s0, w83670; NONEON-NOSVE-NEXT: str h0, [sp, #44]3671; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]3672; NONEON-NOSVE-NEXT: fmov w8, s03673; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3674; NONEON-NOSVE-NEXT: fmov s0, w83675; NONEON-NOSVE-NEXT: str h0, [sp, #42]3676; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]3677; NONEON-NOSVE-NEXT: fmov w8, s03678; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3679; NONEON-NOSVE-NEXT: fmov s0, w83680; NONEON-NOSVE-NEXT: str h0, [sp, #40]3681; NONEON-NOSVE-NEXT: ldr h0, [sp, #6]3682; NONEON-NOSVE-NEXT: fmov w8, s03683; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3684; NONEON-NOSVE-NEXT: fmov s0, w83685; NONEON-NOSVE-NEXT: str h0, [sp, #38]3686; NONEON-NOSVE-NEXT: ldr h0, [sp, #4]3687; NONEON-NOSVE-NEXT: fmov w8, s03688; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3689; NONEON-NOSVE-NEXT: fmov s0, w83690; NONEON-NOSVE-NEXT: str h0, [sp, #36]3691; NONEON-NOSVE-NEXT: ldr h0, [sp, #2]3692; NONEON-NOSVE-NEXT: fmov w8, s03693; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3694; NONEON-NOSVE-NEXT: fmov s0, w83695; NONEON-NOSVE-NEXT: str h0, [sp, #34]3696; NONEON-NOSVE-NEXT: ldr h0, [sp]3697; NONEON-NOSVE-NEXT: fmov w8, s03698; NONEON-NOSVE-NEXT: and w8, w8, #0x7fff3699; NONEON-NOSVE-NEXT: fmov s0, w83700; NONEON-NOSVE-NEXT: str h0, [sp, #32]3701; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]3702; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3703; NONEON-NOSVE-NEXT: add sp, sp, #643704; NONEON-NOSVE-NEXT: ret3705 %op = load <16 x half>, ptr %a3706 %res = call <16 x half> @llvm.fabs.v16f16(<16 x half> %op)3707 store <16 x half> %res, ptr %a3708 ret void3709}3710 3711define <2 x float> @fabs_v2f32(<2 x float> %op) {3712; CHECK-LABEL: fabs_v2f32:3713; CHECK: // %bb.0:3714; CHECK-NEXT: ptrue p0.s, vl23715; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03716; CHECK-NEXT: fabs z0.s, p0/m, z0.s3717; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03718; CHECK-NEXT: ret3719;3720; NONEON-NOSVE-LABEL: fabs_v2f32:3721; NONEON-NOSVE: // %bb.0:3722; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!3723; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 163724; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]3725; NONEON-NOSVE-NEXT: fabs s1, s03726; NONEON-NOSVE-NEXT: ldr s0, [sp]3727; NONEON-NOSVE-NEXT: fabs s0, s03728; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8]3729; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3730; NONEON-NOSVE-NEXT: add sp, sp, #163731; NONEON-NOSVE-NEXT: ret3732 %res = call <2 x float> @llvm.fabs.v2f32(<2 x float> %op)3733 ret <2 x float> %res3734}3735 3736define <4 x float> @fabs_v4f32(<4 x float> %op) {3737; CHECK-LABEL: fabs_v4f32:3738; CHECK: // %bb.0:3739; CHECK-NEXT: ptrue p0.s, vl43740; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03741; CHECK-NEXT: fabs z0.s, p0/m, z0.s3742; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03743; CHECK-NEXT: ret3744;3745; NONEON-NOSVE-LABEL: fabs_v4f32:3746; NONEON-NOSVE: // %bb.0:3747; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!3748; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 323749; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]3750; NONEON-NOSVE-NEXT: fabs s1, s03751; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]3752; NONEON-NOSVE-NEXT: fabs s0, s03753; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]3754; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]3755; NONEON-NOSVE-NEXT: fabs s1, s03756; NONEON-NOSVE-NEXT: ldr s0, [sp]3757; NONEON-NOSVE-NEXT: fabs s0, s03758; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]3759; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]3760; NONEON-NOSVE-NEXT: add sp, sp, #323761; NONEON-NOSVE-NEXT: ret3762 %res = call <4 x float> @llvm.fabs.v4f32(<4 x float> %op)3763 ret <4 x float> %res3764}3765 3766define void @fabs_v8f32(ptr %a) {3767; CHECK-LABEL: fabs_v8f32:3768; CHECK: // %bb.0:3769; CHECK-NEXT: ldp q0, q1, [x0]3770; CHECK-NEXT: ptrue p0.s, vl43771; CHECK-NEXT: fabs z0.s, p0/m, z0.s3772; CHECK-NEXT: fabs z1.s, p0/m, z1.s3773; CHECK-NEXT: stp q0, q1, [x0]3774; CHECK-NEXT: ret3775;3776; NONEON-NOSVE-LABEL: fabs_v8f32:3777; NONEON-NOSVE: // %bb.0:3778; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]3779; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!3780; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 643781; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]3782; NONEON-NOSVE-NEXT: fabs s1, s03783; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]3784; NONEON-NOSVE-NEXT: fabs s0, s03785; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]3786; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]3787; NONEON-NOSVE-NEXT: fabs s1, s03788; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]3789; NONEON-NOSVE-NEXT: fabs s0, s03790; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]3791; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]3792; NONEON-NOSVE-NEXT: fabs s1, s03793; NONEON-NOSVE-NEXT: ldr s0, [sp, #8]3794; NONEON-NOSVE-NEXT: fabs s0, s03795; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]3796; NONEON-NOSVE-NEXT: ldr s0, [sp, #4]3797; NONEON-NOSVE-NEXT: fabs s1, s03798; NONEON-NOSVE-NEXT: ldr s0, [sp]3799; NONEON-NOSVE-NEXT: fabs s0, s03800; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]3801; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]3802; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3803; NONEON-NOSVE-NEXT: add sp, sp, #643804; NONEON-NOSVE-NEXT: ret3805 %op = load <8 x float>, ptr %a3806 %res = call <8 x float> @llvm.fabs.v8f32(<8 x float> %op)3807 store <8 x float> %res, ptr %a3808 ret void3809}3810 3811define <2 x double> @fabs_v2f64(<2 x double> %op) {3812; CHECK-LABEL: fabs_v2f64:3813; CHECK: // %bb.0:3814; CHECK-NEXT: ptrue p0.d, vl23815; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03816; CHECK-NEXT: fabs z0.d, p0/m, z0.d3817; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03818; CHECK-NEXT: ret3819;3820; NONEON-NOSVE-LABEL: fabs_v2f64:3821; NONEON-NOSVE: // %bb.0:3822; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!3823; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 323824; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3825; NONEON-NOSVE-NEXT: fabs d1, d03826; NONEON-NOSVE-NEXT: ldr d0, [sp]3827; NONEON-NOSVE-NEXT: fabs d0, d03828; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]3829; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]3830; NONEON-NOSVE-NEXT: add sp, sp, #323831; NONEON-NOSVE-NEXT: ret3832 %res = call <2 x double> @llvm.fabs.v2f64(<2 x double> %op)3833 ret <2 x double> %res3834}3835 3836define void @fabs_v4f64(ptr %a) {3837; CHECK-LABEL: fabs_v4f64:3838; CHECK: // %bb.0:3839; CHECK-NEXT: ldp q0, q1, [x0]3840; CHECK-NEXT: ptrue p0.d, vl23841; CHECK-NEXT: fabs z0.d, p0/m, z0.d3842; CHECK-NEXT: fabs z1.d, p0/m, z1.d3843; CHECK-NEXT: stp q0, q1, [x0]3844; CHECK-NEXT: ret3845;3846; NONEON-NOSVE-LABEL: fabs_v4f64:3847; NONEON-NOSVE: // %bb.0:3848; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]3849; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!3850; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 643851; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3852; NONEON-NOSVE-NEXT: fabs d1, d03853; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]3854; NONEON-NOSVE-NEXT: fabs d0, d03855; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]3856; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3857; NONEON-NOSVE-NEXT: fabs d1, d03858; NONEON-NOSVE-NEXT: ldr d0, [sp]3859; NONEON-NOSVE-NEXT: fabs d0, d03860; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]3861; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]3862; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3863; NONEON-NOSVE-NEXT: add sp, sp, #643864; NONEON-NOSVE-NEXT: ret3865 %op = load <4 x double>, ptr %a3866 %res = call <4 x double> @llvm.fabs.v4f64(<4 x double> %op)3867 store <4 x double> %res, ptr %a3868 ret void3869}3870 3871declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>)3872declare <4 x half> @llvm.fma.v4f16(<4 x half>, <4 x half>, <4 x half>)3873declare <8 x half> @llvm.fma.v8f16(<8 x half>, <8 x half>, <8 x half>)3874declare <16 x half> @llvm.fma.v16f16(<16 x half>, <16 x half>, <16 x half>)3875declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>)3876declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)3877declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>)3878declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>)3879declare <4 x double> @llvm.fma.v4f64(<4 x double>, <4 x double>, <4 x double>)3880 3881declare <2 x half> @llvm.sqrt.v2f16(<2 x half>)3882declare <4 x half> @llvm.sqrt.v4f16(<4 x half>)3883declare <8 x half> @llvm.sqrt.v8f16(<8 x half>)3884declare <16 x half> @llvm.sqrt.v16f16(<16 x half>)3885declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)3886declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)3887declare <8 x float> @llvm.sqrt.v8f32(<8 x float>)3888declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)3889declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)3890 3891declare <2 x half> @llvm.fabs.v2f16(<2 x half>)3892declare <4 x half> @llvm.fabs.v4f16(<4 x half>)3893declare <8 x half> @llvm.fabs.v8f16(<8 x half>)3894declare <16 x half> @llvm.fabs.v16f16(<16 x half>)3895declare <2 x float> @llvm.fabs.v2f32(<2 x float>)3896declare <4 x float> @llvm.fabs.v4f32(<4 x float>)3897declare <8 x float> @llvm.fabs.v8f32(<8 x float>)3898declare <2 x double> @llvm.fabs.v2f64(<2 x double>)3899declare <4 x double> @llvm.fabs.v4f64(<4 x double>)3900