; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc -mtriple=aarch64 -mattr=+faminmax -mattr=+sve2 -verify-machineinstrs %s -o - | FileCheck %s ; RUN: llc -mtriple=aarch64 -mattr=+faminmax -mattr=+sme2 -force-streaming -verify-machineinstrs %s -o - | FileCheck %s ; RUN: llc -mtriple=aarch64 -mattr=+sve2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-NO-FAMINMAX ; Replace pattern max(abs(a), abs(b)) by famax(a,b) ; Replace pattern min(abs(a), abs(b)) by famin(a,b) ; When the fastmath flag 'nnan' (no nan) is enabled, we may also replace: ; minnm(abs(a), abs(b)) with famin(a, b) ; maxnm(abs(a), abs(b)) with famax(a, b) define @famax_max_nx4f16( %a, %b) { ; CHECK-LABEL: famax_max_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_max_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmax z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call @llvm.maximum.nxv4f16( %aa, %bb) ret %r } define @famax_maxnm_nnan_nx4f16( %a, %b) { ; CHECK-LABEL: famax_maxnm_nnan_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call nnan @llvm.maxnum.nxv4f16( %aa, %bb) ret %r } define @famax_maxnm_noflag_nx4f16( %a, %b) { ; CHECK-LABEL: famax_maxnm_noflag_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call @llvm.maxnum.nxv4f16( %aa, %bb) ret %r } define @famin_min_nx4f16( %a, %b) { ; CHECK-LABEL: famin_min_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_min_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmin z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call @llvm.minimum.nxv4f16( %aa, %bb) ret %r } define @famin_minnm_nnan_nx4f16( %a, %b) { ; CHECK-LABEL: famin_minnm_nnan_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call nnan @llvm.minnum.nxv4f16( %aa, %bb) ret %r } define @famin_minnm_noflag_nx4f16( %a, %b) { ; CHECK-LABEL: famin_minnm_noflag_nx4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx4f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv4f16( %a) %bb = call @llvm.fabs.nxv4f16( %b) %r = call @llvm.minnum.nxv4f16( %aa, %bb) ret %r } define @famax_max_nx8f16( %a, %b) { ; CHECK-LABEL: famax_max_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_max_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmax z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call @llvm.maximum.nxv8f16( %aa, %bb) ret %r } define @famax_maxnm_nnan_nx8f16( %a, %b) { ; CHECK-LABEL: famax_maxnm_nnan_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: famax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call nnan @llvm.maxnum.nxv8f16( %aa, %bb) ret %r } define @famax_maxnm_noflag_nx8f16( %a, %b) { ; CHECK-LABEL: famax_maxnm_noflag_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call @llvm.maxnum.nxv8f16( %aa, %bb) ret %r } define @famin_min_nx8f16( %a, %b) { ; CHECK-LABEL: famin_min_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_min_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fmin z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call @llvm.minimum.nxv8f16( %aa, %bb) ret %r } define @famin_minnm_nnan_nx8f16( %a, %b) { ; CHECK-LABEL: famin_minnm_nnan_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: famin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call nnan @llvm.minnum.nxv8f16( %aa, %bb) ret %r } define @famin_minnm_noflag_nx8f16( %a, %b) { ; CHECK-LABEL: famin_minnm_noflag_nx8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx8f16: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z0.h, p0/m, z0.h ; CHECK-NO-FAMINMAX-NEXT: fabs z1.h, p0/m, z1.h ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.h, p0/m, z0.h, z1.h ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nxv8f16( %a) %bb = call @llvm.fabs.nxv8f16( %b) %r = call @llvm.minnum.nxv8f16( %aa, %bb) ret %r } define @famax_max_nx2f32( %a, %b) { ; CHECK-LABEL: famax_max_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_max_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmax z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call @llvm.maximum.nx2f32( %aa, %bb) ret %r } define @famax_maxnm_nnan_nx2f32( %a, %b) { ; CHECK-LABEL: famax_maxnm_nnan_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call nnan @llvm.maxnum.nx2f32( %aa, %bb) ret %r } define @famax_maxnm_noflag_nx2f32( %a, %b) { ; CHECK-LABEL: famax_maxnm_noflag_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call @llvm.maxnum.nx2f32( %aa, %bb) ret %r } define @famin_min_nx2f32( %a, %b) { ; CHECK-LABEL: famin_min_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_min_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmin z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call @llvm.minimum.nx2f32( %aa, %bb) ret %r } define @famin_minnm_nnan_nx2f32( %a, %b) { ; CHECK-LABEL: famin_minnm_nnan_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call nnan @llvm.minnum.nx2f32( %aa, %bb) ret %r } define @famin_minnm_noflag_nx2f32( %a, %b) { ; CHECK-LABEL: famin_minnm_noflag_nx2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx2f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f32( %a) %bb = call @llvm.fabs.nx2f32( %b) %r = call @llvm.minnum.nx2f32( %aa, %bb) ret %r } define @famax_max_nx4f32( %a, %b) { ; CHECK-LABEL: famax_max_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_max_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmax z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call @llvm.maximum.nx4f32( %aa, %bb) ret %r } define @famax_maxnm_nnan_nx4f32( %a, %b) { ; CHECK-LABEL: famax_maxnm_nnan_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call nnan @llvm.maxnum.nx4f32( %aa, %bb) ret %r } define @famax_maxnm_noflag_nx4f32( %a, %b) { ; CHECK-LABEL: famax_maxnm_noflag_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call @llvm.maxnum.nx4f32( %aa, %bb) ret %r } define @famin_min_nx4f32( %a, %b) { ; CHECK-LABEL: famin_min_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_min_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fmin z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call @llvm.minimum.nx4f32( %aa, %bb) ret %r } define @famin_minnm_nnan_nx4f32( %a, %b) { ; CHECK-LABEL: famin_minnm_nnan_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: famin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call nnan @llvm.minnum.nx4f32( %aa, %bb) ret %r } define @famin_minnm_noflag_nx4f32( %a, %b) { ; CHECK-LABEL: famin_minnm_noflag_nx4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx4f32: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z0.s, p0/m, z0.s ; CHECK-NO-FAMINMAX-NEXT: fabs z1.s, p0/m, z1.s ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.s, p0/m, z0.s, z1.s ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx4f32( %a) %bb = call @llvm.fabs.nx4f32( %b) %r = call @llvm.minnum.nx4f32( %aa, %bb) ret %r } define @famax_max_nx2f64( %a, %b) { ; CHECK-LABEL: famax_max_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_max_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fmax z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call @llvm.maximum.nx2f64( %aa, %bb) ret %r } define @famax_maxnm_nnan_nx2f64( %a, %b) { ; CHECK-LABEL: famax_maxnm_nnan_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_nnan_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call nnan @llvm.maxnum.nx2f64( %aa, %bb) ret %r } define @famax_maxnm_noflag_nx2f64( %a, %b) { ; CHECK-LABEL: famax_maxnm_noflag_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famax_maxnm_noflag_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call @llvm.maxnum.nx2f64( %aa, %bb) ret %r } define @famin_min_nx2f64( %a, %b) { ; CHECK-LABEL: famin_min_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_min_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fmin z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call @llvm.minimum.nx2f64( %aa, %bb) ret %r } define @famin_minnm_nnan_nx2f64( %a, %b) { ; CHECK-LABEL: famin_minnm_nnan_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: famin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_nnan_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call nnan @llvm.minnum.nx2f64( %aa, %bb) ret %r } define @famin_minnm_noflag_nx2f64( %a, %b) { ; CHECK-LABEL: famin_minnm_noflag_nx2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NEXT: fminnm z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret ; ; CHECK-NO-FAMINMAX-LABEL: famin_minnm_noflag_nx2f64: ; CHECK-NO-FAMINMAX: // %bb.0: ; CHECK-NO-FAMINMAX-NEXT: ptrue p0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z0.d, p0/m, z0.d ; CHECK-NO-FAMINMAX-NEXT: fabs z1.d, p0/m, z1.d ; CHECK-NO-FAMINMAX-NEXT: fminnm z0.d, p0/m, z0.d, z1.d ; CHECK-NO-FAMINMAX-NEXT: ret %aa = call @llvm.fabs.nx2f64( %a) %bb = call @llvm.fabs.nx2f64( %b) %r = call @llvm.minnum.nx2f64( %aa, %bb) ret %r } declare @llvm.fabs.nxv4f16() declare @llvm.fabs.nxv8f16() declare @llvm.fabs.nx2f32() declare @llvm.fabs.nx4f32() declare @llvm.fabs.nx2f64() declare @llvm.maximum.nxv4f16(, ) declare @llvm.maximum.nxv8f16(, ) declare @llvm.maximum.nx2f32(, ) declare @llvm.maximum.nx4f32(, ) declare @llvm.maximum.nx2f64(, ) declare @llvm.minimum.nxv4f16(, ) declare @llvm.minimum.nxv8f16(, ) declare @llvm.minimum.nx2f32(, ) declare @llvm.minimum.nx4f32(, ) declare @llvm.minimum.nx2f64(, ) declare @llvm.maxnum.nxv4f16(, ) declare @llvm.maxnum.nxv8f16(, ) declare @llvm.maxnum.nx2f32(, ) declare @llvm.maxnum.nx2f64(, ) declare @llvm.maxnum.nx4f32(, ) declare @llvm.minnum.nxv4f16(, ) declare @llvm.minnum.nxv8f16(, ) declare @llvm.minnum.nx2f32(, ) declare @llvm.minnum.nx4f32(, ) declare @llvm.minnum.nx2f64(, )