1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=aarch64 --mattr=+fullfp16 < %s | FileCheck %s --check-prefix=AARCH64 3 4;;;;;;;;;;;;;;;; max_f64 5define double @max_nnan_f64(double %a, double %b) { 6; AARCH64-LABEL: max_nnan_f64: 7; AARCH64: // %bb.0: // %entry 8; AARCH64-NEXT: fmaxnm d0, d0, d1 9; AARCH64-NEXT: ret 10entry: 11 %c = call nnan double @llvm.maximumnum.f64(double %a, double %b) 12 ret double %c 13} 14 15define <2 x double> @max_nnan_v2f64(<2 x double> %a, <2 x double> %b) { 16; AARCH64-LABEL: max_nnan_v2f64: 17; AARCH64: // %bb.0: // %entry 18; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d 19; AARCH64-NEXT: ret 20entry: 21 %c = call nnan <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b) 22 ret <2 x double> %c 23} 24 25define <3 x double> @max_nnan_v3f64(<3 x double> %a, <3 x double> %b) { 26; AARCH64-LABEL: max_nnan_v3f64: 27; AARCH64: // %bb.0: // %entry 28; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q3 29; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q0 30; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q4 31; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q1 32; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q2 33; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q5 34; AARCH64-NEXT: mov v3.d[1], v4.d[0] 35; AARCH64-NEXT: mov v0.d[1], v1.d[0] 36; AARCH64-NEXT: fmaxnm v2.2d, v2.2d, v5.2d 37; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q2 38; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v3.2d 39; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #8 40; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q0 41; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q1 42; AARCH64-NEXT: ret 43entry: 44 %c = call nnan <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b) 45 ret <3 x double> %c 46} 47 48define <4 x double> @max_nnan_v4f64(<4 x double> %a, <4 x double> %b) { 49; AARCH64-LABEL: max_nnan_v4f64: 50; AARCH64: // %bb.0: // %entry 51; AARCH64-NEXT: fmaxnm v1.2d, v1.2d, v3.2d 52; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v2.2d 53; AARCH64-NEXT: ret 54entry: 55 %c = call nnan <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b) 56 ret <4 x double> %c 57} 58 59;;;;;;;;;;;;;;;;;; max_f32 60define float @max_nnan_f32(float %a, float %b) { 61; AARCH64-LABEL: max_nnan_f32: 62; AARCH64: // %bb.0: // %entry 63; AARCH64-NEXT: fmaxnm s0, s0, s1 64; AARCH64-NEXT: ret 65entry: 66 %c = call nnan float @llvm.maximumnum.f32(float %a, float %b) 67 ret float %c 68} 69 70define <2 x float> @max_nnan_v2f32(<2 x float> %a, <2 x float> %b) { 71; AARCH64-LABEL: max_nnan_v2f32: 72; AARCH64: // %bb.0: // %entry 73; AARCH64-NEXT: fmaxnm v0.2s, v0.2s, v1.2s 74; AARCH64-NEXT: ret 75entry: 76 %c = call nnan <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b) 77 ret <2 x float> %c 78} 79 80define <3 x float> @max_nnan_v3f32(<3 x float> %a, <3 x float> %b) { 81; AARCH64-LABEL: max_nnan_v3f32: 82; AARCH64: // %bb.0: // %entry 83; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s 84; AARCH64-NEXT: ret 85entry: 86 %c = call nnan <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b) 87 ret <3 x float> %c 88} 89 90define <4 x float> @max_nnan_v4f32(<4 x float> %a, <4 x float> %b) { 91; AARCH64-LABEL: max_nnan_v4f32: 92; AARCH64: // %bb.0: // %entry 93; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s 94; AARCH64-NEXT: ret 95entry: 96 %c = call nnan <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b) 97 ret <4 x float> %c 98} 99 100define <5 x float> @max_nnan_v5f32(<5 x float> %a, <5 x float> %b) { 101; AARCH64-LABEL: max_nnan_v5f32: 102; AARCH64: // %bb.0: // %entry 103; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0 104; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5 105; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1 106; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6 107; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2 108; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7 109; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3 110; AARCH64-NEXT: mov x8, sp 111; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4 112; AARCH64-NEXT: mov v0.s[1], v1.s[0] 113; AARCH64-NEXT: mov v5.s[1], v6.s[0] 114; AARCH64-NEXT: mov v0.s[2], v2.s[0] 115; AARCH64-NEXT: mov v5.s[2], v7.s[0] 116; AARCH64-NEXT: ldr s2, [sp, #8] 117; AARCH64-NEXT: fmaxnm v4.4s, v4.4s, v2.4s 118; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4 119; AARCH64-NEXT: mov v0.s[3], v3.s[0] 120; AARCH64-NEXT: ld1 { v5.s }[3], [x8] 121; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v5.4s 122; AARCH64-NEXT: mov s1, v0.s[1] 123; AARCH64-NEXT: mov s2, v0.s[2] 124; AARCH64-NEXT: mov s3, v0.s[3] 125; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0 126; AARCH64-NEXT: ret 127entry: 128 %c = call nnan <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b) 129 ret <5 x float> %c 130} 131 132define <8 x float> @max_nnan_v8f32(<8 x float> %a, <8 x float> %b) { 133; AARCH64-LABEL: max_nnan_v8f32: 134; AARCH64: // %bb.0: // %entry 135; AARCH64-NEXT: fmaxnm v1.4s, v1.4s, v3.4s 136; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v2.4s 137; AARCH64-NEXT: ret 138entry: 139 %c = call nnan <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b) 140 ret <8 x float> %c 141} 142 143;;;;;;;;;;;;;;;;;; max_f16 144define half @max_nnan_f16(half %a, half %b) { 145; AARCH64-LABEL: max_nnan_f16: 146; AARCH64: // %bb.0: // %entry 147; AARCH64-NEXT: fmaxnm h0, h0, h1 148; AARCH64-NEXT: ret 149entry: 150 %c = call nnan half @llvm.maximumnum.f16(half %a, half %b) 151 ret half %c 152} 153 154define <2 x half> @max_nnan_v2f16(<2 x half> %a, <2 x half> %b) { 155; AARCH64-LABEL: max_nnan_v2f16: 156; AARCH64: // %bb.0: // %entry 157; AARCH64-NEXT: fmaxnm v0.4h, v0.4h, v1.4h 158; AARCH64-NEXT: ret 159entry: 160 %c = call nnan <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b) 161 ret <2 x half> %c 162} 163 164define <4 x half> @max_nnan_v4f16(<4 x half> %a, <4 x half> %b) { 165; AARCH64-LABEL: max_nnan_v4f16: 166; AARCH64: // %bb.0: // %entry 167; AARCH64-NEXT: fmaxnm v0.4h, v0.4h, v1.4h 168; AARCH64-NEXT: ret 169entry: 170 %c = call nnan <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b) 171 ret <4 x half> %c 172} 173 174define <8 x half> @max_nnan_v8f16(<8 x half> %a, <8 x half> %b) { 175; AARCH64-LABEL: max_nnan_v8f16: 176; AARCH64: // %bb.0: // %entry 177; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v1.8h 178; AARCH64-NEXT: ret 179entry: 180 %c = call nnan <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b) 181 ret <8 x half> %c 182} 183 184define <9 x half> @max_nnan_v9f16(<9 x half> %a, <9 x half> %b) { 185; AARCH64-LABEL: max_nnan_v9f16: 186; AARCH64: // %bb.0: // %entry 187; AARCH64-NEXT: // kill: def $h0 killed $h0 def $q0 188; AARCH64-NEXT: // kill: def $h1 killed $h1 def $q1 189; AARCH64-NEXT: // kill: def $h2 killed $h2 def $q2 190; AARCH64-NEXT: add x9, sp, #16 191; AARCH64-NEXT: // kill: def $h3 killed $h3 def $q3 192; AARCH64-NEXT: // kill: def $h4 killed $h4 def $q4 193; AARCH64-NEXT: // kill: def $h5 killed $h5 def $q5 194; AARCH64-NEXT: // kill: def $h6 killed $h6 def $q6 195; AARCH64-NEXT: // kill: def $h7 killed $h7 def $q7 196; AARCH64-NEXT: mov v0.h[1], v1.h[0] 197; AARCH64-NEXT: ldr h1, [sp, #8] 198; AARCH64-NEXT: ld1 { v1.h }[1], [x9] 199; AARCH64-NEXT: add x9, sp, #24 200; AARCH64-NEXT: mov v0.h[2], v2.h[0] 201; AARCH64-NEXT: ldr h2, [sp, #72] 202; AARCH64-NEXT: ld1 { v1.h }[2], [x9] 203; AARCH64-NEXT: add x9, sp, #32 204; AARCH64-NEXT: mov v0.h[3], v3.h[0] 205; AARCH64-NEXT: ld1 { v1.h }[3], [x9] 206; AARCH64-NEXT: add x9, sp, #40 207; AARCH64-NEXT: ldr h3, [sp] 208; AARCH64-NEXT: ld1 { v1.h }[4], [x9] 209; AARCH64-NEXT: add x9, sp, #48 210; AARCH64-NEXT: fmaxnm v2.8h, v3.8h, v2.8h 211; AARCH64-NEXT: mov v0.h[4], v4.h[0] 212; AARCH64-NEXT: ld1 { v1.h }[5], [x9] 213; AARCH64-NEXT: add x9, sp, #56 214; AARCH64-NEXT: str h2, [x8, #16] 215; AARCH64-NEXT: mov v0.h[5], v5.h[0] 216; AARCH64-NEXT: ld1 { v1.h }[6], [x9] 217; AARCH64-NEXT: add x9, sp, #64 218; AARCH64-NEXT: mov v0.h[6], v6.h[0] 219; AARCH64-NEXT: ld1 { v1.h }[7], [x9] 220; AARCH64-NEXT: mov v0.h[7], v7.h[0] 221; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v1.8h 222; AARCH64-NEXT: str q0, [x8] 223; AARCH64-NEXT: ret 224entry: 225 %c = call nnan <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b) 226 ret <9 x half> %c 227} 228 229define <16 x half> @max_nnan_v16f16(<16 x half> %a, <16 x half> %b) { 230; AARCH64-LABEL: max_nnan_v16f16: 231; AARCH64: // %bb.0: // %entry 232; AARCH64-NEXT: fmaxnm v1.8h, v1.8h, v3.8h 233; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v2.8h 234; AARCH64-NEXT: ret 235entry: 236 %c = call nnan <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b) 237 ret <16 x half> %c 238} 239 240;;;;;;;;;;;;;;;; min_f64 241define double @min_nnan_f64(double %a, double %b) { 242; AARCH64-LABEL: min_nnan_f64: 243; AARCH64: // %bb.0: // %entry 244; AARCH64-NEXT: fminnm d0, d0, d1 245; AARCH64-NEXT: ret 246entry: 247 %c = call nnan double @llvm.minimumnum.f64(double %a, double %b) 248 ret double %c 249} 250 251define <2 x double> @min_nnan_v2f64(<2 x double> %a, <2 x double> %b) { 252; AARCH64-LABEL: min_nnan_v2f64: 253; AARCH64: // %bb.0: // %entry 254; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d 255; AARCH64-NEXT: ret 256entry: 257 %c = call nnan <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b) 258 ret <2 x double> %c 259} 260 261define <3 x double> @min_nnan_v3f64(<3 x double> %a, <3 x double> %b) { 262; AARCH64-LABEL: min_nnan_v3f64: 263; AARCH64: // %bb.0: // %entry 264; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q3 265; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q0 266; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q4 267; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q1 268; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q2 269; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q5 270; AARCH64-NEXT: mov v3.d[1], v4.d[0] 271; AARCH64-NEXT: mov v0.d[1], v1.d[0] 272; AARCH64-NEXT: fminnm v2.2d, v2.2d, v5.2d 273; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q2 274; AARCH64-NEXT: fminnm v0.2d, v0.2d, v3.2d 275; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #8 276; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q0 277; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q1 278; AARCH64-NEXT: ret 279entry: 280 %c = call nnan <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b) 281 ret <3 x double> %c 282} 283 284define <4 x double> @min_nnan_v4f64(<4 x double> %a, <4 x double> %b) { 285; AARCH64-LABEL: min_nnan_v4f64: 286; AARCH64: // %bb.0: // %entry 287; AARCH64-NEXT: fminnm v1.2d, v1.2d, v3.2d 288; AARCH64-NEXT: fminnm v0.2d, v0.2d, v2.2d 289; AARCH64-NEXT: ret 290entry: 291 %c = call nnan <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b) 292 ret <4 x double> %c 293} 294 295;;;;;;;;;;;;;;;;;; min_f32 296define float @min_nnan_f32(float %a, float %b) { 297; AARCH64-LABEL: min_nnan_f32: 298; AARCH64: // %bb.0: // %entry 299; AARCH64-NEXT: fminnm s0, s0, s1 300; AARCH64-NEXT: ret 301entry: 302 %c = call nnan float @llvm.minimumnum.f32(float %a, float %b) 303 ret float %c 304} 305 306define <2 x float> @min_nnan_v2f32(<2 x float> %a, <2 x float> %b) { 307; AARCH64-LABEL: min_nnan_v2f32: 308; AARCH64: // %bb.0: // %entry 309; AARCH64-NEXT: fminnm v0.2s, v0.2s, v1.2s 310; AARCH64-NEXT: ret 311entry: 312 %c = call nnan <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b) 313 ret <2 x float> %c 314} 315 316define <3 x float> @min_nnan_v3f32(<3 x float> %a, <3 x float> %b) { 317; AARCH64-LABEL: min_nnan_v3f32: 318; AARCH64: // %bb.0: // %entry 319; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s 320; AARCH64-NEXT: ret 321entry: 322 %c = call nnan <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b) 323 ret <3 x float> %c 324} 325 326define <4 x float> @min_nnan_v4f32(<4 x float> %a, <4 x float> %b) { 327; AARCH64-LABEL: min_nnan_v4f32: 328; AARCH64: // %bb.0: // %entry 329; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s 330; AARCH64-NEXT: ret 331entry: 332 %c = call nnan <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b) 333 ret <4 x float> %c 334} 335 336define <5 x float> @min_nnan_v5f32(<5 x float> %a, <5 x float> %b) { 337; AARCH64-LABEL: min_nnan_v5f32: 338; AARCH64: // %bb.0: // %entry 339; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0 340; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5 341; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1 342; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6 343; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2 344; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7 345; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3 346; AARCH64-NEXT: mov x8, sp 347; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4 348; AARCH64-NEXT: mov v0.s[1], v1.s[0] 349; AARCH64-NEXT: mov v5.s[1], v6.s[0] 350; AARCH64-NEXT: mov v0.s[2], v2.s[0] 351; AARCH64-NEXT: mov v5.s[2], v7.s[0] 352; AARCH64-NEXT: ldr s2, [sp, #8] 353; AARCH64-NEXT: fminnm v4.4s, v4.4s, v2.4s 354; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4 355; AARCH64-NEXT: mov v0.s[3], v3.s[0] 356; AARCH64-NEXT: ld1 { v5.s }[3], [x8] 357; AARCH64-NEXT: fminnm v0.4s, v0.4s, v5.4s 358; AARCH64-NEXT: mov s1, v0.s[1] 359; AARCH64-NEXT: mov s2, v0.s[2] 360; AARCH64-NEXT: mov s3, v0.s[3] 361; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0 362; AARCH64-NEXT: ret 363entry: 364 %c = call nnan <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b) 365 ret <5 x float> %c 366} 367 368define <8 x float> @min_nnan_v8f32(<8 x float> %a, <8 x float> %b) { 369; AARCH64-LABEL: min_nnan_v8f32: 370; AARCH64: // %bb.0: // %entry 371; AARCH64-NEXT: fminnm v1.4s, v1.4s, v3.4s 372; AARCH64-NEXT: fminnm v0.4s, v0.4s, v2.4s 373; AARCH64-NEXT: ret 374entry: 375 %c = call nnan <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b) 376 ret <8 x float> %c 377} 378 379;;;;;;;;;;;;;;;;;; min_f16 380define half @min_nnan_f16(half %a, half %b) { 381; AARCH64-LABEL: min_nnan_f16: 382; AARCH64: // %bb.0: // %entry 383; AARCH64-NEXT: fminnm h0, h0, h1 384; AARCH64-NEXT: ret 385entry: 386 %c = call nnan half @llvm.minimumnum.f16(half %a, half %b) 387 ret half %c 388} 389 390define <2 x half> @min_nnan_v2f16(<2 x half> %a, <2 x half> %b) { 391; AARCH64-LABEL: min_nnan_v2f16: 392; AARCH64: // %bb.0: // %entry 393; AARCH64-NEXT: fminnm v0.4h, v0.4h, v1.4h 394; AARCH64-NEXT: ret 395entry: 396 %c = call nnan <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b) 397 ret <2 x half> %c 398} 399 400define <4 x half> @min_nnan_v4f16(<4 x half> %a, <4 x half> %b) { 401; AARCH64-LABEL: min_nnan_v4f16: 402; AARCH64: // %bb.0: // %entry 403; AARCH64-NEXT: fminnm v0.4h, v0.4h, v1.4h 404; AARCH64-NEXT: ret 405entry: 406 %c = call nnan <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b) 407 ret <4 x half> %c 408} 409 410define <8 x half> @min_nnan_v8f16(<8 x half> %a, <8 x half> %b) { 411; AARCH64-LABEL: min_nnan_v8f16: 412; AARCH64: // %bb.0: // %entry 413; AARCH64-NEXT: fminnm v0.8h, v0.8h, v1.8h 414; AARCH64-NEXT: ret 415entry: 416 %c = call nnan <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b) 417 ret <8 x half> %c 418} 419 420define <9 x half> @min_nnan_v9f16(<9 x half> %a, <9 x half> %b) { 421; AARCH64-LABEL: min_nnan_v9f16: 422; AARCH64: // %bb.0: // %entry 423; AARCH64-NEXT: // kill: def $h0 killed $h0 def $q0 424; AARCH64-NEXT: // kill: def $h1 killed $h1 def $q1 425; AARCH64-NEXT: // kill: def $h2 killed $h2 def $q2 426; AARCH64-NEXT: add x9, sp, #16 427; AARCH64-NEXT: // kill: def $h3 killed $h3 def $q3 428; AARCH64-NEXT: // kill: def $h4 killed $h4 def $q4 429; AARCH64-NEXT: // kill: def $h5 killed $h5 def $q5 430; AARCH64-NEXT: // kill: def $h6 killed $h6 def $q6 431; AARCH64-NEXT: // kill: def $h7 killed $h7 def $q7 432; AARCH64-NEXT: mov v0.h[1], v1.h[0] 433; AARCH64-NEXT: ldr h1, [sp, #8] 434; AARCH64-NEXT: ld1 { v1.h }[1], [x9] 435; AARCH64-NEXT: add x9, sp, #24 436; AARCH64-NEXT: mov v0.h[2], v2.h[0] 437; AARCH64-NEXT: ldr h2, [sp, #72] 438; AARCH64-NEXT: ld1 { v1.h }[2], [x9] 439; AARCH64-NEXT: add x9, sp, #32 440; AARCH64-NEXT: mov v0.h[3], v3.h[0] 441; AARCH64-NEXT: ld1 { v1.h }[3], [x9] 442; AARCH64-NEXT: add x9, sp, #40 443; AARCH64-NEXT: ldr h3, [sp] 444; AARCH64-NEXT: ld1 { v1.h }[4], [x9] 445; AARCH64-NEXT: add x9, sp, #48 446; AARCH64-NEXT: fminnm v2.8h, v3.8h, v2.8h 447; AARCH64-NEXT: mov v0.h[4], v4.h[0] 448; AARCH64-NEXT: ld1 { v1.h }[5], [x9] 449; AARCH64-NEXT: add x9, sp, #56 450; AARCH64-NEXT: str h2, [x8, #16] 451; AARCH64-NEXT: mov v0.h[5], v5.h[0] 452; AARCH64-NEXT: ld1 { v1.h }[6], [x9] 453; AARCH64-NEXT: add x9, sp, #64 454; AARCH64-NEXT: mov v0.h[6], v6.h[0] 455; AARCH64-NEXT: ld1 { v1.h }[7], [x9] 456; AARCH64-NEXT: mov v0.h[7], v7.h[0] 457; AARCH64-NEXT: fminnm v0.8h, v0.8h, v1.8h 458; AARCH64-NEXT: str q0, [x8] 459; AARCH64-NEXT: ret 460entry: 461 %c = call nnan <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b) 462 ret <9 x half> %c 463} 464 465define <16 x half> @min_nnan_v16f16(<16 x half> %a, <16 x half> %b) { 466; AARCH64-LABEL: min_nnan_v16f16: 467; AARCH64: // %bb.0: // %entry 468; AARCH64-NEXT: fminnm v1.8h, v1.8h, v3.8h 469; AARCH64-NEXT: fminnm v0.8h, v0.8h, v2.8h 470; AARCH64-NEXT: ret 471entry: 472 %c = call nnan <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b) 473 ret <16 x half> %c 474} 475 476;;;;;;;;;;;;;;;; max_f64 477define double @max_f64(double %a, double %b) { 478; AARCH64-LABEL: max_f64: 479; AARCH64: // %bb.0: // %entry 480; AARCH64-NEXT: fminnm d1, d1, d1 481; AARCH64-NEXT: fminnm d0, d0, d0 482; AARCH64-NEXT: fmaxnm d0, d0, d1 483; AARCH64-NEXT: ret 484entry: 485 %c = call double @llvm.maximumnum.f64(double %a, double %b) 486 ret double %c 487} 488 489define <2 x double> @max_v2f64(<2 x double> %a, <2 x double> %b) { 490; AARCH64-LABEL: max_v2f64: 491; AARCH64: // %bb.0: // %entry 492; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d 493; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 494; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d 495; AARCH64-NEXT: ret 496entry: 497 %c = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b) 498 ret <2 x double> %c 499} 500 501define <3 x double> @max_v3f64(<3 x double> %a, <3 x double> %b) { 502; AARCH64-LABEL: max_v3f64: 503; AARCH64: // %bb.0: // %entry 504; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q3 505; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q0 506; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q4 507; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q1 508; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q2 509; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q5 510; AARCH64-NEXT: mov v0.d[1], v1.d[0] 511; AARCH64-NEXT: mov v3.d[1], v4.d[0] 512; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d 513; AARCH64-NEXT: fminnm v1.2d, v3.2d, v3.2d 514; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 515; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d 516; AARCH64-NEXT: fminnm v1.2d, v5.2d, v5.2d 517; AARCH64-NEXT: fmaxnm v2.2d, v2.2d, v1.2d 518; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #8 519; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q0 520; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q1 521; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q2 522; AARCH64-NEXT: ret 523entry: 524 %c = call <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b) 525 ret <3 x double> %c 526} 527 528define <4 x double> @max_v4f64(<4 x double> %a, <4 x double> %b) { 529; AARCH64-LABEL: max_v4f64: 530; AARCH64: // %bb.0: // %entry 531; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d 532; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 533; AARCH64-NEXT: fminnm v3.2d, v3.2d, v3.2d 534; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d 535; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v2.2d 536; AARCH64-NEXT: fmaxnm v1.2d, v1.2d, v3.2d 537; AARCH64-NEXT: ret 538entry: 539 %c = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b) 540 ret <4 x double> %c 541} 542 543;;;;;;;;;;;;;;;;;; max_f32 544define float @max_f32(float %a, float %b) { 545; AARCH64-LABEL: max_f32: 546; AARCH64: // %bb.0: // %entry 547; AARCH64-NEXT: fminnm s1, s1, s1 548; AARCH64-NEXT: fminnm s0, s0, s0 549; AARCH64-NEXT: fmaxnm s0, s0, s1 550; AARCH64-NEXT: ret 551entry: 552 %c = call float @llvm.maximumnum.f32(float %a, float %b) 553 ret float %c 554} 555 556define <2 x float> @max_v2f32(<2 x float> %a, <2 x float> %b) { 557; AARCH64-LABEL: max_v2f32: 558; AARCH64: // %bb.0: // %entry 559; AARCH64-NEXT: fminnm v1.2s, v1.2s, v1.2s 560; AARCH64-NEXT: fminnm v0.2s, v0.2s, v0.2s 561; AARCH64-NEXT: fmaxnm v0.2s, v0.2s, v1.2s 562; AARCH64-NEXT: ret 563entry: 564 %c = call <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b) 565 ret <2 x float> %c 566} 567 568define <3 x float> @max_v3f32(<3 x float> %a, <3 x float> %b) { 569; AARCH64-LABEL: max_v3f32: 570; AARCH64: // %bb.0: // %entry 571; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 572; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 573; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s 574; AARCH64-NEXT: ret 575entry: 576 %c = call <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b) 577 ret <3 x float> %c 578} 579 580define <4 x float> @max_v4f32(<4 x float> %a, <4 x float> %b) { 581; AARCH64-LABEL: max_v4f32: 582; AARCH64: // %bb.0: // %entry 583; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 584; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 585; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s 586; AARCH64-NEXT: ret 587entry: 588 %c = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b) 589 ret <4 x float> %c 590} 591 592define <5 x float> @max_v5f32(<5 x float> %a, <5 x float> %b) { 593; AARCH64-LABEL: max_v5f32: 594; AARCH64: // %bb.0: // %entry 595; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0 596; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5 597; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1 598; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6 599; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2 600; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7 601; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3 602; AARCH64-NEXT: mov x8, sp 603; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4 604; AARCH64-NEXT: mov v0.s[1], v1.s[0] 605; AARCH64-NEXT: mov v5.s[1], v6.s[0] 606; AARCH64-NEXT: mov v0.s[2], v2.s[0] 607; AARCH64-NEXT: mov v5.s[2], v7.s[0] 608; AARCH64-NEXT: ldr s2, [sp, #8] 609; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s 610; AARCH64-NEXT: mov v0.s[3], v3.s[0] 611; AARCH64-NEXT: ld1 { v5.s }[3], [x8] 612; AARCH64-NEXT: fminnm v3.4s, v4.4s, v4.4s 613; AARCH64-NEXT: fminnm v1.4s, v5.4s, v5.4s 614; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 615; AARCH64-NEXT: fmaxnm v4.4s, v3.4s, v2.4s 616; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4 617; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s 618; AARCH64-NEXT: mov s1, v0.s[1] 619; AARCH64-NEXT: mov s2, v0.s[2] 620; AARCH64-NEXT: mov s3, v0.s[3] 621; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0 622; AARCH64-NEXT: ret 623entry: 624 %c = call <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b) 625 ret <5 x float> %c 626} 627 628define <8 x float> @max_v8f32(<8 x float> %a, <8 x float> %b) { 629; AARCH64-LABEL: max_v8f32: 630; AARCH64: // %bb.0: // %entry 631; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s 632; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 633; AARCH64-NEXT: fminnm v3.4s, v3.4s, v3.4s 634; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 635; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v2.4s 636; AARCH64-NEXT: fmaxnm v1.4s, v1.4s, v3.4s 637; AARCH64-NEXT: ret 638entry: 639 %c = call <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b) 640 ret <8 x float> %c 641} 642 643;;;;;;;;;;;;;;;;;; max_f16 644define half @max_f16(half %a, half %b) { 645; AARCH64-LABEL: max_f16: 646; AARCH64: // %bb.0: // %entry 647; AARCH64-NEXT: fminnm h1, h1, h1 648; AARCH64-NEXT: fminnm h0, h0, h0 649; AARCH64-NEXT: fmaxnm h0, h0, h1 650; AARCH64-NEXT: ret 651entry: 652 %c = call half @llvm.maximumnum.f16(half %a, half %b) 653 ret half %c 654} 655 656define <2 x half> @max_v2f16(<2 x half> %a, <2 x half> %b) { 657; AARCH64-LABEL: max_v2f16: 658; AARCH64: // %bb.0: // %entry 659; AARCH64-NEXT: fminnm v1.4h, v1.4h, v1.4h 660; AARCH64-NEXT: fminnm v0.4h, v0.4h, v0.4h 661; AARCH64-NEXT: fmaxnm v0.4h, v0.4h, v1.4h 662; AARCH64-NEXT: ret 663entry: 664 %c = call <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b) 665 ret <2 x half> %c 666} 667 668define <4 x half> @max_v4f16(<4 x half> %a, <4 x half> %b) { 669; AARCH64-LABEL: max_v4f16: 670; AARCH64: // %bb.0: // %entry 671; AARCH64-NEXT: fminnm v1.4h, v1.4h, v1.4h 672; AARCH64-NEXT: fminnm v0.4h, v0.4h, v0.4h 673; AARCH64-NEXT: fmaxnm v0.4h, v0.4h, v1.4h 674; AARCH64-NEXT: ret 675entry: 676 %c = call <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b) 677 ret <4 x half> %c 678} 679 680define <8 x half> @max_v8f16(<8 x half> %a, <8 x half> %b) { 681; AARCH64-LABEL: max_v8f16: 682; AARCH64: // %bb.0: // %entry 683; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 684; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 685; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v1.8h 686; AARCH64-NEXT: ret 687entry: 688 %c = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b) 689 ret <8 x half> %c 690} 691 692define <9 x half> @max_v9f16(<9 x half> %a, <9 x half> %b) { 693; AARCH64-LABEL: max_v9f16: 694; AARCH64: // %bb.0: // %entry 695; AARCH64-NEXT: // kill: def $h0 killed $h0 def $q0 696; AARCH64-NEXT: // kill: def $h1 killed $h1 def $q1 697; AARCH64-NEXT: // kill: def $h2 killed $h2 def $q2 698; AARCH64-NEXT: add x9, sp, #16 699; AARCH64-NEXT: // kill: def $h3 killed $h3 def $q3 700; AARCH64-NEXT: // kill: def $h4 killed $h4 def $q4 701; AARCH64-NEXT: // kill: def $h5 killed $h5 def $q5 702; AARCH64-NEXT: // kill: def $h6 killed $h6 def $q6 703; AARCH64-NEXT: // kill: def $h7 killed $h7 def $q7 704; AARCH64-NEXT: mov v0.h[1], v1.h[0] 705; AARCH64-NEXT: ldr h1, [sp, #8] 706; AARCH64-NEXT: ld1 { v1.h }[1], [x9] 707; AARCH64-NEXT: add x9, sp, #24 708; AARCH64-NEXT: mov v0.h[2], v2.h[0] 709; AARCH64-NEXT: ldr h2, [sp] 710; AARCH64-NEXT: ld1 { v1.h }[2], [x9] 711; AARCH64-NEXT: add x9, sp, #32 712; AARCH64-NEXT: fminnm v2.8h, v2.8h, v2.8h 713; AARCH64-NEXT: mov v0.h[3], v3.h[0] 714; AARCH64-NEXT: ld1 { v1.h }[3], [x9] 715; AARCH64-NEXT: add x9, sp, #40 716; AARCH64-NEXT: ldr h3, [sp, #72] 717; AARCH64-NEXT: ld1 { v1.h }[4], [x9] 718; AARCH64-NEXT: add x9, sp, #48 719; AARCH64-NEXT: fminnm v3.8h, v3.8h, v3.8h 720; AARCH64-NEXT: mov v0.h[4], v4.h[0] 721; AARCH64-NEXT: ld1 { v1.h }[5], [x9] 722; AARCH64-NEXT: add x9, sp, #56 723; AARCH64-NEXT: fmaxnm v2.8h, v2.8h, v3.8h 724; AARCH64-NEXT: mov v0.h[5], v5.h[0] 725; AARCH64-NEXT: ld1 { v1.h }[6], [x9] 726; AARCH64-NEXT: add x9, sp, #64 727; AARCH64-NEXT: str h2, [x8, #16] 728; AARCH64-NEXT: mov v0.h[6], v6.h[0] 729; AARCH64-NEXT: ld1 { v1.h }[7], [x9] 730; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 731; AARCH64-NEXT: mov v0.h[7], v7.h[0] 732; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 733; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v1.8h 734; AARCH64-NEXT: str q0, [x8] 735; AARCH64-NEXT: ret 736entry: 737 %c = call <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b) 738 ret <9 x half> %c 739} 740 741define <16 x half> @max_v16f16(<16 x half> %a, <16 x half> %b) { 742; AARCH64-LABEL: max_v16f16: 743; AARCH64: // %bb.0: // %entry 744; AARCH64-NEXT: fminnm v2.8h, v2.8h, v2.8h 745; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 746; AARCH64-NEXT: fminnm v3.8h, v3.8h, v3.8h 747; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 748; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v2.8h 749; AARCH64-NEXT: fmaxnm v1.8h, v1.8h, v3.8h 750; AARCH64-NEXT: ret 751entry: 752 %c = call <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b) 753 ret <16 x half> %c 754} 755 756;;;;;;;;;;;;;;;; min_f64 757define double @min_f64(double %a, double %b) { 758; AARCH64-LABEL: min_f64: 759; AARCH64: // %bb.0: // %entry 760; AARCH64-NEXT: fminnm d1, d1, d1 761; AARCH64-NEXT: fminnm d0, d0, d0 762; AARCH64-NEXT: fminnm d0, d0, d1 763; AARCH64-NEXT: ret 764entry: 765 %c = call double @llvm.minimumnum.f64(double %a, double %b) 766 ret double %c 767} 768 769define <2 x double> @min_v2f64(<2 x double> %a, <2 x double> %b) { 770; AARCH64-LABEL: min_v2f64: 771; AARCH64: // %bb.0: // %entry 772; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d 773; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 774; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d 775; AARCH64-NEXT: ret 776entry: 777 %c = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b) 778 ret <2 x double> %c 779} 780 781define <3 x double> @min_v3f64(<3 x double> %a, <3 x double> %b) { 782; AARCH64-LABEL: min_v3f64: 783; AARCH64: // %bb.0: // %entry 784; AARCH64-NEXT: // kill: def $d3 killed $d3 def $q3 785; AARCH64-NEXT: // kill: def $d0 killed $d0 def $q0 786; AARCH64-NEXT: // kill: def $d4 killed $d4 def $q4 787; AARCH64-NEXT: // kill: def $d1 killed $d1 def $q1 788; AARCH64-NEXT: // kill: def $d2 killed $d2 def $q2 789; AARCH64-NEXT: // kill: def $d5 killed $d5 def $q5 790; AARCH64-NEXT: mov v0.d[1], v1.d[0] 791; AARCH64-NEXT: mov v3.d[1], v4.d[0] 792; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d 793; AARCH64-NEXT: fminnm v1.2d, v3.2d, v3.2d 794; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 795; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d 796; AARCH64-NEXT: fminnm v1.2d, v5.2d, v5.2d 797; AARCH64-NEXT: fminnm v2.2d, v2.2d, v1.2d 798; AARCH64-NEXT: ext v1.16b, v0.16b, v0.16b, #8 799; AARCH64-NEXT: // kill: def $d0 killed $d0 killed $q0 800; AARCH64-NEXT: // kill: def $d1 killed $d1 killed $q1 801; AARCH64-NEXT: // kill: def $d2 killed $d2 killed $q2 802; AARCH64-NEXT: ret 803entry: 804 %c = call <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b) 805 ret <3 x double> %c 806} 807 808define <4 x double> @min_v4f64(<4 x double> %a, <4 x double> %b) { 809; AARCH64-LABEL: min_v4f64: 810; AARCH64: // %bb.0: // %entry 811; AARCH64-NEXT: fminnm v2.2d, v2.2d, v2.2d 812; AARCH64-NEXT: fminnm v0.2d, v0.2d, v0.2d 813; AARCH64-NEXT: fminnm v3.2d, v3.2d, v3.2d 814; AARCH64-NEXT: fminnm v1.2d, v1.2d, v1.2d 815; AARCH64-NEXT: fminnm v0.2d, v0.2d, v2.2d 816; AARCH64-NEXT: fminnm v1.2d, v1.2d, v3.2d 817; AARCH64-NEXT: ret 818entry: 819 %c = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b) 820 ret <4 x double> %c 821} 822 823;;;;;;;;;;;;;;;;;; min_f32 824define float @min_f32(float %a, float %b) { 825; AARCH64-LABEL: min_f32: 826; AARCH64: // %bb.0: // %entry 827; AARCH64-NEXT: fminnm s1, s1, s1 828; AARCH64-NEXT: fminnm s0, s0, s0 829; AARCH64-NEXT: fminnm s0, s0, s1 830; AARCH64-NEXT: ret 831entry: 832 %c = call float @llvm.minimumnum.f32(float %a, float %b) 833 ret float %c 834} 835 836define <2 x float> @min_v2f32(<2 x float> %a, <2 x float> %b) { 837; AARCH64-LABEL: min_v2f32: 838; AARCH64: // %bb.0: // %entry 839; AARCH64-NEXT: fminnm v1.2s, v1.2s, v1.2s 840; AARCH64-NEXT: fminnm v0.2s, v0.2s, v0.2s 841; AARCH64-NEXT: fminnm v0.2s, v0.2s, v1.2s 842; AARCH64-NEXT: ret 843entry: 844 %c = call <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b) 845 ret <2 x float> %c 846} 847 848define <3 x float> @min_v3f32(<3 x float> %a, <3 x float> %b) { 849; AARCH64-LABEL: min_v3f32: 850; AARCH64: // %bb.0: // %entry 851; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 852; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 853; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s 854; AARCH64-NEXT: ret 855entry: 856 %c = call <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b) 857 ret <3 x float> %c 858} 859 860define <4 x float> @min_v4f32(<4 x float> %a, <4 x float> %b) { 861; AARCH64-LABEL: min_v4f32: 862; AARCH64: // %bb.0: // %entry 863; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 864; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 865; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s 866; AARCH64-NEXT: ret 867entry: 868 %c = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b) 869 ret <4 x float> %c 870} 871 872define <5 x float> @min_v5f32(<5 x float> %a, <5 x float> %b) { 873; AARCH64-LABEL: min_v5f32: 874; AARCH64: // %bb.0: // %entry 875; AARCH64-NEXT: // kill: def $s0 killed $s0 def $q0 876; AARCH64-NEXT: // kill: def $s5 killed $s5 def $q5 877; AARCH64-NEXT: // kill: def $s1 killed $s1 def $q1 878; AARCH64-NEXT: // kill: def $s6 killed $s6 def $q6 879; AARCH64-NEXT: // kill: def $s2 killed $s2 def $q2 880; AARCH64-NEXT: // kill: def $s7 killed $s7 def $q7 881; AARCH64-NEXT: // kill: def $s3 killed $s3 def $q3 882; AARCH64-NEXT: mov x8, sp 883; AARCH64-NEXT: // kill: def $s4 killed $s4 def $q4 884; AARCH64-NEXT: mov v0.s[1], v1.s[0] 885; AARCH64-NEXT: mov v5.s[1], v6.s[0] 886; AARCH64-NEXT: mov v0.s[2], v2.s[0] 887; AARCH64-NEXT: mov v5.s[2], v7.s[0] 888; AARCH64-NEXT: ldr s2, [sp, #8] 889; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s 890; AARCH64-NEXT: mov v0.s[3], v3.s[0] 891; AARCH64-NEXT: ld1 { v5.s }[3], [x8] 892; AARCH64-NEXT: fminnm v3.4s, v4.4s, v4.4s 893; AARCH64-NEXT: fminnm v1.4s, v5.4s, v5.4s 894; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 895; AARCH64-NEXT: fminnm v4.4s, v3.4s, v2.4s 896; AARCH64-NEXT: // kill: def $s4 killed $s4 killed $q4 897; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s 898; AARCH64-NEXT: mov s1, v0.s[1] 899; AARCH64-NEXT: mov s2, v0.s[2] 900; AARCH64-NEXT: mov s3, v0.s[3] 901; AARCH64-NEXT: // kill: def $s0 killed $s0 killed $q0 902; AARCH64-NEXT: ret 903entry: 904 %c = call <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b) 905 ret <5 x float> %c 906} 907 908define <8 x float> @min_v8f32(<8 x float> %a, <8 x float> %b) { 909; AARCH64-LABEL: min_v8f32: 910; AARCH64: // %bb.0: // %entry 911; AARCH64-NEXT: fminnm v2.4s, v2.4s, v2.4s 912; AARCH64-NEXT: fminnm v0.4s, v0.4s, v0.4s 913; AARCH64-NEXT: fminnm v3.4s, v3.4s, v3.4s 914; AARCH64-NEXT: fminnm v1.4s, v1.4s, v1.4s 915; AARCH64-NEXT: fminnm v0.4s, v0.4s, v2.4s 916; AARCH64-NEXT: fminnm v1.4s, v1.4s, v3.4s 917; AARCH64-NEXT: ret 918entry: 919 %c = call <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b) 920 ret <8 x float> %c 921} 922 923;;;;;;;;;;;;;;;;;; min_f16 924define half @min_f16(half %a, half %b) { 925; AARCH64-LABEL: min_f16: 926; AARCH64: // %bb.0: // %entry 927; AARCH64-NEXT: fminnm h1, h1, h1 928; AARCH64-NEXT: fminnm h0, h0, h0 929; AARCH64-NEXT: fminnm h0, h0, h1 930; AARCH64-NEXT: ret 931entry: 932 %c = call half @llvm.minimumnum.f16(half %a, half %b) 933 ret half %c 934} 935 936define <2 x half> @min_v2f16(<2 x half> %a, <2 x half> %b) { 937; AARCH64-LABEL: min_v2f16: 938; AARCH64: // %bb.0: // %entry 939; AARCH64-NEXT: fminnm v1.4h, v1.4h, v1.4h 940; AARCH64-NEXT: fminnm v0.4h, v0.4h, v0.4h 941; AARCH64-NEXT: fminnm v0.4h, v0.4h, v1.4h 942; AARCH64-NEXT: ret 943entry: 944 %c = call <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b) 945 ret <2 x half> %c 946} 947 948define <4 x half> @min_v4f16(<4 x half> %a, <4 x half> %b) { 949; AARCH64-LABEL: min_v4f16: 950; AARCH64: // %bb.0: // %entry 951; AARCH64-NEXT: fminnm v1.4h, v1.4h, v1.4h 952; AARCH64-NEXT: fminnm v0.4h, v0.4h, v0.4h 953; AARCH64-NEXT: fminnm v0.4h, v0.4h, v1.4h 954; AARCH64-NEXT: ret 955entry: 956 %c = call <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b) 957 ret <4 x half> %c 958} 959 960define <8 x half> @min_v8f16(<8 x half> %a, <8 x half> %b) { 961; AARCH64-LABEL: min_v8f16: 962; AARCH64: // %bb.0: // %entry 963; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 964; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 965; AARCH64-NEXT: fminnm v0.8h, v0.8h, v1.8h 966; AARCH64-NEXT: ret 967entry: 968 %c = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b) 969 ret <8 x half> %c 970} 971 972define <9 x half> @min_v9f16(<9 x half> %a, <9 x half> %b) { 973; AARCH64-LABEL: min_v9f16: 974; AARCH64: // %bb.0: // %entry 975; AARCH64-NEXT: // kill: def $h0 killed $h0 def $q0 976; AARCH64-NEXT: // kill: def $h1 killed $h1 def $q1 977; AARCH64-NEXT: // kill: def $h2 killed $h2 def $q2 978; AARCH64-NEXT: add x9, sp, #16 979; AARCH64-NEXT: // kill: def $h3 killed $h3 def $q3 980; AARCH64-NEXT: // kill: def $h4 killed $h4 def $q4 981; AARCH64-NEXT: // kill: def $h5 killed $h5 def $q5 982; AARCH64-NEXT: // kill: def $h6 killed $h6 def $q6 983; AARCH64-NEXT: // kill: def $h7 killed $h7 def $q7 984; AARCH64-NEXT: mov v0.h[1], v1.h[0] 985; AARCH64-NEXT: ldr h1, [sp, #8] 986; AARCH64-NEXT: ld1 { v1.h }[1], [x9] 987; AARCH64-NEXT: add x9, sp, #24 988; AARCH64-NEXT: mov v0.h[2], v2.h[0] 989; AARCH64-NEXT: ldr h2, [sp] 990; AARCH64-NEXT: ld1 { v1.h }[2], [x9] 991; AARCH64-NEXT: add x9, sp, #32 992; AARCH64-NEXT: fminnm v2.8h, v2.8h, v2.8h 993; AARCH64-NEXT: mov v0.h[3], v3.h[0] 994; AARCH64-NEXT: ld1 { v1.h }[3], [x9] 995; AARCH64-NEXT: add x9, sp, #40 996; AARCH64-NEXT: ldr h3, [sp, #72] 997; AARCH64-NEXT: ld1 { v1.h }[4], [x9] 998; AARCH64-NEXT: add x9, sp, #48 999; AARCH64-NEXT: fminnm v3.8h, v3.8h, v3.8h 1000; AARCH64-NEXT: mov v0.h[4], v4.h[0] 1001; AARCH64-NEXT: ld1 { v1.h }[5], [x9] 1002; AARCH64-NEXT: add x9, sp, #56 1003; AARCH64-NEXT: fminnm v2.8h, v2.8h, v3.8h 1004; AARCH64-NEXT: mov v0.h[5], v5.h[0] 1005; AARCH64-NEXT: ld1 { v1.h }[6], [x9] 1006; AARCH64-NEXT: add x9, sp, #64 1007; AARCH64-NEXT: str h2, [x8, #16] 1008; AARCH64-NEXT: mov v0.h[6], v6.h[0] 1009; AARCH64-NEXT: ld1 { v1.h }[7], [x9] 1010; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 1011; AARCH64-NEXT: mov v0.h[7], v7.h[0] 1012; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 1013; AARCH64-NEXT: fminnm v0.8h, v0.8h, v1.8h 1014; AARCH64-NEXT: str q0, [x8] 1015; AARCH64-NEXT: ret 1016entry: 1017 %c = call <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b) 1018 ret <9 x half> %c 1019} 1020 1021define <16 x half> @min_v16f16(<16 x half> %a, <16 x half> %b) { 1022; AARCH64-LABEL: min_v16f16: 1023; AARCH64: // %bb.0: // %entry 1024; AARCH64-NEXT: fminnm v2.8h, v2.8h, v2.8h 1025; AARCH64-NEXT: fminnm v0.8h, v0.8h, v0.8h 1026; AARCH64-NEXT: fminnm v3.8h, v3.8h, v3.8h 1027; AARCH64-NEXT: fminnm v1.8h, v1.8h, v1.8h 1028; AARCH64-NEXT: fminnm v0.8h, v0.8h, v2.8h 1029; AARCH64-NEXT: fminnm v1.8h, v1.8h, v3.8h 1030; AARCH64-NEXT: ret 1031entry: 1032 %c = call <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b) 1033 ret <16 x half> %c 1034} 1035