605 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mattr=+faminmax -verify-machineinstrs %s -o - | FileCheck %s3; RUN: llc -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-NO-FAMINMAX4 5target triple = "aarch64-unknown-linux-gnu"6 7; Replace min(abs(a), abs(b)) with famin(a, b)8; Replace max(abs(a), abs(b)) with famax(a, b)9 10; When the fastmath flag 'nnan' (no nan) is enabled, we may also replace:11; minnm(abs(a), abs(b)) with famin(a, b)12; maxnm(abs(a), abs(b)) with famax(a, b)13 14define <4 x half> @test_max_v4f16(<4 x half> %a, <4 x half> %b) #0 {15; CHECK-LABEL: test_max_v4f16:16; CHECK: // %bb.0:17; CHECK-NEXT: famax v0.4h, v0.4h, v1.4h18; CHECK-NEXT: ret19;20; CHECK-NO-FAMINMAX-LABEL: test_max_v4f16:21; CHECK-NO-FAMINMAX: // %bb.0:22; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h23; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h24; CHECK-NO-FAMINMAX-NEXT: fmax v0.4h, v0.4h, v1.4h25; CHECK-NO-FAMINMAX-NEXT: ret26 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)27 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)28 %r = call <4 x half> @llvm.maximum.v4f16(<4 x half> %aa, <4 x half> %ab)29 ret <4 x half> %r30}31 32define <4 x half> @test_maxnm_nnan_v4f16(<4 x half> %a, <4 x half> %b) #0 {33; CHECK-LABEL: test_maxnm_nnan_v4f16:34; CHECK: // %bb.0:35; CHECK-NEXT: famax v0.4h, v0.4h, v1.4h36; CHECK-NEXT: ret37;38; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v4f16:39; CHECK-NO-FAMINMAX: // %bb.0:40; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h41; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h42; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.4h, v0.4h, v1.4h43; CHECK-NO-FAMINMAX-NEXT: ret44 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)45 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)46 %r = call nnan <4 x half> @llvm.maxnum.v4f16(<4 x half> %aa, <4 x half> %ab)47 ret <4 x half> %r48}49 50define <4 x half> @test_maxnm_noflag_v4f16(<4 x half> %a, <4 x half> %b) #0 {51; CHECK-LABEL: test_maxnm_noflag_v4f16:52; CHECK: // %bb.0:53; CHECK-NEXT: fabs v0.4h, v0.4h54; CHECK-NEXT: fabs v1.4h, v1.4h55; CHECK-NEXT: fmaxnm v0.4h, v0.4h, v1.4h56; CHECK-NEXT: ret57;58; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v4f16:59; CHECK-NO-FAMINMAX: // %bb.0:60; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h61; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h62; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.4h, v0.4h, v1.4h63; CHECK-NO-FAMINMAX-NEXT: ret64 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)65 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)66 %r = call <4 x half> @llvm.maxnum.v4f16(<4 x half> %aa, <4 x half> %ab)67 ret <4 x half> %r68}69 70define <4 x half> @test_min_v4f16(<4 x half> %a, <4 x half> %b) #0 {71; CHECK-LABEL: test_min_v4f16:72; CHECK: // %bb.0:73; CHECK-NEXT: famin v0.4h, v0.4h, v1.4h74; CHECK-NEXT: ret75;76; CHECK-NO-FAMINMAX-LABEL: test_min_v4f16:77; CHECK-NO-FAMINMAX: // %bb.0:78; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h79; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h80; CHECK-NO-FAMINMAX-NEXT: fmin v0.4h, v0.4h, v1.4h81; CHECK-NO-FAMINMAX-NEXT: ret82 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)83 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)84 %r = call <4 x half> @llvm.minimum.v4f16(<4 x half> %aa, <4 x half> %ab)85 ret <4 x half> %r86}87 88define <4 x half> @test_minnm_nnan_v4f16(<4 x half> %a, <4 x half> %b) #0 {89; CHECK-LABEL: test_minnm_nnan_v4f16:90; CHECK: // %bb.0:91; CHECK-NEXT: famin v0.4h, v0.4h, v1.4h92; CHECK-NEXT: ret93;94; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v4f16:95; CHECK-NO-FAMINMAX: // %bb.0:96; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h97; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h98; CHECK-NO-FAMINMAX-NEXT: fminnm v0.4h, v0.4h, v1.4h99; CHECK-NO-FAMINMAX-NEXT: ret100 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)101 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)102 %r = call nnan <4 x half> @llvm.minnum.v4f16(<4 x half> %aa, <4 x half> %ab)103 ret <4 x half> %r104}105 106define <4 x half> @test_minnm_noflag_v4f16(<4 x half> %a, <4 x half> %b) #0 {107; CHECK-LABEL: test_minnm_noflag_v4f16:108; CHECK: // %bb.0:109; CHECK-NEXT: fabs v0.4h, v0.4h110; CHECK-NEXT: fabs v1.4h, v1.4h111; CHECK-NEXT: fminnm v0.4h, v0.4h, v1.4h112; CHECK-NEXT: ret113;114; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v4f16:115; CHECK-NO-FAMINMAX: // %bb.0:116; CHECK-NO-FAMINMAX-NEXT: fabs v0.4h, v0.4h117; CHECK-NO-FAMINMAX-NEXT: fabs v1.4h, v1.4h118; CHECK-NO-FAMINMAX-NEXT: fminnm v0.4h, v0.4h, v1.4h119; CHECK-NO-FAMINMAX-NEXT: ret120 %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)121 %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)122 %r = call <4 x half> @llvm.minnum.v4f16(<4 x half> %aa, <4 x half> %ab)123 ret <4 x half> %r124}125 126define <8 x half> @test_max_v8f16(<8 x half> %a, <8 x half> %b) #0 {127; CHECK-LABEL: test_max_v8f16:128; CHECK: // %bb.0:129; CHECK-NEXT: famax v0.8h, v0.8h, v1.8h130; CHECK-NEXT: ret131;132; CHECK-NO-FAMINMAX-LABEL: test_max_v8f16:133; CHECK-NO-FAMINMAX: // %bb.0:134; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h135; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h136; CHECK-NO-FAMINMAX-NEXT: fmax v0.8h, v0.8h, v1.8h137; CHECK-NO-FAMINMAX-NEXT: ret138 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)139 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)140 %r = call <8 x half> @llvm.maximum.v8f16(<8 x half> %aa, <8 x half> %ab)141 ret <8 x half> %r142}143 144define <8 x half> @test_maxnm_nnan_v8f16(<8 x half> %a, <8 x half> %b) #0 {145; CHECK-LABEL: test_maxnm_nnan_v8f16:146; CHECK: // %bb.0:147; CHECK-NEXT: famax v0.8h, v0.8h, v1.8h148; CHECK-NEXT: ret149;150; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v8f16:151; CHECK-NO-FAMINMAX: // %bb.0:152; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h153; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h154; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.8h, v0.8h, v1.8h155; CHECK-NO-FAMINMAX-NEXT: ret156 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)157 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)158 %r = call nnan <8 x half> @llvm.maxnum.v8f16(<8 x half> %aa, <8 x half> %ab)159 ret <8 x half> %r160}161 162define <8 x half> @test_maxnm_noflag_v8f16(<8 x half> %a, <8 x half> %b) #0 {163; CHECK-LABEL: test_maxnm_noflag_v8f16:164; CHECK: // %bb.0:165; CHECK-NEXT: fabs v0.8h, v0.8h166; CHECK-NEXT: fabs v1.8h, v1.8h167; CHECK-NEXT: fmaxnm v0.8h, v0.8h, v1.8h168; CHECK-NEXT: ret169;170; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v8f16:171; CHECK-NO-FAMINMAX: // %bb.0:172; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h173; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h174; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.8h, v0.8h, v1.8h175; CHECK-NO-FAMINMAX-NEXT: ret176 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)177 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)178 %r = call <8 x half> @llvm.maxnum.v8f16(<8 x half> %aa, <8 x half> %ab)179 ret <8 x half> %r180}181 182define <8 x half> @test_min_v8f16(<8 x half> %a, <8 x half> %b) #0 {183; CHECK-LABEL: test_min_v8f16:184; CHECK: // %bb.0:185; CHECK-NEXT: famin v0.8h, v0.8h, v1.8h186; CHECK-NEXT: ret187;188; CHECK-NO-FAMINMAX-LABEL: test_min_v8f16:189; CHECK-NO-FAMINMAX: // %bb.0:190; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h191; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h192; CHECK-NO-FAMINMAX-NEXT: fmin v0.8h, v0.8h, v1.8h193; CHECK-NO-FAMINMAX-NEXT: ret194 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)195 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)196 %r = call <8 x half> @llvm.minimum.v8f16(<8 x half> %aa, <8 x half> %ab)197 ret <8 x half> %r198}199 200define <8 x half> @test_minnm_nnan_v8f16(<8 x half> %a, <8 x half> %b) #0 {201; CHECK-LABEL: test_minnm_nnan_v8f16:202; CHECK: // %bb.0:203; CHECK-NEXT: famin v0.8h, v0.8h, v1.8h204; CHECK-NEXT: ret205;206; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v8f16:207; CHECK-NO-FAMINMAX: // %bb.0:208; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h209; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h210; CHECK-NO-FAMINMAX-NEXT: fminnm v0.8h, v0.8h, v1.8h211; CHECK-NO-FAMINMAX-NEXT: ret212 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)213 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)214 %r = call nnan <8 x half> @llvm.minnum.v8f16(<8 x half> %aa, <8 x half> %ab)215 ret <8 x half> %r216}217 218define <8 x half> @test_minnm_noflag_v8f16(<8 x half> %a, <8 x half> %b) #0 {219; CHECK-LABEL: test_minnm_noflag_v8f16:220; CHECK: // %bb.0:221; CHECK-NEXT: fabs v0.8h, v0.8h222; CHECK-NEXT: fabs v1.8h, v1.8h223; CHECK-NEXT: fminnm v0.8h, v0.8h, v1.8h224; CHECK-NEXT: ret225;226; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v8f16:227; CHECK-NO-FAMINMAX: // %bb.0:228; CHECK-NO-FAMINMAX-NEXT: fabs v0.8h, v0.8h229; CHECK-NO-FAMINMAX-NEXT: fabs v1.8h, v1.8h230; CHECK-NO-FAMINMAX-NEXT: fminnm v0.8h, v0.8h, v1.8h231; CHECK-NO-FAMINMAX-NEXT: ret232 %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)233 %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)234 %r = call <8 x half> @llvm.minnum.v8f16(<8 x half> %aa, <8 x half> %ab)235 ret <8 x half> %r236}237 238define <2 x float> @test_max_v2f32(<2 x float> %a, <2 x float> %b) {239; CHECK-LABEL: test_max_v2f32:240; CHECK: // %bb.0:241; CHECK-NEXT: famax v0.2s, v0.2s, v1.2s242; CHECK-NEXT: ret243;244; CHECK-NO-FAMINMAX-LABEL: test_max_v2f32:245; CHECK-NO-FAMINMAX: // %bb.0:246; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s247; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s248; CHECK-NO-FAMINMAX-NEXT: fmax v0.2s, v0.2s, v1.2s249; CHECK-NO-FAMINMAX-NEXT: ret250 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)251 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)252 %r = call <2 x float> @llvm.maximum.v2f32(<2 x float> %aa, <2 x float> %ab)253 ret <2 x float> %r254}255 256define <2 x float> @test_maxnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {257; CHECK-LABEL: test_maxnm_nnan_v2f32:258; CHECK: // %bb.0:259; CHECK-NEXT: famax v0.2s, v0.2s, v1.2s260; CHECK-NEXT: ret261;262; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v2f32:263; CHECK-NO-FAMINMAX: // %bb.0:264; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s265; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s266; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.2s, v0.2s, v1.2s267; CHECK-NO-FAMINMAX-NEXT: ret268 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)269 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)270 %r = call nnan <2 x float> @llvm.maxnum.v2f32(<2 x float> %aa, <2 x float> %ab)271 ret <2 x float> %r272}273 274define <2 x float> @test_maxnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {275; CHECK-LABEL: test_maxnm_noflag_v2f32:276; CHECK: // %bb.0:277; CHECK-NEXT: fabs v0.2s, v0.2s278; CHECK-NEXT: fabs v1.2s, v1.2s279; CHECK-NEXT: fmaxnm v0.2s, v0.2s, v1.2s280; CHECK-NEXT: ret281;282; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v2f32:283; CHECK-NO-FAMINMAX: // %bb.0:284; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s285; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s286; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.2s, v0.2s, v1.2s287; CHECK-NO-FAMINMAX-NEXT: ret288 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)289 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)290 %r = call <2 x float> @llvm.maxnum.v2f32(<2 x float> %aa, <2 x float> %ab)291 ret <2 x float> %r292}293 294define <2 x float> @test_min_v2f32(<2 x float> %a, <2 x float> %b) {295; CHECK-LABEL: test_min_v2f32:296; CHECK: // %bb.0:297; CHECK-NEXT: famin v0.2s, v0.2s, v1.2s298; CHECK-NEXT: ret299;300; CHECK-NO-FAMINMAX-LABEL: test_min_v2f32:301; CHECK-NO-FAMINMAX: // %bb.0:302; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s303; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s304; CHECK-NO-FAMINMAX-NEXT: fmin v0.2s, v0.2s, v1.2s305; CHECK-NO-FAMINMAX-NEXT: ret306 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)307 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)308 %r = call <2 x float> @llvm.minimum.v2f32(<2 x float> %aa, <2 x float> %ab)309 ret <2 x float> %r310}311 312define <2 x float> @test_minnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {313; CHECK-LABEL: test_minnm_nnan_v2f32:314; CHECK: // %bb.0:315; CHECK-NEXT: famin v0.2s, v0.2s, v1.2s316; CHECK-NEXT: ret317;318; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v2f32:319; CHECK-NO-FAMINMAX: // %bb.0:320; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s321; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s322; CHECK-NO-FAMINMAX-NEXT: fminnm v0.2s, v0.2s, v1.2s323; CHECK-NO-FAMINMAX-NEXT: ret324 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)325 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)326 %r = call nnan <2 x float> @llvm.minnum.v2f32(<2 x float> %aa, <2 x float> %ab)327 ret <2 x float> %r328}329 330define <2 x float> @test_minnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {331; CHECK-LABEL: test_minnm_noflag_v2f32:332; CHECK: // %bb.0:333; CHECK-NEXT: fabs v0.2s, v0.2s334; CHECK-NEXT: fabs v1.2s, v1.2s335; CHECK-NEXT: fminnm v0.2s, v0.2s, v1.2s336; CHECK-NEXT: ret337;338; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v2f32:339; CHECK-NO-FAMINMAX: // %bb.0:340; CHECK-NO-FAMINMAX-NEXT: fabs v0.2s, v0.2s341; CHECK-NO-FAMINMAX-NEXT: fabs v1.2s, v1.2s342; CHECK-NO-FAMINMAX-NEXT: fminnm v0.2s, v0.2s, v1.2s343; CHECK-NO-FAMINMAX-NEXT: ret344 %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)345 %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)346 %r = call <2 x float> @llvm.minnum.v2f32(<2 x float> %aa, <2 x float> %ab)347 ret <2 x float> %r348}349 350define <4 x float> @test_max_v4f32(<4 x float> %a, <4 x float> %b) {351; CHECK-LABEL: test_max_v4f32:352; CHECK: // %bb.0:353; CHECK-NEXT: famax v0.4s, v0.4s, v1.4s354; CHECK-NEXT: ret355;356; CHECK-NO-FAMINMAX-LABEL: test_max_v4f32:357; CHECK-NO-FAMINMAX: // %bb.0:358; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s359; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s360; CHECK-NO-FAMINMAX-NEXT: fmax v0.4s, v0.4s, v1.4s361; CHECK-NO-FAMINMAX-NEXT: ret362 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)363 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)364 %r = call <4 x float> @llvm.maximum.v4f32(<4 x float> %aa, <4 x float> %ab)365 ret <4 x float> %r366}367 368define <4 x float> @test_maxnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {369; CHECK-LABEL: test_maxnm_nnan_v4f32:370; CHECK: // %bb.0:371; CHECK-NEXT: famax v0.4s, v0.4s, v1.4s372; CHECK-NEXT: ret373;374; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v4f32:375; CHECK-NO-FAMINMAX: // %bb.0:376; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s377; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s378; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.4s, v0.4s, v1.4s379; CHECK-NO-FAMINMAX-NEXT: ret380 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)381 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)382 %r = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %aa, <4 x float> %ab)383 ret <4 x float> %r384}385 386define <4 x float> @test_maxnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {387; CHECK-LABEL: test_maxnm_noflag_v4f32:388; CHECK: // %bb.0:389; CHECK-NEXT: fabs v0.4s, v0.4s390; CHECK-NEXT: fabs v1.4s, v1.4s391; CHECK-NEXT: fmaxnm v0.4s, v0.4s, v1.4s392; CHECK-NEXT: ret393;394; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v4f32:395; CHECK-NO-FAMINMAX: // %bb.0:396; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s397; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s398; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.4s, v0.4s, v1.4s399; CHECK-NO-FAMINMAX-NEXT: ret400 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)401 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)402 %r = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %aa, <4 x float> %ab)403 ret <4 x float> %r404}405 406define <4 x float> @test_min_v4f32(<4 x float> %a, <4 x float> %b) {407; CHECK-LABEL: test_min_v4f32:408; CHECK: // %bb.0:409; CHECK-NEXT: famin v0.4s, v0.4s, v1.4s410; CHECK-NEXT: ret411;412; CHECK-NO-FAMINMAX-LABEL: test_min_v4f32:413; CHECK-NO-FAMINMAX: // %bb.0:414; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s415; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s416; CHECK-NO-FAMINMAX-NEXT: fmin v0.4s, v0.4s, v1.4s417; CHECK-NO-FAMINMAX-NEXT: ret418 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)419 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)420 %r = call <4 x float> @llvm.minimum.v4f32(<4 x float> %aa, <4 x float> %ab)421 ret <4 x float> %r422}423 424define <4 x float> @test_minnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {425; CHECK-LABEL: test_minnm_nnan_v4f32:426; CHECK: // %bb.0:427; CHECK-NEXT: famin v0.4s, v0.4s, v1.4s428; CHECK-NEXT: ret429;430; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v4f32:431; CHECK-NO-FAMINMAX: // %bb.0:432; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s433; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s434; CHECK-NO-FAMINMAX-NEXT: fminnm v0.4s, v0.4s, v1.4s435; CHECK-NO-FAMINMAX-NEXT: ret436 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)437 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)438 %r = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %aa, <4 x float> %ab)439 ret <4 x float> %r440}441 442define <4 x float> @test_minnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {443; CHECK-LABEL: test_minnm_noflag_v4f32:444; CHECK: // %bb.0:445; CHECK-NEXT: fabs v0.4s, v0.4s446; CHECK-NEXT: fabs v1.4s, v1.4s447; CHECK-NEXT: fminnm v0.4s, v0.4s, v1.4s448; CHECK-NEXT: ret449;450; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v4f32:451; CHECK-NO-FAMINMAX: // %bb.0:452; CHECK-NO-FAMINMAX-NEXT: fabs v0.4s, v0.4s453; CHECK-NO-FAMINMAX-NEXT: fabs v1.4s, v1.4s454; CHECK-NO-FAMINMAX-NEXT: fminnm v0.4s, v0.4s, v1.4s455; CHECK-NO-FAMINMAX-NEXT: ret456 %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)457 %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)458 %r = call <4 x float> @llvm.minnum.v4f32(<4 x float> %aa, <4 x float> %ab)459 ret <4 x float> %r460}461 462define <2 x double> @test_max_v2f64(<2 x double> %a, <2 x double> %b) {463; CHECK-LABEL: test_max_v2f64:464; CHECK: // %bb.0:465; CHECK-NEXT: famax v0.2d, v0.2d, v1.2d466; CHECK-NEXT: ret467;468; CHECK-NO-FAMINMAX-LABEL: test_max_v2f64:469; CHECK-NO-FAMINMAX: // %bb.0:470; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d471; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d472; CHECK-NO-FAMINMAX-NEXT: fmax v0.2d, v0.2d, v1.2d473; CHECK-NO-FAMINMAX-NEXT: ret474 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)475 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)476 %r = call <2 x double> @llvm.maximum.v2f64(<2 x double> %aa, <2 x double> %ab)477 ret <2 x double> %r478}479 480define <2 x double> @test_maxnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {481; CHECK-LABEL: test_maxnm_nnan_v2f64:482; CHECK: // %bb.0:483; CHECK-NEXT: famax v0.2d, v0.2d, v1.2d484; CHECK-NEXT: ret485;486; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v2f64:487; CHECK-NO-FAMINMAX: // %bb.0:488; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d489; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d490; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.2d, v0.2d, v1.2d491; CHECK-NO-FAMINMAX-NEXT: ret492 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)493 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)494 %r = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %aa, <2 x double> %ab)495 ret <2 x double> %r496}497 498define <2 x double> @test_maxnm_noflag_v2f64(<2 x double> %a, <2 x double> %b) {499; CHECK-LABEL: test_maxnm_noflag_v2f64:500; CHECK: // %bb.0:501; CHECK-NEXT: fabs v0.2d, v0.2d502; CHECK-NEXT: fabs v1.2d, v1.2d503; CHECK-NEXT: fmaxnm v0.2d, v0.2d, v1.2d504; CHECK-NEXT: ret505;506; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v2f64:507; CHECK-NO-FAMINMAX: // %bb.0:508; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d509; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d510; CHECK-NO-FAMINMAX-NEXT: fmaxnm v0.2d, v0.2d, v1.2d511; CHECK-NO-FAMINMAX-NEXT: ret512 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)513 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)514 %r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %aa, <2 x double> %ab)515 ret <2 x double> %r516}517 518define <2 x double> @test_min_v2f64(<2 x double> %a, <2 x double> %b) {519; CHECK-LABEL: test_min_v2f64:520; CHECK: // %bb.0:521; CHECK-NEXT: famin v0.2d, v0.2d, v1.2d522; CHECK-NEXT: ret523;524; CHECK-NO-FAMINMAX-LABEL: test_min_v2f64:525; CHECK-NO-FAMINMAX: // %bb.0:526; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d527; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d528; CHECK-NO-FAMINMAX-NEXT: fmin v0.2d, v0.2d, v1.2d529; CHECK-NO-FAMINMAX-NEXT: ret530 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)531 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)532 %r = call <2 x double> @llvm.minimum.v2f64(<2 x double> %aa, <2 x double> %ab)533 ret <2 x double> %r534}535 536define <2 x double> @test_minnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {537; CHECK-LABEL: test_minnm_nnan_v2f64:538; CHECK: // %bb.0:539; CHECK-NEXT: famin v0.2d, v0.2d, v1.2d540; CHECK-NEXT: ret541;542; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v2f64:543; CHECK-NO-FAMINMAX: // %bb.0:544; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d545; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d546; CHECK-NO-FAMINMAX-NEXT: fminnm v0.2d, v0.2d, v1.2d547; CHECK-NO-FAMINMAX-NEXT: ret548 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)549 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)550 %r = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %aa, <2 x double> %ab)551 ret <2 x double> %r552}553 554define <2 x double> @test_min_noflag_v2f64(<2 x double> %a, <2 x double> %b) {555; CHECK-LABEL: test_min_noflag_v2f64:556; CHECK: // %bb.0:557; CHECK-NEXT: fabs v0.2d, v0.2d558; CHECK-NEXT: fabs v1.2d, v1.2d559; CHECK-NEXT: fminnm v0.2d, v0.2d, v1.2d560; CHECK-NEXT: ret561;562; CHECK-NO-FAMINMAX-LABEL: test_min_noflag_v2f64:563; CHECK-NO-FAMINMAX: // %bb.0:564; CHECK-NO-FAMINMAX-NEXT: fabs v0.2d, v0.2d565; CHECK-NO-FAMINMAX-NEXT: fabs v1.2d, v1.2d566; CHECK-NO-FAMINMAX-NEXT: fminnm v0.2d, v0.2d, v1.2d567; CHECK-NO-FAMINMAX-NEXT: ret568 %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)569 %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)570 %r = call <2 x double> @llvm.minnum.v2f64(<2 x double> %aa, <2 x double> %ab)571 ret <2 x double> %r572}573 574declare <8 x half> @llvm.fabs.v8f16(<8 x half>)575declare <4 x half> @llvm.fabs.v4f16(<4 x half>)576declare <4 x float> @llvm.fabs.v4f32(<4 x float>)577declare <2 x float> @llvm.fabs.v2f32(<2 x float>)578declare <2 x double> @llvm.fabs.v2f64(<2 x double>)579 580declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)581declare <4 x half> @llvm.minimum.v4f16(<4 x half>, <4 x half>)582declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)583declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)584declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)585 586declare <4 x half> @llvm.minnum.v4f16(<4 x half>, <4 x half>)587declare <8 x half> @llvm.minnum.v8f16(<8 x half>, <8 x half>)588declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>)589declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)590declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>)591 592declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)593declare <4 x half> @llvm.maximum.v4f16(<4 x half>, <4 x half>)594declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)595declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)596declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)597 598declare <4 x half> @llvm.maxnum.v4f16(<4 x half>, <4 x half>)599declare <8 x half> @llvm.maxnum.v8f16(<8 x half>, <8 x half>)600declare <2 x float> @llvm.maxnum.v2f32(<2 x float>, <2 x float>)601declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)602declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>)603 604attributes #0 = { nounwind "target-features"="+fullfp16" }605