662 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64 -mattr=+faminmax -mattr=+sve2 -verify-machineinstrs %s -o - | FileCheck %s3; RUN: llc -mtriple=aarch64 -mattr=+faminmax -mattr=+sme2 -force-streaming -verify-machineinstrs %s -o - | FileCheck %s4; RUN: llc -mtriple=aarch64 -mattr=+sve2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-NO-FAMINMAX5 6; Replace pattern max(abs(a), abs(b)) by famax(a,b)7; Replace pattern min(abs(a), abs(b)) by famin(a,b)8 9; When the fastmath flag 'nnan' (no nan) is enabled, we may also replace:10; minnm(abs(a), abs(b)) with famin(a, b)11; maxnm(abs(a), abs(b)) with famax(a, b)12 13define <vscale x 4 x half> @famax_max_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {14; CHECK-LABEL: famax_max_nx4f16:15; CHECK: // %bb.0:16; CHECK-NEXT: ptrue p0.s17; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h18; CHECK-NEXT: ret19;20; CHECK-NO-FAMINMAX-LABEL: famax_max_nx4f16:21; CHECK-NO-FAMINMAX: // %bb.0:22; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s23; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h24; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h25; CHECK-NO-FAMINMAX-NEXT: fmax z0.h, p0/m, z0.h, z1.h26; CHECK-NO-FAMINMAX-NEXT: ret27 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)28 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)29 %r = call <vscale x 4 x half> @llvm.maximum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)30 ret <vscale x 4 x half> %r31}32 33define <vscale x 4 x half> @famax_maxnm_nnan_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {34; CHECK-LABEL: famax_maxnm_nnan_nx4f16:35; CHECK: // %bb.0:36; CHECK-NEXT: ptrue p0.s37; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h38; CHECK-NEXT: ret39;40; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx4f16:41; CHECK-NO-FAMINMAX: // %bb.0:42; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s43; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h44; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h45; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h46; CHECK-NO-FAMINMAX-NEXT: ret47 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)48 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)49 %r = call nnan <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)50 ret <vscale x 4 x half> %r51}52 53define <vscale x 4 x half> @famax_maxnm_noflag_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {54; CHECK-LABEL: famax_maxnm_noflag_nx4f16:55; CHECK: // %bb.0:56; CHECK-NEXT: ptrue p0.s57; CHECK-NEXT: fabs z0.h, p0/m, z0.h58; CHECK-NEXT: fabs z1.h, p0/m, z1.h59; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h60; CHECK-NEXT: ret61;62; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx4f16:63; CHECK-NO-FAMINMAX: // %bb.0:64; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s65; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h66; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h67; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h68; CHECK-NO-FAMINMAX-NEXT: ret69 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)70 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)71 %r = call <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)72 ret <vscale x 4 x half> %r73}74 75define <vscale x 4 x half> @famin_min_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {76; CHECK-LABEL: famin_min_nx4f16:77; CHECK: // %bb.0:78; CHECK-NEXT: ptrue p0.s79; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h80; CHECK-NEXT: ret81;82; CHECK-NO-FAMINMAX-LABEL: famin_min_nx4f16:83; CHECK-NO-FAMINMAX: // %bb.0:84; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s85; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h86; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h87; CHECK-NO-FAMINMAX-NEXT: fmin z0.h, p0/m, z0.h, z1.h88; CHECK-NO-FAMINMAX-NEXT: ret89 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)90 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)91 %r = call <vscale x 4 x half> @llvm.minimum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)92 ret <vscale x 4 x half> %r93}94 95define <vscale x 4 x half> @famin_minnm_nnan_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {96; CHECK-LABEL: famin_minnm_nnan_nx4f16:97; CHECK: // %bb.0:98; CHECK-NEXT: ptrue p0.s99; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h100; CHECK-NEXT: ret101;102; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx4f16:103; CHECK-NO-FAMINMAX: // %bb.0:104; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s105; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h106; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h107; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h108; CHECK-NO-FAMINMAX-NEXT: ret109 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)110 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)111 %r = call nnan <vscale x 4 x half> @llvm.minnum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)112 ret <vscale x 4 x half> %r113}114 115define <vscale x 4 x half> @famin_minnm_noflag_nx4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) {116; CHECK-LABEL: famin_minnm_noflag_nx4f16:117; CHECK: // %bb.0:118; CHECK-NEXT: ptrue p0.s119; CHECK-NEXT: fabs z0.h, p0/m, z0.h120; CHECK-NEXT: fabs z1.h, p0/m, z1.h121; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h122; CHECK-NEXT: ret123;124; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx4f16:125; CHECK-NO-FAMINMAX: // %bb.0:126; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s127; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h128; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h129; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h130; CHECK-NO-FAMINMAX-NEXT: ret131 %aa = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %a)132 %bb = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %b)133 %r = call <vscale x 4 x half> @llvm.minnum.nxv4f16(<vscale x 4 x half> %aa, <vscale x 4 x half> %bb)134 ret <vscale x 4 x half> %r135}136 137define <vscale x 8 x half> @famax_max_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {138; CHECK-LABEL: famax_max_nx8f16:139; CHECK: // %bb.0:140; CHECK-NEXT: ptrue p0.h141; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h142; CHECK-NEXT: ret143;144; CHECK-NO-FAMINMAX-LABEL: famax_max_nx8f16:145; CHECK-NO-FAMINMAX: // %bb.0:146; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h147; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h148; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h149; CHECK-NO-FAMINMAX-NEXT: fmax z0.h, p0/m, z0.h, z1.h150; CHECK-NO-FAMINMAX-NEXT: ret151 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)152 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)153 %r = call <vscale x 8 x half> @llvm.maximum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)154 ret <vscale x 8 x half> %r155}156 157define <vscale x 8 x half> @famax_maxnm_nnan_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {158; CHECK-LABEL: famax_maxnm_nnan_nx8f16:159; CHECK: // %bb.0:160; CHECK-NEXT: ptrue p0.h161; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h162; CHECK-NEXT: ret163;164; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx8f16:165; CHECK-NO-FAMINMAX: // %bb.0:166; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h167; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h168; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h169; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h170; CHECK-NO-FAMINMAX-NEXT: ret171 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)172 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)173 %r = call nnan <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)174 ret <vscale x 8 x half> %r175}176 177define <vscale x 8 x half> @famax_maxnm_noflag_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {178; CHECK-LABEL: famax_maxnm_noflag_nx8f16:179; CHECK: // %bb.0:180; CHECK-NEXT: ptrue p0.h181; CHECK-NEXT: fabs z0.h, p0/m, z0.h182; CHECK-NEXT: fabs z1.h, p0/m, z1.h183; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h184; CHECK-NEXT: ret185;186; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx8f16:187; CHECK-NO-FAMINMAX: // %bb.0:188; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h189; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h190; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h191; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h192; CHECK-NO-FAMINMAX-NEXT: ret193 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)194 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)195 %r = call <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)196 ret <vscale x 8 x half> %r197}198 199define <vscale x 8 x half> @famin_min_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {200; CHECK-LABEL: famin_min_nx8f16:201; CHECK: // %bb.0:202; CHECK-NEXT: ptrue p0.h203; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h204; CHECK-NEXT: ret205;206; CHECK-NO-FAMINMAX-LABEL: famin_min_nx8f16:207; CHECK-NO-FAMINMAX: // %bb.0:208; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h209; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h210; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h211; CHECK-NO-FAMINMAX-NEXT: fmin z0.h, p0/m, z0.h, z1.h212; CHECK-NO-FAMINMAX-NEXT: ret213 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)214 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)215 %r = call <vscale x 8 x half> @llvm.minimum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)216 ret <vscale x 8 x half> %r217}218 219define <vscale x 8 x half> @famin_minnm_nnan_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {220; CHECK-LABEL: famin_minnm_nnan_nx8f16:221; CHECK: // %bb.0:222; CHECK-NEXT: ptrue p0.h223; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h224; CHECK-NEXT: ret225;226; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx8f16:227; CHECK-NO-FAMINMAX: // %bb.0:228; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h229; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h230; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h231; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h232; CHECK-NO-FAMINMAX-NEXT: ret233 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)234 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)235 %r = call nnan <vscale x 8 x half> @llvm.minnum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)236 ret <vscale x 8 x half> %r237}238 239define <vscale x 8 x half> @famin_minnm_noflag_nx8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) {240; CHECK-LABEL: famin_minnm_noflag_nx8f16:241; CHECK: // %bb.0:242; CHECK-NEXT: ptrue p0.h243; CHECK-NEXT: fabs z0.h, p0/m, z0.h244; CHECK-NEXT: fabs z1.h, p0/m, z1.h245; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h246; CHECK-NEXT: ret247;248; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx8f16:249; CHECK-NO-FAMINMAX: // %bb.0:250; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h251; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h252; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h253; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h254; CHECK-NO-FAMINMAX-NEXT: ret255 %aa = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %a)256 %bb = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %b)257 %r = call <vscale x 8 x half> @llvm.minnum.nxv8f16(<vscale x 8 x half> %aa, <vscale x 8 x half> %bb)258 ret <vscale x 8 x half> %r259}260 261define <vscale x 2 x float> @famax_max_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {262; CHECK-LABEL: famax_max_nx2f32:263; CHECK: // %bb.0:264; CHECK-NEXT: ptrue p0.d265; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s266; CHECK-NEXT: ret267;268; CHECK-NO-FAMINMAX-LABEL: famax_max_nx2f32:269; CHECK-NO-FAMINMAX: // %bb.0:270; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d271; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s272; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s273; CHECK-NO-FAMINMAX-NEXT: fmax z0.s, p0/m, z0.s, z1.s274; CHECK-NO-FAMINMAX-NEXT: ret275 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)276 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)277 %r = call <vscale x 2 x float> @llvm.maximum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)278 ret <vscale x 2 x float> %r279}280 281define <vscale x 2 x float> @famax_maxnm_nnan_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {282; CHECK-LABEL: famax_maxnm_nnan_nx2f32:283; CHECK: // %bb.0:284; CHECK-NEXT: ptrue p0.d285; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s286; CHECK-NEXT: ret287;288; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx2f32:289; CHECK-NO-FAMINMAX: // %bb.0:290; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d291; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s292; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s293; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s294; CHECK-NO-FAMINMAX-NEXT: ret295 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)296 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)297 %r = call nnan <vscale x 2 x float> @llvm.maxnum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)298 ret <vscale x 2 x float> %r299}300 301define <vscale x 2 x float> @famax_maxnm_noflag_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {302; CHECK-LABEL: famax_maxnm_noflag_nx2f32:303; CHECK: // %bb.0:304; CHECK-NEXT: ptrue p0.d305; CHECK-NEXT: fabs z0.s, p0/m, z0.s306; CHECK-NEXT: fabs z1.s, p0/m, z1.s307; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s308; CHECK-NEXT: ret309;310; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx2f32:311; CHECK-NO-FAMINMAX: // %bb.0:312; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d313; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s314; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s315; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s316; CHECK-NO-FAMINMAX-NEXT: ret317 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)318 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)319 %r = call <vscale x 2 x float> @llvm.maxnum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)320 ret <vscale x 2 x float> %r321}322 323define <vscale x 2 x float> @famin_min_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {324; CHECK-LABEL: famin_min_nx2f32:325; CHECK: // %bb.0:326; CHECK-NEXT: ptrue p0.d327; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s328; CHECK-NEXT: ret329;330; CHECK-NO-FAMINMAX-LABEL: famin_min_nx2f32:331; CHECK-NO-FAMINMAX: // %bb.0:332; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d333; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s334; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s335; CHECK-NO-FAMINMAX-NEXT: fmin z0.s, p0/m, z0.s, z1.s336; CHECK-NO-FAMINMAX-NEXT: ret337 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)338 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)339 %r = call <vscale x 2 x float> @llvm.minimum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)340 ret <vscale x 2 x float> %r341}342 343define <vscale x 2 x float> @famin_minnm_nnan_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {344; CHECK-LABEL: famin_minnm_nnan_nx2f32:345; CHECK: // %bb.0:346; CHECK-NEXT: ptrue p0.d347; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s348; CHECK-NEXT: ret349;350; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx2f32:351; CHECK-NO-FAMINMAX: // %bb.0:352; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d353; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s354; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s355; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s356; CHECK-NO-FAMINMAX-NEXT: ret357 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)358 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)359 %r = call nnan <vscale x 2 x float> @llvm.minnum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)360 ret <vscale x 2 x float> %r361}362 363define <vscale x 2 x float> @famin_minnm_noflag_nx2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) {364; CHECK-LABEL: famin_minnm_noflag_nx2f32:365; CHECK: // %bb.0:366; CHECK-NEXT: ptrue p0.d367; CHECK-NEXT: fabs z0.s, p0/m, z0.s368; CHECK-NEXT: fabs z1.s, p0/m, z1.s369; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s370; CHECK-NEXT: ret371;372; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx2f32:373; CHECK-NO-FAMINMAX: // %bb.0:374; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d375; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s376; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s377; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s378; CHECK-NO-FAMINMAX-NEXT: ret379 %aa = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %a)380 %bb = call <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float> %b)381 %r = call <vscale x 2 x float> @llvm.minnum.nx2f32(<vscale x 2 x float> %aa, <vscale x 2 x float> %bb)382 ret <vscale x 2 x float> %r383}384 385define <vscale x 4 x float> @famax_max_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {386; CHECK-LABEL: famax_max_nx4f32:387; CHECK: // %bb.0:388; CHECK-NEXT: ptrue p0.s389; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s390; CHECK-NEXT: ret391;392; CHECK-NO-FAMINMAX-LABEL: famax_max_nx4f32:393; CHECK-NO-FAMINMAX: // %bb.0:394; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s395; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s396; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s397; CHECK-NO-FAMINMAX-NEXT: fmax z0.s, p0/m, z0.s, z1.s398; CHECK-NO-FAMINMAX-NEXT: ret399 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)400 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)401 %r = call <vscale x 4 x float> @llvm.maximum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)402 ret <vscale x 4 x float> %r403}404 405define <vscale x 4 x float> @famax_maxnm_nnan_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {406; CHECK-LABEL: famax_maxnm_nnan_nx4f32:407; CHECK: // %bb.0:408; CHECK-NEXT: ptrue p0.s409; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s410; CHECK-NEXT: ret411;412; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx4f32:413; CHECK-NO-FAMINMAX: // %bb.0:414; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s415; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s416; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s417; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s418; CHECK-NO-FAMINMAX-NEXT: ret419 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)420 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)421 %r = call nnan <vscale x 4 x float> @llvm.maxnum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)422 ret <vscale x 4 x float> %r423}424 425define <vscale x 4 x float> @famax_maxnm_noflag_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {426; CHECK-LABEL: famax_maxnm_noflag_nx4f32:427; CHECK: // %bb.0:428; CHECK-NEXT: ptrue p0.s429; CHECK-NEXT: fabs z0.s, p0/m, z0.s430; CHECK-NEXT: fabs z1.s, p0/m, z1.s431; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s432; CHECK-NEXT: ret433;434; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx4f32:435; CHECK-NO-FAMINMAX: // %bb.0:436; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s437; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s438; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s439; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s440; CHECK-NO-FAMINMAX-NEXT: ret441 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)442 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)443 %r = call <vscale x 4 x float> @llvm.maxnum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)444 ret <vscale x 4 x float> %r445}446 447define <vscale x 4 x float> @famin_min_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {448; CHECK-LABEL: famin_min_nx4f32:449; CHECK: // %bb.0:450; CHECK-NEXT: ptrue p0.s451; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s452; CHECK-NEXT: ret453;454; CHECK-NO-FAMINMAX-LABEL: famin_min_nx4f32:455; CHECK-NO-FAMINMAX: // %bb.0:456; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s457; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s458; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s459; CHECK-NO-FAMINMAX-NEXT: fmin z0.s, p0/m, z0.s, z1.s460; CHECK-NO-FAMINMAX-NEXT: ret461 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)462 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)463 %r = call <vscale x 4 x float> @llvm.minimum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)464 ret <vscale x 4 x float> %r465}466 467define <vscale x 4 x float> @famin_minnm_nnan_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {468; CHECK-LABEL: famin_minnm_nnan_nx4f32:469; CHECK: // %bb.0:470; CHECK-NEXT: ptrue p0.s471; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s472; CHECK-NEXT: ret473;474; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx4f32:475; CHECK-NO-FAMINMAX: // %bb.0:476; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s477; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s478; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s479; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s480; CHECK-NO-FAMINMAX-NEXT: ret481 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)482 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)483 %r = call nnan <vscale x 4 x float> @llvm.minnum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)484 ret <vscale x 4 x float> %r485}486 487define <vscale x 4 x float> @famin_minnm_noflag_nx4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {488; CHECK-LABEL: famin_minnm_noflag_nx4f32:489; CHECK: // %bb.0:490; CHECK-NEXT: ptrue p0.s491; CHECK-NEXT: fabs z0.s, p0/m, z0.s492; CHECK-NEXT: fabs z1.s, p0/m, z1.s493; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s494; CHECK-NEXT: ret495;496; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx4f32:497; CHECK-NO-FAMINMAX: // %bb.0:498; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s499; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s500; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s501; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s502; CHECK-NO-FAMINMAX-NEXT: ret503 %aa = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %a)504 %bb = call <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float> %b)505 %r = call <vscale x 4 x float> @llvm.minnum.nx4f32(<vscale x 4 x float> %aa, <vscale x 4 x float> %bb)506 ret <vscale x 4 x float> %r507}508 509define <vscale x 2 x double> @famax_max_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {510; CHECK-LABEL: famax_max_nx2f64:511; CHECK: // %bb.0:512; CHECK-NEXT: ptrue p0.d513; CHECK-NEXT: famax z0.d, p0/m, z0.d, z1.d514; CHECK-NEXT: ret515;516; CHECK-NO-FAMINMAX-LABEL: famax_max_nx2f64:517; CHECK-NO-FAMINMAX: // %bb.0:518; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d519; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d520; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d521; CHECK-NO-FAMINMAX-NEXT: fmax z0.d, p0/m, z0.d, z1.d522; CHECK-NO-FAMINMAX-NEXT: ret523 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)524 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)525 %r = call <vscale x 2 x double> @llvm.maximum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)526 ret <vscale x 2 x double> %r527}528 529define <vscale x 2 x double> @famax_maxnm_nnan_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {530; CHECK-LABEL: famax_maxnm_nnan_nx2f64:531; CHECK: // %bb.0:532; CHECK-NEXT: ptrue p0.d533; CHECK-NEXT: famax z0.d, p0/m, z0.d, z1.d534; CHECK-NEXT: ret535;536; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx2f64:537; CHECK-NO-FAMINMAX: // %bb.0:538; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d539; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d540; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d541; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d542; CHECK-NO-FAMINMAX-NEXT: ret543 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)544 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)545 %r = call nnan <vscale x 2 x double> @llvm.maxnum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)546 ret <vscale x 2 x double> %r547}548 549define <vscale x 2 x double> @famax_maxnm_noflag_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {550; CHECK-LABEL: famax_maxnm_noflag_nx2f64:551; CHECK: // %bb.0:552; CHECK-NEXT: ptrue p0.d553; CHECK-NEXT: fabs z0.d, p0/m, z0.d554; CHECK-NEXT: fabs z1.d, p0/m, z1.d555; CHECK-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d556; CHECK-NEXT: ret557;558; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx2f64:559; CHECK-NO-FAMINMAX: // %bb.0:560; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d561; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d562; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d563; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d564; CHECK-NO-FAMINMAX-NEXT: ret565 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)566 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)567 %r = call <vscale x 2 x double> @llvm.maxnum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)568 ret <vscale x 2 x double> %r569}570 571define <vscale x 2 x double> @famin_min_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {572; CHECK-LABEL: famin_min_nx2f64:573; CHECK: // %bb.0:574; CHECK-NEXT: ptrue p0.d575; CHECK-NEXT: famin z0.d, p0/m, z0.d, z1.d576; CHECK-NEXT: ret577;578; CHECK-NO-FAMINMAX-LABEL: famin_min_nx2f64:579; CHECK-NO-FAMINMAX: // %bb.0:580; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d581; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d582; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d583; CHECK-NO-FAMINMAX-NEXT: fmin z0.d, p0/m, z0.d, z1.d584; CHECK-NO-FAMINMAX-NEXT: ret585 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)586 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)587 %r = call <vscale x 2 x double> @llvm.minimum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)588 ret <vscale x 2 x double> %r589}590 591define <vscale x 2 x double> @famin_minnm_nnan_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {592; CHECK-LABEL: famin_minnm_nnan_nx2f64:593; CHECK: // %bb.0:594; CHECK-NEXT: ptrue p0.d595; CHECK-NEXT: famin z0.d, p0/m, z0.d, z1.d596; CHECK-NEXT: ret597;598; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx2f64:599; CHECK-NO-FAMINMAX: // %bb.0:600; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d601; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d602; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d603; CHECK-NO-FAMINMAX-NEXT: fminnm z0.d, p0/m, z0.d, z1.d604; CHECK-NO-FAMINMAX-NEXT: ret605 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)606 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)607 %r = call nnan <vscale x 2 x double> @llvm.minnum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)608 ret <vscale x 2 x double> %r609}610 611define <vscale x 2 x double> @famin_minnm_noflag_nx2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) {612; CHECK-LABEL: famin_minnm_noflag_nx2f64:613; CHECK: // %bb.0:614; CHECK-NEXT: ptrue p0.d615; CHECK-NEXT: fabs z0.d, p0/m, z0.d616; CHECK-NEXT: fabs z1.d, p0/m, z1.d617; CHECK-NEXT: fminnm z0.d, p0/m, z0.d, z1.d618; CHECK-NEXT: ret619;620; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx2f64:621; CHECK-NO-FAMINMAX: // %bb.0:622; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d623; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d624; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d625; CHECK-NO-FAMINMAX-NEXT: fminnm z0.d, p0/m, z0.d, z1.d626; CHECK-NO-FAMINMAX-NEXT: ret627 %aa = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %a)628 %bb = call <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double> %b)629 %r = call <vscale x 2 x double> @llvm.minnum.nx2f64(<vscale x 2 x double> %aa, <vscale x 2 x double> %bb)630 ret <vscale x 2 x double> %r631}632 633declare <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half>)634declare <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half>)635declare <vscale x 2 x float> @llvm.fabs.nx2f32(<vscale x 2 x float>)636declare <vscale x 4 x float> @llvm.fabs.nx4f32(<vscale x 4 x float>)637declare <vscale x 2 x double> @llvm.fabs.nx2f64(<vscale x 2 x double>)638 639declare <vscale x 4 x half> @llvm.maximum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)640declare <vscale x 8 x half> @llvm.maximum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)641declare <vscale x 2 x float> @llvm.maximum.nx2f32(<vscale x 2 x float>, <vscale x 2 x float>)642declare <vscale x 4 x float> @llvm.maximum.nx4f32(<vscale x 4 x float>, <vscale x 4 x float>)643declare <vscale x 2 x double> @llvm.maximum.nx2f64(<vscale x 2 x double>, <vscale x 2 x double>)644 645declare <vscale x 4 x half> @llvm.minimum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)646declare <vscale x 8 x half> @llvm.minimum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)647declare <vscale x 2 x float> @llvm.minimum.nx2f32(<vscale x 2 x float>, <vscale x 2 x float>)648declare <vscale x 4 x float> @llvm.minimum.nx4f32(<vscale x 4 x float>, <vscale x 4 x float>)649declare <vscale x 2 x double> @llvm.minimum.nx2f64(<vscale x 2 x double>, <vscale x 2 x double>)650 651declare <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)652declare <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half> )653declare <vscale x 2 x float> @llvm.maxnum.nx2f32(<vscale x 2 x float>, <vscale x 2 x float>)654declare <vscale x 2 x double> @llvm.maxnum.nx2f64(<vscale x 2 x double>, <vscale x 2 x double>)655declare <vscale x 4 x float> @llvm.maxnum.nx4f32(<vscale x 4 x float>, <vscale x 4 x float>)656 657declare <vscale x 4 x half> @llvm.minnum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>)658declare <vscale x 8 x half> @llvm.minnum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)659declare <vscale x 2 x float> @llvm.minnum.nx2f32(<vscale x 2 x float>, <vscale x 2 x float>)660declare <vscale x 4 x float> @llvm.minnum.nx4f32(<vscale x 4 x float>, <vscale x 4 x float>)661declare <vscale x 2 x double> @llvm.minnum.nx2f64(<vscale x 2 x double>, <vscale x 2 x double>)662