2104 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 -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE4 5target triple = "aarch64-unknown-linux-gnu"6 7;8; FADDA9;10 11define half @fadda_v4f16(half %start, <4 x half> %a) {12; CHECK-LABEL: fadda_v4f16:13; CHECK: // %bb.0:14; CHECK-NEXT: // kill: def $d1 killed $d1 def $z115; CHECK-NEXT: fadd h0, h0, h116; CHECK-NEXT: mov z2.h, z1.h[1]17; CHECK-NEXT: fadd h0, h0, h218; CHECK-NEXT: mov z2.h, z1.h[2]19; CHECK-NEXT: mov z1.h, z1.h[3]20; CHECK-NEXT: fadd h0, h0, h221; CHECK-NEXT: fadd h0, h0, h122; CHECK-NEXT: ret23;24; NONEON-NOSVE-LABEL: fadda_v4f16:25; NONEON-NOSVE: // %bb.0:26; NONEON-NOSVE-NEXT: sub sp, sp, #1627; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1628; NONEON-NOSVE-NEXT: str d1, [sp, #8]29; NONEON-NOSVE-NEXT: fcvt s0, h030; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]31; NONEON-NOSVE-NEXT: fcvt s1, h132; NONEON-NOSVE-NEXT: fadd s0, s0, s133; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]34; NONEON-NOSVE-NEXT: fcvt s1, h135; NONEON-NOSVE-NEXT: fcvt h0, s036; NONEON-NOSVE-NEXT: fcvt s0, h037; NONEON-NOSVE-NEXT: fadd s0, s0, s138; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]39; NONEON-NOSVE-NEXT: fcvt s1, h140; NONEON-NOSVE-NEXT: fcvt h0, s041; NONEON-NOSVE-NEXT: fcvt s0, h042; NONEON-NOSVE-NEXT: fadd s0, s0, s143; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]44; NONEON-NOSVE-NEXT: fcvt s1, h145; NONEON-NOSVE-NEXT: fcvt h0, s046; NONEON-NOSVE-NEXT: fcvt s0, h047; NONEON-NOSVE-NEXT: fadd s0, s0, s148; NONEON-NOSVE-NEXT: fcvt h0, s049; NONEON-NOSVE-NEXT: add sp, sp, #1650; NONEON-NOSVE-NEXT: ret51 %res = call half @llvm.vector.reduce.fadd.v4f16(half %start, <4 x half> %a)52 ret half %res53}54 55define half @fadda_v8f16(half %start, <8 x half> %a) {56; CHECK-LABEL: fadda_v8f16:57; CHECK: // %bb.0:58; CHECK-NEXT: // kill: def $q1 killed $q1 def $z159; CHECK-NEXT: fadd h0, h0, h160; CHECK-NEXT: mov z2.h, z1.h[1]61; CHECK-NEXT: fadd h0, h0, h262; CHECK-NEXT: mov z2.h, z1.h[2]63; CHECK-NEXT: fadd h0, h0, h264; CHECK-NEXT: mov z2.h, z1.h[3]65; CHECK-NEXT: fadd h0, h0, h266; CHECK-NEXT: mov z2.h, z1.h[4]67; CHECK-NEXT: fadd h0, h0, h268; CHECK-NEXT: mov z2.h, z1.h[5]69; CHECK-NEXT: fadd h0, h0, h270; CHECK-NEXT: mov z2.h, z1.h[6]71; CHECK-NEXT: mov z1.h, z1.h[7]72; CHECK-NEXT: fadd h0, h0, h273; CHECK-NEXT: fadd h0, h0, h174; CHECK-NEXT: ret75;76; NONEON-NOSVE-LABEL: fadda_v8f16:77; NONEON-NOSVE: // %bb.0:78; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!79; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1680; NONEON-NOSVE-NEXT: ldr h1, [sp]81; NONEON-NOSVE-NEXT: fcvt s0, h082; NONEON-NOSVE-NEXT: fcvt s1, h183; NONEON-NOSVE-NEXT: fadd s0, s0, s184; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]85; NONEON-NOSVE-NEXT: fcvt s1, h186; NONEON-NOSVE-NEXT: fcvt h0, s087; NONEON-NOSVE-NEXT: fcvt s0, h088; NONEON-NOSVE-NEXT: fadd s0, s0, s189; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]90; NONEON-NOSVE-NEXT: fcvt s1, h191; NONEON-NOSVE-NEXT: fcvt h0, s092; NONEON-NOSVE-NEXT: fcvt s0, h093; NONEON-NOSVE-NEXT: fadd s0, s0, s194; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]95; NONEON-NOSVE-NEXT: fcvt s1, h196; NONEON-NOSVE-NEXT: fcvt h0, s097; NONEON-NOSVE-NEXT: fcvt s0, h098; NONEON-NOSVE-NEXT: fadd s0, s0, s199; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]100; NONEON-NOSVE-NEXT: fcvt s1, h1101; NONEON-NOSVE-NEXT: fcvt h0, s0102; NONEON-NOSVE-NEXT: fcvt s0, h0103; NONEON-NOSVE-NEXT: fadd s0, s0, s1104; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]105; NONEON-NOSVE-NEXT: fcvt s1, h1106; NONEON-NOSVE-NEXT: fcvt h0, s0107; NONEON-NOSVE-NEXT: fcvt s0, h0108; NONEON-NOSVE-NEXT: fadd s0, s0, s1109; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]110; NONEON-NOSVE-NEXT: fcvt s1, h1111; NONEON-NOSVE-NEXT: fcvt h0, s0112; NONEON-NOSVE-NEXT: fcvt s0, h0113; NONEON-NOSVE-NEXT: fadd s0, s0, s1114; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]115; NONEON-NOSVE-NEXT: fcvt s1, h1116; NONEON-NOSVE-NEXT: fcvt h0, s0117; NONEON-NOSVE-NEXT: fcvt s0, h0118; NONEON-NOSVE-NEXT: fadd s0, s0, s1119; NONEON-NOSVE-NEXT: fcvt h0, s0120; NONEON-NOSVE-NEXT: add sp, sp, #16121; NONEON-NOSVE-NEXT: ret122 %res = call half @llvm.vector.reduce.fadd.v8f16(half %start, <8 x half> %a)123 ret half %res124}125 126define half @fadda_v16f16(half %start, ptr %a) {127; CHECK-LABEL: fadda_v16f16:128; CHECK: // %bb.0:129; CHECK-NEXT: ldr q1, [x0]130; CHECK-NEXT: fadd h0, h0, h1131; CHECK-NEXT: mov z2.h, z1.h[1]132; CHECK-NEXT: fadd h0, h0, h2133; CHECK-NEXT: mov z2.h, z1.h[2]134; CHECK-NEXT: fadd h0, h0, h2135; CHECK-NEXT: mov z2.h, z1.h[3]136; CHECK-NEXT: fadd h0, h0, h2137; CHECK-NEXT: mov z2.h, z1.h[4]138; CHECK-NEXT: fadd h0, h0, h2139; CHECK-NEXT: mov z2.h, z1.h[5]140; CHECK-NEXT: fadd h0, h0, h2141; CHECK-NEXT: mov z2.h, z1.h[6]142; CHECK-NEXT: mov z1.h, z1.h[7]143; CHECK-NEXT: fadd h0, h0, h2144; CHECK-NEXT: fadd h0, h0, h1145; CHECK-NEXT: ldr q1, [x0, #16]146; CHECK-NEXT: mov z2.h, z1.h[1]147; CHECK-NEXT: fadd h0, h0, h1148; CHECK-NEXT: fadd h0, h0, h2149; CHECK-NEXT: mov z2.h, z1.h[2]150; CHECK-NEXT: fadd h0, h0, h2151; CHECK-NEXT: mov z2.h, z1.h[3]152; CHECK-NEXT: fadd h0, h0, h2153; CHECK-NEXT: mov z2.h, z1.h[4]154; CHECK-NEXT: fadd h0, h0, h2155; CHECK-NEXT: mov z2.h, z1.h[5]156; CHECK-NEXT: fadd h0, h0, h2157; CHECK-NEXT: mov z2.h, z1.h[6]158; CHECK-NEXT: mov z1.h, z1.h[7]159; CHECK-NEXT: fadd h0, h0, h2160; CHECK-NEXT: fadd h0, h0, h1161; CHECK-NEXT: ret162;163; NONEON-NOSVE-LABEL: fadda_v16f16:164; NONEON-NOSVE: // %bb.0:165; NONEON-NOSVE-NEXT: sub sp, sp, #32166; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32167; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]168; NONEON-NOSVE-NEXT: fcvt s0, h0169; NONEON-NOSVE-NEXT: str q1, [sp, #16]170; NONEON-NOSVE-NEXT: ldr q1, [x0]171; NONEON-NOSVE-NEXT: str q1, [sp]172; NONEON-NOSVE-NEXT: ldr h1, [sp]173; NONEON-NOSVE-NEXT: fcvt s1, h1174; NONEON-NOSVE-NEXT: fadd s0, s0, s1175; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]176; NONEON-NOSVE-NEXT: fcvt s1, h1177; NONEON-NOSVE-NEXT: fcvt h0, s0178; NONEON-NOSVE-NEXT: fcvt s0, h0179; NONEON-NOSVE-NEXT: fadd s0, s0, s1180; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]181; NONEON-NOSVE-NEXT: fcvt s1, h1182; NONEON-NOSVE-NEXT: fcvt h0, s0183; NONEON-NOSVE-NEXT: fcvt s0, h0184; NONEON-NOSVE-NEXT: fadd s0, s0, s1185; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]186; NONEON-NOSVE-NEXT: fcvt s1, h1187; NONEON-NOSVE-NEXT: fcvt h0, s0188; NONEON-NOSVE-NEXT: fcvt s0, h0189; NONEON-NOSVE-NEXT: fadd s0, s0, s1190; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]191; NONEON-NOSVE-NEXT: fcvt s1, h1192; NONEON-NOSVE-NEXT: fcvt h0, s0193; NONEON-NOSVE-NEXT: fcvt s0, h0194; NONEON-NOSVE-NEXT: fadd s0, s0, s1195; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]196; NONEON-NOSVE-NEXT: fcvt s1, h1197; NONEON-NOSVE-NEXT: fcvt h0, s0198; NONEON-NOSVE-NEXT: fcvt s0, h0199; NONEON-NOSVE-NEXT: fadd s0, s0, s1200; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]201; NONEON-NOSVE-NEXT: fcvt s1, h1202; NONEON-NOSVE-NEXT: fcvt h0, s0203; NONEON-NOSVE-NEXT: fcvt s0, h0204; NONEON-NOSVE-NEXT: fadd s0, s0, s1205; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]206; NONEON-NOSVE-NEXT: fcvt s1, h1207; NONEON-NOSVE-NEXT: fcvt h0, s0208; NONEON-NOSVE-NEXT: fcvt s0, h0209; NONEON-NOSVE-NEXT: fadd s0, s0, s1210; NONEON-NOSVE-NEXT: ldr h1, [sp, #16]211; NONEON-NOSVE-NEXT: fcvt s1, h1212; NONEON-NOSVE-NEXT: fcvt h0, s0213; NONEON-NOSVE-NEXT: fcvt s0, h0214; NONEON-NOSVE-NEXT: fadd s0, s0, s1215; NONEON-NOSVE-NEXT: ldr h1, [sp, #18]216; NONEON-NOSVE-NEXT: fcvt s1, h1217; NONEON-NOSVE-NEXT: fcvt h0, s0218; NONEON-NOSVE-NEXT: fcvt s0, h0219; NONEON-NOSVE-NEXT: fadd s0, s0, s1220; NONEON-NOSVE-NEXT: ldr h1, [sp, #20]221; NONEON-NOSVE-NEXT: fcvt s1, h1222; NONEON-NOSVE-NEXT: fcvt h0, s0223; NONEON-NOSVE-NEXT: fcvt s0, h0224; NONEON-NOSVE-NEXT: fadd s0, s0, s1225; NONEON-NOSVE-NEXT: ldr h1, [sp, #22]226; NONEON-NOSVE-NEXT: fcvt s1, h1227; NONEON-NOSVE-NEXT: fcvt h0, s0228; NONEON-NOSVE-NEXT: fcvt s0, h0229; NONEON-NOSVE-NEXT: fadd s0, s0, s1230; NONEON-NOSVE-NEXT: ldr h1, [sp, #24]231; NONEON-NOSVE-NEXT: fcvt s1, h1232; NONEON-NOSVE-NEXT: fcvt h0, s0233; NONEON-NOSVE-NEXT: fcvt s0, h0234; NONEON-NOSVE-NEXT: fadd s0, s0, s1235; NONEON-NOSVE-NEXT: ldr h1, [sp, #26]236; NONEON-NOSVE-NEXT: fcvt s1, h1237; NONEON-NOSVE-NEXT: fcvt h0, s0238; NONEON-NOSVE-NEXT: fcvt s0, h0239; NONEON-NOSVE-NEXT: fadd s0, s0, s1240; NONEON-NOSVE-NEXT: ldr h1, [sp, #28]241; NONEON-NOSVE-NEXT: fcvt s1, h1242; NONEON-NOSVE-NEXT: fcvt h0, s0243; NONEON-NOSVE-NEXT: fcvt s0, h0244; NONEON-NOSVE-NEXT: fadd s0, s0, s1245; NONEON-NOSVE-NEXT: ldr h1, [sp, #30]246; NONEON-NOSVE-NEXT: fcvt s1, h1247; NONEON-NOSVE-NEXT: fcvt h0, s0248; NONEON-NOSVE-NEXT: fcvt s0, h0249; NONEON-NOSVE-NEXT: fadd s0, s0, s1250; NONEON-NOSVE-NEXT: fcvt h0, s0251; NONEON-NOSVE-NEXT: add sp, sp, #32252; NONEON-NOSVE-NEXT: ret253 %op = load <16 x half>, ptr %a254 %res = call half @llvm.vector.reduce.fadd.v16f16(half %start, <16 x half> %op)255 ret half %res256}257 258define float @fadda_v2f32(float %start, <2 x float> %a) {259; CHECK-LABEL: fadda_v2f32:260; CHECK: // %bb.0:261; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1262; CHECK-NEXT: fadd s0, s0, s1263; CHECK-NEXT: mov z1.s, z1.s[1]264; CHECK-NEXT: fadd s0, s0, s1265; CHECK-NEXT: ret266;267; NONEON-NOSVE-LABEL: fadda_v2f32:268; NONEON-NOSVE: // %bb.0:269; NONEON-NOSVE-NEXT: sub sp, sp, #16270; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16271; NONEON-NOSVE-NEXT: str d1, [sp, #8]272; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]273; NONEON-NOSVE-NEXT: fadd s0, s0, s2274; NONEON-NOSVE-NEXT: fadd s0, s0, s1275; NONEON-NOSVE-NEXT: add sp, sp, #16276; NONEON-NOSVE-NEXT: ret277 %res = call float @llvm.vector.reduce.fadd.v2f32(float %start, <2 x float> %a)278 ret float %res279}280 281define float @fadda_v4f32(float %start, <4 x float> %a) {282; CHECK-LABEL: fadda_v4f32:283; CHECK: // %bb.0:284; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1285; CHECK-NEXT: fadd s0, s0, s1286; CHECK-NEXT: mov z2.s, z1.s[1]287; CHECK-NEXT: fadd s0, s0, s2288; CHECK-NEXT: mov z2.s, z1.s[2]289; CHECK-NEXT: mov z1.s, z1.s[3]290; CHECK-NEXT: fadd s0, s0, s2291; CHECK-NEXT: fadd s0, s0, s1292; CHECK-NEXT: ret293;294; NONEON-NOSVE-LABEL: fadda_v4f32:295; NONEON-NOSVE: // %bb.0:296; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!297; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16298; NONEON-NOSVE-NEXT: ldp s2, s1, [sp]299; NONEON-NOSVE-NEXT: fadd s0, s0, s2300; NONEON-NOSVE-NEXT: fadd s0, s0, s1301; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]302; NONEON-NOSVE-NEXT: fadd s0, s0, s2303; NONEON-NOSVE-NEXT: fadd s0, s0, s1304; NONEON-NOSVE-NEXT: add sp, sp, #16305; NONEON-NOSVE-NEXT: ret306 %res = call float @llvm.vector.reduce.fadd.v4f32(float %start, <4 x float> %a)307 ret float %res308}309 310define float @fadda_v8f32(float %start, ptr %a) {311; CHECK-LABEL: fadda_v8f32:312; CHECK: // %bb.0:313; CHECK-NEXT: ldr q1, [x0]314; CHECK-NEXT: fadd s0, s0, s1315; CHECK-NEXT: mov z2.s, z1.s[1]316; CHECK-NEXT: fadd s0, s0, s2317; CHECK-NEXT: mov z2.s, z1.s[2]318; CHECK-NEXT: mov z1.s, z1.s[3]319; CHECK-NEXT: fadd s0, s0, s2320; CHECK-NEXT: fadd s0, s0, s1321; CHECK-NEXT: ldr q1, [x0, #16]322; CHECK-NEXT: mov z2.s, z1.s[1]323; CHECK-NEXT: fadd s0, s0, s1324; CHECK-NEXT: fadd s0, s0, s2325; CHECK-NEXT: mov z2.s, z1.s[2]326; CHECK-NEXT: mov z1.s, z1.s[3]327; CHECK-NEXT: fadd s0, s0, s2328; CHECK-NEXT: fadd s0, s0, s1329; CHECK-NEXT: ret330;331; NONEON-NOSVE-LABEL: fadda_v8f32:332; NONEON-NOSVE: // %bb.0:333; NONEON-NOSVE-NEXT: sub sp, sp, #32334; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32335; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]336; NONEON-NOSVE-NEXT: str q1, [sp, #16]337; NONEON-NOSVE-NEXT: ldr q1, [x0]338; NONEON-NOSVE-NEXT: str q1, [sp]339; NONEON-NOSVE-NEXT: ldp s2, s1, [sp]340; NONEON-NOSVE-NEXT: fadd s0, s0, s2341; NONEON-NOSVE-NEXT: fadd s0, s0, s1342; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]343; NONEON-NOSVE-NEXT: fadd s0, s0, s2344; NONEON-NOSVE-NEXT: fadd s0, s0, s1345; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #16]346; NONEON-NOSVE-NEXT: fadd s0, s0, s2347; NONEON-NOSVE-NEXT: fadd s0, s0, s1348; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #24]349; NONEON-NOSVE-NEXT: fadd s0, s0, s2350; NONEON-NOSVE-NEXT: fadd s0, s0, s1351; NONEON-NOSVE-NEXT: add sp, sp, #32352; NONEON-NOSVE-NEXT: ret353 %op = load <8 x float>, ptr %a354 %res = call float @llvm.vector.reduce.fadd.v8f32(float %start, <8 x float> %op)355 ret float %res356}357 358define double @fadda_v1f64(double %start, <1 x double> %a) {359; CHECK-LABEL: fadda_v1f64:360; CHECK: // %bb.0:361; CHECK-NEXT: fadd d0, d0, d1362; CHECK-NEXT: ret363;364; NONEON-NOSVE-LABEL: fadda_v1f64:365; NONEON-NOSVE: // %bb.0:366; NONEON-NOSVE-NEXT: fadd d0, d0, d1367; NONEON-NOSVE-NEXT: ret368 %res = call double @llvm.vector.reduce.fadd.v1f64(double %start, <1 x double> %a)369 ret double %res370}371 372define double @fadda_v2f64(double %start, <2 x double> %a) {373; CHECK-LABEL: fadda_v2f64:374; CHECK: // %bb.0:375; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1376; CHECK-NEXT: fadd d0, d0, d1377; CHECK-NEXT: mov z1.d, z1.d[1]378; CHECK-NEXT: fadd d0, d0, d1379; CHECK-NEXT: ret380;381; NONEON-NOSVE-LABEL: fadda_v2f64:382; NONEON-NOSVE: // %bb.0:383; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!384; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16385; NONEON-NOSVE-NEXT: ldp d2, d1, [sp], #16386; NONEON-NOSVE-NEXT: fadd d0, d0, d2387; NONEON-NOSVE-NEXT: fadd d0, d0, d1388; NONEON-NOSVE-NEXT: ret389 %res = call double @llvm.vector.reduce.fadd.v2f64(double %start, <2 x double> %a)390 ret double %res391}392 393define double @fadda_v4f64(double %start, ptr %a) {394; CHECK-LABEL: fadda_v4f64:395; CHECK: // %bb.0:396; CHECK-NEXT: ldr q1, [x0]397; CHECK-NEXT: fadd d0, d0, d1398; CHECK-NEXT: mov z1.d, z1.d[1]399; CHECK-NEXT: fadd d0, d0, d1400; CHECK-NEXT: ldr q1, [x0, #16]401; CHECK-NEXT: fadd d0, d0, d1402; CHECK-NEXT: mov z1.d, z1.d[1]403; CHECK-NEXT: fadd d0, d0, d1404; CHECK-NEXT: ret405;406; NONEON-NOSVE-LABEL: fadda_v4f64:407; NONEON-NOSVE: // %bb.0:408; NONEON-NOSVE-NEXT: sub sp, sp, #32409; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32410; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]411; NONEON-NOSVE-NEXT: str q1, [sp, #16]412; NONEON-NOSVE-NEXT: ldr q1, [x0]413; NONEON-NOSVE-NEXT: str q1, [sp]414; NONEON-NOSVE-NEXT: ldp d2, d1, [sp]415; NONEON-NOSVE-NEXT: fadd d0, d0, d2416; NONEON-NOSVE-NEXT: fadd d0, d0, d1417; NONEON-NOSVE-NEXT: ldp d2, d1, [sp, #16]418; NONEON-NOSVE-NEXT: fadd d0, d0, d2419; NONEON-NOSVE-NEXT: fadd d0, d0, d1420; NONEON-NOSVE-NEXT: add sp, sp, #32421; NONEON-NOSVE-NEXT: ret422 %op = load <4 x double>, ptr %a423 %res = call double @llvm.vector.reduce.fadd.v4f64(double %start, <4 x double> %op)424 ret double %res425}426 427;428; FADDV429;430 431define half @faddv_v4f16(half %start, <4 x half> %a) {432; CHECK-LABEL: faddv_v4f16:433; CHECK: // %bb.0:434; CHECK-NEXT: ptrue p0.h, vl4435; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1436; CHECK-NEXT: faddv h1, p0, z1.h437; CHECK-NEXT: fadd h0, h0, h1438; CHECK-NEXT: ret439;440; NONEON-NOSVE-LABEL: faddv_v4f16:441; NONEON-NOSVE: // %bb.0:442; NONEON-NOSVE-NEXT: sub sp, sp, #16443; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16444; NONEON-NOSVE-NEXT: str d1, [sp, #8]445; NONEON-NOSVE-NEXT: fcvt s0, h0446; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]447; NONEON-NOSVE-NEXT: ldr h2, [sp, #14]448; NONEON-NOSVE-NEXT: ldr h3, [sp, #12]449; NONEON-NOSVE-NEXT: ldr h4, [sp, #8]450; NONEON-NOSVE-NEXT: fcvt s1, h1451; NONEON-NOSVE-NEXT: fcvt s3, h3452; NONEON-NOSVE-NEXT: fcvt s2, h2453; NONEON-NOSVE-NEXT: fcvt s4, h4454; NONEON-NOSVE-NEXT: fadd s2, s3, s2455; NONEON-NOSVE-NEXT: fadd s1, s4, s1456; NONEON-NOSVE-NEXT: fadd s1, s1, s2457; NONEON-NOSVE-NEXT: fadd s0, s0, s1458; NONEON-NOSVE-NEXT: fcvt h0, s0459; NONEON-NOSVE-NEXT: add sp, sp, #16460; NONEON-NOSVE-NEXT: ret461 %res = call fast half @llvm.vector.reduce.fadd.v4f16(half %start, <4 x half> %a)462 ret half %res463}464 465define half @faddv_v8f16(half %start, <8 x half> %a) {466; CHECK-LABEL: faddv_v8f16:467; CHECK: // %bb.0:468; CHECK-NEXT: ptrue p0.h, vl8469; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1470; CHECK-NEXT: faddv h1, p0, z1.h471; CHECK-NEXT: fadd h0, h0, h1472; CHECK-NEXT: ret473;474; NONEON-NOSVE-LABEL: faddv_v8f16:475; NONEON-NOSVE: // %bb.0:476; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!477; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16478; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]479; NONEON-NOSVE-NEXT: ldr h2, [sp, #6]480; NONEON-NOSVE-NEXT: fcvt s0, h0481; NONEON-NOSVE-NEXT: ldr h3, [sp, #4]482; NONEON-NOSVE-NEXT: ldr h4, [sp]483; NONEON-NOSVE-NEXT: ldr h5, [sp, #10]484; NONEON-NOSVE-NEXT: ldr h6, [sp, #8]485; NONEON-NOSVE-NEXT: fcvt s1, h1486; NONEON-NOSVE-NEXT: fcvt s2, h2487; NONEON-NOSVE-NEXT: fcvt s4, h4488; NONEON-NOSVE-NEXT: fcvt s3, h3489; NONEON-NOSVE-NEXT: fcvt s5, h5490; NONEON-NOSVE-NEXT: fcvt s6, h6491; NONEON-NOSVE-NEXT: ldr h7, [sp, #12]492; NONEON-NOSVE-NEXT: fadd s1, s4, s1493; NONEON-NOSVE-NEXT: fadd s2, s3, s2494; NONEON-NOSVE-NEXT: fcvt s3, h7495; NONEON-NOSVE-NEXT: fadd s4, s6, s5496; NONEON-NOSVE-NEXT: ldr h5, [sp, #14]497; NONEON-NOSVE-NEXT: fadd s1, s1, s2498; NONEON-NOSVE-NEXT: fadd s2, s4, s3499; NONEON-NOSVE-NEXT: fcvt s3, h5500; NONEON-NOSVE-NEXT: fadd s1, s1, s2501; NONEON-NOSVE-NEXT: fadd s0, s0, s3502; NONEON-NOSVE-NEXT: fadd s0, s0, s1503; NONEON-NOSVE-NEXT: fcvt h0, s0504; NONEON-NOSVE-NEXT: add sp, sp, #16505; NONEON-NOSVE-NEXT: ret506 %res = call fast half @llvm.vector.reduce.fadd.v8f16(half %start, <8 x half> %a)507 ret half %res508}509 510define half @faddv_v16f16(half %start, ptr %a) {511; CHECK-LABEL: faddv_v16f16:512; CHECK: // %bb.0:513; CHECK-NEXT: ldp q2, q1, [x0]514; CHECK-NEXT: ptrue p0.h, vl8515; CHECK-NEXT: fadd z1.h, p0/m, z1.h, z2.h516; CHECK-NEXT: faddv h1, p0, z1.h517; CHECK-NEXT: fadd h0, h0, h1518; CHECK-NEXT: ret519;520; NONEON-NOSVE-LABEL: faddv_v16f16:521; NONEON-NOSVE: // %bb.0:522; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]523; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #-32]!524; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32525; NONEON-NOSVE-NEXT: ldr h1, [sp, #18]526; NONEON-NOSVE-NEXT: ldr h2, [sp, #2]527; NONEON-NOSVE-NEXT: fcvt s0, h0528; NONEON-NOSVE-NEXT: ldr h3, [sp, #16]529; NONEON-NOSVE-NEXT: ldr h4, [sp]530; NONEON-NOSVE-NEXT: ldr h5, [sp, #20]531; NONEON-NOSVE-NEXT: ldr h6, [sp, #4]532; NONEON-NOSVE-NEXT: fcvt s1, h1533; NONEON-NOSVE-NEXT: fcvt s2, h2534; NONEON-NOSVE-NEXT: ldr h7, [sp, #22]535; NONEON-NOSVE-NEXT: ldr h16, [sp, #6]536; NONEON-NOSVE-NEXT: fcvt s3, h3537; NONEON-NOSVE-NEXT: ldr h17, [sp, #24]538; NONEON-NOSVE-NEXT: ldr h18, [sp, #8]539; NONEON-NOSVE-NEXT: fcvt s4, h4540; NONEON-NOSVE-NEXT: ldr h19, [sp, #26]541; NONEON-NOSVE-NEXT: ldr h20, [sp, #10]542; NONEON-NOSVE-NEXT: fcvt s5, h5543; NONEON-NOSVE-NEXT: fcvt s6, h6544; NONEON-NOSVE-NEXT: fcvt s7, h7545; NONEON-NOSVE-NEXT: fcvt s16, h16546; NONEON-NOSVE-NEXT: fcvt s17, h17547; NONEON-NOSVE-NEXT: fcvt s18, h18548; NONEON-NOSVE-NEXT: fcvt s19, h19549; NONEON-NOSVE-NEXT: fcvt s20, h20550; NONEON-NOSVE-NEXT: ldr h21, [sp, #28]551; NONEON-NOSVE-NEXT: ldr h22, [sp, #12]552; NONEON-NOSVE-NEXT: fadd s1, s2, s1553; NONEON-NOSVE-NEXT: fadd s2, s4, s3554; NONEON-NOSVE-NEXT: fadd s3, s6, s5555; NONEON-NOSVE-NEXT: fadd s4, s16, s7556; NONEON-NOSVE-NEXT: fcvt s5, h21557; NONEON-NOSVE-NEXT: fcvt s6, h22558; NONEON-NOSVE-NEXT: fadd s7, s18, s17559; NONEON-NOSVE-NEXT: ldr h17, [sp, #30]560; NONEON-NOSVE-NEXT: fadd s16, s20, s19561; NONEON-NOSVE-NEXT: ldr h18, [sp, #14]562; NONEON-NOSVE-NEXT: fadd s1, s2, s1563; NONEON-NOSVE-NEXT: fadd s2, s3, s4564; NONEON-NOSVE-NEXT: fcvt s4, h17565; NONEON-NOSVE-NEXT: fadd s5, s6, s5566; NONEON-NOSVE-NEXT: fcvt s6, h18567; NONEON-NOSVE-NEXT: fadd s3, s7, s16568; NONEON-NOSVE-NEXT: fadd s1, s1, s2569; NONEON-NOSVE-NEXT: fadd s2, s3, s5570; NONEON-NOSVE-NEXT: fadd s3, s6, s4571; NONEON-NOSVE-NEXT: fadd s1, s1, s2572; NONEON-NOSVE-NEXT: fadd s0, s0, s3573; NONEON-NOSVE-NEXT: fadd s0, s0, s1574; NONEON-NOSVE-NEXT: fcvt h0, s0575; NONEON-NOSVE-NEXT: add sp, sp, #32576; NONEON-NOSVE-NEXT: ret577 %op = load <16 x half>, ptr %a578 %res = call fast half @llvm.vector.reduce.fadd.v16f16(half %start, <16 x half> %op)579 ret half %res580}581 582define float @faddv_v2f32(float %start, <2 x float> %a) {583; CHECK-LABEL: faddv_v2f32:584; CHECK: // %bb.0:585; CHECK-NEXT: ptrue p0.s, vl2586; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1587; CHECK-NEXT: faddv s1, p0, z1.s588; CHECK-NEXT: fadd s0, s0, s1589; CHECK-NEXT: ret590;591; NONEON-NOSVE-LABEL: faddv_v2f32:592; NONEON-NOSVE: // %bb.0:593; NONEON-NOSVE-NEXT: sub sp, sp, #16594; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16595; NONEON-NOSVE-NEXT: str d1, [sp, #8]596; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]597; NONEON-NOSVE-NEXT: fadd s1, s2, s1598; NONEON-NOSVE-NEXT: fadd s0, s0, s1599; NONEON-NOSVE-NEXT: add sp, sp, #16600; NONEON-NOSVE-NEXT: ret601 %res = call fast float @llvm.vector.reduce.fadd.v2f32(float %start, <2 x float> %a)602 ret float %res603}604 605define float @faddv_v4f32(float %start, <4 x float> %a) {606; CHECK-LABEL: faddv_v4f32:607; CHECK: // %bb.0:608; CHECK-NEXT: ptrue p0.s, vl4609; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1610; CHECK-NEXT: faddv s1, p0, z1.s611; CHECK-NEXT: fadd s0, s0, s1612; CHECK-NEXT: ret613;614; NONEON-NOSVE-LABEL: faddv_v4f32:615; NONEON-NOSVE: // %bb.0:616; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!617; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16618; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]619; NONEON-NOSVE-NEXT: ldp s4, s3, [sp], #16620; NONEON-NOSVE-NEXT: fadd s3, s4, s3621; NONEON-NOSVE-NEXT: fadd s1, s2, s1622; NONEON-NOSVE-NEXT: fadd s1, s3, s1623; NONEON-NOSVE-NEXT: fadd s0, s0, s1624; NONEON-NOSVE-NEXT: ret625 %res = call fast float @llvm.vector.reduce.fadd.v4f32(float %start, <4 x float> %a)626 ret float %res627}628 629define float @faddv_v8f32(float %start, ptr %a) {630; CHECK-LABEL: faddv_v8f32:631; CHECK: // %bb.0:632; CHECK-NEXT: ldp q2, q1, [x0]633; CHECK-NEXT: ptrue p0.s, vl4634; CHECK-NEXT: fadd z1.s, p0/m, z1.s, z2.s635; CHECK-NEXT: faddv s1, p0, z1.s636; CHECK-NEXT: fadd s0, s0, s1637; CHECK-NEXT: ret638;639; NONEON-NOSVE-LABEL: faddv_v8f32:640; NONEON-NOSVE: // %bb.0:641; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]642; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #-32]!643; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32644; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #16]645; NONEON-NOSVE-NEXT: ldp s4, s3, [sp]646; NONEON-NOSVE-NEXT: ldp s5, s6, [sp, #24]647; NONEON-NOSVE-NEXT: ldp s7, s16, [sp, #8]648; NONEON-NOSVE-NEXT: fadd s1, s3, s1649; NONEON-NOSVE-NEXT: fadd s2, s4, s2650; NONEON-NOSVE-NEXT: fadd s3, s7, s5651; NONEON-NOSVE-NEXT: fadd s4, s16, s6652; NONEON-NOSVE-NEXT: fadd s1, s2, s1653; NONEON-NOSVE-NEXT: fadd s2, s3, s4654; NONEON-NOSVE-NEXT: fadd s1, s1, s2655; NONEON-NOSVE-NEXT: fadd s0, s0, s1656; NONEON-NOSVE-NEXT: add sp, sp, #32657; NONEON-NOSVE-NEXT: ret658 %op = load <8 x float>, ptr %a659 %res = call fast float @llvm.vector.reduce.fadd.v8f32(float %start, <8 x float> %op)660 ret float %res661}662 663define double @faddv_v1f64(double %start, <1 x double> %a) {664; CHECK-LABEL: faddv_v1f64:665; CHECK: // %bb.0:666; CHECK-NEXT: fadd d0, d0, d1667; CHECK-NEXT: ret668;669; NONEON-NOSVE-LABEL: faddv_v1f64:670; NONEON-NOSVE: // %bb.0:671; NONEON-NOSVE-NEXT: fadd d0, d0, d1672; NONEON-NOSVE-NEXT: ret673 %res = call fast double @llvm.vector.reduce.fadd.v1f64(double %start, <1 x double> %a)674 ret double %res675}676 677define double @faddv_v2f64(double %start, <2 x double> %a) {678; CHECK-LABEL: faddv_v2f64:679; CHECK: // %bb.0:680; CHECK-NEXT: ptrue p0.d, vl2681; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1682; CHECK-NEXT: faddv d1, p0, z1.d683; CHECK-NEXT: fadd d0, d0, d1684; CHECK-NEXT: ret685;686; NONEON-NOSVE-LABEL: faddv_v2f64:687; NONEON-NOSVE: // %bb.0:688; NONEON-NOSVE-NEXT: str q1, [sp, #-16]!689; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16690; NONEON-NOSVE-NEXT: ldp d2, d1, [sp], #16691; NONEON-NOSVE-NEXT: fadd d1, d2, d1692; NONEON-NOSVE-NEXT: fadd d0, d0, d1693; NONEON-NOSVE-NEXT: ret694 %res = call fast double @llvm.vector.reduce.fadd.v2f64(double %start, <2 x double> %a)695 ret double %res696}697 698define double @faddv_v4f64(double %start, ptr %a) {699; CHECK-LABEL: faddv_v4f64:700; CHECK: // %bb.0:701; CHECK-NEXT: ldp q2, q1, [x0]702; CHECK-NEXT: ptrue p0.d, vl2703; CHECK-NEXT: fadd z1.d, p0/m, z1.d, z2.d704; CHECK-NEXT: faddv d1, p0, z1.d705; CHECK-NEXT: fadd d0, d0, d1706; CHECK-NEXT: ret707;708; NONEON-NOSVE-LABEL: faddv_v4f64:709; NONEON-NOSVE: // %bb.0:710; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]711; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #-32]!712; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32713; NONEON-NOSVE-NEXT: ldp d2, d1, [sp, #16]714; NONEON-NOSVE-NEXT: ldp d4, d3, [sp], #32715; NONEON-NOSVE-NEXT: fadd d1, d3, d1716; NONEON-NOSVE-NEXT: fadd d2, d4, d2717; NONEON-NOSVE-NEXT: fadd d1, d2, d1718; NONEON-NOSVE-NEXT: fadd d0, d0, d1719; NONEON-NOSVE-NEXT: ret720 %op = load <4 x double>, ptr %a721 %res = call fast double @llvm.vector.reduce.fadd.v4f64(double %start, <4 x double> %op)722 ret double %res723}724 725;726; FMAXNMV727;728 729define half @fmaxv_v4f16(<4 x half> %a) {730; CHECK-LABEL: fmaxv_v4f16:731; CHECK: // %bb.0:732; CHECK-NEXT: ptrue p0.h, vl4733; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0734; CHECK-NEXT: fmaxnmv h0, p0, z0.h735; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0736; CHECK-NEXT: ret737;738; NONEON-NOSVE-LABEL: fmaxv_v4f16:739; NONEON-NOSVE: // %bb.0:740; NONEON-NOSVE-NEXT: sub sp, sp, #16741; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16742; NONEON-NOSVE-NEXT: str d0, [sp, #8]743; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]744; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]745; NONEON-NOSVE-NEXT: fcvt s1, h1746; NONEON-NOSVE-NEXT: fcvt s0, h0747; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1748; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]749; NONEON-NOSVE-NEXT: fcvt s1, h1750; NONEON-NOSVE-NEXT: fcvt h0, s0751; NONEON-NOSVE-NEXT: fcvt s0, h0752; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1753; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]754; NONEON-NOSVE-NEXT: fcvt s1, h1755; NONEON-NOSVE-NEXT: fcvt h0, s0756; NONEON-NOSVE-NEXT: fcvt s0, h0757; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1758; NONEON-NOSVE-NEXT: fcvt h0, s0759; NONEON-NOSVE-NEXT: add sp, sp, #16760; NONEON-NOSVE-NEXT: ret761 %res = call half @llvm.vector.reduce.fmax.v4f16(<4 x half> %a)762 ret half %res763}764 765define half @fmaxv_v8f16(<8 x half> %a) {766; CHECK-LABEL: fmaxv_v8f16:767; CHECK: // %bb.0:768; CHECK-NEXT: ptrue p0.h, vl8769; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0770; CHECK-NEXT: fmaxnmv h0, p0, z0.h771; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0772; CHECK-NEXT: ret773;774; NONEON-NOSVE-LABEL: fmaxv_v8f16:775; NONEON-NOSVE: // %bb.0:776; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!777; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16778; NONEON-NOSVE-NEXT: ldr h0, [sp]779; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]780; NONEON-NOSVE-NEXT: fcvt s1, h1781; NONEON-NOSVE-NEXT: fcvt s0, h0782; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1783; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]784; NONEON-NOSVE-NEXT: fcvt s1, h1785; NONEON-NOSVE-NEXT: fcvt h0, s0786; NONEON-NOSVE-NEXT: fcvt s0, h0787; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1788; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]789; NONEON-NOSVE-NEXT: fcvt s1, h1790; NONEON-NOSVE-NEXT: fcvt h0, s0791; NONEON-NOSVE-NEXT: fcvt s0, h0792; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1793; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]794; NONEON-NOSVE-NEXT: fcvt s1, h1795; NONEON-NOSVE-NEXT: fcvt h0, s0796; NONEON-NOSVE-NEXT: fcvt s0, h0797; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1798; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]799; NONEON-NOSVE-NEXT: fcvt s1, h1800; NONEON-NOSVE-NEXT: fcvt h0, s0801; NONEON-NOSVE-NEXT: fcvt s0, h0802; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1803; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]804; NONEON-NOSVE-NEXT: fcvt s1, h1805; NONEON-NOSVE-NEXT: fcvt h0, s0806; NONEON-NOSVE-NEXT: fcvt s0, h0807; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1808; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]809; NONEON-NOSVE-NEXT: fcvt s1, h1810; NONEON-NOSVE-NEXT: fcvt h0, s0811; NONEON-NOSVE-NEXT: fcvt s0, h0812; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1813; NONEON-NOSVE-NEXT: fcvt h0, s0814; NONEON-NOSVE-NEXT: add sp, sp, #16815; NONEON-NOSVE-NEXT: ret816 %res = call half @llvm.vector.reduce.fmax.v8f16(<8 x half> %a)817 ret half %res818}819 820define half @fmaxv_v16f16(ptr %a) {821; CHECK-LABEL: fmaxv_v16f16:822; CHECK: // %bb.0:823; CHECK-NEXT: ldp q1, q0, [x0]824; CHECK-NEXT: ptrue p0.h, vl8825; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h826; CHECK-NEXT: fmaxnmv h0, p0, z0.h827; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0828; CHECK-NEXT: ret829;830; NONEON-NOSVE-LABEL: fmaxv_v16f16:831; NONEON-NOSVE: // %bb.0:832; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]833; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!834; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32835; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]836; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]837; NONEON-NOSVE-NEXT: ldr h2, [sp, #16]838; NONEON-NOSVE-NEXT: ldr h3, [sp]839; NONEON-NOSVE-NEXT: fcvt s0, h0840; NONEON-NOSVE-NEXT: fcvt s1, h1841; NONEON-NOSVE-NEXT: fcvt s2, h2842; NONEON-NOSVE-NEXT: fcvt s3, h3843; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0844; NONEON-NOSVE-NEXT: fmaxnm s1, s3, s2845; NONEON-NOSVE-NEXT: ldr h2, [sp, #20]846; NONEON-NOSVE-NEXT: ldr h3, [sp, #4]847; NONEON-NOSVE-NEXT: fcvt s2, h2848; NONEON-NOSVE-NEXT: fcvt s3, h3849; NONEON-NOSVE-NEXT: fcvt h0, s0850; NONEON-NOSVE-NEXT: fcvt h1, s1851; NONEON-NOSVE-NEXT: fmaxnm s2, s3, s2852; NONEON-NOSVE-NEXT: ldr h3, [sp, #6]853; NONEON-NOSVE-NEXT: fcvt s0, h0854; NONEON-NOSVE-NEXT: fcvt s1, h1855; NONEON-NOSVE-NEXT: fcvt s3, h3856; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0857; NONEON-NOSVE-NEXT: fcvt h1, s2858; NONEON-NOSVE-NEXT: ldr h2, [sp, #22]859; NONEON-NOSVE-NEXT: fcvt s2, h2860; NONEON-NOSVE-NEXT: fcvt h0, s0861; NONEON-NOSVE-NEXT: fcvt s1, h1862; NONEON-NOSVE-NEXT: fmaxnm s2, s3, s2863; NONEON-NOSVE-NEXT: ldr h3, [sp, #8]864; NONEON-NOSVE-NEXT: fcvt s0, h0865; NONEON-NOSVE-NEXT: fcvt s3, h3866; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1867; NONEON-NOSVE-NEXT: fcvt h1, s2868; NONEON-NOSVE-NEXT: ldr h2, [sp, #24]869; NONEON-NOSVE-NEXT: fcvt s2, h2870; NONEON-NOSVE-NEXT: fcvt h0, s0871; NONEON-NOSVE-NEXT: fcvt s1, h1872; NONEON-NOSVE-NEXT: fmaxnm s2, s3, s2873; NONEON-NOSVE-NEXT: ldr h3, [sp, #10]874; NONEON-NOSVE-NEXT: fcvt s0, h0875; NONEON-NOSVE-NEXT: fcvt s3, h3876; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1877; NONEON-NOSVE-NEXT: fcvt h1, s2878; NONEON-NOSVE-NEXT: ldr h2, [sp, #26]879; NONEON-NOSVE-NEXT: fcvt s2, h2880; NONEON-NOSVE-NEXT: fcvt h0, s0881; NONEON-NOSVE-NEXT: fcvt s1, h1882; NONEON-NOSVE-NEXT: fmaxnm s2, s3, s2883; NONEON-NOSVE-NEXT: ldr h3, [sp, #12]884; NONEON-NOSVE-NEXT: fcvt s0, h0885; NONEON-NOSVE-NEXT: fcvt s3, h3886; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1887; NONEON-NOSVE-NEXT: fcvt h1, s2888; NONEON-NOSVE-NEXT: ldr h2, [sp, #28]889; NONEON-NOSVE-NEXT: fcvt s2, h2890; NONEON-NOSVE-NEXT: fcvt h0, s0891; NONEON-NOSVE-NEXT: fcvt s1, h1892; NONEON-NOSVE-NEXT: fcvt s0, h0893; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1894; NONEON-NOSVE-NEXT: fmaxnm s1, s3, s2895; NONEON-NOSVE-NEXT: ldr h2, [sp, #30]896; NONEON-NOSVE-NEXT: ldr h3, [sp, #14]897; NONEON-NOSVE-NEXT: fcvt s2, h2898; NONEON-NOSVE-NEXT: fcvt s3, h3899; NONEON-NOSVE-NEXT: fcvt h0, s0900; NONEON-NOSVE-NEXT: fcvt h1, s1901; NONEON-NOSVE-NEXT: fcvt s0, h0902; NONEON-NOSVE-NEXT: fcvt s1, h1903; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1904; NONEON-NOSVE-NEXT: fmaxnm s1, s3, s2905; NONEON-NOSVE-NEXT: fcvt h0, s0906; NONEON-NOSVE-NEXT: fcvt h1, s1907; NONEON-NOSVE-NEXT: fcvt s0, h0908; NONEON-NOSVE-NEXT: fcvt s1, h1909; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1910; NONEON-NOSVE-NEXT: fcvt h0, s0911; NONEON-NOSVE-NEXT: add sp, sp, #32912; NONEON-NOSVE-NEXT: ret913 %op = load <16 x half>, ptr %a914 %res = call half @llvm.vector.reduce.fmax.v16f16(<16 x half> %op)915 ret half %res916}917 918define float @fmaxv_v2f32(<2 x float> %a) {919; CHECK-LABEL: fmaxv_v2f32:920; CHECK: // %bb.0:921; CHECK-NEXT: ptrue p0.s, vl2922; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0923; CHECK-NEXT: fmaxnmv s0, p0, z0.s924; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0925; CHECK-NEXT: ret926;927; NONEON-NOSVE-LABEL: fmaxv_v2f32:928; NONEON-NOSVE: // %bb.0:929; NONEON-NOSVE-NEXT: sub sp, sp, #16930; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16931; NONEON-NOSVE-NEXT: str d0, [sp, #8]932; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #8]933; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0934; NONEON-NOSVE-NEXT: add sp, sp, #16935; NONEON-NOSVE-NEXT: ret936 %res = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %a)937 ret float %res938}939 940define float @fmaxv_v4f32(<4 x float> %a) {941; CHECK-LABEL: fmaxv_v4f32:942; CHECK: // %bb.0:943; CHECK-NEXT: ptrue p0.s, vl4944; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0945; CHECK-NEXT: fmaxnmv s0, p0, z0.s946; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0947; CHECK-NEXT: ret948;949; NONEON-NOSVE-LABEL: fmaxv_v4f32:950; NONEON-NOSVE: // %bb.0:951; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!952; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16953; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]954; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0955; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]956; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s2957; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1958; NONEON-NOSVE-NEXT: add sp, sp, #16959; NONEON-NOSVE-NEXT: ret960 %res = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %a)961 ret float %res962}963 964define float @fmaxv_v8f32(ptr %a) {965; CHECK-LABEL: fmaxv_v8f32:966; CHECK: // %bb.0:967; CHECK-NEXT: ldp q1, q0, [x0]968; CHECK-NEXT: ptrue p0.s, vl4969; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s970; CHECK-NEXT: fmaxnmv s0, p0, z0.s971; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0972; CHECK-NEXT: ret973;974; NONEON-NOSVE-LABEL: fmaxv_v8f32:975; NONEON-NOSVE: // %bb.0:976; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]977; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!978; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32979; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]980; NONEON-NOSVE-NEXT: ldp s3, s2, [sp]981; NONEON-NOSVE-NEXT: fmaxnm s0, s2, s0982; NONEON-NOSVE-NEXT: fmaxnm s1, s3, s1983; NONEON-NOSVE-NEXT: ldp s3, s4, [sp, #8]984; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0985; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #24]986; NONEON-NOSVE-NEXT: fmaxnm s2, s3, s2987; NONEON-NOSVE-NEXT: fmaxnm s1, s4, s1988; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s2989; NONEON-NOSVE-NEXT: fmaxnm s0, s0, s1990; NONEON-NOSVE-NEXT: add sp, sp, #32991; NONEON-NOSVE-NEXT: ret992 %op = load <8 x float>, ptr %a993 %res = call float @llvm.vector.reduce.fmax.v8f32(<8 x float> %op)994 ret float %res995}996 997define double @fmaxv_v1f64(<1 x double> %a) {998; CHECK-LABEL: fmaxv_v1f64:999; CHECK: // %bb.0:1000; CHECK-NEXT: ret1001;1002; NONEON-NOSVE-LABEL: fmaxv_v1f64:1003; NONEON-NOSVE: // %bb.0:1004; NONEON-NOSVE-NEXT: ret1005 %res = call double @llvm.vector.reduce.fmax.v1f64(<1 x double> %a)1006 ret double %res1007}1008 1009define double @fmaxv_v2f64(<2 x double> %a) {1010; CHECK-LABEL: fmaxv_v2f64:1011; CHECK: // %bb.0:1012; CHECK-NEXT: ptrue p0.d, vl21013; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01014; CHECK-NEXT: fmaxnmv d0, p0, z0.d1015; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01016; CHECK-NEXT: ret1017;1018; NONEON-NOSVE-LABEL: fmaxv_v2f64:1019; NONEON-NOSVE: // %bb.0:1020; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1021; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161022; NONEON-NOSVE-NEXT: ldp d1, d0, [sp], #161023; NONEON-NOSVE-NEXT: fmaxnm d0, d1, d01024; NONEON-NOSVE-NEXT: ret1025 %res = call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %a)1026 ret double %res1027}1028 1029define double @fmaxv_v4f64(ptr %a) {1030; CHECK-LABEL: fmaxv_v4f64:1031; CHECK: // %bb.0:1032; CHECK-NEXT: ldp q1, q0, [x0]1033; CHECK-NEXT: ptrue p0.d, vl21034; CHECK-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d1035; CHECK-NEXT: fmaxnmv d0, p0, z0.d1036; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01037; CHECK-NEXT: ret1038;1039; NONEON-NOSVE-LABEL: fmaxv_v4f64:1040; NONEON-NOSVE: // %bb.0:1041; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1042; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1043; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321044; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]1045; NONEON-NOSVE-NEXT: ldp d3, d2, [sp], #321046; NONEON-NOSVE-NEXT: fmaxnm d0, d2, d01047; NONEON-NOSVE-NEXT: fmaxnm d1, d3, d11048; NONEON-NOSVE-NEXT: fmaxnm d0, d1, d01049; NONEON-NOSVE-NEXT: ret1050 %op = load <4 x double>, ptr %a1051 %res = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %op)1052 ret double %res1053}1054 1055;1056; FMINNMV1057;1058 1059define half @fminv_v4f16(<4 x half> %a) {1060; CHECK-LABEL: fminv_v4f16:1061; CHECK: // %bb.0:1062; CHECK-NEXT: ptrue p0.h, vl41063; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01064; CHECK-NEXT: fminnmv h0, p0, z0.h1065; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01066; CHECK-NEXT: ret1067;1068; NONEON-NOSVE-LABEL: fminv_v4f16:1069; NONEON-NOSVE: // %bb.0:1070; NONEON-NOSVE-NEXT: sub sp, sp, #161071; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161072; NONEON-NOSVE-NEXT: str d0, [sp, #8]1073; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]1074; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1075; NONEON-NOSVE-NEXT: fcvt s1, h11076; NONEON-NOSVE-NEXT: fcvt s0, h01077; NONEON-NOSVE-NEXT: fminnm s0, s0, s11078; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1079; NONEON-NOSVE-NEXT: fcvt s1, h11080; NONEON-NOSVE-NEXT: fcvt h0, s01081; NONEON-NOSVE-NEXT: fcvt s0, h01082; NONEON-NOSVE-NEXT: fminnm s0, s0, s11083; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1084; NONEON-NOSVE-NEXT: fcvt s1, h11085; NONEON-NOSVE-NEXT: fcvt h0, s01086; NONEON-NOSVE-NEXT: fcvt s0, h01087; NONEON-NOSVE-NEXT: fminnm s0, s0, s11088; NONEON-NOSVE-NEXT: fcvt h0, s01089; NONEON-NOSVE-NEXT: add sp, sp, #161090; NONEON-NOSVE-NEXT: ret1091 %res = call half @llvm.vector.reduce.fmin.v4f16(<4 x half> %a)1092 ret half %res1093}1094 1095define half @fminv_v8f16(<8 x half> %a) {1096; CHECK-LABEL: fminv_v8f16:1097; CHECK: // %bb.0:1098; CHECK-NEXT: ptrue p0.h, vl81099; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01100; CHECK-NEXT: fminnmv h0, p0, z0.h1101; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01102; CHECK-NEXT: ret1103;1104; NONEON-NOSVE-LABEL: fminv_v8f16:1105; NONEON-NOSVE: // %bb.0:1106; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1107; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161108; NONEON-NOSVE-NEXT: ldr h0, [sp]1109; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1110; NONEON-NOSVE-NEXT: fcvt s1, h11111; NONEON-NOSVE-NEXT: fcvt s0, h01112; NONEON-NOSVE-NEXT: fminnm s0, s0, s11113; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]1114; NONEON-NOSVE-NEXT: fcvt s1, h11115; NONEON-NOSVE-NEXT: fcvt h0, s01116; NONEON-NOSVE-NEXT: fcvt s0, h01117; NONEON-NOSVE-NEXT: fminnm s0, s0, s11118; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]1119; NONEON-NOSVE-NEXT: fcvt s1, h11120; NONEON-NOSVE-NEXT: fcvt h0, s01121; NONEON-NOSVE-NEXT: fcvt s0, h01122; NONEON-NOSVE-NEXT: fminnm s0, s0, s11123; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1124; NONEON-NOSVE-NEXT: fcvt s1, h11125; NONEON-NOSVE-NEXT: fcvt h0, s01126; NONEON-NOSVE-NEXT: fcvt s0, h01127; NONEON-NOSVE-NEXT: fminnm s0, s0, s11128; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1129; NONEON-NOSVE-NEXT: fcvt s1, h11130; NONEON-NOSVE-NEXT: fcvt h0, s01131; NONEON-NOSVE-NEXT: fcvt s0, h01132; NONEON-NOSVE-NEXT: fminnm s0, s0, s11133; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1134; NONEON-NOSVE-NEXT: fcvt s1, h11135; NONEON-NOSVE-NEXT: fcvt h0, s01136; NONEON-NOSVE-NEXT: fcvt s0, h01137; NONEON-NOSVE-NEXT: fminnm s0, s0, s11138; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1139; NONEON-NOSVE-NEXT: fcvt s1, h11140; NONEON-NOSVE-NEXT: fcvt h0, s01141; NONEON-NOSVE-NEXT: fcvt s0, h01142; NONEON-NOSVE-NEXT: fminnm s0, s0, s11143; NONEON-NOSVE-NEXT: fcvt h0, s01144; NONEON-NOSVE-NEXT: add sp, sp, #161145; NONEON-NOSVE-NEXT: ret1146 %res = call half @llvm.vector.reduce.fmin.v8f16(<8 x half> %a)1147 ret half %res1148}1149 1150define half @fminv_v16f16(ptr %a) {1151; CHECK-LABEL: fminv_v16f16:1152; CHECK: // %bb.0:1153; CHECK-NEXT: ldp q1, q0, [x0]1154; CHECK-NEXT: ptrue p0.h, vl81155; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h1156; CHECK-NEXT: fminnmv h0, p0, z0.h1157; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01158; CHECK-NEXT: ret1159;1160; NONEON-NOSVE-LABEL: fminv_v16f16:1161; NONEON-NOSVE: // %bb.0:1162; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1163; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1164; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321165; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1166; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1167; NONEON-NOSVE-NEXT: ldr h2, [sp, #16]1168; NONEON-NOSVE-NEXT: ldr h3, [sp]1169; NONEON-NOSVE-NEXT: fcvt s0, h01170; NONEON-NOSVE-NEXT: fcvt s1, h11171; NONEON-NOSVE-NEXT: fcvt s2, h21172; NONEON-NOSVE-NEXT: fcvt s3, h31173; NONEON-NOSVE-NEXT: fminnm s0, s1, s01174; NONEON-NOSVE-NEXT: fminnm s1, s3, s21175; NONEON-NOSVE-NEXT: ldr h2, [sp, #20]1176; NONEON-NOSVE-NEXT: ldr h3, [sp, #4]1177; NONEON-NOSVE-NEXT: fcvt s2, h21178; NONEON-NOSVE-NEXT: fcvt s3, h31179; NONEON-NOSVE-NEXT: fcvt h0, s01180; NONEON-NOSVE-NEXT: fcvt h1, s11181; NONEON-NOSVE-NEXT: fminnm s2, s3, s21182; NONEON-NOSVE-NEXT: ldr h3, [sp, #6]1183; NONEON-NOSVE-NEXT: fcvt s0, h01184; NONEON-NOSVE-NEXT: fcvt s1, h11185; NONEON-NOSVE-NEXT: fcvt s3, h31186; NONEON-NOSVE-NEXT: fminnm s0, s1, s01187; NONEON-NOSVE-NEXT: fcvt h1, s21188; NONEON-NOSVE-NEXT: ldr h2, [sp, #22]1189; NONEON-NOSVE-NEXT: fcvt s2, h21190; NONEON-NOSVE-NEXT: fcvt h0, s01191; NONEON-NOSVE-NEXT: fcvt s1, h11192; NONEON-NOSVE-NEXT: fminnm s2, s3, s21193; NONEON-NOSVE-NEXT: ldr h3, [sp, #8]1194; NONEON-NOSVE-NEXT: fcvt s0, h01195; NONEON-NOSVE-NEXT: fcvt s3, h31196; NONEON-NOSVE-NEXT: fminnm s0, s0, s11197; NONEON-NOSVE-NEXT: fcvt h1, s21198; NONEON-NOSVE-NEXT: ldr h2, [sp, #24]1199; NONEON-NOSVE-NEXT: fcvt s2, h21200; NONEON-NOSVE-NEXT: fcvt h0, s01201; NONEON-NOSVE-NEXT: fcvt s1, h11202; NONEON-NOSVE-NEXT: fminnm s2, s3, s21203; NONEON-NOSVE-NEXT: ldr h3, [sp, #10]1204; NONEON-NOSVE-NEXT: fcvt s0, h01205; NONEON-NOSVE-NEXT: fcvt s3, h31206; NONEON-NOSVE-NEXT: fminnm s0, s0, s11207; NONEON-NOSVE-NEXT: fcvt h1, s21208; NONEON-NOSVE-NEXT: ldr h2, [sp, #26]1209; NONEON-NOSVE-NEXT: fcvt s2, h21210; NONEON-NOSVE-NEXT: fcvt h0, s01211; NONEON-NOSVE-NEXT: fcvt s1, h11212; NONEON-NOSVE-NEXT: fminnm s2, s3, s21213; NONEON-NOSVE-NEXT: ldr h3, [sp, #12]1214; NONEON-NOSVE-NEXT: fcvt s0, h01215; NONEON-NOSVE-NEXT: fcvt s3, h31216; NONEON-NOSVE-NEXT: fminnm s0, s0, s11217; NONEON-NOSVE-NEXT: fcvt h1, s21218; NONEON-NOSVE-NEXT: ldr h2, [sp, #28]1219; NONEON-NOSVE-NEXT: fcvt s2, h21220; NONEON-NOSVE-NEXT: fcvt h0, s01221; NONEON-NOSVE-NEXT: fcvt s1, h11222; NONEON-NOSVE-NEXT: fcvt s0, h01223; NONEON-NOSVE-NEXT: fminnm s0, s0, s11224; NONEON-NOSVE-NEXT: fminnm s1, s3, s21225; NONEON-NOSVE-NEXT: ldr h2, [sp, #30]1226; NONEON-NOSVE-NEXT: ldr h3, [sp, #14]1227; NONEON-NOSVE-NEXT: fcvt s2, h21228; NONEON-NOSVE-NEXT: fcvt s3, h31229; NONEON-NOSVE-NEXT: fcvt h0, s01230; NONEON-NOSVE-NEXT: fcvt h1, s11231; NONEON-NOSVE-NEXT: fcvt s0, h01232; NONEON-NOSVE-NEXT: fcvt s1, h11233; NONEON-NOSVE-NEXT: fminnm s0, s0, s11234; NONEON-NOSVE-NEXT: fminnm s1, s3, s21235; NONEON-NOSVE-NEXT: fcvt h0, s01236; NONEON-NOSVE-NEXT: fcvt h1, s11237; NONEON-NOSVE-NEXT: fcvt s0, h01238; NONEON-NOSVE-NEXT: fcvt s1, h11239; NONEON-NOSVE-NEXT: fminnm s0, s0, s11240; NONEON-NOSVE-NEXT: fcvt h0, s01241; NONEON-NOSVE-NEXT: add sp, sp, #321242; NONEON-NOSVE-NEXT: ret1243 %op = load <16 x half>, ptr %a1244 %res = call half @llvm.vector.reduce.fmin.v16f16(<16 x half> %op)1245 ret half %res1246}1247 1248define float @fminv_v2f32(<2 x float> %a) {1249; CHECK-LABEL: fminv_v2f32:1250; CHECK: // %bb.0:1251; CHECK-NEXT: ptrue p0.s, vl21252; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01253; CHECK-NEXT: fminnmv s0, p0, z0.s1254; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01255; CHECK-NEXT: ret1256;1257; NONEON-NOSVE-LABEL: fminv_v2f32:1258; NONEON-NOSVE: // %bb.0:1259; NONEON-NOSVE-NEXT: sub sp, sp, #161260; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161261; NONEON-NOSVE-NEXT: str d0, [sp, #8]1262; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #8]1263; NONEON-NOSVE-NEXT: fminnm s0, s1, s01264; NONEON-NOSVE-NEXT: add sp, sp, #161265; NONEON-NOSVE-NEXT: ret1266 %res = call float @llvm.vector.reduce.fmin.v2f32(<2 x float> %a)1267 ret float %res1268}1269 1270define float @fminv_v4f32(<4 x float> %a) {1271; CHECK-LABEL: fminv_v4f32:1272; CHECK: // %bb.0:1273; CHECK-NEXT: ptrue p0.s, vl41274; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01275; CHECK-NEXT: fminnmv s0, p0, z0.s1276; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01277; CHECK-NEXT: ret1278;1279; NONEON-NOSVE-LABEL: fminv_v4f32:1280; NONEON-NOSVE: // %bb.0:1281; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1282; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161283; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]1284; NONEON-NOSVE-NEXT: fminnm s0, s1, s01285; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]1286; NONEON-NOSVE-NEXT: fminnm s0, s0, s21287; NONEON-NOSVE-NEXT: fminnm s0, s0, s11288; NONEON-NOSVE-NEXT: add sp, sp, #161289; NONEON-NOSVE-NEXT: ret1290 %res = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %a)1291 ret float %res1292}1293 1294define float @fminv_v8f32(ptr %a) {1295; CHECK-LABEL: fminv_v8f32:1296; CHECK: // %bb.0:1297; CHECK-NEXT: ldp q1, q0, [x0]1298; CHECK-NEXT: ptrue p0.s, vl41299; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s1300; CHECK-NEXT: fminnmv s0, p0, z0.s1301; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01302; CHECK-NEXT: ret1303;1304; NONEON-NOSVE-LABEL: fminv_v8f32:1305; NONEON-NOSVE: // %bb.0:1306; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1307; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1308; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321309; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]1310; NONEON-NOSVE-NEXT: ldp s3, s2, [sp]1311; NONEON-NOSVE-NEXT: fminnm s0, s2, s01312; NONEON-NOSVE-NEXT: fminnm s1, s3, s11313; NONEON-NOSVE-NEXT: ldp s3, s4, [sp, #8]1314; NONEON-NOSVE-NEXT: fminnm s0, s1, s01315; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #24]1316; NONEON-NOSVE-NEXT: fminnm s2, s3, s21317; NONEON-NOSVE-NEXT: fminnm s1, s4, s11318; NONEON-NOSVE-NEXT: fminnm s0, s0, s21319; NONEON-NOSVE-NEXT: fminnm s0, s0, s11320; NONEON-NOSVE-NEXT: add sp, sp, #321321; NONEON-NOSVE-NEXT: ret1322 %op = load <8 x float>, ptr %a1323 %res = call float @llvm.vector.reduce.fmin.v8f32(<8 x float> %op)1324 ret float %res1325}1326 1327define double @fminv_v1f64(<1 x double> %a) {1328; CHECK-LABEL: fminv_v1f64:1329; CHECK: // %bb.0:1330; CHECK-NEXT: ret1331;1332; NONEON-NOSVE-LABEL: fminv_v1f64:1333; NONEON-NOSVE: // %bb.0:1334; NONEON-NOSVE-NEXT: ret1335 %res = call double @llvm.vector.reduce.fmin.v1f64(<1 x double> %a)1336 ret double %res1337}1338 1339define double @fminv_v2f64(<2 x double> %a) {1340; CHECK-LABEL: fminv_v2f64:1341; CHECK: // %bb.0:1342; CHECK-NEXT: ptrue p0.d, vl21343; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01344; CHECK-NEXT: fminnmv d0, p0, z0.d1345; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01346; CHECK-NEXT: ret1347;1348; NONEON-NOSVE-LABEL: fminv_v2f64:1349; NONEON-NOSVE: // %bb.0:1350; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1351; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161352; NONEON-NOSVE-NEXT: ldp d1, d0, [sp], #161353; NONEON-NOSVE-NEXT: fminnm d0, d1, d01354; NONEON-NOSVE-NEXT: ret1355 %res = call double @llvm.vector.reduce.fmin.v2f64(<2 x double> %a)1356 ret double %res1357}1358 1359define double @fminv_v4f64(ptr %a) {1360; CHECK-LABEL: fminv_v4f64:1361; CHECK: // %bb.0:1362; CHECK-NEXT: ldp q1, q0, [x0]1363; CHECK-NEXT: ptrue p0.d, vl21364; CHECK-NEXT: fminnm z0.d, p0/m, z0.d, z1.d1365; CHECK-NEXT: fminnmv d0, p0, z0.d1366; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01367; CHECK-NEXT: ret1368;1369; NONEON-NOSVE-LABEL: fminv_v4f64:1370; NONEON-NOSVE: // %bb.0:1371; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1372; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1373; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321374; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]1375; NONEON-NOSVE-NEXT: ldp d3, d2, [sp], #321376; NONEON-NOSVE-NEXT: fminnm d0, d2, d01377; NONEON-NOSVE-NEXT: fminnm d1, d3, d11378; NONEON-NOSVE-NEXT: fminnm d0, d1, d01379; NONEON-NOSVE-NEXT: ret1380 %op = load <4 x double>, ptr %a1381 %res = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %op)1382 ret double %res1383}1384 1385;1386; FMAXV1387;1388 1389define half @fmaximumv_v4f16(<4 x half> %a) {1390; CHECK-LABEL: fmaximumv_v4f16:1391; CHECK: // %bb.0:1392; CHECK-NEXT: ptrue p0.h, vl41393; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01394; CHECK-NEXT: fmaxv h0, p0, z0.h1395; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01396; CHECK-NEXT: ret1397;1398; NONEON-NOSVE-LABEL: fmaximumv_v4f16:1399; NONEON-NOSVE: // %bb.0:1400; NONEON-NOSVE-NEXT: sub sp, sp, #161401; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161402; NONEON-NOSVE-NEXT: str d0, [sp, #8]1403; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]1404; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1405; NONEON-NOSVE-NEXT: fcvt s1, h11406; NONEON-NOSVE-NEXT: fcvt s0, h01407; NONEON-NOSVE-NEXT: fmax s0, s0, s11408; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1409; NONEON-NOSVE-NEXT: fcvt s1, h11410; NONEON-NOSVE-NEXT: fcvt h0, s01411; NONEON-NOSVE-NEXT: fcvt s0, h01412; NONEON-NOSVE-NEXT: fmax s0, s0, s11413; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1414; NONEON-NOSVE-NEXT: fcvt s1, h11415; NONEON-NOSVE-NEXT: fcvt h0, s01416; NONEON-NOSVE-NEXT: fcvt s0, h01417; NONEON-NOSVE-NEXT: fmax s0, s0, s11418; NONEON-NOSVE-NEXT: fcvt h0, s01419; NONEON-NOSVE-NEXT: add sp, sp, #161420; NONEON-NOSVE-NEXT: ret1421 %res = call half @llvm.vector.reduce.fmaximum.v4f16(<4 x half> %a)1422 ret half %res1423}1424 1425define half @fmaximumv_v8f16(<8 x half> %a) {1426; CHECK-LABEL: fmaximumv_v8f16:1427; CHECK: // %bb.0:1428; CHECK-NEXT: ptrue p0.h, vl81429; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01430; CHECK-NEXT: fmaxv h0, p0, z0.h1431; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01432; CHECK-NEXT: ret1433;1434; NONEON-NOSVE-LABEL: fmaximumv_v8f16:1435; NONEON-NOSVE: // %bb.0:1436; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1437; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161438; NONEON-NOSVE-NEXT: ldr h0, [sp]1439; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1440; NONEON-NOSVE-NEXT: fcvt s1, h11441; NONEON-NOSVE-NEXT: fcvt s0, h01442; NONEON-NOSVE-NEXT: fmax s0, s0, s11443; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]1444; NONEON-NOSVE-NEXT: fcvt s1, h11445; NONEON-NOSVE-NEXT: fcvt h0, s01446; NONEON-NOSVE-NEXT: fcvt s0, h01447; NONEON-NOSVE-NEXT: fmax s0, s0, s11448; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]1449; NONEON-NOSVE-NEXT: fcvt s1, h11450; NONEON-NOSVE-NEXT: fcvt h0, s01451; NONEON-NOSVE-NEXT: fcvt s0, h01452; NONEON-NOSVE-NEXT: fmax s0, s0, s11453; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1454; NONEON-NOSVE-NEXT: fcvt s1, h11455; NONEON-NOSVE-NEXT: fcvt h0, s01456; NONEON-NOSVE-NEXT: fcvt s0, h01457; NONEON-NOSVE-NEXT: fmax s0, s0, s11458; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1459; NONEON-NOSVE-NEXT: fcvt s1, h11460; NONEON-NOSVE-NEXT: fcvt h0, s01461; NONEON-NOSVE-NEXT: fcvt s0, h01462; NONEON-NOSVE-NEXT: fmax s0, s0, s11463; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1464; NONEON-NOSVE-NEXT: fcvt s1, h11465; NONEON-NOSVE-NEXT: fcvt h0, s01466; NONEON-NOSVE-NEXT: fcvt s0, h01467; NONEON-NOSVE-NEXT: fmax s0, s0, s11468; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1469; NONEON-NOSVE-NEXT: fcvt s1, h11470; NONEON-NOSVE-NEXT: fcvt h0, s01471; NONEON-NOSVE-NEXT: fcvt s0, h01472; NONEON-NOSVE-NEXT: fmax s0, s0, s11473; NONEON-NOSVE-NEXT: fcvt h0, s01474; NONEON-NOSVE-NEXT: add sp, sp, #161475; NONEON-NOSVE-NEXT: ret1476 %res = call half @llvm.vector.reduce.fmaximum.v8f16(<8 x half> %a)1477 ret half %res1478}1479 1480define half @fmaximumv_v16f16(ptr %a) {1481; CHECK-LABEL: fmaximumv_v16f16:1482; CHECK: // %bb.0:1483; CHECK-NEXT: ldp q1, q0, [x0]1484; CHECK-NEXT: ptrue p0.h, vl81485; CHECK-NEXT: fmax z0.h, p0/m, z0.h, z1.h1486; CHECK-NEXT: fmaxv h0, p0, z0.h1487; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01488; CHECK-NEXT: ret1489;1490; NONEON-NOSVE-LABEL: fmaximumv_v16f16:1491; NONEON-NOSVE: // %bb.0:1492; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1493; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1494; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321495; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1496; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1497; NONEON-NOSVE-NEXT: ldr h2, [sp, #16]1498; NONEON-NOSVE-NEXT: ldr h3, [sp]1499; NONEON-NOSVE-NEXT: fcvt s0, h01500; NONEON-NOSVE-NEXT: fcvt s1, h11501; NONEON-NOSVE-NEXT: fcvt s2, h21502; NONEON-NOSVE-NEXT: fcvt s3, h31503; NONEON-NOSVE-NEXT: fmax s0, s1, s01504; NONEON-NOSVE-NEXT: fmax s1, s3, s21505; NONEON-NOSVE-NEXT: ldr h2, [sp, #20]1506; NONEON-NOSVE-NEXT: ldr h3, [sp, #4]1507; NONEON-NOSVE-NEXT: fcvt s2, h21508; NONEON-NOSVE-NEXT: fcvt s3, h31509; NONEON-NOSVE-NEXT: fcvt h0, s01510; NONEON-NOSVE-NEXT: fcvt h1, s11511; NONEON-NOSVE-NEXT: fmax s2, s3, s21512; NONEON-NOSVE-NEXT: ldr h3, [sp, #6]1513; NONEON-NOSVE-NEXT: fcvt s0, h01514; NONEON-NOSVE-NEXT: fcvt s1, h11515; NONEON-NOSVE-NEXT: fcvt s3, h31516; NONEON-NOSVE-NEXT: fmax s0, s1, s01517; NONEON-NOSVE-NEXT: fcvt h1, s21518; NONEON-NOSVE-NEXT: ldr h2, [sp, #22]1519; NONEON-NOSVE-NEXT: fcvt s2, h21520; NONEON-NOSVE-NEXT: fcvt h0, s01521; NONEON-NOSVE-NEXT: fcvt s1, h11522; NONEON-NOSVE-NEXT: fmax s2, s3, s21523; NONEON-NOSVE-NEXT: ldr h3, [sp, #8]1524; NONEON-NOSVE-NEXT: fcvt s0, h01525; NONEON-NOSVE-NEXT: fcvt s3, h31526; NONEON-NOSVE-NEXT: fmax s0, s0, s11527; NONEON-NOSVE-NEXT: fcvt h1, s21528; NONEON-NOSVE-NEXT: ldr h2, [sp, #24]1529; NONEON-NOSVE-NEXT: fcvt s2, h21530; NONEON-NOSVE-NEXT: fcvt h0, s01531; NONEON-NOSVE-NEXT: fcvt s1, h11532; NONEON-NOSVE-NEXT: fmax s2, s3, s21533; NONEON-NOSVE-NEXT: ldr h3, [sp, #10]1534; NONEON-NOSVE-NEXT: fcvt s0, h01535; NONEON-NOSVE-NEXT: fcvt s3, h31536; NONEON-NOSVE-NEXT: fmax s0, s0, s11537; NONEON-NOSVE-NEXT: fcvt h1, s21538; NONEON-NOSVE-NEXT: ldr h2, [sp, #26]1539; NONEON-NOSVE-NEXT: fcvt s2, h21540; NONEON-NOSVE-NEXT: fcvt h0, s01541; NONEON-NOSVE-NEXT: fcvt s1, h11542; NONEON-NOSVE-NEXT: fmax s2, s3, s21543; NONEON-NOSVE-NEXT: ldr h3, [sp, #12]1544; NONEON-NOSVE-NEXT: fcvt s0, h01545; NONEON-NOSVE-NEXT: fcvt s3, h31546; NONEON-NOSVE-NEXT: fmax s0, s0, s11547; NONEON-NOSVE-NEXT: fcvt h1, s21548; NONEON-NOSVE-NEXT: ldr h2, [sp, #28]1549; NONEON-NOSVE-NEXT: fcvt s2, h21550; NONEON-NOSVE-NEXT: fcvt h0, s01551; NONEON-NOSVE-NEXT: fcvt s1, h11552; NONEON-NOSVE-NEXT: fcvt s0, h01553; NONEON-NOSVE-NEXT: fmax s0, s0, s11554; NONEON-NOSVE-NEXT: fmax s1, s3, s21555; NONEON-NOSVE-NEXT: ldr h2, [sp, #30]1556; NONEON-NOSVE-NEXT: ldr h3, [sp, #14]1557; NONEON-NOSVE-NEXT: fcvt s2, h21558; NONEON-NOSVE-NEXT: fcvt s3, h31559; NONEON-NOSVE-NEXT: fcvt h0, s01560; NONEON-NOSVE-NEXT: fcvt h1, s11561; NONEON-NOSVE-NEXT: fcvt s0, h01562; NONEON-NOSVE-NEXT: fcvt s1, h11563; NONEON-NOSVE-NEXT: fmax s0, s0, s11564; NONEON-NOSVE-NEXT: fmax s1, s3, s21565; NONEON-NOSVE-NEXT: fcvt h0, s01566; NONEON-NOSVE-NEXT: fcvt h1, s11567; NONEON-NOSVE-NEXT: fcvt s0, h01568; NONEON-NOSVE-NEXT: fcvt s1, h11569; NONEON-NOSVE-NEXT: fmax s0, s0, s11570; NONEON-NOSVE-NEXT: fcvt h0, s01571; NONEON-NOSVE-NEXT: add sp, sp, #321572; NONEON-NOSVE-NEXT: ret1573 %op = load <16 x half>, ptr %a1574 %res = call half @llvm.vector.reduce.fmaximum.v16f16(<16 x half> %op)1575 ret half %res1576}1577 1578define float @fmaximumv_v2f32(<2 x float> %a) {1579; CHECK-LABEL: fmaximumv_v2f32:1580; CHECK: // %bb.0:1581; CHECK-NEXT: ptrue p0.s, vl21582; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01583; CHECK-NEXT: fmaxv s0, p0, z0.s1584; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01585; CHECK-NEXT: ret1586;1587; NONEON-NOSVE-LABEL: fmaximumv_v2f32:1588; NONEON-NOSVE: // %bb.0:1589; NONEON-NOSVE-NEXT: sub sp, sp, #161590; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161591; NONEON-NOSVE-NEXT: str d0, [sp, #8]1592; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #8]1593; NONEON-NOSVE-NEXT: fmax s0, s1, s01594; NONEON-NOSVE-NEXT: add sp, sp, #161595; NONEON-NOSVE-NEXT: ret1596 %res = call float @llvm.vector.reduce.fmaximum.v2f32(<2 x float> %a)1597 ret float %res1598}1599 1600define float @fmaximumv_v4f32(<4 x float> %a) {1601; CHECK-LABEL: fmaximumv_v4f32:1602; CHECK: // %bb.0:1603; CHECK-NEXT: ptrue p0.s, vl41604; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01605; CHECK-NEXT: fmaxv s0, p0, z0.s1606; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01607; CHECK-NEXT: ret1608;1609; NONEON-NOSVE-LABEL: fmaximumv_v4f32:1610; NONEON-NOSVE: // %bb.0:1611; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1612; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161613; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]1614; NONEON-NOSVE-NEXT: fmax s0, s1, s01615; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]1616; NONEON-NOSVE-NEXT: fmax s0, s0, s21617; NONEON-NOSVE-NEXT: fmax s0, s0, s11618; NONEON-NOSVE-NEXT: add sp, sp, #161619; NONEON-NOSVE-NEXT: ret1620 %res = call float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %a)1621 ret float %res1622}1623 1624define float @fmaximumv_v8f32(ptr %a) {1625; CHECK-LABEL: fmaximumv_v8f32:1626; CHECK: // %bb.0:1627; CHECK-NEXT: ldp q1, q0, [x0]1628; CHECK-NEXT: ptrue p0.s, vl41629; CHECK-NEXT: fmax z0.s, p0/m, z0.s, z1.s1630; CHECK-NEXT: fmaxv s0, p0, z0.s1631; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01632; CHECK-NEXT: ret1633;1634; NONEON-NOSVE-LABEL: fmaximumv_v8f32:1635; NONEON-NOSVE: // %bb.0:1636; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1637; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1638; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321639; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]1640; NONEON-NOSVE-NEXT: ldp s3, s2, [sp]1641; NONEON-NOSVE-NEXT: fmax s0, s2, s01642; NONEON-NOSVE-NEXT: fmax s1, s3, s11643; NONEON-NOSVE-NEXT: ldp s3, s4, [sp, #8]1644; NONEON-NOSVE-NEXT: fmax s0, s1, s01645; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #24]1646; NONEON-NOSVE-NEXT: fmax s2, s3, s21647; NONEON-NOSVE-NEXT: fmax s1, s4, s11648; NONEON-NOSVE-NEXT: fmax s0, s0, s21649; NONEON-NOSVE-NEXT: fmax s0, s0, s11650; NONEON-NOSVE-NEXT: add sp, sp, #321651; NONEON-NOSVE-NEXT: ret1652 %op = load <8 x float>, ptr %a1653 %res = call float @llvm.vector.reduce.fmaximum.v8f32(<8 x float> %op)1654 ret float %res1655}1656 1657define double @fmaximumv_v1f64(<1 x double> %a) {1658; CHECK-LABEL: fmaximumv_v1f64:1659; CHECK: // %bb.0:1660; CHECK-NEXT: ret1661;1662; NONEON-NOSVE-LABEL: fmaximumv_v1f64:1663; NONEON-NOSVE: // %bb.0:1664; NONEON-NOSVE-NEXT: ret1665 %res = call double @llvm.vector.reduce.fmaximum.v1f64(<1 x double> %a)1666 ret double %res1667}1668 1669define double @fmaximumv_v2f64(<2 x double> %a) {1670; CHECK-LABEL: fmaximumv_v2f64:1671; CHECK: // %bb.0:1672; CHECK-NEXT: ptrue p0.d, vl21673; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01674; CHECK-NEXT: fmaxv d0, p0, z0.d1675; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01676; CHECK-NEXT: ret1677;1678; NONEON-NOSVE-LABEL: fmaximumv_v2f64:1679; NONEON-NOSVE: // %bb.0:1680; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1681; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161682; NONEON-NOSVE-NEXT: ldp d1, d0, [sp], #161683; NONEON-NOSVE-NEXT: fmax d0, d1, d01684; NONEON-NOSVE-NEXT: ret1685 %res = call double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %a)1686 ret double %res1687}1688 1689define double @fmaximumv_v4f64(ptr %a) {1690; CHECK-LABEL: fmaximumv_v4f64:1691; CHECK: // %bb.0:1692; CHECK-NEXT: ldp q1, q0, [x0]1693; CHECK-NEXT: ptrue p0.d, vl21694; CHECK-NEXT: fmax z0.d, p0/m, z0.d, z1.d1695; CHECK-NEXT: fmaxv d0, p0, z0.d1696; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01697; CHECK-NEXT: ret1698;1699; NONEON-NOSVE-LABEL: fmaximumv_v4f64:1700; NONEON-NOSVE: // %bb.0:1701; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1702; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1703; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321704; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]1705; NONEON-NOSVE-NEXT: ldp d3, d2, [sp], #321706; NONEON-NOSVE-NEXT: fmax d0, d2, d01707; NONEON-NOSVE-NEXT: fmax d1, d3, d11708; NONEON-NOSVE-NEXT: fmax d0, d1, d01709; NONEON-NOSVE-NEXT: ret1710 %op = load <4 x double>, ptr %a1711 %res = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %op)1712 ret double %res1713}1714 1715;1716; FMINV1717;1718 1719define half @fminimumv_v4f16(<4 x half> %a) {1720; CHECK-LABEL: fminimumv_v4f16:1721; CHECK: // %bb.0:1722; CHECK-NEXT: ptrue p0.h, vl41723; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01724; CHECK-NEXT: fminv h0, p0, z0.h1725; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01726; CHECK-NEXT: ret1727;1728; NONEON-NOSVE-LABEL: fminimumv_v4f16:1729; NONEON-NOSVE: // %bb.0:1730; NONEON-NOSVE-NEXT: sub sp, sp, #161731; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161732; NONEON-NOSVE-NEXT: str d0, [sp, #8]1733; NONEON-NOSVE-NEXT: ldr h0, [sp, #8]1734; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1735; NONEON-NOSVE-NEXT: fcvt s1, h11736; NONEON-NOSVE-NEXT: fcvt s0, h01737; NONEON-NOSVE-NEXT: fmin s0, s0, s11738; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1739; NONEON-NOSVE-NEXT: fcvt s1, h11740; NONEON-NOSVE-NEXT: fcvt h0, s01741; NONEON-NOSVE-NEXT: fcvt s0, h01742; NONEON-NOSVE-NEXT: fmin s0, s0, s11743; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1744; NONEON-NOSVE-NEXT: fcvt s1, h11745; NONEON-NOSVE-NEXT: fcvt h0, s01746; NONEON-NOSVE-NEXT: fcvt s0, h01747; NONEON-NOSVE-NEXT: fmin s0, s0, s11748; NONEON-NOSVE-NEXT: fcvt h0, s01749; NONEON-NOSVE-NEXT: add sp, sp, #161750; NONEON-NOSVE-NEXT: ret1751 %res = call half @llvm.vector.reduce.fminimum.v4f16(<4 x half> %a)1752 ret half %res1753}1754 1755define half @fminimumv_v8f16(<8 x half> %a) {1756; CHECK-LABEL: fminimumv_v8f16:1757; CHECK: // %bb.0:1758; CHECK-NEXT: ptrue p0.h, vl81759; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01760; CHECK-NEXT: fminv h0, p0, z0.h1761; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01762; CHECK-NEXT: ret1763;1764; NONEON-NOSVE-LABEL: fminimumv_v8f16:1765; NONEON-NOSVE: // %bb.0:1766; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1767; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161768; NONEON-NOSVE-NEXT: ldr h0, [sp]1769; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1770; NONEON-NOSVE-NEXT: fcvt s1, h11771; NONEON-NOSVE-NEXT: fcvt s0, h01772; NONEON-NOSVE-NEXT: fmin s0, s0, s11773; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]1774; NONEON-NOSVE-NEXT: fcvt s1, h11775; NONEON-NOSVE-NEXT: fcvt h0, s01776; NONEON-NOSVE-NEXT: fcvt s0, h01777; NONEON-NOSVE-NEXT: fmin s0, s0, s11778; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]1779; NONEON-NOSVE-NEXT: fcvt s1, h11780; NONEON-NOSVE-NEXT: fcvt h0, s01781; NONEON-NOSVE-NEXT: fcvt s0, h01782; NONEON-NOSVE-NEXT: fmin s0, s0, s11783; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]1784; NONEON-NOSVE-NEXT: fcvt s1, h11785; NONEON-NOSVE-NEXT: fcvt h0, s01786; NONEON-NOSVE-NEXT: fcvt s0, h01787; NONEON-NOSVE-NEXT: fmin s0, s0, s11788; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]1789; NONEON-NOSVE-NEXT: fcvt s1, h11790; NONEON-NOSVE-NEXT: fcvt h0, s01791; NONEON-NOSVE-NEXT: fcvt s0, h01792; NONEON-NOSVE-NEXT: fmin s0, s0, s11793; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]1794; NONEON-NOSVE-NEXT: fcvt s1, h11795; NONEON-NOSVE-NEXT: fcvt h0, s01796; NONEON-NOSVE-NEXT: fcvt s0, h01797; NONEON-NOSVE-NEXT: fmin s0, s0, s11798; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]1799; NONEON-NOSVE-NEXT: fcvt s1, h11800; NONEON-NOSVE-NEXT: fcvt h0, s01801; NONEON-NOSVE-NEXT: fcvt s0, h01802; NONEON-NOSVE-NEXT: fmin s0, s0, s11803; NONEON-NOSVE-NEXT: fcvt h0, s01804; NONEON-NOSVE-NEXT: add sp, sp, #161805; NONEON-NOSVE-NEXT: ret1806 %res = call half @llvm.vector.reduce.fminimum.v8f16(<8 x half> %a)1807 ret half %res1808}1809 1810define half @fminimumv_v16f16(ptr %a) {1811; CHECK-LABEL: fminimumv_v16f16:1812; CHECK: // %bb.0:1813; CHECK-NEXT: ldp q1, q0, [x0]1814; CHECK-NEXT: ptrue p0.h, vl81815; CHECK-NEXT: fmin z0.h, p0/m, z0.h, z1.h1816; CHECK-NEXT: fminv h0, p0, z0.h1817; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z01818; CHECK-NEXT: ret1819;1820; NONEON-NOSVE-LABEL: fminimumv_v16f16:1821; NONEON-NOSVE: // %bb.0:1822; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1823; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1824; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321825; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]1826; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]1827; NONEON-NOSVE-NEXT: ldr h2, [sp, #16]1828; NONEON-NOSVE-NEXT: ldr h3, [sp]1829; NONEON-NOSVE-NEXT: fcvt s0, h01830; NONEON-NOSVE-NEXT: fcvt s1, h11831; NONEON-NOSVE-NEXT: fcvt s2, h21832; NONEON-NOSVE-NEXT: fcvt s3, h31833; NONEON-NOSVE-NEXT: fmin s0, s1, s01834; NONEON-NOSVE-NEXT: fmin s1, s3, s21835; NONEON-NOSVE-NEXT: ldr h2, [sp, #20]1836; NONEON-NOSVE-NEXT: ldr h3, [sp, #4]1837; NONEON-NOSVE-NEXT: fcvt s2, h21838; NONEON-NOSVE-NEXT: fcvt s3, h31839; NONEON-NOSVE-NEXT: fcvt h0, s01840; NONEON-NOSVE-NEXT: fcvt h1, s11841; NONEON-NOSVE-NEXT: fmin s2, s3, s21842; NONEON-NOSVE-NEXT: ldr h3, [sp, #6]1843; NONEON-NOSVE-NEXT: fcvt s0, h01844; NONEON-NOSVE-NEXT: fcvt s1, h11845; NONEON-NOSVE-NEXT: fcvt s3, h31846; NONEON-NOSVE-NEXT: fmin s0, s1, s01847; NONEON-NOSVE-NEXT: fcvt h1, s21848; NONEON-NOSVE-NEXT: ldr h2, [sp, #22]1849; NONEON-NOSVE-NEXT: fcvt s2, h21850; NONEON-NOSVE-NEXT: fcvt h0, s01851; NONEON-NOSVE-NEXT: fcvt s1, h11852; NONEON-NOSVE-NEXT: fmin s2, s3, s21853; NONEON-NOSVE-NEXT: ldr h3, [sp, #8]1854; NONEON-NOSVE-NEXT: fcvt s0, h01855; NONEON-NOSVE-NEXT: fcvt s3, h31856; NONEON-NOSVE-NEXT: fmin s0, s0, s11857; NONEON-NOSVE-NEXT: fcvt h1, s21858; NONEON-NOSVE-NEXT: ldr h2, [sp, #24]1859; NONEON-NOSVE-NEXT: fcvt s2, h21860; NONEON-NOSVE-NEXT: fcvt h0, s01861; NONEON-NOSVE-NEXT: fcvt s1, h11862; NONEON-NOSVE-NEXT: fmin s2, s3, s21863; NONEON-NOSVE-NEXT: ldr h3, [sp, #10]1864; NONEON-NOSVE-NEXT: fcvt s0, h01865; NONEON-NOSVE-NEXT: fcvt s3, h31866; NONEON-NOSVE-NEXT: fmin s0, s0, s11867; NONEON-NOSVE-NEXT: fcvt h1, s21868; NONEON-NOSVE-NEXT: ldr h2, [sp, #26]1869; NONEON-NOSVE-NEXT: fcvt s2, h21870; NONEON-NOSVE-NEXT: fcvt h0, s01871; NONEON-NOSVE-NEXT: fcvt s1, h11872; NONEON-NOSVE-NEXT: fmin s2, s3, s21873; NONEON-NOSVE-NEXT: ldr h3, [sp, #12]1874; NONEON-NOSVE-NEXT: fcvt s0, h01875; NONEON-NOSVE-NEXT: fcvt s3, h31876; NONEON-NOSVE-NEXT: fmin s0, s0, s11877; NONEON-NOSVE-NEXT: fcvt h1, s21878; NONEON-NOSVE-NEXT: ldr h2, [sp, #28]1879; NONEON-NOSVE-NEXT: fcvt s2, h21880; NONEON-NOSVE-NEXT: fcvt h0, s01881; NONEON-NOSVE-NEXT: fcvt s1, h11882; NONEON-NOSVE-NEXT: fcvt s0, h01883; NONEON-NOSVE-NEXT: fmin s0, s0, s11884; NONEON-NOSVE-NEXT: fmin s1, s3, s21885; NONEON-NOSVE-NEXT: ldr h2, [sp, #30]1886; NONEON-NOSVE-NEXT: ldr h3, [sp, #14]1887; NONEON-NOSVE-NEXT: fcvt s2, h21888; NONEON-NOSVE-NEXT: fcvt s3, h31889; NONEON-NOSVE-NEXT: fcvt h0, s01890; NONEON-NOSVE-NEXT: fcvt h1, s11891; NONEON-NOSVE-NEXT: fcvt s0, h01892; NONEON-NOSVE-NEXT: fcvt s1, h11893; NONEON-NOSVE-NEXT: fmin s0, s0, s11894; NONEON-NOSVE-NEXT: fmin s1, s3, s21895; NONEON-NOSVE-NEXT: fcvt h0, s01896; NONEON-NOSVE-NEXT: fcvt h1, s11897; NONEON-NOSVE-NEXT: fcvt s0, h01898; NONEON-NOSVE-NEXT: fcvt s1, h11899; NONEON-NOSVE-NEXT: fmin s0, s0, s11900; NONEON-NOSVE-NEXT: fcvt h0, s01901; NONEON-NOSVE-NEXT: add sp, sp, #321902; NONEON-NOSVE-NEXT: ret1903 %op = load <16 x half>, ptr %a1904 %res = call half @llvm.vector.reduce.fminimum.v16f16(<16 x half> %op)1905 ret half %res1906}1907 1908define float @fminimumv_v2f32(<2 x float> %a) {1909; CHECK-LABEL: fminimumv_v2f32:1910; CHECK: // %bb.0:1911; CHECK-NEXT: ptrue p0.s, vl21912; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01913; CHECK-NEXT: fminv s0, p0, z0.s1914; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01915; CHECK-NEXT: ret1916;1917; NONEON-NOSVE-LABEL: fminimumv_v2f32:1918; NONEON-NOSVE: // %bb.0:1919; NONEON-NOSVE-NEXT: sub sp, sp, #161920; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161921; NONEON-NOSVE-NEXT: str d0, [sp, #8]1922; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #8]1923; NONEON-NOSVE-NEXT: fmin s0, s1, s01924; NONEON-NOSVE-NEXT: add sp, sp, #161925; NONEON-NOSVE-NEXT: ret1926 %res = call float @llvm.vector.reduce.fminimum.v2f32(<2 x float> %a)1927 ret float %res1928}1929 1930define float @fminimumv_v4f32(<4 x float> %a) {1931; CHECK-LABEL: fminimumv_v4f32:1932; CHECK: // %bb.0:1933; CHECK-NEXT: ptrue p0.s, vl41934; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01935; CHECK-NEXT: fminv s0, p0, z0.s1936; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01937; CHECK-NEXT: ret1938;1939; NONEON-NOSVE-LABEL: fminimumv_v4f32:1940; NONEON-NOSVE: // %bb.0:1941; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!1942; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161943; NONEON-NOSVE-NEXT: ldp s1, s0, [sp]1944; NONEON-NOSVE-NEXT: fmin s0, s1, s01945; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #8]1946; NONEON-NOSVE-NEXT: fmin s0, s0, s21947; NONEON-NOSVE-NEXT: fmin s0, s0, s11948; NONEON-NOSVE-NEXT: add sp, sp, #161949; NONEON-NOSVE-NEXT: ret1950 %res = call float @llvm.vector.reduce.fminimum.v4f32(<4 x float> %a)1951 ret float %res1952}1953 1954define float @fminimumv_v8f32(ptr %a) {1955; CHECK-LABEL: fminimumv_v8f32:1956; CHECK: // %bb.0:1957; CHECK-NEXT: ldp q1, q0, [x0]1958; CHECK-NEXT: ptrue p0.s, vl41959; CHECK-NEXT: fmin z0.s, p0/m, z0.s, z1.s1960; CHECK-NEXT: fminv s0, p0, z0.s1961; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z01962; CHECK-NEXT: ret1963;1964; NONEON-NOSVE-LABEL: fminimumv_v8f32:1965; NONEON-NOSVE: // %bb.0:1966; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1967; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!1968; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321969; NONEON-NOSVE-NEXT: ldp s1, s0, [sp, #16]1970; NONEON-NOSVE-NEXT: ldp s3, s2, [sp]1971; NONEON-NOSVE-NEXT: fmin s0, s2, s01972; NONEON-NOSVE-NEXT: fmin s1, s3, s11973; NONEON-NOSVE-NEXT: ldp s3, s4, [sp, #8]1974; NONEON-NOSVE-NEXT: fmin s0, s1, s01975; NONEON-NOSVE-NEXT: ldp s2, s1, [sp, #24]1976; NONEON-NOSVE-NEXT: fmin s2, s3, s21977; NONEON-NOSVE-NEXT: fmin s1, s4, s11978; NONEON-NOSVE-NEXT: fmin s0, s0, s21979; NONEON-NOSVE-NEXT: fmin s0, s0, s11980; NONEON-NOSVE-NEXT: add sp, sp, #321981; NONEON-NOSVE-NEXT: ret1982 %op = load <8 x float>, ptr %a1983 %res = call float @llvm.vector.reduce.fminimum.v8f32(<8 x float> %op)1984 ret float %res1985}1986 1987define double @fminimumv_v1f64(<1 x double> %a) {1988; CHECK-LABEL: fminimumv_v1f64:1989; CHECK: // %bb.0:1990; CHECK-NEXT: ret1991;1992; NONEON-NOSVE-LABEL: fminimumv_v1f64:1993; NONEON-NOSVE: // %bb.0:1994; NONEON-NOSVE-NEXT: ret1995 %res = call double @llvm.vector.reduce.fminimum.v1f64(<1 x double> %a)1996 ret double %res1997}1998 1999define double @fminimumv_v2f64(<2 x double> %a) {2000; CHECK-LABEL: fminimumv_v2f64:2001; CHECK: // %bb.0:2002; CHECK-NEXT: ptrue p0.d, vl22003; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02004; CHECK-NEXT: fminv d0, p0, z0.d2005; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02006; CHECK-NEXT: ret2007;2008; NONEON-NOSVE-LABEL: fminimumv_v2f64:2009; NONEON-NOSVE: // %bb.0:2010; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!2011; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162012; NONEON-NOSVE-NEXT: ldp d1, d0, [sp], #162013; NONEON-NOSVE-NEXT: fmin d0, d1, d02014; NONEON-NOSVE-NEXT: ret2015 %res = call double @llvm.vector.reduce.fminimum.v2f64(<2 x double> %a)2016 ret double %res2017}2018 2019define double @fminimumv_v4f64(ptr %a) {2020; CHECK-LABEL: fminimumv_v4f64:2021; CHECK: // %bb.0:2022; CHECK-NEXT: ldp q1, q0, [x0]2023; CHECK-NEXT: ptrue p0.d, vl22024; CHECK-NEXT: fmin z0.d, p0/m, z0.d, z1.d2025; CHECK-NEXT: fminv d0, p0, z0.d2026; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02027; CHECK-NEXT: ret2028;2029; NONEON-NOSVE-LABEL: fminimumv_v4f64:2030; NONEON-NOSVE: // %bb.0:2031; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2032; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-32]!2033; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322034; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]2035; NONEON-NOSVE-NEXT: ldp d3, d2, [sp], #322036; NONEON-NOSVE-NEXT: fmin d0, d2, d02037; NONEON-NOSVE-NEXT: fmin d1, d3, d12038; NONEON-NOSVE-NEXT: fmin d0, d1, d02039; NONEON-NOSVE-NEXT: ret2040 %op = load <4 x double>, ptr %a2041 %res = call double @llvm.vector.reduce.fminimum.v4f64(<4 x double> %op)2042 ret double %res2043}2044 2045declare half @llvm.vector.reduce.fadd.v4f16(half, <4 x half>)2046declare half @llvm.vector.reduce.fadd.v8f16(half, <8 x half>)2047declare half @llvm.vector.reduce.fadd.v16f16(half, <16 x half>)2048 2049declare float @llvm.vector.reduce.fadd.v2f32(float, <2 x float>)2050declare float @llvm.vector.reduce.fadd.v4f32(float, <4 x float>)2051declare float @llvm.vector.reduce.fadd.v8f32(float, <8 x float>)2052 2053declare double @llvm.vector.reduce.fadd.v1f64(double, <1 x double>)2054declare double @llvm.vector.reduce.fadd.v2f64(double, <2 x double>)2055declare double @llvm.vector.reduce.fadd.v4f64(double, <4 x double>)2056 2057declare half @llvm.vector.reduce.fmax.v4f16(<4 x half>)2058declare half @llvm.vector.reduce.fmax.v8f16(<8 x half>)2059declare half @llvm.vector.reduce.fmax.v16f16(<16 x half>)2060 2061declare float @llvm.vector.reduce.fmax.v2f32(<2 x float>)2062declare float @llvm.vector.reduce.fmax.v4f32(<4 x float>)2063declare float @llvm.vector.reduce.fmax.v8f32(<8 x float>)2064 2065declare double @llvm.vector.reduce.fmax.v1f64(<1 x double>)2066declare double @llvm.vector.reduce.fmax.v2f64(<2 x double>)2067declare double @llvm.vector.reduce.fmax.v4f64(<4 x double>)2068 2069declare half @llvm.vector.reduce.fmin.v4f16(<4 x half>)2070declare half @llvm.vector.reduce.fmin.v8f16(<8 x half>)2071declare half @llvm.vector.reduce.fmin.v16f16(<16 x half>)2072 2073declare float @llvm.vector.reduce.fmin.v2f32(<2 x float>)2074declare float @llvm.vector.reduce.fmin.v4f32(<4 x float>)2075declare float @llvm.vector.reduce.fmin.v8f32(<8 x float>)2076 2077declare double @llvm.vector.reduce.fmin.v1f64(<1 x double>)2078declare double @llvm.vector.reduce.fmin.v2f64(<2 x double>)2079declare double @llvm.vector.reduce.fmin.v4f64(<4 x double>)2080 2081declare half @llvm.vector.reduce.fmaximum.v4f16(<4 x half>)2082declare half @llvm.vector.reduce.fmaximum.v8f16(<8 x half>)2083declare half @llvm.vector.reduce.fmaximum.v16f16(<16 x half>)2084 2085declare float @llvm.vector.reduce.fmaximum.v2f32(<2 x float>)2086declare float @llvm.vector.reduce.fmaximum.v4f32(<4 x float>)2087declare float @llvm.vector.reduce.fmaximum.v8f32(<8 x float>)2088 2089declare double @llvm.vector.reduce.fmaximum.v1f64(<1 x double>)2090declare double @llvm.vector.reduce.fmaximum.v2f64(<2 x double>)2091declare double @llvm.vector.reduce.fmaximum.v4f64(<4 x double>)2092 2093declare half @llvm.vector.reduce.fminimum.v4f16(<4 x half>)2094declare half @llvm.vector.reduce.fminimum.v8f16(<8 x half>)2095declare half @llvm.vector.reduce.fminimum.v16f16(<16 x half>)2096 2097declare float @llvm.vector.reduce.fminimum.v2f32(<2 x float>)2098declare float @llvm.vector.reduce.fminimum.v4f32(<4 x float>)2099declare float @llvm.vector.reduce.fminimum.v8f32(<8 x float>)2100 2101declare double @llvm.vector.reduce.fminimum.v1f64(<1 x double>)2102declare double @llvm.vector.reduce.fminimum.v2f64(<2 x double>)2103declare double @llvm.vector.reduce.fminimum.v4f64(<4 x double>)2104