2242 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=aarch64 --mattr=+fullfp16 < %s | FileCheck %s --check-prefixes=AARCH64,FULLFP163; RUN: llc --mtriple=aarch64 < %s | FileCheck %s --check-prefixes=AARCH64,NOFULLFP164 5;;;;;;;;;;;;;;;; max_f646define double @max_nnan_f64(double %a, double %b) {7; AARCH64-LABEL: max_nnan_f64:8; AARCH64: // %bb.0: // %entry9; AARCH64-NEXT: fmaxnm d0, d0, d110; AARCH64-NEXT: ret11entry:12 %c = call nnan double @llvm.maximumnum.f64(double %a, double %b)13 ret double %c14}15 16define <2 x double> @max_nnan_v2f64(<2 x double> %a, <2 x double> %b) {17; AARCH64-LABEL: max_nnan_v2f64:18; AARCH64: // %bb.0: // %entry19; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d20; AARCH64-NEXT: ret21entry:22 %c = call nnan <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b)23 ret <2 x double> %c24}25 26define <3 x double> @max_nnan_v3f64(<3 x double> %a, <3 x double> %b) {27; AARCH64-LABEL: max_nnan_v3f64:28; AARCH64: // %bb.0: // %entry29; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q330; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q031; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q432; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q133; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q234; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q535; AARCH64-NEXT: mov v3.d[1], v4.d[0]36; AARCH64-NEXT: mov v0.d[1], v1.d[0]37; AARCH64-NEXT: fmaxnm v2.2d, v2.2d, v5.2d38; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q239; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v3.2d40; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #841; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q042; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q143; AARCH64-NEXT: ret44entry:45 %c = call nnan <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b)46 ret <3 x double> %c47}48 49define <4 x double> @max_nnan_v4f64(<4 x double> %a, <4 x double> %b) {50; AARCH64-LABEL: max_nnan_v4f64:51; AARCH64: // %bb.0: // %entry52; AARCH64-NEXT: fmaxnm v1.2d, v1.2d, v3.2d53; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v2.2d54; AARCH64-NEXT: ret55entry:56 %c = call nnan <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b)57 ret <4 x double> %c58}59 60;;;;;;;;;;;;;;;;;; max_f3261define float @max_nnan_f32(float %a, float %b) {62; AARCH64-LABEL: max_nnan_f32:63; AARCH64: // %bb.0: // %entry64; AARCH64-NEXT: fmaxnm s0, s0, s165; AARCH64-NEXT: ret66entry:67 %c = call nnan float @llvm.maximumnum.f32(float %a, float %b)68 ret float %c69}70 71define <2 x float> @max_nnan_v2f32(<2 x float> %a, <2 x float> %b) {72; AARCH64-LABEL: max_nnan_v2f32:73; AARCH64: // %bb.0: // %entry74; AARCH64-NEXT: fmaxnm v0.2s, v0.2s, v1.2s75; AARCH64-NEXT: ret76entry:77 %c = call nnan <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b)78 ret <2 x float> %c79}80 81define <3 x float> @max_nnan_v3f32(<3 x float> %a, <3 x float> %b) {82; AARCH64-LABEL: max_nnan_v3f32:83; AARCH64: // %bb.0: // %entry84; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s85; AARCH64-NEXT: ret86entry:87 %c = call nnan <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b)88 ret <3 x float> %c89}90 91define <4 x float> @max_nnan_v4f32(<4 x float> %a, <4 x float> %b) {92; AARCH64-LABEL: max_nnan_v4f32:93; AARCH64: // %bb.0: // %entry94; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s95; AARCH64-NEXT: ret96entry:97 %c = call nnan <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b)98 ret <4 x float> %c99}100 101define <5 x float> @max_nnan_v5f32(<5 x float> %a, <5 x float> %b) {102; AARCH64-LABEL: max_nnan_v5f32:103; AARCH64: // %bb.0: // %entry104; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0105; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5106; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1107; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6108; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2109; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7110; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3111; AARCH64-NEXT: mov x8, sp112; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4113; AARCH64-NEXT: mov v0.s[1], v1.s[0]114; AARCH64-NEXT: mov v5.s[1], v6.s[0]115; AARCH64-NEXT: mov v0.s[2], v2.s[0]116; AARCH64-NEXT: mov v5.s[2], v7.s[0]117; AARCH64-NEXT: ldr s2, [sp, #8]118; AARCH64-NEXT: fmaxnm v4.4s, v4.4s, v2.4s119; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4120; AARCH64-NEXT: mov v0.s[3], v3.s[0]121; AARCH64-NEXT: ld1 { v5.s }[3], [x8]122; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v5.4s123; AARCH64-NEXT: mov s1, v0.s[1]124; AARCH64-NEXT: mov s2, v0.s[2]125; AARCH64-NEXT: mov s3, v0.s[3]126; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0127; AARCH64-NEXT: ret128entry:129 %c = call nnan <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b)130 ret <5 x float> %c131}132 133define <8 x float> @max_nnan_v8f32(<8 x float> %a, <8 x float> %b) {134; AARCH64-LABEL: max_nnan_v8f32:135; AARCH64: // %bb.0: // %entry136; AARCH64-NEXT: fmaxnm v1.4s, v1.4s, v3.4s137; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v2.4s138; AARCH64-NEXT: ret139entry:140 %c = call nnan <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b)141 ret <8 x float> %c142}143 144;;;;;;;;;;;;;;;;;; max_f16145define half @max_nnan_f16(half %a, half %b) {146; FULLFP16-LABEL: max_nnan_f16:147; FULLFP16: // %bb.0: // %entry148; FULLFP16-NEXT: fmaxnm h0, h0, h1149; FULLFP16-NEXT: ret150;151; NOFULLFP16-LABEL: max_nnan_f16:152; NOFULLFP16: // %bb.0: // %entry153; NOFULLFP16-NEXT: fcvt s1, h1154; NOFULLFP16-NEXT: fcvt s0, h0155; NOFULLFP16-NEXT: fmaxnm s0, s0, s1156; NOFULLFP16-NEXT: fcvt h0, s0157; NOFULLFP16-NEXT: ret158entry:159 %c = call nnan half @llvm.maximumnum.f16(half %a, half %b)160 ret half %c161}162 163define <2 x half> @max_nnan_v2f16(<2 x half> %a, <2 x half> %b) {164; FULLFP16-LABEL: max_nnan_v2f16:165; FULLFP16: // %bb.0: // %entry166; FULLFP16-NEXT: fmaxnm v0.4h, v0.4h, v1.4h167; FULLFP16-NEXT: ret168;169; NOFULLFP16-LABEL: max_nnan_v2f16:170; NOFULLFP16: // %bb.0: // %entry171; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q1172; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q0173; NOFULLFP16-NEXT: mov h2, v1.h[1]174; NOFULLFP16-NEXT: mov h3, v0.h[1]175; NOFULLFP16-NEXT: mov h4, v1.h[2]176; NOFULLFP16-NEXT: mov h5, v0.h[2]177; NOFULLFP16-NEXT: fcvt s6, h1178; NOFULLFP16-NEXT: fcvt s7, h0179; NOFULLFP16-NEXT: mov h1, v1.h[3]180; NOFULLFP16-NEXT: fcvt s2, h2181; NOFULLFP16-NEXT: fcvt s3, h3182; NOFULLFP16-NEXT: fcvt s1, h1183; NOFULLFP16-NEXT: fmaxnm s2, s3, s2184; NOFULLFP16-NEXT: fcvt s3, h4185; NOFULLFP16-NEXT: fcvt s4, h5186; NOFULLFP16-NEXT: fmaxnm s5, s7, s6187; NOFULLFP16-NEXT: mov h6, v0.h[3]188; NOFULLFP16-NEXT: fmaxnm s3, s4, s3189; NOFULLFP16-NEXT: fcvt h2, s2190; NOFULLFP16-NEXT: fcvt h0, s5191; NOFULLFP16-NEXT: fcvt s4, h6192; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]193; NOFULLFP16-NEXT: fcvt h2, s3194; NOFULLFP16-NEXT: fmaxnm s1, s4, s1195; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]196; NOFULLFP16-NEXT: fcvt h1, s1197; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]198; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q0199; NOFULLFP16-NEXT: ret200entry:201 %c = call nnan <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b)202 ret <2 x half> %c203}204 205define <4 x half> @max_nnan_v4f16(<4 x half> %a, <4 x half> %b) {206; FULLFP16-LABEL: max_nnan_v4f16:207; FULLFP16: // %bb.0: // %entry208; FULLFP16-NEXT: fmaxnm v0.4h, v0.4h, v1.4h209; FULLFP16-NEXT: ret210;211; NOFULLFP16-LABEL: max_nnan_v4f16:212; NOFULLFP16: // %bb.0: // %entry213; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q1214; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q0215; NOFULLFP16-NEXT: mov h2, v1.h[1]216; NOFULLFP16-NEXT: mov h3, v0.h[1]217; NOFULLFP16-NEXT: mov h4, v1.h[2]218; NOFULLFP16-NEXT: mov h5, v0.h[2]219; NOFULLFP16-NEXT: fcvt s6, h1220; NOFULLFP16-NEXT: fcvt s7, h0221; NOFULLFP16-NEXT: mov h1, v1.h[3]222; NOFULLFP16-NEXT: fcvt s2, h2223; NOFULLFP16-NEXT: fcvt s3, h3224; NOFULLFP16-NEXT: fcvt s1, h1225; NOFULLFP16-NEXT: fmaxnm s2, s3, s2226; NOFULLFP16-NEXT: fcvt s3, h4227; NOFULLFP16-NEXT: fcvt s4, h5228; NOFULLFP16-NEXT: fmaxnm s5, s7, s6229; NOFULLFP16-NEXT: mov h6, v0.h[3]230; NOFULLFP16-NEXT: fmaxnm s3, s4, s3231; NOFULLFP16-NEXT: fcvt h2, s2232; NOFULLFP16-NEXT: fcvt h0, s5233; NOFULLFP16-NEXT: fcvt s4, h6234; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]235; NOFULLFP16-NEXT: fcvt h2, s3236; NOFULLFP16-NEXT: fmaxnm s1, s4, s1237; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]238; NOFULLFP16-NEXT: fcvt h1, s1239; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]240; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q0241; NOFULLFP16-NEXT: ret242entry:243 %c = call nnan <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b)244 ret <4 x half> %c245}246 247define <8 x half> @max_nnan_v8f16(<8 x half> %a, <8 x half> %b) {248; FULLFP16-LABEL: max_nnan_v8f16:249; FULLFP16: // %bb.0: // %entry250; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v1.8h251; FULLFP16-NEXT: ret252;253; NOFULLFP16-LABEL: max_nnan_v8f16:254; NOFULLFP16: // %bb.0: // %entry255; NOFULLFP16-NEXT: mov h2, v1.h[1]256; NOFULLFP16-NEXT: mov h3, v0.h[1]257; NOFULLFP16-NEXT: fcvt s4, h1258; NOFULLFP16-NEXT: fcvt s5, h0259; NOFULLFP16-NEXT: mov h6, v1.h[2]260; NOFULLFP16-NEXT: mov h7, v0.h[2]261; NOFULLFP16-NEXT: mov h16, v1.h[3]262; NOFULLFP16-NEXT: fcvt s2, h2263; NOFULLFP16-NEXT: fcvt s3, h3264; NOFULLFP16-NEXT: fmaxnm s4, s5, s4265; NOFULLFP16-NEXT: mov h5, v0.h[3]266; NOFULLFP16-NEXT: fcvt s6, h6267; NOFULLFP16-NEXT: fcvt s7, h7268; NOFULLFP16-NEXT: fcvt s16, h16269; NOFULLFP16-NEXT: fmaxnm s3, s3, s2270; NOFULLFP16-NEXT: fcvt s5, h5271; NOFULLFP16-NEXT: fcvt h2, s4272; NOFULLFP16-NEXT: fmaxnm s4, s7, s6273; NOFULLFP16-NEXT: mov h6, v1.h[4]274; NOFULLFP16-NEXT: mov h7, v0.h[4]275; NOFULLFP16-NEXT: fcvt h3, s3276; NOFULLFP16-NEXT: fmaxnm s5, s5, s16277; NOFULLFP16-NEXT: mov h16, v0.h[5]278; NOFULLFP16-NEXT: fcvt h4, s4279; NOFULLFP16-NEXT: mov v2.h[1], v3.h[0]280; NOFULLFP16-NEXT: fcvt s3, h6281; NOFULLFP16-NEXT: fcvt s6, h7282; NOFULLFP16-NEXT: mov h7, v1.h[5]283; NOFULLFP16-NEXT: fcvt h5, s5284; NOFULLFP16-NEXT: fcvt s16, h16285; NOFULLFP16-NEXT: mov v2.h[2], v4.h[0]286; NOFULLFP16-NEXT: mov h4, v1.h[6]287; NOFULLFP16-NEXT: fmaxnm s3, s6, s3288; NOFULLFP16-NEXT: mov h6, v0.h[6]289; NOFULLFP16-NEXT: fcvt s7, h7290; NOFULLFP16-NEXT: mov h1, v1.h[7]291; NOFULLFP16-NEXT: mov h0, v0.h[7]292; NOFULLFP16-NEXT: mov v2.h[3], v5.h[0]293; NOFULLFP16-NEXT: fcvt s4, h4294; NOFULLFP16-NEXT: fcvt h3, s3295; NOFULLFP16-NEXT: fcvt s5, h6296; NOFULLFP16-NEXT: fmaxnm s6, s16, s7297; NOFULLFP16-NEXT: fcvt s1, h1298; NOFULLFP16-NEXT: fcvt s0, h0299; NOFULLFP16-NEXT: mov v2.h[4], v3.h[0]300; NOFULLFP16-NEXT: fmaxnm s4, s5, s4301; NOFULLFP16-NEXT: fcvt h3, s6302; NOFULLFP16-NEXT: fmaxnm s0, s0, s1303; NOFULLFP16-NEXT: mov v2.h[5], v3.h[0]304; NOFULLFP16-NEXT: fcvt h3, s4305; NOFULLFP16-NEXT: fcvt h0, s0306; NOFULLFP16-NEXT: mov v2.h[6], v3.h[0]307; NOFULLFP16-NEXT: mov v2.h[7], v0.h[0]308; NOFULLFP16-NEXT: mov v0.16b, v2.16b309; NOFULLFP16-NEXT: ret310entry:311 %c = call nnan <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b)312 ret <8 x half> %c313}314 315define <9 x half> @max_nnan_v9f16(<9 x half> %a, <9 x half> %b) {316; FULLFP16-LABEL: max_nnan_v9f16:317; FULLFP16: // %bb.0: // %entry318; FULLFP16-NEXT: // kill: def $h0 killed $h0 def $q0319; FULLFP16-NEXT: // kill: def $h1 killed $h1 def $q1320; FULLFP16-NEXT: // kill: def $h2 killed $h2 def $q2321; FULLFP16-NEXT: add x9, sp, #16322; FULLFP16-NEXT: // kill: def $h3 killed $h3 def $q3323; FULLFP16-NEXT: // kill: def $h4 killed $h4 def $q4324; FULLFP16-NEXT: // kill: def $h5 killed $h5 def $q5325; FULLFP16-NEXT: // kill: def $h6 killed $h6 def $q6326; FULLFP16-NEXT: // kill: def $h7 killed $h7 def $q7327; FULLFP16-NEXT: mov v0.h[1], v1.h[0]328; FULLFP16-NEXT: ldr h1, [sp, #8]329; FULLFP16-NEXT: ld1 { v1.h }[1], [x9]330; FULLFP16-NEXT: add x9, sp, #24331; FULLFP16-NEXT: mov v0.h[2], v2.h[0]332; FULLFP16-NEXT: ldr h2, [sp, #72]333; FULLFP16-NEXT: ld1 { v1.h }[2], [x9]334; FULLFP16-NEXT: add x9, sp, #32335; FULLFP16-NEXT: mov v0.h[3], v3.h[0]336; FULLFP16-NEXT: ld1 { v1.h }[3], [x9]337; FULLFP16-NEXT: add x9, sp, #40338; FULLFP16-NEXT: ldr h3, [sp]339; FULLFP16-NEXT: ld1 { v1.h }[4], [x9]340; FULLFP16-NEXT: add x9, sp, #48341; FULLFP16-NEXT: fmaxnm v2.8h, v3.8h, v2.8h342; FULLFP16-NEXT: mov v0.h[4], v4.h[0]343; FULLFP16-NEXT: ld1 { v1.h }[5], [x9]344; FULLFP16-NEXT: add x9, sp, #56345; FULLFP16-NEXT: str h2, [x8, #16]346; FULLFP16-NEXT: mov v0.h[5], v5.h[0]347; FULLFP16-NEXT: ld1 { v1.h }[6], [x9]348; FULLFP16-NEXT: add x9, sp, #64349; FULLFP16-NEXT: mov v0.h[6], v6.h[0]350; FULLFP16-NEXT: ld1 { v1.h }[7], [x9]351; FULLFP16-NEXT: mov v0.h[7], v7.h[0]352; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v1.8h353; FULLFP16-NEXT: str q0, [x8]354; FULLFP16-NEXT: ret355;356; NOFULLFP16-LABEL: max_nnan_v9f16:357; NOFULLFP16: // %bb.0: // %entry358; NOFULLFP16-NEXT: ldr h16, [sp, #16]359; NOFULLFP16-NEXT: ldr h17, [sp, #8]360; NOFULLFP16-NEXT: fcvt s1, h1361; NOFULLFP16-NEXT: fcvt s0, h0362; NOFULLFP16-NEXT: ldr h18, [sp, #24]363; NOFULLFP16-NEXT: fcvt s2, h2364; NOFULLFP16-NEXT: fcvt s16, h16365; NOFULLFP16-NEXT: fcvt s17, h17366; NOFULLFP16-NEXT: fcvt s3, h3367; NOFULLFP16-NEXT: fcvt s18, h18368; NOFULLFP16-NEXT: fcvt s4, h4369; NOFULLFP16-NEXT: fcvt s5, h5370; NOFULLFP16-NEXT: fmaxnm s1, s1, s16371; NOFULLFP16-NEXT: fmaxnm s0, s0, s17372; NOFULLFP16-NEXT: ldr h16, [sp, #32]373; NOFULLFP16-NEXT: fmaxnm s2, s2, s18374; NOFULLFP16-NEXT: ldr h17, [sp, #40]375; NOFULLFP16-NEXT: fcvt s16, h16376; NOFULLFP16-NEXT: fcvt s17, h17377; NOFULLFP16-NEXT: fcvt h1, s1378; NOFULLFP16-NEXT: fcvt h0, s0379; NOFULLFP16-NEXT: fcvt h2, s2380; NOFULLFP16-NEXT: fmaxnm s3, s3, s16381; NOFULLFP16-NEXT: fmaxnm s4, s4, s17382; NOFULLFP16-NEXT: mov v0.h[1], v1.h[0]383; NOFULLFP16-NEXT: ldr h1, [sp, #48]384; NOFULLFP16-NEXT: fcvt s1, h1385; NOFULLFP16-NEXT: fcvt h3, s3386; NOFULLFP16-NEXT: fcvt h4, s4387; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]388; NOFULLFP16-NEXT: ldr h2, [sp, #56]389; NOFULLFP16-NEXT: fmaxnm s1, s5, s1390; NOFULLFP16-NEXT: fcvt s2, h2391; NOFULLFP16-NEXT: ldr h5, [sp, #64]392; NOFULLFP16-NEXT: mov v0.h[3], v3.h[0]393; NOFULLFP16-NEXT: fcvt s3, h6394; NOFULLFP16-NEXT: ldr h6, [sp, #72]395; NOFULLFP16-NEXT: fcvt h1, s1396; NOFULLFP16-NEXT: fcvt s6, h6397; NOFULLFP16-NEXT: mov v0.h[4], v4.h[0]398; NOFULLFP16-NEXT: fmaxnm s2, s3, s2399; NOFULLFP16-NEXT: fcvt s3, h5400; NOFULLFP16-NEXT: fcvt s4, h7401; NOFULLFP16-NEXT: ldr h5, [sp]402; NOFULLFP16-NEXT: fcvt s5, h5403; NOFULLFP16-NEXT: mov v0.h[5], v1.h[0]404; NOFULLFP16-NEXT: fcvt h1, s2405; NOFULLFP16-NEXT: fmaxnm s2, s4, s3406; NOFULLFP16-NEXT: fmaxnm s3, s5, s6407; NOFULLFP16-NEXT: mov v0.h[6], v1.h[0]408; NOFULLFP16-NEXT: fcvt h1, s2409; NOFULLFP16-NEXT: fcvt h2, s3410; NOFULLFP16-NEXT: mov v0.h[7], v1.h[0]411; NOFULLFP16-NEXT: str h2, [x8, #16]412; NOFULLFP16-NEXT: str q0, [x8]413; NOFULLFP16-NEXT: ret414entry:415 %c = call nnan <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b)416 ret <9 x half> %c417}418 419define <16 x half> @max_nnan_v16f16(<16 x half> %a, <16 x half> %b) {420; FULLFP16-LABEL: max_nnan_v16f16:421; FULLFP16: // %bb.0: // %entry422; FULLFP16-NEXT: fmaxnm v1.8h, v1.8h, v3.8h423; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v2.8h424; FULLFP16-NEXT: ret425;426; NOFULLFP16-LABEL: max_nnan_v16f16:427; NOFULLFP16: // %bb.0: // %entry428; NOFULLFP16-NEXT: mov h6, v2.h[1]429; NOFULLFP16-NEXT: mov h7, v0.h[1]430; NOFULLFP16-NEXT: fcvt s4, h2431; NOFULLFP16-NEXT: fcvt s5, h0432; NOFULLFP16-NEXT: mov h16, v3.h[1]433; NOFULLFP16-NEXT: mov h17, v1.h[1]434; NOFULLFP16-NEXT: mov h18, v2.h[2]435; NOFULLFP16-NEXT: mov h19, v0.h[2]436; NOFULLFP16-NEXT: fcvt s20, h3437; NOFULLFP16-NEXT: fcvt s21, h1438; NOFULLFP16-NEXT: mov h22, v3.h[2]439; NOFULLFP16-NEXT: mov h23, v1.h[2]440; NOFULLFP16-NEXT: fcvt s6, h6441; NOFULLFP16-NEXT: fcvt s7, h7442; NOFULLFP16-NEXT: mov h24, v0.h[6]443; NOFULLFP16-NEXT: fmaxnm s4, s5, s4444; NOFULLFP16-NEXT: fcvt s5, h16445; NOFULLFP16-NEXT: fcvt s16, h17446; NOFULLFP16-NEXT: fcvt s17, h18447; NOFULLFP16-NEXT: fcvt s18, h19448; NOFULLFP16-NEXT: mov h19, v0.h[3]449; NOFULLFP16-NEXT: fmaxnm s20, s21, s20450; NOFULLFP16-NEXT: fcvt s21, h22451; NOFULLFP16-NEXT: mov h22, v3.h[3]452; NOFULLFP16-NEXT: fmaxnm s6, s7, s6453; NOFULLFP16-NEXT: mov h7, v2.h[3]454; NOFULLFP16-NEXT: mov h25, v1.h[6]455; NOFULLFP16-NEXT: fcvt h4, s4456; NOFULLFP16-NEXT: fmaxnm s5, s16, s5457; NOFULLFP16-NEXT: fcvt s16, h23458; NOFULLFP16-NEXT: mov h23, v1.h[3]459; NOFULLFP16-NEXT: fmaxnm s17, s18, s17460; NOFULLFP16-NEXT: fcvt s18, h19461; NOFULLFP16-NEXT: fcvt h6, s6462; NOFULLFP16-NEXT: fcvt s7, h7463; NOFULLFP16-NEXT: fcvt h19, s5464; NOFULLFP16-NEXT: fcvt h5, s20465; NOFULLFP16-NEXT: fmaxnm s16, s16, s21466; NOFULLFP16-NEXT: fcvt s20, h23467; NOFULLFP16-NEXT: fcvt h17, s17468; NOFULLFP16-NEXT: mov h21, v2.h[4]469; NOFULLFP16-NEXT: mov h23, v1.h[4]470; NOFULLFP16-NEXT: mov v4.h[1], v6.h[0]471; NOFULLFP16-NEXT: fcvt s6, h22472; NOFULLFP16-NEXT: mov h22, v0.h[4]473; NOFULLFP16-NEXT: fmaxnm s7, s18, s7474; NOFULLFP16-NEXT: mov h18, v3.h[4]475; NOFULLFP16-NEXT: mov v5.h[1], v19.h[0]476; NOFULLFP16-NEXT: fcvt h16, s16477; NOFULLFP16-NEXT: fmaxnm s6, s20, s6478; NOFULLFP16-NEXT: mov v4.h[2], v17.h[0]479; NOFULLFP16-NEXT: fcvt s17, h21480; NOFULLFP16-NEXT: fcvt s19, h22481; NOFULLFP16-NEXT: fcvt h7, s7482; NOFULLFP16-NEXT: fcvt s18, h18483; NOFULLFP16-NEXT: fcvt s20, h23484; NOFULLFP16-NEXT: mov h21, v2.h[5]485; NOFULLFP16-NEXT: mov h22, v0.h[5]486; NOFULLFP16-NEXT: mov v5.h[2], v16.h[0]487; NOFULLFP16-NEXT: mov h16, v3.h[5]488; NOFULLFP16-NEXT: mov h23, v1.h[5]489; NOFULLFP16-NEXT: fcvt h6, s6490; NOFULLFP16-NEXT: mov h0, v0.h[7]491; NOFULLFP16-NEXT: mov h1, v1.h[7]492; NOFULLFP16-NEXT: fmaxnm s17, s19, s17493; NOFULLFP16-NEXT: mov h19, v2.h[6]494; NOFULLFP16-NEXT: mov v4.h[3], v7.h[0]495; NOFULLFP16-NEXT: fmaxnm s18, s20, s18496; NOFULLFP16-NEXT: mov h20, v3.h[6]497; NOFULLFP16-NEXT: fcvt s7, h21498; NOFULLFP16-NEXT: fcvt s21, h22499; NOFULLFP16-NEXT: fcvt s22, h24500; NOFULLFP16-NEXT: mov h2, v2.h[7]501; NOFULLFP16-NEXT: mov v5.h[3], v6.h[0]502; NOFULLFP16-NEXT: fcvt s6, h16503; NOFULLFP16-NEXT: fcvt s16, h23504; NOFULLFP16-NEXT: fcvt h17, s17505; NOFULLFP16-NEXT: fcvt s19, h19506; NOFULLFP16-NEXT: fcvt s23, h25507; NOFULLFP16-NEXT: fcvt h18, s18508; NOFULLFP16-NEXT: fcvt s20, h20509; NOFULLFP16-NEXT: mov h3, v3.h[7]510; NOFULLFP16-NEXT: fmaxnm s7, s21, s7511; NOFULLFP16-NEXT: fcvt s2, h2512; NOFULLFP16-NEXT: fcvt s0, h0513; NOFULLFP16-NEXT: fmaxnm s6, s16, s6514; NOFULLFP16-NEXT: fcvt s1, h1515; NOFULLFP16-NEXT: mov v4.h[4], v17.h[0]516; NOFULLFP16-NEXT: fmaxnm s16, s22, s19517; NOFULLFP16-NEXT: mov v5.h[4], v18.h[0]518; NOFULLFP16-NEXT: fmaxnm s17, s23, s20519; NOFULLFP16-NEXT: fcvt s3, h3520; NOFULLFP16-NEXT: fcvt h7, s7521; NOFULLFP16-NEXT: fmaxnm s0, s0, s2522; NOFULLFP16-NEXT: fcvt h6, s6523; NOFULLFP16-NEXT: fcvt h2, s16524; NOFULLFP16-NEXT: fmaxnm s1, s1, s3525; NOFULLFP16-NEXT: mov v4.h[5], v7.h[0]526; NOFULLFP16-NEXT: fcvt h0, s0527; NOFULLFP16-NEXT: mov v5.h[5], v6.h[0]528; NOFULLFP16-NEXT: fcvt h6, s17529; NOFULLFP16-NEXT: fcvt h1, s1530; NOFULLFP16-NEXT: mov v4.h[6], v2.h[0]531; NOFULLFP16-NEXT: mov v5.h[6], v6.h[0]532; NOFULLFP16-NEXT: mov v4.h[7], v0.h[0]533; NOFULLFP16-NEXT: mov v5.h[7], v1.h[0]534; NOFULLFP16-NEXT: mov v0.16b, v4.16b535; NOFULLFP16-NEXT: mov v1.16b, v5.16b536; NOFULLFP16-NEXT: ret537entry:538 %c = call nnan <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b)539 ret <16 x half> %c540}541 542;;;;;;;;;;;;;;;; min_f64543define double @min_nnan_f64(double %a, double %b) {544; AARCH64-LABEL: min_nnan_f64:545; AARCH64: // %bb.0: // %entry546; AARCH64-NEXT: fminnm d0, d0, d1547; AARCH64-NEXT: ret548entry:549 %c = call nnan double @llvm.minimumnum.f64(double %a, double %b)550 ret double %c551}552 553define <2 x double> @min_nnan_v2f64(<2 x double> %a, <2 x double> %b) {554; AARCH64-LABEL: min_nnan_v2f64:555; AARCH64: // %bb.0: // %entry556; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d557; AARCH64-NEXT: ret558entry:559 %c = call nnan <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b)560 ret <2 x double> %c561}562 563define <3 x double> @min_nnan_v3f64(<3 x double> %a, <3 x double> %b) {564; AARCH64-LABEL: min_nnan_v3f64:565; AARCH64: // %bb.0: // %entry566; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q3567; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q0568; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q4569; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q1570; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q2571; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q5572; AARCH64-NEXT: mov v3.d[1], v4.d[0]573; AARCH64-NEXT: mov v0.d[1], v1.d[0]574; AARCH64-NEXT: fminnm v2.2d, v2.2d, v5.2d575; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q2576; AARCH64-NEXT: fminnm v0.2d, v0.2d, v3.2d577; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #8578; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q0579; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q1580; AARCH64-NEXT: ret581entry:582 %c = call nnan <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b)583 ret <3 x double> %c584}585 586define <4 x double> @min_nnan_v4f64(<4 x double> %a, <4 x double> %b) {587; AARCH64-LABEL: min_nnan_v4f64:588; AARCH64: // %bb.0: // %entry589; AARCH64-NEXT: fminnm v1.2d, v1.2d, v3.2d590; AARCH64-NEXT: fminnm v0.2d, v0.2d, v2.2d591; AARCH64-NEXT: ret592entry:593 %c = call nnan <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b)594 ret <4 x double> %c595}596 597;;;;;;;;;;;;;;;;;; min_f32598define float @min_nnan_f32(float %a, float %b) {599; AARCH64-LABEL: min_nnan_f32:600; AARCH64: // %bb.0: // %entry601; AARCH64-NEXT: fminnm s0, s0, s1602; AARCH64-NEXT: ret603entry:604 %c = call nnan float @llvm.minimumnum.f32(float %a, float %b)605 ret float %c606}607 608define <2 x float> @min_nnan_v2f32(<2 x float> %a, <2 x float> %b) {609; AARCH64-LABEL: min_nnan_v2f32:610; AARCH64: // %bb.0: // %entry611; AARCH64-NEXT: fminnm v0.2s, v0.2s, v1.2s612; AARCH64-NEXT: ret613entry:614 %c = call nnan <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b)615 ret <2 x float> %c616}617 618define <3 x float> @min_nnan_v3f32(<3 x float> %a, <3 x float> %b) {619; AARCH64-LABEL: min_nnan_v3f32:620; AARCH64: // %bb.0: // %entry621; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s622; AARCH64-NEXT: ret623entry:624 %c = call nnan <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b)625 ret <3 x float> %c626}627 628define <4 x float> @min_nnan_v4f32(<4 x float> %a, <4 x float> %b) {629; AARCH64-LABEL: min_nnan_v4f32:630; AARCH64: // %bb.0: // %entry631; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s632; AARCH64-NEXT: ret633entry:634 %c = call nnan <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b)635 ret <4 x float> %c636}637 638define <5 x float> @min_nnan_v5f32(<5 x float> %a, <5 x float> %b) {639; AARCH64-LABEL: min_nnan_v5f32:640; AARCH64: // %bb.0: // %entry641; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0642; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5643; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1644; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6645; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2646; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7647; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3648; AARCH64-NEXT: mov x8, sp649; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4650; AARCH64-NEXT: mov v0.s[1], v1.s[0]651; AARCH64-NEXT: mov v5.s[1], v6.s[0]652; AARCH64-NEXT: mov v0.s[2], v2.s[0]653; AARCH64-NEXT: mov v5.s[2], v7.s[0]654; AARCH64-NEXT: ldr s2, [sp, #8]655; AARCH64-NEXT: fminnm v4.4s, v4.4s, v2.4s656; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4657; AARCH64-NEXT: mov v0.s[3], v3.s[0]658; AARCH64-NEXT: ld1 { v5.s }[3], [x8]659; AARCH64-NEXT: fminnm v0.4s, v0.4s, v5.4s660; AARCH64-NEXT: mov s1, v0.s[1]661; AARCH64-NEXT: mov s2, v0.s[2]662; AARCH64-NEXT: mov s3, v0.s[3]663; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0664; AARCH64-NEXT: ret665entry:666 %c = call nnan <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b)667 ret <5 x float> %c668}669 670define <8 x float> @min_nnan_v8f32(<8 x float> %a, <8 x float> %b) {671; AARCH64-LABEL: min_nnan_v8f32:672; AARCH64: // %bb.0: // %entry673; AARCH64-NEXT: fminnm v1.4s, v1.4s, v3.4s674; AARCH64-NEXT: fminnm v0.4s, v0.4s, v2.4s675; AARCH64-NEXT: ret676entry:677 %c = call nnan <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b)678 ret <8 x float> %c679}680 681;;;;;;;;;;;;;;;;;; min_f16682define half @min_nnan_f16(half %a, half %b) {683; FULLFP16-LABEL: min_nnan_f16:684; FULLFP16: // %bb.0: // %entry685; FULLFP16-NEXT: fminnm h0, h0, h1686; FULLFP16-NEXT: ret687;688; NOFULLFP16-LABEL: min_nnan_f16:689; NOFULLFP16: // %bb.0: // %entry690; NOFULLFP16-NEXT: fcvt s1, h1691; NOFULLFP16-NEXT: fcvt s0, h0692; NOFULLFP16-NEXT: fminnm s0, s0, s1693; NOFULLFP16-NEXT: fcvt h0, s0694; NOFULLFP16-NEXT: ret695entry:696 %c = call nnan half @llvm.minimumnum.f16(half %a, half %b)697 ret half %c698}699 700define <2 x half> @min_nnan_v2f16(<2 x half> %a, <2 x half> %b) {701; FULLFP16-LABEL: min_nnan_v2f16:702; FULLFP16: // %bb.0: // %entry703; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v1.4h704; FULLFP16-NEXT: ret705;706; NOFULLFP16-LABEL: min_nnan_v2f16:707; NOFULLFP16: // %bb.0: // %entry708; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q1709; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q0710; NOFULLFP16-NEXT: mov h2, v1.h[1]711; NOFULLFP16-NEXT: mov h3, v0.h[1]712; NOFULLFP16-NEXT: mov h4, v1.h[2]713; NOFULLFP16-NEXT: mov h5, v0.h[2]714; NOFULLFP16-NEXT: fcvt s6, h1715; NOFULLFP16-NEXT: fcvt s7, h0716; NOFULLFP16-NEXT: mov h1, v1.h[3]717; NOFULLFP16-NEXT: fcvt s2, h2718; NOFULLFP16-NEXT: fcvt s3, h3719; NOFULLFP16-NEXT: fcvt s1, h1720; NOFULLFP16-NEXT: fminnm s2, s3, s2721; NOFULLFP16-NEXT: fcvt s3, h4722; NOFULLFP16-NEXT: fcvt s4, h5723; NOFULLFP16-NEXT: fminnm s5, s7, s6724; NOFULLFP16-NEXT: mov h6, v0.h[3]725; NOFULLFP16-NEXT: fminnm s3, s4, s3726; NOFULLFP16-NEXT: fcvt h2, s2727; NOFULLFP16-NEXT: fcvt h0, s5728; NOFULLFP16-NEXT: fcvt s4, h6729; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]730; NOFULLFP16-NEXT: fcvt h2, s3731; NOFULLFP16-NEXT: fminnm s1, s4, s1732; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]733; NOFULLFP16-NEXT: fcvt h1, s1734; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]735; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q0736; NOFULLFP16-NEXT: ret737entry:738 %c = call nnan <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b)739 ret <2 x half> %c740}741 742define <4 x half> @min_nnan_v4f16(<4 x half> %a, <4 x half> %b) {743; FULLFP16-LABEL: min_nnan_v4f16:744; FULLFP16: // %bb.0: // %entry745; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v1.4h746; FULLFP16-NEXT: ret747;748; NOFULLFP16-LABEL: min_nnan_v4f16:749; NOFULLFP16: // %bb.0: // %entry750; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q1751; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q0752; NOFULLFP16-NEXT: mov h2, v1.h[1]753; NOFULLFP16-NEXT: mov h3, v0.h[1]754; NOFULLFP16-NEXT: mov h4, v1.h[2]755; NOFULLFP16-NEXT: mov h5, v0.h[2]756; NOFULLFP16-NEXT: fcvt s6, h1757; NOFULLFP16-NEXT: fcvt s7, h0758; NOFULLFP16-NEXT: mov h1, v1.h[3]759; NOFULLFP16-NEXT: fcvt s2, h2760; NOFULLFP16-NEXT: fcvt s3, h3761; NOFULLFP16-NEXT: fcvt s1, h1762; NOFULLFP16-NEXT: fminnm s2, s3, s2763; NOFULLFP16-NEXT: fcvt s3, h4764; NOFULLFP16-NEXT: fcvt s4, h5765; NOFULLFP16-NEXT: fminnm s5, s7, s6766; NOFULLFP16-NEXT: mov h6, v0.h[3]767; NOFULLFP16-NEXT: fminnm s3, s4, s3768; NOFULLFP16-NEXT: fcvt h2, s2769; NOFULLFP16-NEXT: fcvt h0, s5770; NOFULLFP16-NEXT: fcvt s4, h6771; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]772; NOFULLFP16-NEXT: fcvt h2, s3773; NOFULLFP16-NEXT: fminnm s1, s4, s1774; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]775; NOFULLFP16-NEXT: fcvt h1, s1776; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]777; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q0778; NOFULLFP16-NEXT: ret779entry:780 %c = call nnan <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b)781 ret <4 x half> %c782}783 784define <8 x half> @min_nnan_v8f16(<8 x half> %a, <8 x half> %b) {785; FULLFP16-LABEL: min_nnan_v8f16:786; FULLFP16: // %bb.0: // %entry787; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v1.8h788; FULLFP16-NEXT: ret789;790; NOFULLFP16-LABEL: min_nnan_v8f16:791; NOFULLFP16: // %bb.0: // %entry792; NOFULLFP16-NEXT: mov h2, v1.h[1]793; NOFULLFP16-NEXT: mov h3, v0.h[1]794; NOFULLFP16-NEXT: fcvt s4, h1795; NOFULLFP16-NEXT: fcvt s5, h0796; NOFULLFP16-NEXT: mov h6, v1.h[2]797; NOFULLFP16-NEXT: mov h7, v0.h[2]798; NOFULLFP16-NEXT: mov h16, v1.h[3]799; NOFULLFP16-NEXT: fcvt s2, h2800; NOFULLFP16-NEXT: fcvt s3, h3801; NOFULLFP16-NEXT: fminnm s4, s5, s4802; NOFULLFP16-NEXT: mov h5, v0.h[3]803; NOFULLFP16-NEXT: fcvt s6, h6804; NOFULLFP16-NEXT: fcvt s7, h7805; NOFULLFP16-NEXT: fcvt s16, h16806; NOFULLFP16-NEXT: fminnm s3, s3, s2807; NOFULLFP16-NEXT: fcvt s5, h5808; NOFULLFP16-NEXT: fcvt h2, s4809; NOFULLFP16-NEXT: fminnm s4, s7, s6810; NOFULLFP16-NEXT: mov h6, v1.h[4]811; NOFULLFP16-NEXT: mov h7, v0.h[4]812; NOFULLFP16-NEXT: fcvt h3, s3813; NOFULLFP16-NEXT: fminnm s5, s5, s16814; NOFULLFP16-NEXT: mov h16, v0.h[5]815; NOFULLFP16-NEXT: fcvt h4, s4816; NOFULLFP16-NEXT: mov v2.h[1], v3.h[0]817; NOFULLFP16-NEXT: fcvt s3, h6818; NOFULLFP16-NEXT: fcvt s6, h7819; NOFULLFP16-NEXT: mov h7, v1.h[5]820; NOFULLFP16-NEXT: fcvt h5, s5821; NOFULLFP16-NEXT: fcvt s16, h16822; NOFULLFP16-NEXT: mov v2.h[2], v4.h[0]823; NOFULLFP16-NEXT: mov h4, v1.h[6]824; NOFULLFP16-NEXT: fminnm s3, s6, s3825; NOFULLFP16-NEXT: mov h6, v0.h[6]826; NOFULLFP16-NEXT: fcvt s7, h7827; NOFULLFP16-NEXT: mov h1, v1.h[7]828; NOFULLFP16-NEXT: mov h0, v0.h[7]829; NOFULLFP16-NEXT: mov v2.h[3], v5.h[0]830; NOFULLFP16-NEXT: fcvt s4, h4831; NOFULLFP16-NEXT: fcvt h3, s3832; NOFULLFP16-NEXT: fcvt s5, h6833; NOFULLFP16-NEXT: fminnm s6, s16, s7834; NOFULLFP16-NEXT: fcvt s1, h1835; NOFULLFP16-NEXT: fcvt s0, h0836; NOFULLFP16-NEXT: mov v2.h[4], v3.h[0]837; NOFULLFP16-NEXT: fminnm s4, s5, s4838; NOFULLFP16-NEXT: fcvt h3, s6839; NOFULLFP16-NEXT: fminnm s0, s0, s1840; NOFULLFP16-NEXT: mov v2.h[5], v3.h[0]841; NOFULLFP16-NEXT: fcvt h3, s4842; NOFULLFP16-NEXT: fcvt h0, s0843; NOFULLFP16-NEXT: mov v2.h[6], v3.h[0]844; NOFULLFP16-NEXT: mov v2.h[7], v0.h[0]845; NOFULLFP16-NEXT: mov v0.16b, v2.16b846; NOFULLFP16-NEXT: ret847entry:848 %c = call nnan <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b)849 ret <8 x half> %c850}851 852define <9 x half> @min_nnan_v9f16(<9 x half> %a, <9 x half> %b) {853; FULLFP16-LABEL: min_nnan_v9f16:854; FULLFP16: // %bb.0: // %entry855; FULLFP16-NEXT: // kill: def $h0 killed $h0 def $q0856; FULLFP16-NEXT: // kill: def $h1 killed $h1 def $q1857; FULLFP16-NEXT: // kill: def $h2 killed $h2 def $q2858; FULLFP16-NEXT: add x9, sp, #16859; FULLFP16-NEXT: // kill: def $h3 killed $h3 def $q3860; FULLFP16-NEXT: // kill: def $h4 killed $h4 def $q4861; FULLFP16-NEXT: // kill: def $h5 killed $h5 def $q5862; FULLFP16-NEXT: // kill: def $h6 killed $h6 def $q6863; FULLFP16-NEXT: // kill: def $h7 killed $h7 def $q7864; FULLFP16-NEXT: mov v0.h[1], v1.h[0]865; FULLFP16-NEXT: ldr h1, [sp, #8]866; FULLFP16-NEXT: ld1 { v1.h }[1], [x9]867; FULLFP16-NEXT: add x9, sp, #24868; FULLFP16-NEXT: mov v0.h[2], v2.h[0]869; FULLFP16-NEXT: ldr h2, [sp, #72]870; FULLFP16-NEXT: ld1 { v1.h }[2], [x9]871; FULLFP16-NEXT: add x9, sp, #32872; FULLFP16-NEXT: mov v0.h[3], v3.h[0]873; FULLFP16-NEXT: ld1 { v1.h }[3], [x9]874; FULLFP16-NEXT: add x9, sp, #40875; FULLFP16-NEXT: ldr h3, [sp]876; FULLFP16-NEXT: ld1 { v1.h }[4], [x9]877; FULLFP16-NEXT: add x9, sp, #48878; FULLFP16-NEXT: fminnm v2.8h, v3.8h, v2.8h879; FULLFP16-NEXT: mov v0.h[4], v4.h[0]880; FULLFP16-NEXT: ld1 { v1.h }[5], [x9]881; FULLFP16-NEXT: add x9, sp, #56882; FULLFP16-NEXT: str h2, [x8, #16]883; FULLFP16-NEXT: mov v0.h[5], v5.h[0]884; FULLFP16-NEXT: ld1 { v1.h }[6], [x9]885; FULLFP16-NEXT: add x9, sp, #64886; FULLFP16-NEXT: mov v0.h[6], v6.h[0]887; FULLFP16-NEXT: ld1 { v1.h }[7], [x9]888; FULLFP16-NEXT: mov v0.h[7], v7.h[0]889; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v1.8h890; FULLFP16-NEXT: str q0, [x8]891; FULLFP16-NEXT: ret892;893; NOFULLFP16-LABEL: min_nnan_v9f16:894; NOFULLFP16: // %bb.0: // %entry895; NOFULLFP16-NEXT: ldr h16, [sp, #16]896; NOFULLFP16-NEXT: ldr h17, [sp, #8]897; NOFULLFP16-NEXT: fcvt s1, h1898; NOFULLFP16-NEXT: fcvt s0, h0899; NOFULLFP16-NEXT: ldr h18, [sp, #24]900; NOFULLFP16-NEXT: fcvt s2, h2901; NOFULLFP16-NEXT: fcvt s16, h16902; NOFULLFP16-NEXT: fcvt s17, h17903; NOFULLFP16-NEXT: fcvt s3, h3904; NOFULLFP16-NEXT: fcvt s18, h18905; NOFULLFP16-NEXT: fcvt s4, h4906; NOFULLFP16-NEXT: fcvt s5, h5907; NOFULLFP16-NEXT: fminnm s1, s1, s16908; NOFULLFP16-NEXT: fminnm s0, s0, s17909; NOFULLFP16-NEXT: ldr h16, [sp, #32]910; NOFULLFP16-NEXT: fminnm s2, s2, s18911; NOFULLFP16-NEXT: ldr h17, [sp, #40]912; NOFULLFP16-NEXT: fcvt s16, h16913; NOFULLFP16-NEXT: fcvt s17, h17914; NOFULLFP16-NEXT: fcvt h1, s1915; NOFULLFP16-NEXT: fcvt h0, s0916; NOFULLFP16-NEXT: fcvt h2, s2917; NOFULLFP16-NEXT: fminnm s3, s3, s16918; NOFULLFP16-NEXT: fminnm s4, s4, s17919; NOFULLFP16-NEXT: mov v0.h[1], v1.h[0]920; NOFULLFP16-NEXT: ldr h1, [sp, #48]921; NOFULLFP16-NEXT: fcvt s1, h1922; NOFULLFP16-NEXT: fcvt h3, s3923; NOFULLFP16-NEXT: fcvt h4, s4924; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]925; NOFULLFP16-NEXT: ldr h2, [sp, #56]926; NOFULLFP16-NEXT: fminnm s1, s5, s1927; NOFULLFP16-NEXT: fcvt s2, h2928; NOFULLFP16-NEXT: ldr h5, [sp, #64]929; NOFULLFP16-NEXT: mov v0.h[3], v3.h[0]930; NOFULLFP16-NEXT: fcvt s3, h6931; NOFULLFP16-NEXT: ldr h6, [sp, #72]932; NOFULLFP16-NEXT: fcvt h1, s1933; NOFULLFP16-NEXT: fcvt s6, h6934; NOFULLFP16-NEXT: mov v0.h[4], v4.h[0]935; NOFULLFP16-NEXT: fminnm s2, s3, s2936; NOFULLFP16-NEXT: fcvt s3, h5937; NOFULLFP16-NEXT: fcvt s4, h7938; NOFULLFP16-NEXT: ldr h5, [sp]939; NOFULLFP16-NEXT: fcvt s5, h5940; NOFULLFP16-NEXT: mov v0.h[5], v1.h[0]941; NOFULLFP16-NEXT: fcvt h1, s2942; NOFULLFP16-NEXT: fminnm s2, s4, s3943; NOFULLFP16-NEXT: fminnm s3, s5, s6944; NOFULLFP16-NEXT: mov v0.h[6], v1.h[0]945; NOFULLFP16-NEXT: fcvt h1, s2946; NOFULLFP16-NEXT: fcvt h2, s3947; NOFULLFP16-NEXT: mov v0.h[7], v1.h[0]948; NOFULLFP16-NEXT: str h2, [x8, #16]949; NOFULLFP16-NEXT: str q0, [x8]950; NOFULLFP16-NEXT: ret951entry:952 %c = call nnan <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b)953 ret <9 x half> %c954}955 956define <16 x half> @min_nnan_v16f16(<16 x half> %a, <16 x half> %b) {957; FULLFP16-LABEL: min_nnan_v16f16:958; FULLFP16: // %bb.0: // %entry959; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v3.8h960; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v2.8h961; FULLFP16-NEXT: ret962;963; NOFULLFP16-LABEL: min_nnan_v16f16:964; NOFULLFP16: // %bb.0: // %entry965; NOFULLFP16-NEXT: mov h6, v2.h[1]966; NOFULLFP16-NEXT: mov h7, v0.h[1]967; NOFULLFP16-NEXT: fcvt s4, h2968; NOFULLFP16-NEXT: fcvt s5, h0969; NOFULLFP16-NEXT: mov h16, v3.h[1]970; NOFULLFP16-NEXT: mov h17, v1.h[1]971; NOFULLFP16-NEXT: mov h18, v2.h[2]972; NOFULLFP16-NEXT: mov h19, v0.h[2]973; NOFULLFP16-NEXT: fcvt s20, h3974; NOFULLFP16-NEXT: fcvt s21, h1975; NOFULLFP16-NEXT: mov h22, v3.h[2]976; NOFULLFP16-NEXT: mov h23, v1.h[2]977; NOFULLFP16-NEXT: fcvt s6, h6978; NOFULLFP16-NEXT: fcvt s7, h7979; NOFULLFP16-NEXT: mov h24, v0.h[6]980; NOFULLFP16-NEXT: fminnm s4, s5, s4981; NOFULLFP16-NEXT: fcvt s5, h16982; NOFULLFP16-NEXT: fcvt s16, h17983; NOFULLFP16-NEXT: fcvt s17, h18984; NOFULLFP16-NEXT: fcvt s18, h19985; NOFULLFP16-NEXT: mov h19, v0.h[3]986; NOFULLFP16-NEXT: fminnm s20, s21, s20987; NOFULLFP16-NEXT: fcvt s21, h22988; NOFULLFP16-NEXT: mov h22, v3.h[3]989; NOFULLFP16-NEXT: fminnm s6, s7, s6990; NOFULLFP16-NEXT: mov h7, v2.h[3]991; NOFULLFP16-NEXT: mov h25, v1.h[6]992; NOFULLFP16-NEXT: fcvt h4, s4993; NOFULLFP16-NEXT: fminnm s5, s16, s5994; NOFULLFP16-NEXT: fcvt s16, h23995; NOFULLFP16-NEXT: mov h23, v1.h[3]996; NOFULLFP16-NEXT: fminnm s17, s18, s17997; NOFULLFP16-NEXT: fcvt s18, h19998; NOFULLFP16-NEXT: fcvt h6, s6999; NOFULLFP16-NEXT: fcvt s7, h71000; NOFULLFP16-NEXT: fcvt h19, s51001; NOFULLFP16-NEXT: fcvt h5, s201002; NOFULLFP16-NEXT: fminnm s16, s16, s211003; NOFULLFP16-NEXT: fcvt s20, h231004; NOFULLFP16-NEXT: fcvt h17, s171005; NOFULLFP16-NEXT: mov h21, v2.h[4]1006; NOFULLFP16-NEXT: mov h23, v1.h[4]1007; NOFULLFP16-NEXT: mov v4.h[1], v6.h[0]1008; NOFULLFP16-NEXT: fcvt s6, h221009; NOFULLFP16-NEXT: mov h22, v0.h[4]1010; NOFULLFP16-NEXT: fminnm s7, s18, s71011; NOFULLFP16-NEXT: mov h18, v3.h[4]1012; NOFULLFP16-NEXT: mov v5.h[1], v19.h[0]1013; NOFULLFP16-NEXT: fcvt h16, s161014; NOFULLFP16-NEXT: fminnm s6, s20, s61015; NOFULLFP16-NEXT: mov v4.h[2], v17.h[0]1016; NOFULLFP16-NEXT: fcvt s17, h211017; NOFULLFP16-NEXT: fcvt s19, h221018; NOFULLFP16-NEXT: fcvt h7, s71019; NOFULLFP16-NEXT: fcvt s18, h181020; NOFULLFP16-NEXT: fcvt s20, h231021; NOFULLFP16-NEXT: mov h21, v2.h[5]1022; NOFULLFP16-NEXT: mov h22, v0.h[5]1023; NOFULLFP16-NEXT: mov v5.h[2], v16.h[0]1024; NOFULLFP16-NEXT: mov h16, v3.h[5]1025; NOFULLFP16-NEXT: mov h23, v1.h[5]1026; NOFULLFP16-NEXT: fcvt h6, s61027; NOFULLFP16-NEXT: mov h0, v0.h[7]1028; NOFULLFP16-NEXT: mov h1, v1.h[7]1029; NOFULLFP16-NEXT: fminnm s17, s19, s171030; NOFULLFP16-NEXT: mov h19, v2.h[6]1031; NOFULLFP16-NEXT: mov v4.h[3], v7.h[0]1032; NOFULLFP16-NEXT: fminnm s18, s20, s181033; NOFULLFP16-NEXT: mov h20, v3.h[6]1034; NOFULLFP16-NEXT: fcvt s7, h211035; NOFULLFP16-NEXT: fcvt s21, h221036; NOFULLFP16-NEXT: fcvt s22, h241037; NOFULLFP16-NEXT: mov h2, v2.h[7]1038; NOFULLFP16-NEXT: mov v5.h[3], v6.h[0]1039; NOFULLFP16-NEXT: fcvt s6, h161040; NOFULLFP16-NEXT: fcvt s16, h231041; NOFULLFP16-NEXT: fcvt h17, s171042; NOFULLFP16-NEXT: fcvt s19, h191043; NOFULLFP16-NEXT: fcvt s23, h251044; NOFULLFP16-NEXT: fcvt h18, s181045; NOFULLFP16-NEXT: fcvt s20, h201046; NOFULLFP16-NEXT: mov h3, v3.h[7]1047; NOFULLFP16-NEXT: fminnm s7, s21, s71048; NOFULLFP16-NEXT: fcvt s2, h21049; NOFULLFP16-NEXT: fcvt s0, h01050; NOFULLFP16-NEXT: fminnm s6, s16, s61051; NOFULLFP16-NEXT: fcvt s1, h11052; NOFULLFP16-NEXT: mov v4.h[4], v17.h[0]1053; NOFULLFP16-NEXT: fminnm s16, s22, s191054; NOFULLFP16-NEXT: mov v5.h[4], v18.h[0]1055; NOFULLFP16-NEXT: fminnm s17, s23, s201056; NOFULLFP16-NEXT: fcvt s3, h31057; NOFULLFP16-NEXT: fcvt h7, s71058; NOFULLFP16-NEXT: fminnm s0, s0, s21059; NOFULLFP16-NEXT: fcvt h6, s61060; NOFULLFP16-NEXT: fcvt h2, s161061; NOFULLFP16-NEXT: fminnm s1, s1, s31062; NOFULLFP16-NEXT: mov v4.h[5], v7.h[0]1063; NOFULLFP16-NEXT: fcvt h0, s01064; NOFULLFP16-NEXT: mov v5.h[5], v6.h[0]1065; NOFULLFP16-NEXT: fcvt h6, s171066; NOFULLFP16-NEXT: fcvt h1, s11067; NOFULLFP16-NEXT: mov v4.h[6], v2.h[0]1068; NOFULLFP16-NEXT: mov v5.h[6], v6.h[0]1069; NOFULLFP16-NEXT: mov v4.h[7], v0.h[0]1070; NOFULLFP16-NEXT: mov v5.h[7], v1.h[0]1071; NOFULLFP16-NEXT: mov v0.16b, v4.16b1072; NOFULLFP16-NEXT: mov v1.16b, v5.16b1073; NOFULLFP16-NEXT: ret1074entry:1075 %c = call nnan <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b)1076 ret <16 x half> %c1077}1078 1079;;;;;;;;;;;;;;;; max_f641080define double @max_f64(double %a, double %b) {1081; AARCH64-LABEL: max_f64:1082; AARCH64: // %bb.0: // %entry1083; AARCH64-NEXT: fminnm d1, d1, d11084; AARCH64-NEXT: fminnm d0, d0, d01085; AARCH64-NEXT: fmaxnm d0, d0, d11086; AARCH64-NEXT: ret1087entry:1088 %c = call double @llvm.maximumnum.f64(double %a, double %b)1089 ret double %c1090}1091 1092define <2 x double> @max_v2f64(<2 x double> %a, <2 x double> %b) {1093; AARCH64-LABEL: max_v2f64:1094; AARCH64: // %bb.0: // %entry1095; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d1096; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1097; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d1098; AARCH64-NEXT: ret1099entry:1100 %c = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b)1101 ret <2 x double> %c1102}1103 1104define <3 x double> @max_v3f64(<3 x double> %a, <3 x double> %b) {1105; AARCH64-LABEL: max_v3f64:1106; AARCH64: // %bb.0: // %entry1107; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q31108; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q01109; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q41110; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q11111; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q21112; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q51113; AARCH64-NEXT: mov v0.d[1], v1.d[0]1114; AARCH64-NEXT: mov v3.d[1], v4.d[0]1115; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d1116; AARCH64-NEXT: fminnm v1.2d, v3.2d, v3.2d1117; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1118; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d1119; AARCH64-NEXT: fminnm v1.2d, v5.2d, v5.2d1120; AARCH64-NEXT: fmaxnm v2.2d, v2.2d, v1.2d1121; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #81122; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q01123; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q11124; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q21125; AARCH64-NEXT: ret1126entry:1127 %c = call <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b)1128 ret <3 x double> %c1129}1130 1131define <4 x double> @max_v4f64(<4 x double> %a, <4 x double> %b) {1132; AARCH64-LABEL: max_v4f64:1133; AARCH64: // %bb.0: // %entry1134; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d1135; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1136; AARCH64-NEXT: fminnm v3.2d, v3.2d, v3.2d1137; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d1138; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v2.2d1139; AARCH64-NEXT: fmaxnm v1.2d, v1.2d, v3.2d1140; AARCH64-NEXT: ret1141entry:1142 %c = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b)1143 ret <4 x double> %c1144}1145 1146;;;;;;;;;;;;;;;;;; max_f321147define float @max_f32(float %a, float %b) {1148; AARCH64-LABEL: max_f32:1149; AARCH64: // %bb.0: // %entry1150; AARCH64-NEXT: fminnm s1, s1, s11151; AARCH64-NEXT: fminnm s0, s0, s01152; AARCH64-NEXT: fmaxnm s0, s0, s11153; AARCH64-NEXT: ret1154entry:1155 %c = call float @llvm.maximumnum.f32(float %a, float %b)1156 ret float %c1157}1158 1159define <2 x float> @max_v2f32(<2 x float> %a, <2 x float> %b) {1160; AARCH64-LABEL: max_v2f32:1161; AARCH64: // %bb.0: // %entry1162; AARCH64-NEXT: fminnm v1.2s, v1.2s, v1.2s1163; AARCH64-NEXT: fminnm v0.2s, v0.2s, v0.2s1164; AARCH64-NEXT: fmaxnm v0.2s, v0.2s, v1.2s1165; AARCH64-NEXT: ret1166entry:1167 %c = call <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b)1168 ret <2 x float> %c1169}1170 1171define <3 x float> @max_v3f32(<3 x float> %a, <3 x float> %b) {1172; AARCH64-LABEL: max_v3f32:1173; AARCH64: // %bb.0: // %entry1174; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1175; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1176; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s1177; AARCH64-NEXT: ret1178entry:1179 %c = call <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b)1180 ret <3 x float> %c1181}1182 1183define <4 x float> @max_v4f32(<4 x float> %a, <4 x float> %b) {1184; AARCH64-LABEL: max_v4f32:1185; AARCH64: // %bb.0: // %entry1186; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1187; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1188; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s1189; AARCH64-NEXT: ret1190entry:1191 %c = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b)1192 ret <4 x float> %c1193}1194 1195define <5 x float> @max_v5f32(<5 x float> %a, <5 x float> %b) {1196; AARCH64-LABEL: max_v5f32:1197; AARCH64: // %bb.0: // %entry1198; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q01199; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q51200; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q11201; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q61202; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q21203; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q71204; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q31205; AARCH64-NEXT: mov x8, sp1206; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q41207; AARCH64-NEXT: mov v0.s[1], v1.s[0]1208; AARCH64-NEXT: mov v5.s[1], v6.s[0]1209; AARCH64-NEXT: mov v0.s[2], v2.s[0]1210; AARCH64-NEXT: mov v5.s[2], v7.s[0]1211; AARCH64-NEXT: ldr s2, [sp, #8]1212; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s1213; AARCH64-NEXT: mov v0.s[3], v3.s[0]1214; AARCH64-NEXT: ld1 { v5.s }[3], [x8]1215; AARCH64-NEXT: fminnm v3.4s, v4.4s, v4.4s1216; AARCH64-NEXT: fminnm v1.4s, v5.4s, v5.4s1217; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1218; AARCH64-NEXT: fmaxnm v4.4s, v3.4s, v2.4s1219; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q41220; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s1221; AARCH64-NEXT: mov s1, v0.s[1]1222; AARCH64-NEXT: mov s2, v0.s[2]1223; AARCH64-NEXT: mov s3, v0.s[3]1224; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q01225; AARCH64-NEXT: ret1226entry:1227 %c = call <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b)1228 ret <5 x float> %c1229}1230 1231define <8 x float> @max_v8f32(<8 x float> %a, <8 x float> %b) {1232; AARCH64-LABEL: max_v8f32:1233; AARCH64: // %bb.0: // %entry1234; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s1235; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1236; AARCH64-NEXT: fminnm v3.4s, v3.4s, v3.4s1237; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1238; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v2.4s1239; AARCH64-NEXT: fmaxnm v1.4s, v1.4s, v3.4s1240; AARCH64-NEXT: ret1241entry:1242 %c = call <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b)1243 ret <8 x float> %c1244}1245 1246;;;;;;;;;;;;;;;;;; max_f161247define half @max_f16(half %a, half %b) {1248; FULLFP16-LABEL: max_f16:1249; FULLFP16: // %bb.0: // %entry1250; FULLFP16-NEXT: fminnm h1, h1, h11251; FULLFP16-NEXT: fminnm h0, h0, h01252; FULLFP16-NEXT: fmaxnm h0, h0, h11253; FULLFP16-NEXT: ret1254;1255; NOFULLFP16-LABEL: max_f16:1256; NOFULLFP16: // %bb.0: // %entry1257; NOFULLFP16-NEXT: fcvt s1, h11258; NOFULLFP16-NEXT: fcvt s0, h01259; NOFULLFP16-NEXT: fmaxnm s0, s0, s11260; NOFULLFP16-NEXT: fcvt h0, s01261; NOFULLFP16-NEXT: ret1262entry:1263 %c = call half @llvm.maximumnum.f16(half %a, half %b)1264 ret half %c1265}1266 1267define <2 x half> @max_v2f16(<2 x half> %a, <2 x half> %b) {1268; FULLFP16-LABEL: max_v2f16:1269; FULLFP16: // %bb.0: // %entry1270; FULLFP16-NEXT: fminnm v1.4h, v1.4h, v1.4h1271; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v0.4h1272; FULLFP16-NEXT: fmaxnm v0.4h, v0.4h, v1.4h1273; FULLFP16-NEXT: ret1274;1275; NOFULLFP16-LABEL: max_v2f16:1276; NOFULLFP16: // %bb.0: // %entry1277; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q11278; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q01279; NOFULLFP16-NEXT: mov h2, v1.h[1]1280; NOFULLFP16-NEXT: mov h3, v0.h[1]1281; NOFULLFP16-NEXT: mov h4, v1.h[2]1282; NOFULLFP16-NEXT: mov h5, v0.h[2]1283; NOFULLFP16-NEXT: fcvt s6, h11284; NOFULLFP16-NEXT: fcvt s7, h01285; NOFULLFP16-NEXT: mov h1, v1.h[3]1286; NOFULLFP16-NEXT: fcvt s2, h21287; NOFULLFP16-NEXT: fcvt s3, h31288; NOFULLFP16-NEXT: fcvt s1, h11289; NOFULLFP16-NEXT: fmaxnm s2, s3, s21290; NOFULLFP16-NEXT: fcvt s3, h41291; NOFULLFP16-NEXT: fcvt s4, h51292; NOFULLFP16-NEXT: fmaxnm s5, s7, s61293; NOFULLFP16-NEXT: mov h6, v0.h[3]1294; NOFULLFP16-NEXT: fmaxnm s3, s4, s31295; NOFULLFP16-NEXT: fcvt h2, s21296; NOFULLFP16-NEXT: fcvt h0, s51297; NOFULLFP16-NEXT: fcvt s4, h61298; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]1299; NOFULLFP16-NEXT: fcvt h2, s31300; NOFULLFP16-NEXT: fmaxnm s1, s4, s11301; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]1302; NOFULLFP16-NEXT: fcvt h1, s11303; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]1304; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q01305; NOFULLFP16-NEXT: ret1306entry:1307 %c = call <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b)1308 ret <2 x half> %c1309}1310 1311define <4 x half> @max_v4f16(<4 x half> %a, <4 x half> %b) {1312; FULLFP16-LABEL: max_v4f16:1313; FULLFP16: // %bb.0: // %entry1314; FULLFP16-NEXT: fminnm v1.4h, v1.4h, v1.4h1315; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v0.4h1316; FULLFP16-NEXT: fmaxnm v0.4h, v0.4h, v1.4h1317; FULLFP16-NEXT: ret1318;1319; NOFULLFP16-LABEL: max_v4f16:1320; NOFULLFP16: // %bb.0: // %entry1321; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q11322; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q01323; NOFULLFP16-NEXT: mov h2, v1.h[1]1324; NOFULLFP16-NEXT: mov h3, v0.h[1]1325; NOFULLFP16-NEXT: mov h4, v1.h[2]1326; NOFULLFP16-NEXT: mov h5, v0.h[2]1327; NOFULLFP16-NEXT: fcvt s6, h11328; NOFULLFP16-NEXT: fcvt s7, h01329; NOFULLFP16-NEXT: mov h1, v1.h[3]1330; NOFULLFP16-NEXT: fcvt s2, h21331; NOFULLFP16-NEXT: fcvt s3, h31332; NOFULLFP16-NEXT: fcvt s1, h11333; NOFULLFP16-NEXT: fmaxnm s2, s3, s21334; NOFULLFP16-NEXT: fcvt s3, h41335; NOFULLFP16-NEXT: fcvt s4, h51336; NOFULLFP16-NEXT: fmaxnm s5, s7, s61337; NOFULLFP16-NEXT: mov h6, v0.h[3]1338; NOFULLFP16-NEXT: fmaxnm s3, s4, s31339; NOFULLFP16-NEXT: fcvt h2, s21340; NOFULLFP16-NEXT: fcvt h0, s51341; NOFULLFP16-NEXT: fcvt s4, h61342; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]1343; NOFULLFP16-NEXT: fcvt h2, s31344; NOFULLFP16-NEXT: fmaxnm s1, s4, s11345; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]1346; NOFULLFP16-NEXT: fcvt h1, s11347; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]1348; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q01349; NOFULLFP16-NEXT: ret1350entry:1351 %c = call <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b)1352 ret <4 x half> %c1353}1354 1355define <8 x half> @max_v8f16(<8 x half> %a, <8 x half> %b) {1356; FULLFP16-LABEL: max_v8f16:1357; FULLFP16: // %bb.0: // %entry1358; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h1359; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h1360; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v1.8h1361; FULLFP16-NEXT: ret1362;1363; NOFULLFP16-LABEL: max_v8f16:1364; NOFULLFP16: // %bb.0: // %entry1365; NOFULLFP16-NEXT: mov h2, v1.h[1]1366; NOFULLFP16-NEXT: mov h3, v0.h[1]1367; NOFULLFP16-NEXT: fcvt s4, h11368; NOFULLFP16-NEXT: fcvt s5, h01369; NOFULLFP16-NEXT: mov h6, v1.h[2]1370; NOFULLFP16-NEXT: mov h7, v0.h[2]1371; NOFULLFP16-NEXT: mov h16, v1.h[3]1372; NOFULLFP16-NEXT: fcvt s2, h21373; NOFULLFP16-NEXT: fcvt s3, h31374; NOFULLFP16-NEXT: fmaxnm s4, s5, s41375; NOFULLFP16-NEXT: mov h5, v0.h[3]1376; NOFULLFP16-NEXT: fcvt s6, h61377; NOFULLFP16-NEXT: fcvt s7, h71378; NOFULLFP16-NEXT: fcvt s16, h161379; NOFULLFP16-NEXT: fmaxnm s3, s3, s21380; NOFULLFP16-NEXT: fcvt s5, h51381; NOFULLFP16-NEXT: fcvt h2, s41382; NOFULLFP16-NEXT: fmaxnm s4, s7, s61383; NOFULLFP16-NEXT: mov h6, v1.h[4]1384; NOFULLFP16-NEXT: mov h7, v0.h[4]1385; NOFULLFP16-NEXT: fcvt h3, s31386; NOFULLFP16-NEXT: fmaxnm s5, s5, s161387; NOFULLFP16-NEXT: mov h16, v0.h[5]1388; NOFULLFP16-NEXT: fcvt h4, s41389; NOFULLFP16-NEXT: mov v2.h[1], v3.h[0]1390; NOFULLFP16-NEXT: fcvt s3, h61391; NOFULLFP16-NEXT: fcvt s6, h71392; NOFULLFP16-NEXT: mov h7, v1.h[5]1393; NOFULLFP16-NEXT: fcvt h5, s51394; NOFULLFP16-NEXT: fcvt s16, h161395; NOFULLFP16-NEXT: mov v2.h[2], v4.h[0]1396; NOFULLFP16-NEXT: mov h4, v1.h[6]1397; NOFULLFP16-NEXT: fmaxnm s3, s6, s31398; NOFULLFP16-NEXT: mov h6, v0.h[6]1399; NOFULLFP16-NEXT: fcvt s7, h71400; NOFULLFP16-NEXT: mov h1, v1.h[7]1401; NOFULLFP16-NEXT: mov h0, v0.h[7]1402; NOFULLFP16-NEXT: mov v2.h[3], v5.h[0]1403; NOFULLFP16-NEXT: fcvt s4, h41404; NOFULLFP16-NEXT: fcvt h3, s31405; NOFULLFP16-NEXT: fcvt s5, h61406; NOFULLFP16-NEXT: fmaxnm s6, s16, s71407; NOFULLFP16-NEXT: fcvt s1, h11408; NOFULLFP16-NEXT: fcvt s0, h01409; NOFULLFP16-NEXT: mov v2.h[4], v3.h[0]1410; NOFULLFP16-NEXT: fmaxnm s4, s5, s41411; NOFULLFP16-NEXT: fcvt h3, s61412; NOFULLFP16-NEXT: fmaxnm s0, s0, s11413; NOFULLFP16-NEXT: mov v2.h[5], v3.h[0]1414; NOFULLFP16-NEXT: fcvt h3, s41415; NOFULLFP16-NEXT: fcvt h0, s01416; NOFULLFP16-NEXT: mov v2.h[6], v3.h[0]1417; NOFULLFP16-NEXT: mov v2.h[7], v0.h[0]1418; NOFULLFP16-NEXT: mov v0.16b, v2.16b1419; NOFULLFP16-NEXT: ret1420entry:1421 %c = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b)1422 ret <8 x half> %c1423}1424 1425define <9 x half> @max_v9f16(<9 x half> %a, <9 x half> %b) {1426; FULLFP16-LABEL: max_v9f16:1427; FULLFP16: // %bb.0: // %entry1428; FULLFP16-NEXT: // kill: def $h0 killed $h0 def $q01429; FULLFP16-NEXT: // kill: def $h1 killed $h1 def $q11430; FULLFP16-NEXT: // kill: def $h2 killed $h2 def $q21431; FULLFP16-NEXT: add x9, sp, #161432; FULLFP16-NEXT: // kill: def $h3 killed $h3 def $q31433; FULLFP16-NEXT: // kill: def $h4 killed $h4 def $q41434; FULLFP16-NEXT: add x10, sp, #401435; FULLFP16-NEXT: // kill: def $h5 killed $h5 def $q51436; FULLFP16-NEXT: // kill: def $h6 killed $h6 def $q61437; FULLFP16-NEXT: // kill: def $h7 killed $h7 def $q71438; FULLFP16-NEXT: mov v0.h[1], v1.h[0]1439; FULLFP16-NEXT: ldr h1, [sp, #8]1440; FULLFP16-NEXT: ld1 { v1.h }[1], [x9]1441; FULLFP16-NEXT: add x9, sp, #241442; FULLFP16-NEXT: mov v0.h[2], v2.h[0]1443; FULLFP16-NEXT: ld1 { v1.h }[2], [x9]1444; FULLFP16-NEXT: add x9, sp, #321445; FULLFP16-NEXT: mov v0.h[3], v3.h[0]1446; FULLFP16-NEXT: ld1 { v1.h }[3], [x9]1447; FULLFP16-NEXT: ldr h2, [x10]1448; FULLFP16-NEXT: add x9, sp, #481449; FULLFP16-NEXT: ldr h3, [sp, #72]1450; FULLFP16-NEXT: ld1 { v2.h }[1], [x9]1451; FULLFP16-NEXT: add x9, sp, #561452; FULLFP16-NEXT: fminnm v3.8h, v3.8h, v3.8h1453; FULLFP16-NEXT: mov v0.h[4], v4.h[0]1454; FULLFP16-NEXT: ld1 { v2.h }[2], [x9]1455; FULLFP16-NEXT: add x9, sp, #641456; FULLFP16-NEXT: mov v0.h[5], v5.h[0]1457; FULLFP16-NEXT: ld1 { v2.h }[3], [x9]1458; FULLFP16-NEXT: zip1 v1.2d, v1.2d, v2.2d1459; FULLFP16-NEXT: ldr h2, [sp]1460; FULLFP16-NEXT: mov v0.h[6], v6.h[0]1461; FULLFP16-NEXT: fminnm v2.8h, v2.8h, v2.8h1462; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h1463; FULLFP16-NEXT: mov v0.h[7], v7.h[0]1464; FULLFP16-NEXT: fmaxnm v2.8h, v2.8h, v3.8h1465; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h1466; FULLFP16-NEXT: str h2, [x8, #16]1467; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v1.8h1468; FULLFP16-NEXT: str q0, [x8]1469; FULLFP16-NEXT: ret1470;1471; NOFULLFP16-LABEL: max_v9f16:1472; NOFULLFP16: // %bb.0: // %entry1473; NOFULLFP16-NEXT: ldr h16, [sp, #16]1474; NOFULLFP16-NEXT: ldr h17, [sp, #8]1475; NOFULLFP16-NEXT: fcvt s1, h11476; NOFULLFP16-NEXT: fcvt s0, h01477; NOFULLFP16-NEXT: ldr h18, [sp, #24]1478; NOFULLFP16-NEXT: fcvt s2, h21479; NOFULLFP16-NEXT: fcvt s16, h161480; NOFULLFP16-NEXT: fcvt s17, h171481; NOFULLFP16-NEXT: fcvt s3, h31482; NOFULLFP16-NEXT: fcvt s18, h181483; NOFULLFP16-NEXT: fcvt s4, h41484; NOFULLFP16-NEXT: fcvt s5, h51485; NOFULLFP16-NEXT: fmaxnm s1, s1, s161486; NOFULLFP16-NEXT: fmaxnm s0, s0, s171487; NOFULLFP16-NEXT: ldr h16, [sp, #32]1488; NOFULLFP16-NEXT: fmaxnm s2, s2, s181489; NOFULLFP16-NEXT: ldr h17, [sp, #40]1490; NOFULLFP16-NEXT: fcvt s16, h161491; NOFULLFP16-NEXT: fcvt s17, h171492; NOFULLFP16-NEXT: fcvt h1, s11493; NOFULLFP16-NEXT: fcvt h0, s01494; NOFULLFP16-NEXT: fcvt h2, s21495; NOFULLFP16-NEXT: fmaxnm s3, s3, s161496; NOFULLFP16-NEXT: fmaxnm s4, s4, s171497; NOFULLFP16-NEXT: mov v0.h[1], v1.h[0]1498; NOFULLFP16-NEXT: ldr h1, [sp, #48]1499; NOFULLFP16-NEXT: fcvt s1, h11500; NOFULLFP16-NEXT: fcvt h3, s31501; NOFULLFP16-NEXT: fcvt h4, s41502; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]1503; NOFULLFP16-NEXT: ldr h2, [sp, #56]1504; NOFULLFP16-NEXT: fmaxnm s1, s5, s11505; NOFULLFP16-NEXT: fcvt s2, h21506; NOFULLFP16-NEXT: ldr h5, [sp, #64]1507; NOFULLFP16-NEXT: mov v0.h[3], v3.h[0]1508; NOFULLFP16-NEXT: fcvt s3, h61509; NOFULLFP16-NEXT: ldr h6, [sp, #72]1510; NOFULLFP16-NEXT: fcvt h1, s11511; NOFULLFP16-NEXT: fcvt s6, h61512; NOFULLFP16-NEXT: mov v0.h[4], v4.h[0]1513; NOFULLFP16-NEXT: fmaxnm s2, s3, s21514; NOFULLFP16-NEXT: fcvt s3, h51515; NOFULLFP16-NEXT: fcvt s4, h71516; NOFULLFP16-NEXT: ldr h5, [sp]1517; NOFULLFP16-NEXT: fcvt s5, h51518; NOFULLFP16-NEXT: mov v0.h[5], v1.h[0]1519; NOFULLFP16-NEXT: fcvt h1, s21520; NOFULLFP16-NEXT: fmaxnm s2, s4, s31521; NOFULLFP16-NEXT: fmaxnm s3, s5, s61522; NOFULLFP16-NEXT: mov v0.h[6], v1.h[0]1523; NOFULLFP16-NEXT: fcvt h1, s21524; NOFULLFP16-NEXT: fcvt h2, s31525; NOFULLFP16-NEXT: mov v0.h[7], v1.h[0]1526; NOFULLFP16-NEXT: str h2, [x8, #16]1527; NOFULLFP16-NEXT: str q0, [x8]1528; NOFULLFP16-NEXT: ret1529entry:1530 %c = call <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b)1531 ret <9 x half> %c1532}1533 1534define <16 x half> @max_v16f16(<16 x half> %a, <16 x half> %b) {1535; FULLFP16-LABEL: max_v16f16:1536; FULLFP16: // %bb.0: // %entry1537; FULLFP16-NEXT: fminnm v2.8h, v2.8h, v2.8h1538; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h1539; FULLFP16-NEXT: fminnm v3.8h, v3.8h, v3.8h1540; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h1541; FULLFP16-NEXT: fmaxnm v0.8h, v0.8h, v2.8h1542; FULLFP16-NEXT: fmaxnm v1.8h, v1.8h, v3.8h1543; FULLFP16-NEXT: ret1544;1545; NOFULLFP16-LABEL: max_v16f16:1546; NOFULLFP16: // %bb.0: // %entry1547; NOFULLFP16-NEXT: mov h6, v2.h[1]1548; NOFULLFP16-NEXT: mov h7, v0.h[1]1549; NOFULLFP16-NEXT: fcvt s4, h21550; NOFULLFP16-NEXT: fcvt s5, h01551; NOFULLFP16-NEXT: mov h16, v3.h[1]1552; NOFULLFP16-NEXT: mov h17, v1.h[1]1553; NOFULLFP16-NEXT: mov h18, v2.h[2]1554; NOFULLFP16-NEXT: mov h19, v0.h[2]1555; NOFULLFP16-NEXT: fcvt s20, h31556; NOFULLFP16-NEXT: fcvt s21, h11557; NOFULLFP16-NEXT: mov h22, v3.h[2]1558; NOFULLFP16-NEXT: mov h23, v1.h[2]1559; NOFULLFP16-NEXT: fcvt s6, h61560; NOFULLFP16-NEXT: fcvt s7, h71561; NOFULLFP16-NEXT: mov h24, v0.h[6]1562; NOFULLFP16-NEXT: fmaxnm s4, s5, s41563; NOFULLFP16-NEXT: fcvt s5, h161564; NOFULLFP16-NEXT: fcvt s16, h171565; NOFULLFP16-NEXT: fcvt s17, h181566; NOFULLFP16-NEXT: fcvt s18, h191567; NOFULLFP16-NEXT: mov h19, v0.h[3]1568; NOFULLFP16-NEXT: fmaxnm s20, s21, s201569; NOFULLFP16-NEXT: fcvt s21, h221570; NOFULLFP16-NEXT: mov h22, v3.h[3]1571; NOFULLFP16-NEXT: fmaxnm s6, s7, s61572; NOFULLFP16-NEXT: mov h7, v2.h[3]1573; NOFULLFP16-NEXT: mov h25, v1.h[6]1574; NOFULLFP16-NEXT: fcvt h4, s41575; NOFULLFP16-NEXT: fmaxnm s5, s16, s51576; NOFULLFP16-NEXT: fcvt s16, h231577; NOFULLFP16-NEXT: mov h23, v1.h[3]1578; NOFULLFP16-NEXT: fmaxnm s17, s18, s171579; NOFULLFP16-NEXT: fcvt s18, h191580; NOFULLFP16-NEXT: fcvt h6, s61581; NOFULLFP16-NEXT: fcvt s7, h71582; NOFULLFP16-NEXT: fcvt h19, s51583; NOFULLFP16-NEXT: fcvt h5, s201584; NOFULLFP16-NEXT: fmaxnm s16, s16, s211585; NOFULLFP16-NEXT: fcvt s20, h231586; NOFULLFP16-NEXT: fcvt h17, s171587; NOFULLFP16-NEXT: mov h21, v2.h[4]1588; NOFULLFP16-NEXT: mov h23, v1.h[4]1589; NOFULLFP16-NEXT: mov v4.h[1], v6.h[0]1590; NOFULLFP16-NEXT: fcvt s6, h221591; NOFULLFP16-NEXT: mov h22, v0.h[4]1592; NOFULLFP16-NEXT: fmaxnm s7, s18, s71593; NOFULLFP16-NEXT: mov h18, v3.h[4]1594; NOFULLFP16-NEXT: mov v5.h[1], v19.h[0]1595; NOFULLFP16-NEXT: fcvt h16, s161596; NOFULLFP16-NEXT: fmaxnm s6, s20, s61597; NOFULLFP16-NEXT: mov v4.h[2], v17.h[0]1598; NOFULLFP16-NEXT: fcvt s17, h211599; NOFULLFP16-NEXT: fcvt s19, h221600; NOFULLFP16-NEXT: fcvt h7, s71601; NOFULLFP16-NEXT: fcvt s18, h181602; NOFULLFP16-NEXT: fcvt s20, h231603; NOFULLFP16-NEXT: mov h21, v2.h[5]1604; NOFULLFP16-NEXT: mov h22, v0.h[5]1605; NOFULLFP16-NEXT: mov v5.h[2], v16.h[0]1606; NOFULLFP16-NEXT: mov h16, v3.h[5]1607; NOFULLFP16-NEXT: mov h23, v1.h[5]1608; NOFULLFP16-NEXT: fcvt h6, s61609; NOFULLFP16-NEXT: mov h0, v0.h[7]1610; NOFULLFP16-NEXT: mov h1, v1.h[7]1611; NOFULLFP16-NEXT: fmaxnm s17, s19, s171612; NOFULLFP16-NEXT: mov h19, v2.h[6]1613; NOFULLFP16-NEXT: mov v4.h[3], v7.h[0]1614; NOFULLFP16-NEXT: fmaxnm s18, s20, s181615; NOFULLFP16-NEXT: mov h20, v3.h[6]1616; NOFULLFP16-NEXT: fcvt s7, h211617; NOFULLFP16-NEXT: fcvt s21, h221618; NOFULLFP16-NEXT: fcvt s22, h241619; NOFULLFP16-NEXT: mov h2, v2.h[7]1620; NOFULLFP16-NEXT: mov v5.h[3], v6.h[0]1621; NOFULLFP16-NEXT: fcvt s6, h161622; NOFULLFP16-NEXT: fcvt s16, h231623; NOFULLFP16-NEXT: fcvt h17, s171624; NOFULLFP16-NEXT: fcvt s19, h191625; NOFULLFP16-NEXT: fcvt s23, h251626; NOFULLFP16-NEXT: fcvt h18, s181627; NOFULLFP16-NEXT: fcvt s20, h201628; NOFULLFP16-NEXT: mov h3, v3.h[7]1629; NOFULLFP16-NEXT: fmaxnm s7, s21, s71630; NOFULLFP16-NEXT: fcvt s2, h21631; NOFULLFP16-NEXT: fcvt s0, h01632; NOFULLFP16-NEXT: fmaxnm s6, s16, s61633; NOFULLFP16-NEXT: fcvt s1, h11634; NOFULLFP16-NEXT: mov v4.h[4], v17.h[0]1635; NOFULLFP16-NEXT: fmaxnm s16, s22, s191636; NOFULLFP16-NEXT: mov v5.h[4], v18.h[0]1637; NOFULLFP16-NEXT: fmaxnm s17, s23, s201638; NOFULLFP16-NEXT: fcvt s3, h31639; NOFULLFP16-NEXT: fcvt h7, s71640; NOFULLFP16-NEXT: fmaxnm s0, s0, s21641; NOFULLFP16-NEXT: fcvt h6, s61642; NOFULLFP16-NEXT: fcvt h2, s161643; NOFULLFP16-NEXT: fmaxnm s1, s1, s31644; NOFULLFP16-NEXT: mov v4.h[5], v7.h[0]1645; NOFULLFP16-NEXT: fcvt h0, s01646; NOFULLFP16-NEXT: mov v5.h[5], v6.h[0]1647; NOFULLFP16-NEXT: fcvt h6, s171648; NOFULLFP16-NEXT: fcvt h1, s11649; NOFULLFP16-NEXT: mov v4.h[6], v2.h[0]1650; NOFULLFP16-NEXT: mov v5.h[6], v6.h[0]1651; NOFULLFP16-NEXT: mov v4.h[7], v0.h[0]1652; NOFULLFP16-NEXT: mov v5.h[7], v1.h[0]1653; NOFULLFP16-NEXT: mov v0.16b, v4.16b1654; NOFULLFP16-NEXT: mov v1.16b, v5.16b1655; NOFULLFP16-NEXT: ret1656entry:1657 %c = call <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b)1658 ret <16 x half> %c1659}1660 1661;;;;;;;;;;;;;;;; min_f641662define double @min_f64(double %a, double %b) {1663; AARCH64-LABEL: min_f64:1664; AARCH64: // %bb.0: // %entry1665; AARCH64-NEXT: fminnm d1, d1, d11666; AARCH64-NEXT: fminnm d0, d0, d01667; AARCH64-NEXT: fminnm d0, d0, d11668; AARCH64-NEXT: ret1669entry:1670 %c = call double @llvm.minimumnum.f64(double %a, double %b)1671 ret double %c1672}1673 1674define <2 x double> @min_v2f64(<2 x double> %a, <2 x double> %b) {1675; AARCH64-LABEL: min_v2f64:1676; AARCH64: // %bb.0: // %entry1677; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d1678; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1679; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d1680; AARCH64-NEXT: ret1681entry:1682 %c = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b)1683 ret <2 x double> %c1684}1685 1686define <3 x double> @min_v3f64(<3 x double> %a, <3 x double> %b) {1687; AARCH64-LABEL: min_v3f64:1688; AARCH64: // %bb.0: // %entry1689; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q31690; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q01691; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q41692; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q11693; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q21694; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q51695; AARCH64-NEXT: mov v0.d[1], v1.d[0]1696; AARCH64-NEXT: mov v3.d[1], v4.d[0]1697; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d1698; AARCH64-NEXT: fminnm v1.2d, v3.2d, v3.2d1699; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1700; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d1701; AARCH64-NEXT: fminnm v1.2d, v5.2d, v5.2d1702; AARCH64-NEXT: fminnm v2.2d, v2.2d, v1.2d1703; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #81704; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q01705; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q11706; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q21707; AARCH64-NEXT: ret1708entry:1709 %c = call <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b)1710 ret <3 x double> %c1711}1712 1713define <4 x double> @min_v4f64(<4 x double> %a, <4 x double> %b) {1714; AARCH64-LABEL: min_v4f64:1715; AARCH64: // %bb.0: // %entry1716; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d1717; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d1718; AARCH64-NEXT: fminnm v3.2d, v3.2d, v3.2d1719; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d1720; AARCH64-NEXT: fminnm v0.2d, v0.2d, v2.2d1721; AARCH64-NEXT: fminnm v1.2d, v1.2d, v3.2d1722; AARCH64-NEXT: ret1723entry:1724 %c = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b)1725 ret <4 x double> %c1726}1727 1728;;;;;;;;;;;;;;;;;; min_f321729define float @min_f32(float %a, float %b) {1730; AARCH64-LABEL: min_f32:1731; AARCH64: // %bb.0: // %entry1732; AARCH64-NEXT: fminnm s1, s1, s11733; AARCH64-NEXT: fminnm s0, s0, s01734; AARCH64-NEXT: fminnm s0, s0, s11735; AARCH64-NEXT: ret1736entry:1737 %c = call float @llvm.minimumnum.f32(float %a, float %b)1738 ret float %c1739}1740 1741define <2 x float> @min_v2f32(<2 x float> %a, <2 x float> %b) {1742; AARCH64-LABEL: min_v2f32:1743; AARCH64: // %bb.0: // %entry1744; AARCH64-NEXT: fminnm v1.2s, v1.2s, v1.2s1745; AARCH64-NEXT: fminnm v0.2s, v0.2s, v0.2s1746; AARCH64-NEXT: fminnm v0.2s, v0.2s, v1.2s1747; AARCH64-NEXT: ret1748entry:1749 %c = call <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b)1750 ret <2 x float> %c1751}1752 1753define <3 x float> @min_v3f32(<3 x float> %a, <3 x float> %b) {1754; AARCH64-LABEL: min_v3f32:1755; AARCH64: // %bb.0: // %entry1756; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1757; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1758; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s1759; AARCH64-NEXT: ret1760entry:1761 %c = call <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b)1762 ret <3 x float> %c1763}1764 1765define <4 x float> @min_v4f32(<4 x float> %a, <4 x float> %b) {1766; AARCH64-LABEL: min_v4f32:1767; AARCH64: // %bb.0: // %entry1768; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1769; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1770; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s1771; AARCH64-NEXT: ret1772entry:1773 %c = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b)1774 ret <4 x float> %c1775}1776 1777define <5 x float> @min_v5f32(<5 x float> %a, <5 x float> %b) {1778; AARCH64-LABEL: min_v5f32:1779; AARCH64: // %bb.0: // %entry1780; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q01781; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q51782; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q11783; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q61784; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q21785; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q71786; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q31787; AARCH64-NEXT: mov x8, sp1788; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q41789; AARCH64-NEXT: mov v0.s[1], v1.s[0]1790; AARCH64-NEXT: mov v5.s[1], v6.s[0]1791; AARCH64-NEXT: mov v0.s[2], v2.s[0]1792; AARCH64-NEXT: mov v5.s[2], v7.s[0]1793; AARCH64-NEXT: ldr s2, [sp, #8]1794; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s1795; AARCH64-NEXT: mov v0.s[3], v3.s[0]1796; AARCH64-NEXT: ld1 { v5.s }[3], [x8]1797; AARCH64-NEXT: fminnm v3.4s, v4.4s, v4.4s1798; AARCH64-NEXT: fminnm v1.4s, v5.4s, v5.4s1799; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1800; AARCH64-NEXT: fminnm v4.4s, v3.4s, v2.4s1801; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q41802; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s1803; AARCH64-NEXT: mov s1, v0.s[1]1804; AARCH64-NEXT: mov s2, v0.s[2]1805; AARCH64-NEXT: mov s3, v0.s[3]1806; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q01807; AARCH64-NEXT: ret1808entry:1809 %c = call <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b)1810 ret <5 x float> %c1811}1812 1813define <8 x float> @min_v8f32(<8 x float> %a, <8 x float> %b) {1814; AARCH64-LABEL: min_v8f32:1815; AARCH64: // %bb.0: // %entry1816; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s1817; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s1818; AARCH64-NEXT: fminnm v3.4s, v3.4s, v3.4s1819; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s1820; AARCH64-NEXT: fminnm v0.4s, v0.4s, v2.4s1821; AARCH64-NEXT: fminnm v1.4s, v1.4s, v3.4s1822; AARCH64-NEXT: ret1823entry:1824 %c = call <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b)1825 ret <8 x float> %c1826}1827 1828;;;;;;;;;;;;;;;;;; min_f161829define half @min_f16(half %a, half %b) {1830; FULLFP16-LABEL: min_f16:1831; FULLFP16: // %bb.0: // %entry1832; FULLFP16-NEXT: fminnm h1, h1, h11833; FULLFP16-NEXT: fminnm h0, h0, h01834; FULLFP16-NEXT: fminnm h0, h0, h11835; FULLFP16-NEXT: ret1836;1837; NOFULLFP16-LABEL: min_f16:1838; NOFULLFP16: // %bb.0: // %entry1839; NOFULLFP16-NEXT: fcvt s1, h11840; NOFULLFP16-NEXT: fcvt s0, h01841; NOFULLFP16-NEXT: fminnm s0, s0, s11842; NOFULLFP16-NEXT: fcvt h0, s01843; NOFULLFP16-NEXT: ret1844entry:1845 %c = call half @llvm.minimumnum.f16(half %a, half %b)1846 ret half %c1847}1848 1849define <2 x half> @min_v2f16(<2 x half> %a, <2 x half> %b) {1850; FULLFP16-LABEL: min_v2f16:1851; FULLFP16: // %bb.0: // %entry1852; FULLFP16-NEXT: fminnm v1.4h, v1.4h, v1.4h1853; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v0.4h1854; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v1.4h1855; FULLFP16-NEXT: ret1856;1857; NOFULLFP16-LABEL: min_v2f16:1858; NOFULLFP16: // %bb.0: // %entry1859; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q11860; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q01861; NOFULLFP16-NEXT: mov h2, v1.h[1]1862; NOFULLFP16-NEXT: mov h3, v0.h[1]1863; NOFULLFP16-NEXT: mov h4, v1.h[2]1864; NOFULLFP16-NEXT: mov h5, v0.h[2]1865; NOFULLFP16-NEXT: fcvt s6, h11866; NOFULLFP16-NEXT: fcvt s7, h01867; NOFULLFP16-NEXT: mov h1, v1.h[3]1868; NOFULLFP16-NEXT: fcvt s2, h21869; NOFULLFP16-NEXT: fcvt s3, h31870; NOFULLFP16-NEXT: fcvt s1, h11871; NOFULLFP16-NEXT: fminnm s2, s3, s21872; NOFULLFP16-NEXT: fcvt s3, h41873; NOFULLFP16-NEXT: fcvt s4, h51874; NOFULLFP16-NEXT: fminnm s5, s7, s61875; NOFULLFP16-NEXT: mov h6, v0.h[3]1876; NOFULLFP16-NEXT: fminnm s3, s4, s31877; NOFULLFP16-NEXT: fcvt h2, s21878; NOFULLFP16-NEXT: fcvt h0, s51879; NOFULLFP16-NEXT: fcvt s4, h61880; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]1881; NOFULLFP16-NEXT: fcvt h2, s31882; NOFULLFP16-NEXT: fminnm s1, s4, s11883; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]1884; NOFULLFP16-NEXT: fcvt h1, s11885; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]1886; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q01887; NOFULLFP16-NEXT: ret1888entry:1889 %c = call <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b)1890 ret <2 x half> %c1891}1892 1893define <4 x half> @min_v4f16(<4 x half> %a, <4 x half> %b) {1894; FULLFP16-LABEL: min_v4f16:1895; FULLFP16: // %bb.0: // %entry1896; FULLFP16-NEXT: fminnm v1.4h, v1.4h, v1.4h1897; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v0.4h1898; FULLFP16-NEXT: fminnm v0.4h, v0.4h, v1.4h1899; FULLFP16-NEXT: ret1900;1901; NOFULLFP16-LABEL: min_v4f16:1902; NOFULLFP16: // %bb.0: // %entry1903; NOFULLFP16-NEXT: // kill: def $d1 killed $d1 def $q11904; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 def $q01905; NOFULLFP16-NEXT: mov h2, v1.h[1]1906; NOFULLFP16-NEXT: mov h3, v0.h[1]1907; NOFULLFP16-NEXT: mov h4, v1.h[2]1908; NOFULLFP16-NEXT: mov h5, v0.h[2]1909; NOFULLFP16-NEXT: fcvt s6, h11910; NOFULLFP16-NEXT: fcvt s7, h01911; NOFULLFP16-NEXT: mov h1, v1.h[3]1912; NOFULLFP16-NEXT: fcvt s2, h21913; NOFULLFP16-NEXT: fcvt s3, h31914; NOFULLFP16-NEXT: fcvt s1, h11915; NOFULLFP16-NEXT: fminnm s2, s3, s21916; NOFULLFP16-NEXT: fcvt s3, h41917; NOFULLFP16-NEXT: fcvt s4, h51918; NOFULLFP16-NEXT: fminnm s5, s7, s61919; NOFULLFP16-NEXT: mov h6, v0.h[3]1920; NOFULLFP16-NEXT: fminnm s3, s4, s31921; NOFULLFP16-NEXT: fcvt h2, s21922; NOFULLFP16-NEXT: fcvt h0, s51923; NOFULLFP16-NEXT: fcvt s4, h61924; NOFULLFP16-NEXT: mov v0.h[1], v2.h[0]1925; NOFULLFP16-NEXT: fcvt h2, s31926; NOFULLFP16-NEXT: fminnm s1, s4, s11927; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]1928; NOFULLFP16-NEXT: fcvt h1, s11929; NOFULLFP16-NEXT: mov v0.h[3], v1.h[0]1930; NOFULLFP16-NEXT: // kill: def $d0 killed $d0 killed $q01931; NOFULLFP16-NEXT: ret1932entry:1933 %c = call <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b)1934 ret <4 x half> %c1935}1936 1937define <8 x half> @min_v8f16(<8 x half> %a, <8 x half> %b) {1938; FULLFP16-LABEL: min_v8f16:1939; FULLFP16: // %bb.0: // %entry1940; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h1941; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h1942; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v1.8h1943; FULLFP16-NEXT: ret1944;1945; NOFULLFP16-LABEL: min_v8f16:1946; NOFULLFP16: // %bb.0: // %entry1947; NOFULLFP16-NEXT: mov h2, v1.h[1]1948; NOFULLFP16-NEXT: mov h3, v0.h[1]1949; NOFULLFP16-NEXT: fcvt s4, h11950; NOFULLFP16-NEXT: fcvt s5, h01951; NOFULLFP16-NEXT: mov h6, v1.h[2]1952; NOFULLFP16-NEXT: mov h7, v0.h[2]1953; NOFULLFP16-NEXT: mov h16, v1.h[3]1954; NOFULLFP16-NEXT: fcvt s2, h21955; NOFULLFP16-NEXT: fcvt s3, h31956; NOFULLFP16-NEXT: fminnm s4, s5, s41957; NOFULLFP16-NEXT: mov h5, v0.h[3]1958; NOFULLFP16-NEXT: fcvt s6, h61959; NOFULLFP16-NEXT: fcvt s7, h71960; NOFULLFP16-NEXT: fcvt s16, h161961; NOFULLFP16-NEXT: fminnm s3, s3, s21962; NOFULLFP16-NEXT: fcvt s5, h51963; NOFULLFP16-NEXT: fcvt h2, s41964; NOFULLFP16-NEXT: fminnm s4, s7, s61965; NOFULLFP16-NEXT: mov h6, v1.h[4]1966; NOFULLFP16-NEXT: mov h7, v0.h[4]1967; NOFULLFP16-NEXT: fcvt h3, s31968; NOFULLFP16-NEXT: fminnm s5, s5, s161969; NOFULLFP16-NEXT: mov h16, v0.h[5]1970; NOFULLFP16-NEXT: fcvt h4, s41971; NOFULLFP16-NEXT: mov v2.h[1], v3.h[0]1972; NOFULLFP16-NEXT: fcvt s3, h61973; NOFULLFP16-NEXT: fcvt s6, h71974; NOFULLFP16-NEXT: mov h7, v1.h[5]1975; NOFULLFP16-NEXT: fcvt h5, s51976; NOFULLFP16-NEXT: fcvt s16, h161977; NOFULLFP16-NEXT: mov v2.h[2], v4.h[0]1978; NOFULLFP16-NEXT: mov h4, v1.h[6]1979; NOFULLFP16-NEXT: fminnm s3, s6, s31980; NOFULLFP16-NEXT: mov h6, v0.h[6]1981; NOFULLFP16-NEXT: fcvt s7, h71982; NOFULLFP16-NEXT: mov h1, v1.h[7]1983; NOFULLFP16-NEXT: mov h0, v0.h[7]1984; NOFULLFP16-NEXT: mov v2.h[3], v5.h[0]1985; NOFULLFP16-NEXT: fcvt s4, h41986; NOFULLFP16-NEXT: fcvt h3, s31987; NOFULLFP16-NEXT: fcvt s5, h61988; NOFULLFP16-NEXT: fminnm s6, s16, s71989; NOFULLFP16-NEXT: fcvt s1, h11990; NOFULLFP16-NEXT: fcvt s0, h01991; NOFULLFP16-NEXT: mov v2.h[4], v3.h[0]1992; NOFULLFP16-NEXT: fminnm s4, s5, s41993; NOFULLFP16-NEXT: fcvt h3, s61994; NOFULLFP16-NEXT: fminnm s0, s0, s11995; NOFULLFP16-NEXT: mov v2.h[5], v3.h[0]1996; NOFULLFP16-NEXT: fcvt h3, s41997; NOFULLFP16-NEXT: fcvt h0, s01998; NOFULLFP16-NEXT: mov v2.h[6], v3.h[0]1999; NOFULLFP16-NEXT: mov v2.h[7], v0.h[0]2000; NOFULLFP16-NEXT: mov v0.16b, v2.16b2001; NOFULLFP16-NEXT: ret2002entry:2003 %c = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b)2004 ret <8 x half> %c2005}2006 2007define <9 x half> @min_v9f16(<9 x half> %a, <9 x half> %b) {2008; FULLFP16-LABEL: min_v9f16:2009; FULLFP16: // %bb.0: // %entry2010; FULLFP16-NEXT: // kill: def $h0 killed $h0 def $q02011; FULLFP16-NEXT: // kill: def $h1 killed $h1 def $q12012; FULLFP16-NEXT: // kill: def $h2 killed $h2 def $q22013; FULLFP16-NEXT: add x9, sp, #162014; FULLFP16-NEXT: // kill: def $h3 killed $h3 def $q32015; FULLFP16-NEXT: // kill: def $h4 killed $h4 def $q42016; FULLFP16-NEXT: add x10, sp, #402017; FULLFP16-NEXT: // kill: def $h5 killed $h5 def $q52018; FULLFP16-NEXT: // kill: def $h6 killed $h6 def $q62019; FULLFP16-NEXT: // kill: def $h7 killed $h7 def $q72020; FULLFP16-NEXT: mov v0.h[1], v1.h[0]2021; FULLFP16-NEXT: ldr h1, [sp, #8]2022; FULLFP16-NEXT: ld1 { v1.h }[1], [x9]2023; FULLFP16-NEXT: add x9, sp, #242024; FULLFP16-NEXT: mov v0.h[2], v2.h[0]2025; FULLFP16-NEXT: ld1 { v1.h }[2], [x9]2026; FULLFP16-NEXT: add x9, sp, #322027; FULLFP16-NEXT: mov v0.h[3], v3.h[0]2028; FULLFP16-NEXT: ld1 { v1.h }[3], [x9]2029; FULLFP16-NEXT: ldr h2, [x10]2030; FULLFP16-NEXT: add x9, sp, #482031; FULLFP16-NEXT: ldr h3, [sp, #72]2032; FULLFP16-NEXT: ld1 { v2.h }[1], [x9]2033; FULLFP16-NEXT: add x9, sp, #562034; FULLFP16-NEXT: fminnm v3.8h, v3.8h, v3.8h2035; FULLFP16-NEXT: mov v0.h[4], v4.h[0]2036; FULLFP16-NEXT: ld1 { v2.h }[2], [x9]2037; FULLFP16-NEXT: add x9, sp, #642038; FULLFP16-NEXT: mov v0.h[5], v5.h[0]2039; FULLFP16-NEXT: ld1 { v2.h }[3], [x9]2040; FULLFP16-NEXT: zip1 v1.2d, v1.2d, v2.2d2041; FULLFP16-NEXT: ldr h2, [sp]2042; FULLFP16-NEXT: mov v0.h[6], v6.h[0]2043; FULLFP16-NEXT: fminnm v2.8h, v2.8h, v2.8h2044; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h2045; FULLFP16-NEXT: mov v0.h[7], v7.h[0]2046; FULLFP16-NEXT: fminnm v2.8h, v2.8h, v3.8h2047; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h2048; FULLFP16-NEXT: str h2, [x8, #16]2049; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v1.8h2050; FULLFP16-NEXT: str q0, [x8]2051; FULLFP16-NEXT: ret2052;2053; NOFULLFP16-LABEL: min_v9f16:2054; NOFULLFP16: // %bb.0: // %entry2055; NOFULLFP16-NEXT: ldr h16, [sp, #16]2056; NOFULLFP16-NEXT: ldr h17, [sp, #8]2057; NOFULLFP16-NEXT: fcvt s1, h12058; NOFULLFP16-NEXT: fcvt s0, h02059; NOFULLFP16-NEXT: ldr h18, [sp, #24]2060; NOFULLFP16-NEXT: fcvt s2, h22061; NOFULLFP16-NEXT: fcvt s16, h162062; NOFULLFP16-NEXT: fcvt s17, h172063; NOFULLFP16-NEXT: fcvt s3, h32064; NOFULLFP16-NEXT: fcvt s18, h182065; NOFULLFP16-NEXT: fcvt s4, h42066; NOFULLFP16-NEXT: fcvt s5, h52067; NOFULLFP16-NEXT: fminnm s1, s1, s162068; NOFULLFP16-NEXT: fminnm s0, s0, s172069; NOFULLFP16-NEXT: ldr h16, [sp, #32]2070; NOFULLFP16-NEXT: fminnm s2, s2, s182071; NOFULLFP16-NEXT: ldr h17, [sp, #40]2072; NOFULLFP16-NEXT: fcvt s16, h162073; NOFULLFP16-NEXT: fcvt s17, h172074; NOFULLFP16-NEXT: fcvt h1, s12075; NOFULLFP16-NEXT: fcvt h0, s02076; NOFULLFP16-NEXT: fcvt h2, s22077; NOFULLFP16-NEXT: fminnm s3, s3, s162078; NOFULLFP16-NEXT: fminnm s4, s4, s172079; NOFULLFP16-NEXT: mov v0.h[1], v1.h[0]2080; NOFULLFP16-NEXT: ldr h1, [sp, #48]2081; NOFULLFP16-NEXT: fcvt s1, h12082; NOFULLFP16-NEXT: fcvt h3, s32083; NOFULLFP16-NEXT: fcvt h4, s42084; NOFULLFP16-NEXT: mov v0.h[2], v2.h[0]2085; NOFULLFP16-NEXT: ldr h2, [sp, #56]2086; NOFULLFP16-NEXT: fminnm s1, s5, s12087; NOFULLFP16-NEXT: fcvt s2, h22088; NOFULLFP16-NEXT: ldr h5, [sp, #64]2089; NOFULLFP16-NEXT: mov v0.h[3], v3.h[0]2090; NOFULLFP16-NEXT: fcvt s3, h62091; NOFULLFP16-NEXT: ldr h6, [sp, #72]2092; NOFULLFP16-NEXT: fcvt h1, s12093; NOFULLFP16-NEXT: fcvt s6, h62094; NOFULLFP16-NEXT: mov v0.h[4], v4.h[0]2095; NOFULLFP16-NEXT: fminnm s2, s3, s22096; NOFULLFP16-NEXT: fcvt s3, h52097; NOFULLFP16-NEXT: fcvt s4, h72098; NOFULLFP16-NEXT: ldr h5, [sp]2099; NOFULLFP16-NEXT: fcvt s5, h52100; NOFULLFP16-NEXT: mov v0.h[5], v1.h[0]2101; NOFULLFP16-NEXT: fcvt h1, s22102; NOFULLFP16-NEXT: fminnm s2, s4, s32103; NOFULLFP16-NEXT: fminnm s3, s5, s62104; NOFULLFP16-NEXT: mov v0.h[6], v1.h[0]2105; NOFULLFP16-NEXT: fcvt h1, s22106; NOFULLFP16-NEXT: fcvt h2, s32107; NOFULLFP16-NEXT: mov v0.h[7], v1.h[0]2108; NOFULLFP16-NEXT: str h2, [x8, #16]2109; NOFULLFP16-NEXT: str q0, [x8]2110; NOFULLFP16-NEXT: ret2111entry:2112 %c = call <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b)2113 ret <9 x half> %c2114}2115 2116define <16 x half> @min_v16f16(<16 x half> %a, <16 x half> %b) {2117; FULLFP16-LABEL: min_v16f16:2118; FULLFP16: // %bb.0: // %entry2119; FULLFP16-NEXT: fminnm v2.8h, v2.8h, v2.8h2120; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v0.8h2121; FULLFP16-NEXT: fminnm v3.8h, v3.8h, v3.8h2122; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v1.8h2123; FULLFP16-NEXT: fminnm v0.8h, v0.8h, v2.8h2124; FULLFP16-NEXT: fminnm v1.8h, v1.8h, v3.8h2125; FULLFP16-NEXT: ret2126;2127; NOFULLFP16-LABEL: min_v16f16:2128; NOFULLFP16: // %bb.0: // %entry2129; NOFULLFP16-NEXT: mov h6, v2.h[1]2130; NOFULLFP16-NEXT: mov h7, v0.h[1]2131; NOFULLFP16-NEXT: fcvt s4, h22132; NOFULLFP16-NEXT: fcvt s5, h02133; NOFULLFP16-NEXT: mov h16, v3.h[1]2134; NOFULLFP16-NEXT: mov h17, v1.h[1]2135; NOFULLFP16-NEXT: mov h18, v2.h[2]2136; NOFULLFP16-NEXT: mov h19, v0.h[2]2137; NOFULLFP16-NEXT: fcvt s20, h32138; NOFULLFP16-NEXT: fcvt s21, h12139; NOFULLFP16-NEXT: mov h22, v3.h[2]2140; NOFULLFP16-NEXT: mov h23, v1.h[2]2141; NOFULLFP16-NEXT: fcvt s6, h62142; NOFULLFP16-NEXT: fcvt s7, h72143; NOFULLFP16-NEXT: mov h24, v0.h[6]2144; NOFULLFP16-NEXT: fminnm s4, s5, s42145; NOFULLFP16-NEXT: fcvt s5, h162146; NOFULLFP16-NEXT: fcvt s16, h172147; NOFULLFP16-NEXT: fcvt s17, h182148; NOFULLFP16-NEXT: fcvt s18, h192149; NOFULLFP16-NEXT: mov h19, v0.h[3]2150; NOFULLFP16-NEXT: fminnm s20, s21, s202151; NOFULLFP16-NEXT: fcvt s21, h222152; NOFULLFP16-NEXT: mov h22, v3.h[3]2153; NOFULLFP16-NEXT: fminnm s6, s7, s62154; NOFULLFP16-NEXT: mov h7, v2.h[3]2155; NOFULLFP16-NEXT: mov h25, v1.h[6]2156; NOFULLFP16-NEXT: fcvt h4, s42157; NOFULLFP16-NEXT: fminnm s5, s16, s52158; NOFULLFP16-NEXT: fcvt s16, h232159; NOFULLFP16-NEXT: mov h23, v1.h[3]2160; NOFULLFP16-NEXT: fminnm s17, s18, s172161; NOFULLFP16-NEXT: fcvt s18, h192162; NOFULLFP16-NEXT: fcvt h6, s62163; NOFULLFP16-NEXT: fcvt s7, h72164; NOFULLFP16-NEXT: fcvt h19, s52165; NOFULLFP16-NEXT: fcvt h5, s202166; NOFULLFP16-NEXT: fminnm s16, s16, s212167; NOFULLFP16-NEXT: fcvt s20, h232168; NOFULLFP16-NEXT: fcvt h17, s172169; NOFULLFP16-NEXT: mov h21, v2.h[4]2170; NOFULLFP16-NEXT: mov h23, v1.h[4]2171; NOFULLFP16-NEXT: mov v4.h[1], v6.h[0]2172; NOFULLFP16-NEXT: fcvt s6, h222173; NOFULLFP16-NEXT: mov h22, v0.h[4]2174; NOFULLFP16-NEXT: fminnm s7, s18, s72175; NOFULLFP16-NEXT: mov h18, v3.h[4]2176; NOFULLFP16-NEXT: mov v5.h[1], v19.h[0]2177; NOFULLFP16-NEXT: fcvt h16, s162178; NOFULLFP16-NEXT: fminnm s6, s20, s62179; NOFULLFP16-NEXT: mov v4.h[2], v17.h[0]2180; NOFULLFP16-NEXT: fcvt s17, h212181; NOFULLFP16-NEXT: fcvt s19, h222182; NOFULLFP16-NEXT: fcvt h7, s72183; NOFULLFP16-NEXT: fcvt s18, h182184; NOFULLFP16-NEXT: fcvt s20, h232185; NOFULLFP16-NEXT: mov h21, v2.h[5]2186; NOFULLFP16-NEXT: mov h22, v0.h[5]2187; NOFULLFP16-NEXT: mov v5.h[2], v16.h[0]2188; NOFULLFP16-NEXT: mov h16, v3.h[5]2189; NOFULLFP16-NEXT: mov h23, v1.h[5]2190; NOFULLFP16-NEXT: fcvt h6, s62191; NOFULLFP16-NEXT: mov h0, v0.h[7]2192; NOFULLFP16-NEXT: mov h1, v1.h[7]2193; NOFULLFP16-NEXT: fminnm s17, s19, s172194; NOFULLFP16-NEXT: mov h19, v2.h[6]2195; NOFULLFP16-NEXT: mov v4.h[3], v7.h[0]2196; NOFULLFP16-NEXT: fminnm s18, s20, s182197; NOFULLFP16-NEXT: mov h20, v3.h[6]2198; NOFULLFP16-NEXT: fcvt s7, h212199; NOFULLFP16-NEXT: fcvt s21, h222200; NOFULLFP16-NEXT: fcvt s22, h242201; NOFULLFP16-NEXT: mov h2, v2.h[7]2202; NOFULLFP16-NEXT: mov v5.h[3], v6.h[0]2203; NOFULLFP16-NEXT: fcvt s6, h162204; NOFULLFP16-NEXT: fcvt s16, h232205; NOFULLFP16-NEXT: fcvt h17, s172206; NOFULLFP16-NEXT: fcvt s19, h192207; NOFULLFP16-NEXT: fcvt s23, h252208; NOFULLFP16-NEXT: fcvt h18, s182209; NOFULLFP16-NEXT: fcvt s20, h202210; NOFULLFP16-NEXT: mov h3, v3.h[7]2211; NOFULLFP16-NEXT: fminnm s7, s21, s72212; NOFULLFP16-NEXT: fcvt s2, h22213; NOFULLFP16-NEXT: fcvt s0, h02214; NOFULLFP16-NEXT: fminnm s6, s16, s62215; NOFULLFP16-NEXT: fcvt s1, h12216; NOFULLFP16-NEXT: mov v4.h[4], v17.h[0]2217; NOFULLFP16-NEXT: fminnm s16, s22, s192218; NOFULLFP16-NEXT: mov v5.h[4], v18.h[0]2219; NOFULLFP16-NEXT: fminnm s17, s23, s202220; NOFULLFP16-NEXT: fcvt s3, h32221; NOFULLFP16-NEXT: fcvt h7, s72222; NOFULLFP16-NEXT: fminnm s0, s0, s22223; NOFULLFP16-NEXT: fcvt h6, s62224; NOFULLFP16-NEXT: fcvt h2, s162225; NOFULLFP16-NEXT: fminnm s1, s1, s32226; NOFULLFP16-NEXT: mov v4.h[5], v7.h[0]2227; NOFULLFP16-NEXT: fcvt h0, s02228; NOFULLFP16-NEXT: mov v5.h[5], v6.h[0]2229; NOFULLFP16-NEXT: fcvt h6, s172230; NOFULLFP16-NEXT: fcvt h1, s12231; NOFULLFP16-NEXT: mov v4.h[6], v2.h[0]2232; NOFULLFP16-NEXT: mov v5.h[6], v6.h[0]2233; NOFULLFP16-NEXT: mov v4.h[7], v0.h[0]2234; NOFULLFP16-NEXT: mov v5.h[7], v1.h[0]2235; NOFULLFP16-NEXT: mov v0.16b, v4.16b2236; NOFULLFP16-NEXT: mov v1.16b, v5.16b2237; NOFULLFP16-NEXT: ret2238entry:2239 %c = call <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b)2240 ret <16 x half> %c2241}2242