1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=armv7 -mattr=+neon %s -o - | FileCheck %s --check-prefix=ARMV7 3; RUN: llc -mtriple=armv8.2-a -mattr=+fp-armv8 %s -o - | FileCheck %s --check-prefix=ARMV8 4; RUN: llc -mtriple=armv8.1m-none-none-eabi -mattr=+mve.fp,+fp64 %s -o - | FileCheck %s --check-prefix=ARMV8M 5 6declare float @llvm.minnum.f32(float, float) 7declare float @llvm.maxnum.f32(float, float) 8declare double @llvm.minnum.f64(double, double) 9declare double @llvm.maxnum.f64(double, double) 10declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) 11declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>) 12declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>) 13declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>) 14 15define float @fminnum32_intrinsic(float %x, float %y) { 16; ARMV7-LABEL: fminnum32_intrinsic: 17; ARMV7: @ %bb.0: 18; ARMV7-NEXT: vmov s0, r0 19; ARMV7-NEXT: vmov s2, r1 20; ARMV7-NEXT: vcmp.f32 s0, s2 21; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 22; ARMV7-NEXT: vmovlt.f32 s2, s0 23; ARMV7-NEXT: vmov r0, s2 24; ARMV7-NEXT: bx lr 25; 26; ARMV8-LABEL: fminnum32_intrinsic: 27; ARMV8: @ %bb.0: 28; ARMV8-NEXT: vmov s0, r1 29; ARMV8-NEXT: vmov s2, r0 30; ARMV8-NEXT: vminnm.f32 s0, s2, s0 31; ARMV8-NEXT: vmov r0, s0 32; ARMV8-NEXT: mov pc, lr 33; 34; ARMV8M-LABEL: fminnum32_intrinsic: 35; ARMV8M: @ %bb.0: 36; ARMV8M-NEXT: vmov s0, r1 37; ARMV8M-NEXT: vmov s2, r0 38; ARMV8M-NEXT: vminnm.f32 s0, s2, s0 39; ARMV8M-NEXT: vmov r0, s0 40; ARMV8M-NEXT: bx lr 41 %a = call nnan float @llvm.minnum.f32(float %x, float %y) 42 ret float %a 43} 44 45define float @fminnum32_nsz_intrinsic(float %x, float %y) { 46; ARMV7-LABEL: fminnum32_nsz_intrinsic: 47; ARMV7: @ %bb.0: 48; ARMV7-NEXT: vmov s0, r0 49; ARMV7-NEXT: vmov s2, r1 50; ARMV7-NEXT: vcmp.f32 s0, s2 51; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 52; ARMV7-NEXT: vmovlt.f32 s2, s0 53; ARMV7-NEXT: vmov r0, s2 54; ARMV7-NEXT: bx lr 55; 56; ARMV8-LABEL: fminnum32_nsz_intrinsic: 57; ARMV8: @ %bb.0: 58; ARMV8-NEXT: vmov s0, r1 59; ARMV8-NEXT: vmov s2, r0 60; ARMV8-NEXT: vminnm.f32 s0, s2, s0 61; ARMV8-NEXT: vmov r0, s0 62; ARMV8-NEXT: mov pc, lr 63; 64; ARMV8M-LABEL: fminnum32_nsz_intrinsic: 65; ARMV8M: @ %bb.0: 66; ARMV8M-NEXT: vmov s0, r1 67; ARMV8M-NEXT: vmov s2, r0 68; ARMV8M-NEXT: vminnm.f32 s0, s2, s0 69; ARMV8M-NEXT: vmov r0, s0 70; ARMV8M-NEXT: bx lr 71 %a = call nnan nsz float @llvm.minnum.f32(float %x, float %y) 72 ret float %a 73} 74 75define float @fminnum32_non_zero_intrinsic(float %x) { 76; ARMV7-LABEL: fminnum32_non_zero_intrinsic: 77; ARMV7: @ %bb.0: 78; ARMV7-NEXT: vmov.f32 s0, #-1.000000e+00 79; ARMV7-NEXT: vmov s2, r0 80; ARMV7-NEXT: vcmp.f32 s2, s0 81; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 82; ARMV7-NEXT: vmovlt.f32 s0, s2 83; ARMV7-NEXT: vmov r0, s0 84; ARMV7-NEXT: bx lr 85; 86; ARMV8-LABEL: fminnum32_non_zero_intrinsic: 87; ARMV8: @ %bb.0: 88; ARMV8-NEXT: vmov.f32 s0, #-1.000000e+00 89; ARMV8-NEXT: vmov s2, r0 90; ARMV8-NEXT: vminnm.f32 s0, s2, s0 91; ARMV8-NEXT: vmov r0, s0 92; ARMV8-NEXT: mov pc, lr 93; 94; ARMV8M-LABEL: fminnum32_non_zero_intrinsic: 95; ARMV8M: @ %bb.0: 96; ARMV8M-NEXT: vmov.f32 s0, #-1.000000e+00 97; ARMV8M-NEXT: vmov s2, r0 98; ARMV8M-NEXT: vminnm.f32 s0, s2, s0 99; ARMV8M-NEXT: vmov r0, s0 100; ARMV8M-NEXT: bx lr 101 %a = call nnan float @llvm.minnum.f32(float %x, float -1.0) 102 ret float %a 103} 104 105define float @fmaxnum32_intrinsic(float %x, float %y) { 106; ARMV7-LABEL: fmaxnum32_intrinsic: 107; ARMV7: @ %bb.0: 108; ARMV7-NEXT: vmov s0, r0 109; ARMV7-NEXT: vmov s2, r1 110; ARMV7-NEXT: vcmp.f32 s0, s2 111; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 112; ARMV7-NEXT: vmovgt.f32 s2, s0 113; ARMV7-NEXT: vmov r0, s2 114; ARMV7-NEXT: bx lr 115; 116; ARMV8-LABEL: fmaxnum32_intrinsic: 117; ARMV8: @ %bb.0: 118; ARMV8-NEXT: vmov s0, r1 119; ARMV8-NEXT: vmov s2, r0 120; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 121; ARMV8-NEXT: vmov r0, s0 122; ARMV8-NEXT: mov pc, lr 123; 124; ARMV8M-LABEL: fmaxnum32_intrinsic: 125; ARMV8M: @ %bb.0: 126; ARMV8M-NEXT: vmov s0, r1 127; ARMV8M-NEXT: vmov s2, r0 128; ARMV8M-NEXT: vmaxnm.f32 s0, s2, s0 129; ARMV8M-NEXT: vmov r0, s0 130; ARMV8M-NEXT: bx lr 131 %a = call nnan float @llvm.maxnum.f32(float %x, float %y) 132 ret float %a 133} 134 135define float @fmaxnum32_nsz_intrinsic(float %x, float %y) { 136; ARMV7-LABEL: fmaxnum32_nsz_intrinsic: 137; ARMV7: @ %bb.0: 138; ARMV7-NEXT: vmov s0, r0 139; ARMV7-NEXT: vmov s2, r1 140; ARMV7-NEXT: vcmp.f32 s0, s2 141; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 142; ARMV7-NEXT: vmovgt.f32 s2, s0 143; ARMV7-NEXT: vmov r0, s2 144; ARMV7-NEXT: bx lr 145; 146; ARMV8-LABEL: fmaxnum32_nsz_intrinsic: 147; ARMV8: @ %bb.0: 148; ARMV8-NEXT: vmov s0, r1 149; ARMV8-NEXT: vmov s2, r0 150; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 151; ARMV8-NEXT: vmov r0, s0 152; ARMV8-NEXT: mov pc, lr 153; 154; ARMV8M-LABEL: fmaxnum32_nsz_intrinsic: 155; ARMV8M: @ %bb.0: 156; ARMV8M-NEXT: vmov s0, r1 157; ARMV8M-NEXT: vmov s2, r0 158; ARMV8M-NEXT: vmaxnm.f32 s0, s2, s0 159; ARMV8M-NEXT: vmov r0, s0 160; ARMV8M-NEXT: bx lr 161 %a = call nnan nsz float @llvm.maxnum.f32(float %x, float %y) 162 ret float %a 163} 164 165define float @fmaxnum32_zero_intrinsic(float %x) { 166; ARMV7-LABEL: fmaxnum32_zero_intrinsic: 167; ARMV7: @ %bb.0: 168; ARMV7-NEXT: vmov s2, r0 169; ARMV7-NEXT: vldr s0, .LCPI5_0 170; ARMV7-NEXT: vcmp.f32 s2, #0 171; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 172; ARMV7-NEXT: vmovgt.f32 s0, s2 173; ARMV7-NEXT: vmov r0, s0 174; ARMV7-NEXT: bx lr 175; ARMV7-NEXT: .p2align 2 176; ARMV7-NEXT: @ %bb.1: 177; ARMV7-NEXT: .LCPI5_0: 178; ARMV7-NEXT: .long 0x00000000 @ float 0 179; 180; ARMV8-LABEL: fmaxnum32_zero_intrinsic: 181; ARMV8: @ %bb.0: 182; ARMV8-NEXT: vldr s0, .LCPI5_0 183; ARMV8-NEXT: vmov s2, r0 184; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 185; ARMV8-NEXT: vmov r0, s0 186; ARMV8-NEXT: mov pc, lr 187; ARMV8-NEXT: .p2align 2 188; ARMV8-NEXT: @ %bb.1: 189; ARMV8-NEXT: .LCPI5_0: 190; ARMV8-NEXT: .long 0x00000000 @ float 0 191; 192; ARMV8M-LABEL: fmaxnum32_zero_intrinsic: 193; ARMV8M: @ %bb.0: 194; ARMV8M-NEXT: vldr s0, .LCPI5_0 195; ARMV8M-NEXT: vmov s2, r0 196; ARMV8M-NEXT: vmaxnm.f32 s0, s2, s0 197; ARMV8M-NEXT: vmov r0, s0 198; ARMV8M-NEXT: bx lr 199; ARMV8M-NEXT: .p2align 2 200; ARMV8M-NEXT: @ %bb.1: 201; ARMV8M-NEXT: .LCPI5_0: 202; ARMV8M-NEXT: .long 0x00000000 @ float 0 203 %a = call nnan float @llvm.maxnum.f32(float %x, float 0.0) 204 ret float %a 205} 206 207define float @fmaxnum32_non_zero_intrinsic(float %x) { 208; ARMV7-LABEL: fmaxnum32_non_zero_intrinsic: 209; ARMV7: @ %bb.0: 210; ARMV7-NEXT: vmov.f32 s0, #1.000000e+00 211; ARMV7-NEXT: vmov s2, r0 212; ARMV7-NEXT: vcmp.f32 s2, s0 213; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 214; ARMV7-NEXT: vmovgt.f32 s0, s2 215; ARMV7-NEXT: vmov r0, s0 216; ARMV7-NEXT: bx lr 217; 218; ARMV8-LABEL: fmaxnum32_non_zero_intrinsic: 219; ARMV8: @ %bb.0: 220; ARMV8-NEXT: vmov.f32 s0, #1.000000e+00 221; ARMV8-NEXT: vmov s2, r0 222; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 223; ARMV8-NEXT: vmov r0, s0 224; ARMV8-NEXT: mov pc, lr 225; 226; ARMV8M-LABEL: fmaxnum32_non_zero_intrinsic: 227; ARMV8M: @ %bb.0: 228; ARMV8M-NEXT: vmov.f32 s0, #1.000000e+00 229; ARMV8M-NEXT: vmov s2, r0 230; ARMV8M-NEXT: vmaxnm.f32 s0, s2, s0 231; ARMV8M-NEXT: vmov r0, s0 232; ARMV8M-NEXT: bx lr 233 %a = call nnan float @llvm.maxnum.f32(float %x, float 1.0) 234 ret float %a 235} 236 237define double @fminnum64_intrinsic(double %x, double %y) { 238; ARMV7-LABEL: fminnum64_intrinsic: 239; ARMV7: @ %bb.0: 240; ARMV7-NEXT: vmov d16, r2, r3 241; ARMV7-NEXT: vmov d17, r0, r1 242; ARMV7-NEXT: vcmp.f64 d17, d16 243; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 244; ARMV7-NEXT: vmovlt.f64 d16, d17 245; ARMV7-NEXT: vmov r0, r1, d16 246; ARMV7-NEXT: bx lr 247; 248; ARMV8-LABEL: fminnum64_intrinsic: 249; ARMV8: @ %bb.0: 250; ARMV8-NEXT: vmov d16, r2, r3 251; ARMV8-NEXT: vmov d17, r0, r1 252; ARMV8-NEXT: vminnm.f64 d16, d17, d16 253; ARMV8-NEXT: vmov r0, r1, d16 254; ARMV8-NEXT: mov pc, lr 255; 256; ARMV8M-LABEL: fminnum64_intrinsic: 257; ARMV8M: @ %bb.0: 258; ARMV8M-NEXT: vmov d0, r2, r3 259; ARMV8M-NEXT: vmov d1, r0, r1 260; ARMV8M-NEXT: vminnm.f64 d0, d1, d0 261; ARMV8M-NEXT: vmov r0, r1, d0 262; ARMV8M-NEXT: bx lr 263 %a = call nnan double @llvm.minnum.f64(double %x, double %y) 264 ret double %a 265} 266 267define double @fminnum64_nsz_intrinsic(double %x, double %y) { 268; ARMV7-LABEL: fminnum64_nsz_intrinsic: 269; ARMV7: @ %bb.0: 270; ARMV7-NEXT: vmov d16, r2, r3 271; ARMV7-NEXT: vmov d17, r0, r1 272; ARMV7-NEXT: vcmp.f64 d17, d16 273; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 274; ARMV7-NEXT: vmovlt.f64 d16, d17 275; ARMV7-NEXT: vmov r0, r1, d16 276; ARMV7-NEXT: bx lr 277; 278; ARMV8-LABEL: fminnum64_nsz_intrinsic: 279; ARMV8: @ %bb.0: 280; ARMV8-NEXT: vmov d16, r2, r3 281; ARMV8-NEXT: vmov d17, r0, r1 282; ARMV8-NEXT: vminnm.f64 d16, d17, d16 283; ARMV8-NEXT: vmov r0, r1, d16 284; ARMV8-NEXT: mov pc, lr 285; 286; ARMV8M-LABEL: fminnum64_nsz_intrinsic: 287; ARMV8M: @ %bb.0: 288; ARMV8M-NEXT: vmov d0, r2, r3 289; ARMV8M-NEXT: vmov d1, r0, r1 290; ARMV8M-NEXT: vminnm.f64 d0, d1, d0 291; ARMV8M-NEXT: vmov r0, r1, d0 292; ARMV8M-NEXT: bx lr 293 %a = call nnan nsz double @llvm.minnum.f64(double %x, double %y) 294 ret double %a 295} 296 297define double @fminnum64_zero_intrinsic(double %x) { 298; ARMV7-LABEL: fminnum64_zero_intrinsic: 299; ARMV7: @ %bb.0: 300; ARMV7-NEXT: vldr d16, .LCPI9_0 301; ARMV7-NEXT: vmov d17, r0, r1 302; ARMV7-NEXT: vcmp.f64 d17, d16 303; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 304; ARMV7-NEXT: vmovlt.f64 d16, d17 305; ARMV7-NEXT: vmov r0, r1, d16 306; ARMV7-NEXT: bx lr 307; ARMV7-NEXT: .p2align 3 308; ARMV7-NEXT: @ %bb.1: 309; ARMV7-NEXT: .LCPI9_0: 310; ARMV7-NEXT: .long 0 @ double -0 311; ARMV7-NEXT: .long 2147483648 312; 313; ARMV8-LABEL: fminnum64_zero_intrinsic: 314; ARMV8: @ %bb.0: 315; ARMV8-NEXT: vldr d16, .LCPI9_0 316; ARMV8-NEXT: vmov d17, r0, r1 317; ARMV8-NEXT: vminnm.f64 d16, d17, d16 318; ARMV8-NEXT: vmov r0, r1, d16 319; ARMV8-NEXT: mov pc, lr 320; ARMV8-NEXT: .p2align 3 321; ARMV8-NEXT: @ %bb.1: 322; ARMV8-NEXT: .LCPI9_0: 323; ARMV8-NEXT: .long 0 @ double -0 324; ARMV8-NEXT: .long 2147483648 325; 326; ARMV8M-LABEL: fminnum64_zero_intrinsic: 327; ARMV8M: @ %bb.0: 328; ARMV8M-NEXT: vldr d0, .LCPI9_0 329; ARMV8M-NEXT: vmov d1, r0, r1 330; ARMV8M-NEXT: vminnm.f64 d0, d1, d0 331; ARMV8M-NEXT: vmov r0, r1, d0 332; ARMV8M-NEXT: bx lr 333; ARMV8M-NEXT: .p2align 3 334; ARMV8M-NEXT: @ %bb.1: 335; ARMV8M-NEXT: .LCPI9_0: 336; ARMV8M-NEXT: .long 0 @ double -0 337; ARMV8M-NEXT: .long 2147483648 338 %a = call nnan double @llvm.minnum.f64(double %x, double -0.0) 339 ret double %a 340} 341 342define double @fminnum64_non_zero_intrinsic(double %x) { 343; ARMV7-LABEL: fminnum64_non_zero_intrinsic: 344; ARMV7: @ %bb.0: 345; ARMV7-NEXT: vmov.f64 d16, #-1.000000e+00 346; ARMV7-NEXT: vmov d17, r0, r1 347; ARMV7-NEXT: vcmp.f64 d17, d16 348; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 349; ARMV7-NEXT: vmovlt.f64 d16, d17 350; ARMV7-NEXT: vmov r0, r1, d16 351; ARMV7-NEXT: bx lr 352; 353; ARMV8-LABEL: fminnum64_non_zero_intrinsic: 354; ARMV8: @ %bb.0: 355; ARMV8-NEXT: vmov.f64 d16, #-1.000000e+00 356; ARMV8-NEXT: vmov d17, r0, r1 357; ARMV8-NEXT: vminnm.f64 d16, d17, d16 358; ARMV8-NEXT: vmov r0, r1, d16 359; ARMV8-NEXT: mov pc, lr 360; 361; ARMV8M-LABEL: fminnum64_non_zero_intrinsic: 362; ARMV8M: @ %bb.0: 363; ARMV8M-NEXT: vmov.f64 d0, #-1.000000e+00 364; ARMV8M-NEXT: vmov d1, r0, r1 365; ARMV8M-NEXT: vminnm.f64 d0, d1, d0 366; ARMV8M-NEXT: vmov r0, r1, d0 367; ARMV8M-NEXT: bx lr 368 %a = call nnan double @llvm.minnum.f64(double %x, double -1.0) 369 ret double %a 370} 371 372define double@fmaxnum64_intrinsic(double %x, double %y) { 373; ARMV7-LABEL: fmaxnum64_intrinsic: 374; ARMV7: @ %bb.0: 375; ARMV7-NEXT: vmov d16, r2, r3 376; ARMV7-NEXT: vmov d17, r0, r1 377; ARMV7-NEXT: vcmp.f64 d17, d16 378; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 379; ARMV7-NEXT: vmovgt.f64 d16, d17 380; ARMV7-NEXT: vmov r0, r1, d16 381; ARMV7-NEXT: bx lr 382; 383; ARMV8-LABEL: fmaxnum64_intrinsic: 384; ARMV8: @ %bb.0: 385; ARMV8-NEXT: vmov d16, r2, r3 386; ARMV8-NEXT: vmov d17, r0, r1 387; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 388; ARMV8-NEXT: vmov r0, r1, d16 389; ARMV8-NEXT: mov pc, lr 390; 391; ARMV8M-LABEL: fmaxnum64_intrinsic: 392; ARMV8M: @ %bb.0: 393; ARMV8M-NEXT: vmov d0, r2, r3 394; ARMV8M-NEXT: vmov d1, r0, r1 395; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0 396; ARMV8M-NEXT: vmov r0, r1, d0 397; ARMV8M-NEXT: bx lr 398 %a = call nnan double @llvm.maxnum.f64(double %x, double %y) 399 ret double %a 400} 401 402define double@fmaxnum64_nsz_intrinsic(double %x, double %y) { 403; ARMV7-LABEL: fmaxnum64_nsz_intrinsic: 404; ARMV7: @ %bb.0: 405; ARMV7-NEXT: vmov d16, r2, r3 406; ARMV7-NEXT: vmov d17, r0, r1 407; ARMV7-NEXT: vcmp.f64 d17, d16 408; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 409; ARMV7-NEXT: vmovgt.f64 d16, d17 410; ARMV7-NEXT: vmov r0, r1, d16 411; ARMV7-NEXT: bx lr 412; 413; ARMV8-LABEL: fmaxnum64_nsz_intrinsic: 414; ARMV8: @ %bb.0: 415; ARMV8-NEXT: vmov d16, r2, r3 416; ARMV8-NEXT: vmov d17, r0, r1 417; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 418; ARMV8-NEXT: vmov r0, r1, d16 419; ARMV8-NEXT: mov pc, lr 420; 421; ARMV8M-LABEL: fmaxnum64_nsz_intrinsic: 422; ARMV8M: @ %bb.0: 423; ARMV8M-NEXT: vmov d0, r2, r3 424; ARMV8M-NEXT: vmov d1, r0, r1 425; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0 426; ARMV8M-NEXT: vmov r0, r1, d0 427; ARMV8M-NEXT: bx lr 428 %a = call nnan nsz double @llvm.maxnum.f64(double %x, double %y) 429 ret double %a 430} 431 432define double @fmaxnum64_zero_intrinsic(double %x) { 433; ARMV7-LABEL: fmaxnum64_zero_intrinsic: 434; ARMV7: @ %bb.0: 435; ARMV7-NEXT: vmov d17, r0, r1 436; ARMV7-NEXT: vcmp.f64 d17, #0 437; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 438; ARMV7-NEXT: vmov.i32 d16, #0x0 439; ARMV7-NEXT: vmovgt.f64 d16, d17 440; ARMV7-NEXT: vmov r0, r1, d16 441; ARMV7-NEXT: bx lr 442; 443; ARMV8-LABEL: fmaxnum64_zero_intrinsic: 444; ARMV8: @ %bb.0: 445; ARMV8-NEXT: vldr d16, .LCPI13_0 446; ARMV8-NEXT: vmov d17, r0, r1 447; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 448; ARMV8-NEXT: vmov r0, r1, d16 449; ARMV8-NEXT: mov pc, lr 450; ARMV8-NEXT: .p2align 3 451; ARMV8-NEXT: @ %bb.1: 452; ARMV8-NEXT: .LCPI13_0: 453; ARMV8-NEXT: .long 0 @ double 0 454; ARMV8-NEXT: .long 0 455; 456; ARMV8M-LABEL: fmaxnum64_zero_intrinsic: 457; ARMV8M: @ %bb.0: 458; ARMV8M-NEXT: vldr d0, .LCPI13_0 459; ARMV8M-NEXT: vmov d1, r0, r1 460; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0 461; ARMV8M-NEXT: vmov r0, r1, d0 462; ARMV8M-NEXT: bx lr 463; ARMV8M-NEXT: .p2align 3 464; ARMV8M-NEXT: @ %bb.1: 465; ARMV8M-NEXT: .LCPI13_0: 466; ARMV8M-NEXT: .long 0 @ double 0 467; ARMV8M-NEXT: .long 0 468 %a = call nnan double @llvm.maxnum.f64(double %x, double 0.0) 469 ret double %a 470} 471 472define double @fmaxnum64_non_zero_intrinsic(double %x) { 473; ARMV7-LABEL: fmaxnum64_non_zero_intrinsic: 474; ARMV7: @ %bb.0: 475; ARMV7-NEXT: vmov.f64 d16, #1.000000e+00 476; ARMV7-NEXT: vmov d17, r0, r1 477; ARMV7-NEXT: vcmp.f64 d17, d16 478; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 479; ARMV7-NEXT: vmovgt.f64 d16, d17 480; ARMV7-NEXT: vmov r0, r1, d16 481; ARMV7-NEXT: bx lr 482; 483; ARMV8-LABEL: fmaxnum64_non_zero_intrinsic: 484; ARMV8: @ %bb.0: 485; ARMV8-NEXT: vmov.f64 d16, #1.000000e+00 486; ARMV8-NEXT: vmov d17, r0, r1 487; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 488; ARMV8-NEXT: vmov r0, r1, d16 489; ARMV8-NEXT: mov pc, lr 490; 491; ARMV8M-LABEL: fmaxnum64_non_zero_intrinsic: 492; ARMV8M: @ %bb.0: 493; ARMV8M-NEXT: vmov.f64 d0, #1.000000e+00 494; ARMV8M-NEXT: vmov d1, r0, r1 495; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0 496; ARMV8M-NEXT: vmov r0, r1, d0 497; ARMV8M-NEXT: bx lr 498 %a = call nnan double @llvm.maxnum.f64(double %x, double 1.0) 499 ret double %a 500} 501 502define <4 x float> @fminnumv432_intrinsic(<4 x float> %x, <4 x float> %y) { 503; ARMV7-LABEL: fminnumv432_intrinsic: 504; ARMV7: @ %bb.0: 505; ARMV7-NEXT: vmov d17, r2, r3 506; ARMV7-NEXT: vmov d16, r0, r1 507; ARMV7-NEXT: mov r0, sp 508; ARMV7-NEXT: vld1.64 {d18, d19}, [r0] 509; ARMV7-NEXT: vmin.f32 q8, q8, q9 510; ARMV7-NEXT: vmov r0, r1, d16 511; ARMV7-NEXT: vmov r2, r3, d17 512; ARMV7-NEXT: bx lr 513; 514; ARMV8-LABEL: fminnumv432_intrinsic: 515; ARMV8: @ %bb.0: 516; ARMV8-NEXT: vldr s0, [sp, #4] 517; ARMV8-NEXT: vmov s12, r1 518; ARMV8-NEXT: vldr s2, [sp, #8] 519; ARMV8-NEXT: vmov s10, r2 520; ARMV8-NEXT: vminnm.f32 s0, s12, s0 521; ARMV8-NEXT: vldr s4, [sp, #12] 522; ARMV8-NEXT: vldr s6, [sp] 523; ARMV8-NEXT: vmov s14, r0 524; ARMV8-NEXT: vmov r1, s0 525; ARMV8-NEXT: vminnm.f32 s0, s10, s2 526; ARMV8-NEXT: vmov s8, r3 527; ARMV8-NEXT: vminnm.f32 s6, s14, s6 528; ARMV8-NEXT: vmov r2, s0 529; ARMV8-NEXT: vminnm.f32 s0, s8, s4 530; ARMV8-NEXT: vmov r0, s6 531; ARMV8-NEXT: vmov r3, s0 532; ARMV8-NEXT: mov pc, lr 533; 534; ARMV8M-LABEL: fminnumv432_intrinsic: 535; ARMV8M: @ %bb.0: 536; ARMV8M-NEXT: vmov d0, r0, r1 537; ARMV8M-NEXT: mov r0, sp 538; ARMV8M-NEXT: vldrw.u32 q1, [r0] 539; ARMV8M-NEXT: vmov d1, r2, r3 540; ARMV8M-NEXT: vminnm.f32 q0, q0, q1 541; ARMV8M-NEXT: vmov r0, r1, d0 542; ARMV8M-NEXT: vmov r2, r3, d1 543; ARMV8M-NEXT: bx lr 544 %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y) 545 ret <4 x float> %a 546} 547 548define <4 x float> @fminnumv432_nsz_intrinsic(<4 x float> %x, <4 x float> %y) { 549; ARMV7-LABEL: fminnumv432_nsz_intrinsic: 550; ARMV7: @ %bb.0: 551; ARMV7-NEXT: vmov d17, r2, r3 552; ARMV7-NEXT: vmov d16, r0, r1 553; ARMV7-NEXT: mov r0, sp 554; ARMV7-NEXT: vld1.64 {d18, d19}, [r0] 555; ARMV7-NEXT: vmin.f32 q8, q8, q9 556; ARMV7-NEXT: vmov r0, r1, d16 557; ARMV7-NEXT: vmov r2, r3, d17 558; ARMV7-NEXT: bx lr 559; 560; ARMV8-LABEL: fminnumv432_nsz_intrinsic: 561; ARMV8: @ %bb.0: 562; ARMV8-NEXT: vldr s0, [sp, #4] 563; ARMV8-NEXT: vmov s12, r1 564; ARMV8-NEXT: vldr s2, [sp, #8] 565; ARMV8-NEXT: vmov s10, r2 566; ARMV8-NEXT: vminnm.f32 s0, s12, s0 567; ARMV8-NEXT: vldr s4, [sp, #12] 568; ARMV8-NEXT: vldr s6, [sp] 569; ARMV8-NEXT: vmov s14, r0 570; ARMV8-NEXT: vmov r1, s0 571; ARMV8-NEXT: vminnm.f32 s0, s10, s2 572; ARMV8-NEXT: vmov s8, r3 573; ARMV8-NEXT: vminnm.f32 s6, s14, s6 574; ARMV8-NEXT: vmov r2, s0 575; ARMV8-NEXT: vminnm.f32 s0, s8, s4 576; ARMV8-NEXT: vmov r0, s6 577; ARMV8-NEXT: vmov r3, s0 578; ARMV8-NEXT: mov pc, lr 579; 580; ARMV8M-LABEL: fminnumv432_nsz_intrinsic: 581; ARMV8M: @ %bb.0: 582; ARMV8M-NEXT: vmov d0, r0, r1 583; ARMV8M-NEXT: mov r0, sp 584; ARMV8M-NEXT: vldrw.u32 q1, [r0] 585; ARMV8M-NEXT: vmov d1, r2, r3 586; ARMV8M-NEXT: vminnm.f32 q0, q0, q1 587; ARMV8M-NEXT: vmov r0, r1, d0 588; ARMV8M-NEXT: vmov r2, r3, d1 589; ARMV8M-NEXT: bx lr 590 %a = call nnan nsz <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y) 591 ret <4 x float> %a 592} 593 594define <4 x float> @fminnumv432_non_zero_intrinsic(<4 x float> %x) { 595; ARMV7-LABEL: fminnumv432_non_zero_intrinsic: 596; ARMV7: @ %bb.0: 597; ARMV7-NEXT: vmov d19, r2, r3 598; ARMV7-NEXT: vmov.f32 q8, #-1.000000e+00 599; ARMV7-NEXT: vmov d18, r0, r1 600; ARMV7-NEXT: vmin.f32 q8, q9, q8 601; ARMV7-NEXT: vmov r0, r1, d16 602; ARMV7-NEXT: vmov r2, r3, d17 603; ARMV7-NEXT: bx lr 604; 605; ARMV8-LABEL: fminnumv432_non_zero_intrinsic: 606; ARMV8: @ %bb.0: 607; ARMV8-NEXT: vmov.f32 s0, #-1.000000e+00 608; ARMV8-NEXT: vmov s4, r2 609; ARMV8-NEXT: vmov s6, r1 610; ARMV8-NEXT: vminnm.f32 s4, s4, s0 611; ARMV8-NEXT: vmov s8, r0 612; ARMV8-NEXT: vminnm.f32 s6, s6, s0 613; ARMV8-NEXT: vmov s2, r3 614; ARMV8-NEXT: vminnm.f32 s8, s8, s0 615; ARMV8-NEXT: vminnm.f32 s0, s2, s0 616; ARMV8-NEXT: vmov r0, s8 617; ARMV8-NEXT: vmov r1, s6 618; ARMV8-NEXT: vmov r2, s4 619; ARMV8-NEXT: vmov r3, s0 620; ARMV8-NEXT: mov pc, lr 621; 622; ARMV8M-LABEL: fminnumv432_non_zero_intrinsic: 623; ARMV8M: @ %bb.0: 624; ARMV8M-NEXT: vmov d1, r2, r3 625; ARMV8M-NEXT: vmov.f32 q1, #-1.000000e+00 626; ARMV8M-NEXT: vmov d0, r0, r1 627; ARMV8M-NEXT: vminnm.f32 q0, q0, q1 628; ARMV8M-NEXT: vmov r0, r1, d0 629; ARMV8M-NEXT: vmov r2, r3, d1 630; ARMV8M-NEXT: bx lr 631 %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float><float -1.0, float -1.0, float -1.0, float -1.0>) 632 ret <4 x float> %a 633} 634 635define <4 x float> @fminnumv432_one_zero_intrinsic(<4 x float> %x) { 636; ARMV7-LABEL: fminnumv432_one_zero_intrinsic: 637; ARMV7: @ %bb.0: 638; ARMV7-NEXT: vmov d17, r2, r3 639; ARMV7-NEXT: vmov d16, r0, r1 640; ARMV7-NEXT: adr r0, .LCPI18_0 641; ARMV7-NEXT: vld1.64 {d18, d19}, [r0:128] 642; ARMV7-NEXT: vmin.f32 q8, q8, q9 643; ARMV7-NEXT: vmov r0, r1, d16 644; ARMV7-NEXT: vmov r2, r3, d17 645; ARMV7-NEXT: bx lr 646; ARMV7-NEXT: .p2align 4 647; ARMV7-NEXT: @ %bb.1: 648; ARMV7-NEXT: .LCPI18_0: 649; ARMV7-NEXT: .long 0xbf800000 @ float -1 650; ARMV7-NEXT: .long 0x00000000 @ float 0 651; ARMV7-NEXT: .long 0xbf800000 @ float -1 652; ARMV7-NEXT: .long 0xbf800000 @ float -1 653; 654; ARMV8-LABEL: fminnumv432_one_zero_intrinsic: 655; ARMV8: @ %bb.0: 656; ARMV8-NEXT: vldr s0, .LCPI18_0 657; ARMV8-NEXT: vmov s8, r1 658; ARMV8-NEXT: vmov.f32 s2, #-1.000000e+00 659; ARMV8-NEXT: vminnm.f32 s0, s8, s0 660; ARMV8-NEXT: vmov s6, r2 661; ARMV8-NEXT: vmov s10, r0 662; ARMV8-NEXT: vmov r1, s0 663; ARMV8-NEXT: vminnm.f32 s0, s6, s2 664; ARMV8-NEXT: vmov s4, r3 665; ARMV8-NEXT: vminnm.f32 s10, s10, s2 666; ARMV8-NEXT: vmov r2, s0 667; ARMV8-NEXT: vminnm.f32 s0, s4, s2 668; ARMV8-NEXT: vmov r0, s10 669; ARMV8-NEXT: vmov r3, s0 670; ARMV8-NEXT: mov pc, lr 671; ARMV8-NEXT: .p2align 2 672; ARMV8-NEXT: @ %bb.1: 673; ARMV8-NEXT: .LCPI18_0: 674; ARMV8-NEXT: .long 0x00000000 @ float 0 675; 676; ARMV8M-LABEL: fminnumv432_one_zero_intrinsic: 677; ARMV8M: @ %bb.0: 678; ARMV8M-NEXT: vmov d0, r0, r1 679; ARMV8M-NEXT: adr r0, .LCPI18_0 680; ARMV8M-NEXT: vldrw.u32 q1, [r0] 681; ARMV8M-NEXT: vmov d1, r2, r3 682; ARMV8M-NEXT: vminnm.f32 q0, q0, q1 683; ARMV8M-NEXT: vmov r0, r1, d0 684; ARMV8M-NEXT: vmov r2, r3, d1 685; ARMV8M-NEXT: bx lr 686; ARMV8M-NEXT: .p2align 4 687; ARMV8M-NEXT: @ %bb.1: 688; ARMV8M-NEXT: .LCPI18_0: 689; ARMV8M-NEXT: .long 0xbf800000 @ float -1 690; ARMV8M-NEXT: .long 0x00000000 @ float 0 691; ARMV8M-NEXT: .long 0xbf800000 @ float -1 692; ARMV8M-NEXT: .long 0xbf800000 @ float -1 693 %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float><float -1.0, float 0.0, float -1.0, float -1.0>) 694 ret <4 x float> %a 695} 696 697define <4 x float> @fmaxnumv432_intrinsic(<4 x float> %x, <4 x float> %y) { 698; ARMV7-LABEL: fmaxnumv432_intrinsic: 699; ARMV7: @ %bb.0: 700; ARMV7-NEXT: vmov d17, r2, r3 701; ARMV7-NEXT: vmov d16, r0, r1 702; ARMV7-NEXT: mov r0, sp 703; ARMV7-NEXT: vld1.64 {d18, d19}, [r0] 704; ARMV7-NEXT: vmax.f32 q8, q8, q9 705; ARMV7-NEXT: vmov r0, r1, d16 706; ARMV7-NEXT: vmov r2, r3, d17 707; ARMV7-NEXT: bx lr 708; 709; ARMV8-LABEL: fmaxnumv432_intrinsic: 710; ARMV8: @ %bb.0: 711; ARMV8-NEXT: vldr s0, [sp, #4] 712; ARMV8-NEXT: vmov s12, r1 713; ARMV8-NEXT: vldr s2, [sp, #8] 714; ARMV8-NEXT: vmov s10, r2 715; ARMV8-NEXT: vmaxnm.f32 s0, s12, s0 716; ARMV8-NEXT: vldr s4, [sp, #12] 717; ARMV8-NEXT: vldr s6, [sp] 718; ARMV8-NEXT: vmov s14, r0 719; ARMV8-NEXT: vmov r1, s0 720; ARMV8-NEXT: vmaxnm.f32 s0, s10, s2 721; ARMV8-NEXT: vmov s8, r3 722; ARMV8-NEXT: vmaxnm.f32 s6, s14, s6 723; ARMV8-NEXT: vmov r2, s0 724; ARMV8-NEXT: vmaxnm.f32 s0, s8, s4 725; ARMV8-NEXT: vmov r0, s6 726; ARMV8-NEXT: vmov r3, s0 727; ARMV8-NEXT: mov pc, lr 728; 729; ARMV8M-LABEL: fmaxnumv432_intrinsic: 730; ARMV8M: @ %bb.0: 731; ARMV8M-NEXT: vmov d0, r0, r1 732; ARMV8M-NEXT: mov r0, sp 733; ARMV8M-NEXT: vldrw.u32 q1, [r0] 734; ARMV8M-NEXT: vmov d1, r2, r3 735; ARMV8M-NEXT: vmaxnm.f32 q0, q0, q1 736; ARMV8M-NEXT: vmov r0, r1, d0 737; ARMV8M-NEXT: vmov r2, r3, d1 738; ARMV8M-NEXT: bx lr 739 %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y) 740 ret <4 x float> %a 741} 742 743define <4 x float> @fmaxnumv432_nsz_intrinsic(<4 x float> %x, <4 x float> %y) { 744; ARMV7-LABEL: fmaxnumv432_nsz_intrinsic: 745; ARMV7: @ %bb.0: 746; ARMV7-NEXT: vmov d17, r2, r3 747; ARMV7-NEXT: vmov d16, r0, r1 748; ARMV7-NEXT: mov r0, sp 749; ARMV7-NEXT: vld1.64 {d18, d19}, [r0] 750; ARMV7-NEXT: vmax.f32 q8, q8, q9 751; ARMV7-NEXT: vmov r0, r1, d16 752; ARMV7-NEXT: vmov r2, r3, d17 753; ARMV7-NEXT: bx lr 754; 755; ARMV8-LABEL: fmaxnumv432_nsz_intrinsic: 756; ARMV8: @ %bb.0: 757; ARMV8-NEXT: vldr s0, [sp, #4] 758; ARMV8-NEXT: vmov s12, r1 759; ARMV8-NEXT: vldr s2, [sp, #8] 760; ARMV8-NEXT: vmov s10, r2 761; ARMV8-NEXT: vmaxnm.f32 s0, s12, s0 762; ARMV8-NEXT: vldr s4, [sp, #12] 763; ARMV8-NEXT: vldr s6, [sp] 764; ARMV8-NEXT: vmov s14, r0 765; ARMV8-NEXT: vmov r1, s0 766; ARMV8-NEXT: vmaxnm.f32 s0, s10, s2 767; ARMV8-NEXT: vmov s8, r3 768; ARMV8-NEXT: vmaxnm.f32 s6, s14, s6 769; ARMV8-NEXT: vmov r2, s0 770; ARMV8-NEXT: vmaxnm.f32 s0, s8, s4 771; ARMV8-NEXT: vmov r0, s6 772; ARMV8-NEXT: vmov r3, s0 773; ARMV8-NEXT: mov pc, lr 774; 775; ARMV8M-LABEL: fmaxnumv432_nsz_intrinsic: 776; ARMV8M: @ %bb.0: 777; ARMV8M-NEXT: vmov d0, r0, r1 778; ARMV8M-NEXT: mov r0, sp 779; ARMV8M-NEXT: vldrw.u32 q1, [r0] 780; ARMV8M-NEXT: vmov d1, r2, r3 781; ARMV8M-NEXT: vmaxnm.f32 q0, q0, q1 782; ARMV8M-NEXT: vmov r0, r1, d0 783; ARMV8M-NEXT: vmov r2, r3, d1 784; ARMV8M-NEXT: bx lr 785 %a = call nnan nsz <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y) 786 ret <4 x float> %a 787} 788 789define <4 x float> @fmaxnumv432_zero_intrinsic(<4 x float> %x) { 790; ARMV7-LABEL: fmaxnumv432_zero_intrinsic: 791; ARMV7: @ %bb.0: 792; ARMV7-NEXT: vmov d19, r2, r3 793; ARMV7-NEXT: vmov.i32 q8, #0x0 794; ARMV7-NEXT: vmov d18, r0, r1 795; ARMV7-NEXT: vmax.f32 q8, q9, q8 796; ARMV7-NEXT: vmov r0, r1, d16 797; ARMV7-NEXT: vmov r2, r3, d17 798; ARMV7-NEXT: bx lr 799; 800; ARMV8-LABEL: fmaxnumv432_zero_intrinsic: 801; ARMV8: @ %bb.0: 802; ARMV8-NEXT: vldr s0, .LCPI21_0 803; ARMV8-NEXT: vmov s4, r2 804; ARMV8-NEXT: vmov s6, r1 805; ARMV8-NEXT: vmov s8, r0 806; ARMV8-NEXT: vmaxnm.f32 s6, s6, s0 807; ARMV8-NEXT: vmov s2, r3 808; ARMV8-NEXT: vmaxnm.f32 s8, s8, s0 809; ARMV8-NEXT: vmaxnm.f32 s4, s4, s0 810; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 811; ARMV8-NEXT: vmov r0, s8 812; ARMV8-NEXT: vmov r1, s6 813; ARMV8-NEXT: vmov r2, s4 814; ARMV8-NEXT: vmov r3, s0 815; ARMV8-NEXT: mov pc, lr 816; ARMV8-NEXT: .p2align 2 817; ARMV8-NEXT: @ %bb.1: 818; ARMV8-NEXT: .LCPI21_0: 819; ARMV8-NEXT: .long 0x00000000 @ float 0 820; 821; ARMV8M-LABEL: fmaxnumv432_zero_intrinsic: 822; ARMV8M: @ %bb.0: 823; ARMV8M-NEXT: vmov d1, r2, r3 824; ARMV8M-NEXT: vmov.i32 q1, #0x0 825; ARMV8M-NEXT: vmov d0, r0, r1 826; ARMV8M-NEXT: vmaxnm.f32 q0, q0, q1 827; ARMV8M-NEXT: vmov r0, r1, d0 828; ARMV8M-NEXT: vmov r2, r3, d1 829; ARMV8M-NEXT: bx lr 830 %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float 0.0, float 0.0, float 0.0, float 0.0>) 831 ret <4 x float> %a 832} 833 834define <4 x float> @fmaxnumv432_minus_zero_intrinsic(<4 x float> %x) { 835; ARMV7-LABEL: fmaxnumv432_minus_zero_intrinsic: 836; ARMV7: @ %bb.0: 837; ARMV7-NEXT: vmov d19, r2, r3 838; ARMV7-NEXT: vmov.i32 q8, #0x80000000 839; ARMV7-NEXT: vmov d18, r0, r1 840; ARMV7-NEXT: vmax.f32 q8, q9, q8 841; ARMV7-NEXT: vmov r0, r1, d16 842; ARMV7-NEXT: vmov r2, r3, d17 843; ARMV7-NEXT: bx lr 844; 845; ARMV8-LABEL: fmaxnumv432_minus_zero_intrinsic: 846; ARMV8: @ %bb.0: 847; ARMV8-NEXT: vldr s0, .LCPI22_0 848; ARMV8-NEXT: vmov s4, r2 849; ARMV8-NEXT: vmov s6, r1 850; ARMV8-NEXT: vmov s8, r0 851; ARMV8-NEXT: vmaxnm.f32 s6, s6, s0 852; ARMV8-NEXT: vmov s2, r3 853; ARMV8-NEXT: vmaxnm.f32 s8, s8, s0 854; ARMV8-NEXT: vmaxnm.f32 s4, s4, s0 855; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 856; ARMV8-NEXT: vmov r0, s8 857; ARMV8-NEXT: vmov r1, s6 858; ARMV8-NEXT: vmov r2, s4 859; ARMV8-NEXT: vmov r3, s0 860; ARMV8-NEXT: mov pc, lr 861; ARMV8-NEXT: .p2align 2 862; ARMV8-NEXT: @ %bb.1: 863; ARMV8-NEXT: .LCPI22_0: 864; ARMV8-NEXT: .long 0x80000000 @ float -0 865; 866; ARMV8M-LABEL: fmaxnumv432_minus_zero_intrinsic: 867; ARMV8M: @ %bb.0: 868; ARMV8M-NEXT: vmov d1, r2, r3 869; ARMV8M-NEXT: vmov.i32 q1, #0x80000000 870; ARMV8M-NEXT: vmov d0, r0, r1 871; ARMV8M-NEXT: vmaxnm.f32 q0, q0, q1 872; ARMV8M-NEXT: vmov r0, r1, d0 873; ARMV8M-NEXT: vmov r2, r3, d1 874; ARMV8M-NEXT: bx lr 875 %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float -0.0, float -0.0, float -0.0, float -0.0>) 876 ret <4 x float> %a 877} 878 879define <4 x float> @fmaxnumv432_non_zero_intrinsic(<4 x float> %x) { 880; ARMV7-LABEL: fmaxnumv432_non_zero_intrinsic: 881; ARMV7: @ %bb.0: 882; ARMV7-NEXT: vmov d19, r2, r3 883; ARMV7-NEXT: vmov.f32 q8, #1.000000e+00 884; ARMV7-NEXT: vmov d18, r0, r1 885; ARMV7-NEXT: vmax.f32 q8, q9, q8 886; ARMV7-NEXT: vmov r0, r1, d16 887; ARMV7-NEXT: vmov r2, r3, d17 888; ARMV7-NEXT: bx lr 889; 890; ARMV8-LABEL: fmaxnumv432_non_zero_intrinsic: 891; ARMV8: @ %bb.0: 892; ARMV8-NEXT: vmov.f32 s0, #1.000000e+00 893; ARMV8-NEXT: vmov s4, r2 894; ARMV8-NEXT: vmov s6, r1 895; ARMV8-NEXT: vmaxnm.f32 s4, s4, s0 896; ARMV8-NEXT: vmov s8, r0 897; ARMV8-NEXT: vmaxnm.f32 s6, s6, s0 898; ARMV8-NEXT: vmov s2, r3 899; ARMV8-NEXT: vmaxnm.f32 s8, s8, s0 900; ARMV8-NEXT: vmaxnm.f32 s0, s2, s0 901; ARMV8-NEXT: vmov r0, s8 902; ARMV8-NEXT: vmov r1, s6 903; ARMV8-NEXT: vmov r2, s4 904; ARMV8-NEXT: vmov r3, s0 905; ARMV8-NEXT: mov pc, lr 906; 907; ARMV8M-LABEL: fmaxnumv432_non_zero_intrinsic: 908; ARMV8M: @ %bb.0: 909; ARMV8M-NEXT: vmov d1, r2, r3 910; ARMV8M-NEXT: vmov.f32 q1, #1.000000e+00 911; ARMV8M-NEXT: vmov d0, r0, r1 912; ARMV8M-NEXT: vmaxnm.f32 q0, q0, q1 913; ARMV8M-NEXT: vmov r0, r1, d0 914; ARMV8M-NEXT: vmov r2, r3, d1 915; ARMV8M-NEXT: bx lr 916 %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float 1.0, float 1.0, float 1.0, float 1.0>) 917 ret <4 x float> %a 918} 919 920define <2 x double> @fminnumv264_intrinsic(<2 x double> %x, <2 x double> %y) { 921; ARMV7-LABEL: fminnumv264_intrinsic: 922; ARMV7: @ %bb.0: 923; ARMV7-NEXT: mov r12, sp 924; ARMV7-NEXT: vld1.64 {d16, d17}, [r12] 925; ARMV7-NEXT: vmov d18, r0, r1 926; ARMV7-NEXT: vcmp.f64 d18, d16 927; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 928; ARMV7-NEXT: vmov d19, r2, r3 929; ARMV7-NEXT: vcmp.f64 d19, d17 930; ARMV7-NEXT: vmovlt.f64 d16, d18 931; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 932; ARMV7-NEXT: vmov r0, r1, d16 933; ARMV7-NEXT: vmovlt.f64 d17, d19 934; ARMV7-NEXT: vmov r2, r3, d17 935; ARMV7-NEXT: bx lr 936; 937; ARMV8-LABEL: fminnumv264_intrinsic: 938; ARMV8: @ %bb.0: 939; ARMV8-NEXT: vldr d16, [sp, #8] 940; ARMV8-NEXT: vmov d18, r2, r3 941; ARMV8-NEXT: vldr d17, [sp] 942; ARMV8-NEXT: vmov d19, r0, r1 943; ARMV8-NEXT: vminnm.f64 d16, d18, d16 944; ARMV8-NEXT: vminnm.f64 d17, d19, d17 945; ARMV8-NEXT: vmov r2, r3, d16 946; ARMV8-NEXT: vmov r0, r1, d17 947; ARMV8-NEXT: mov pc, lr 948; 949; ARMV8M-LABEL: fminnumv264_intrinsic: 950; ARMV8M: @ %bb.0: 951; ARMV8M-NEXT: mov r12, sp 952; ARMV8M-NEXT: vmov d0, r0, r1 953; ARMV8M-NEXT: vldrw.u32 q1, [r12] 954; ARMV8M-NEXT: vmov d1, r2, r3 955; ARMV8M-NEXT: vcmp.f64 d2, d0 956; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 957; ARMV8M-NEXT: vcmp.f64 d3, d1 958; ARMV8M-NEXT: vselgt.f64 d0, d0, d2 959; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 960; ARMV8M-NEXT: vmov r0, r1, d0 961; ARMV8M-NEXT: vselgt.f64 d1, d1, d3 962; ARMV8M-NEXT: vmov r2, r3, d1 963; ARMV8M-NEXT: bx lr 964 %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y) 965 ret <2 x double> %a 966} 967 968define <2 x double> @fminnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y) { 969; ARMV7-LABEL: fminnumv264_nsz_intrinsic: 970; ARMV7: @ %bb.0: 971; ARMV7-NEXT: mov r12, sp 972; ARMV7-NEXT: vld1.64 {d16, d17}, [r12] 973; ARMV7-NEXT: vmov d18, r0, r1 974; ARMV7-NEXT: vcmp.f64 d18, d16 975; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 976; ARMV7-NEXT: vmov d19, r2, r3 977; ARMV7-NEXT: vcmp.f64 d19, d17 978; ARMV7-NEXT: vmovlt.f64 d16, d18 979; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 980; ARMV7-NEXT: vmov r0, r1, d16 981; ARMV7-NEXT: vmovlt.f64 d17, d19 982; ARMV7-NEXT: vmov r2, r3, d17 983; ARMV7-NEXT: bx lr 984; 985; ARMV8-LABEL: fminnumv264_nsz_intrinsic: 986; ARMV8: @ %bb.0: 987; ARMV8-NEXT: vldr d16, [sp, #8] 988; ARMV8-NEXT: vmov d18, r2, r3 989; ARMV8-NEXT: vldr d17, [sp] 990; ARMV8-NEXT: vmov d19, r0, r1 991; ARMV8-NEXT: vminnm.f64 d16, d18, d16 992; ARMV8-NEXT: vminnm.f64 d17, d19, d17 993; ARMV8-NEXT: vmov r2, r3, d16 994; ARMV8-NEXT: vmov r0, r1, d17 995; ARMV8-NEXT: mov pc, lr 996; 997; ARMV8M-LABEL: fminnumv264_nsz_intrinsic: 998; ARMV8M: @ %bb.0: 999; ARMV8M-NEXT: mov r12, sp 1000; ARMV8M-NEXT: vmov d0, r0, r1 1001; ARMV8M-NEXT: vldrw.u32 q1, [r12] 1002; ARMV8M-NEXT: vmov d1, r2, r3 1003; ARMV8M-NEXT: vcmp.f64 d2, d0 1004; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1005; ARMV8M-NEXT: vcmp.f64 d3, d1 1006; ARMV8M-NEXT: vselgt.f64 d0, d0, d2 1007; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1008; ARMV8M-NEXT: vmov r0, r1, d0 1009; ARMV8M-NEXT: vselgt.f64 d1, d1, d3 1010; ARMV8M-NEXT: vmov r2, r3, d1 1011; ARMV8M-NEXT: bx lr 1012 %a = call nnan nsz <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y) 1013 ret <2 x double> %a 1014} 1015 1016define <2 x double> @fminnumv264_non_zero_intrinsic(<2 x double> %x) { 1017; ARMV7-LABEL: fminnumv264_non_zero_intrinsic: 1018; ARMV7: @ %bb.0: 1019; ARMV7-NEXT: vmov.f64 d16, #1.000000e+00 1020; ARMV7-NEXT: vmov d17, r0, r1 1021; ARMV7-NEXT: vcmp.f64 d17, d16 1022; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1023; ARMV7-NEXT: vmov d18, r2, r3 1024; ARMV7-NEXT: vcmp.f64 d18, d16 1025; ARMV7-NEXT: vmov.f64 d19, d16 1026; ARMV7-NEXT: vmovlt.f64 d19, d17 1027; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1028; ARMV7-NEXT: vmov r0, r1, d19 1029; ARMV7-NEXT: vmovlt.f64 d16, d18 1030; ARMV7-NEXT: vmov r2, r3, d16 1031; ARMV7-NEXT: bx lr 1032; 1033; ARMV8-LABEL: fminnumv264_non_zero_intrinsic: 1034; ARMV8: @ %bb.0: 1035; ARMV8-NEXT: vmov.f64 d16, #1.000000e+00 1036; ARMV8-NEXT: vmov d18, r0, r1 1037; ARMV8-NEXT: vmov d17, r2, r3 1038; ARMV8-NEXT: vminnm.f64 d18, d18, d16 1039; ARMV8-NEXT: vminnm.f64 d16, d17, d16 1040; ARMV8-NEXT: vmov r0, r1, d18 1041; ARMV8-NEXT: vmov r2, r3, d16 1042; ARMV8-NEXT: mov pc, lr 1043; 1044; ARMV8M-LABEL: fminnumv264_non_zero_intrinsic: 1045; ARMV8M: @ %bb.0: 1046; ARMV8M-NEXT: vmov d1, r0, r1 1047; ARMV8M-NEXT: vmov.f64 d0, #1.000000e+00 1048; ARMV8M-NEXT: vcmp.f64 d0, d1 1049; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1050; ARMV8M-NEXT: vmov d2, r2, r3 1051; ARMV8M-NEXT: vcmp.f64 d0, d2 1052; ARMV8M-NEXT: vselgt.f64 d1, d1, d0 1053; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1054; ARMV8M-NEXT: vmov r0, r1, d1 1055; ARMV8M-NEXT: vselgt.f64 d0, d2, d0 1056; ARMV8M-NEXT: vmov r2, r3, d0 1057; ARMV8M-NEXT: bx lr 1058 %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>) 1059 ret <2 x double> %a 1060} 1061 1062define <2 x double> @fminnumv264_one_zero_intrinsic(<2 x double> %x) { 1063; ARMV7-LABEL: fminnumv264_one_zero_intrinsic: 1064; ARMV7: @ %bb.0: 1065; ARMV7-NEXT: vmov d18, r2, r3 1066; ARMV7-NEXT: vcmp.f64 d18, #0 1067; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1068; ARMV7-NEXT: vmov d19, r0, r1 1069; ARMV7-NEXT: vmov.f64 d16, #-1.000000e+00 1070; ARMV7-NEXT: vcmp.f64 d19, d16 1071; ARMV7-NEXT: vmov.i32 d17, #0x0 1072; ARMV7-NEXT: vmovlt.f64 d17, d18 1073; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1074; ARMV7-NEXT: vmov r2, r3, d17 1075; ARMV7-NEXT: vmovlt.f64 d16, d19 1076; ARMV7-NEXT: vmov r0, r1, d16 1077; ARMV7-NEXT: bx lr 1078; 1079; ARMV8-LABEL: fminnumv264_one_zero_intrinsic: 1080; ARMV8: @ %bb.0: 1081; ARMV8-NEXT: vmov.f64 d16, #-1.000000e+00 1082; ARMV8-NEXT: vldr d17, .LCPI27_0 1083; ARMV8-NEXT: vmov d18, r0, r1 1084; ARMV8-NEXT: vmov d19, r2, r3 1085; ARMV8-NEXT: vminnm.f64 d16, d18, d16 1086; ARMV8-NEXT: vminnm.f64 d17, d19, d17 1087; ARMV8-NEXT: vmov r0, r1, d16 1088; ARMV8-NEXT: vmov r2, r3, d17 1089; ARMV8-NEXT: mov pc, lr 1090; ARMV8-NEXT: .p2align 3 1091; ARMV8-NEXT: @ %bb.1: 1092; ARMV8-NEXT: .LCPI27_0: 1093; ARMV8-NEXT: .long 0 @ double 0 1094; ARMV8-NEXT: .long 0 1095; 1096; ARMV8M-LABEL: fminnumv264_one_zero_intrinsic: 1097; ARMV8M: @ %bb.0: 1098; ARMV8M-NEXT: vmov d3, r2, r3 1099; ARMV8M-NEXT: vldr d1, .LCPI27_0 1100; ARMV8M-NEXT: vcmp.f64 d3, #0 1101; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1102; ARMV8M-NEXT: vmov d2, r0, r1 1103; ARMV8M-NEXT: vmov.f64 d0, #-1.000000e+00 1104; ARMV8M-NEXT: vcmp.f64 d0, d2 1105; ARMV8M-NEXT: vmovlt.f64 d1, d3 1106; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1107; ARMV8M-NEXT: vmov r2, r3, d1 1108; ARMV8M-NEXT: vselgt.f64 d0, d2, d0 1109; ARMV8M-NEXT: vmov r0, r1, d0 1110; ARMV8M-NEXT: bx lr 1111; ARMV8M-NEXT: .p2align 3 1112; ARMV8M-NEXT: @ %bb.1: 1113; ARMV8M-NEXT: .LCPI27_0: 1114; ARMV8M-NEXT: .long 0 @ double 0 1115; ARMV8M-NEXT: .long 0 1116 %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double><double -1.0, double 0.0>) 1117 ret <2 x double> %a 1118} 1119 1120define <2 x double> @fmaxnumv264_intrinsic(<2 x double> %x, <2 x double> %y) { 1121; ARMV7-LABEL: fmaxnumv264_intrinsic: 1122; ARMV7: @ %bb.0: 1123; ARMV7-NEXT: mov r12, sp 1124; ARMV7-NEXT: vld1.64 {d16, d17}, [r12] 1125; ARMV7-NEXT: vmov d18, r0, r1 1126; ARMV7-NEXT: vcmp.f64 d18, d16 1127; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1128; ARMV7-NEXT: vmov d19, r2, r3 1129; ARMV7-NEXT: vcmp.f64 d19, d17 1130; ARMV7-NEXT: vmovgt.f64 d16, d18 1131; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1132; ARMV7-NEXT: vmov r0, r1, d16 1133; ARMV7-NEXT: vmovgt.f64 d17, d19 1134; ARMV7-NEXT: vmov r2, r3, d17 1135; ARMV7-NEXT: bx lr 1136; 1137; ARMV8-LABEL: fmaxnumv264_intrinsic: 1138; ARMV8: @ %bb.0: 1139; ARMV8-NEXT: vldr d16, [sp, #8] 1140; ARMV8-NEXT: vmov d18, r2, r3 1141; ARMV8-NEXT: vldr d17, [sp] 1142; ARMV8-NEXT: vmov d19, r0, r1 1143; ARMV8-NEXT: vmaxnm.f64 d16, d18, d16 1144; ARMV8-NEXT: vmaxnm.f64 d17, d19, d17 1145; ARMV8-NEXT: vmov r2, r3, d16 1146; ARMV8-NEXT: vmov r0, r1, d17 1147; ARMV8-NEXT: mov pc, lr 1148; 1149; ARMV8M-LABEL: fmaxnumv264_intrinsic: 1150; ARMV8M: @ %bb.0: 1151; ARMV8M-NEXT: mov r12, sp 1152; ARMV8M-NEXT: vmov d1, r0, r1 1153; ARMV8M-NEXT: vldrw.u32 q1, [r12] 1154; ARMV8M-NEXT: vmov d0, r2, r3 1155; ARMV8M-NEXT: vcmp.f64 d1, d2 1156; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1157; ARMV8M-NEXT: vcmp.f64 d0, d3 1158; ARMV8M-NEXT: vselgt.f64 d1, d1, d2 1159; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1160; ARMV8M-NEXT: vmov r0, r1, d1 1161; ARMV8M-NEXT: vselgt.f64 d0, d0, d3 1162; ARMV8M-NEXT: vmov r2, r3, d0 1163; ARMV8M-NEXT: bx lr 1164 %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y) 1165 ret <2 x double> %a 1166} 1167 1168define <2 x double> @fmaxnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y) { 1169; ARMV7-LABEL: fmaxnumv264_nsz_intrinsic: 1170; ARMV7: @ %bb.0: 1171; ARMV7-NEXT: mov r12, sp 1172; ARMV7-NEXT: vld1.64 {d16, d17}, [r12] 1173; ARMV7-NEXT: vmov d18, r0, r1 1174; ARMV7-NEXT: vcmp.f64 d18, d16 1175; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1176; ARMV7-NEXT: vmov d19, r2, r3 1177; ARMV7-NEXT: vcmp.f64 d19, d17 1178; ARMV7-NEXT: vmovgt.f64 d16, d18 1179; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1180; ARMV7-NEXT: vmov r0, r1, d16 1181; ARMV7-NEXT: vmovgt.f64 d17, d19 1182; ARMV7-NEXT: vmov r2, r3, d17 1183; ARMV7-NEXT: bx lr 1184; 1185; ARMV8-LABEL: fmaxnumv264_nsz_intrinsic: 1186; ARMV8: @ %bb.0: 1187; ARMV8-NEXT: vldr d16, [sp, #8] 1188; ARMV8-NEXT: vmov d18, r2, r3 1189; ARMV8-NEXT: vldr d17, [sp] 1190; ARMV8-NEXT: vmov d19, r0, r1 1191; ARMV8-NEXT: vmaxnm.f64 d16, d18, d16 1192; ARMV8-NEXT: vmaxnm.f64 d17, d19, d17 1193; ARMV8-NEXT: vmov r2, r3, d16 1194; ARMV8-NEXT: vmov r0, r1, d17 1195; ARMV8-NEXT: mov pc, lr 1196; 1197; ARMV8M-LABEL: fmaxnumv264_nsz_intrinsic: 1198; ARMV8M: @ %bb.0: 1199; ARMV8M-NEXT: mov r12, sp 1200; ARMV8M-NEXT: vmov d1, r0, r1 1201; ARMV8M-NEXT: vldrw.u32 q1, [r12] 1202; ARMV8M-NEXT: vmov d0, r2, r3 1203; ARMV8M-NEXT: vcmp.f64 d1, d2 1204; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1205; ARMV8M-NEXT: vcmp.f64 d0, d3 1206; ARMV8M-NEXT: vselgt.f64 d1, d1, d2 1207; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1208; ARMV8M-NEXT: vmov r0, r1, d1 1209; ARMV8M-NEXT: vselgt.f64 d0, d0, d3 1210; ARMV8M-NEXT: vmov r2, r3, d0 1211; ARMV8M-NEXT: bx lr 1212 %a = call nnan nsz <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y) 1213 ret <2 x double> %a 1214} 1215 1216define <2 x double> @fmaxnumv264_zero_intrinsic(<2 x double> %x) { 1217; ARMV7-LABEL: fmaxnumv264_zero_intrinsic: 1218; ARMV7: @ %bb.0: 1219; ARMV7-NEXT: vldr d17, .LCPI30_0 1220; ARMV7-NEXT: vmov d18, r2, r3 1221; ARMV7-NEXT: vmov d19, r0, r1 1222; ARMV7-NEXT: vcmp.f64 d18, d17 1223; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1224; ARMV7-NEXT: vmov.i32 d16, #0x0 1225; ARMV7-NEXT: vcmp.f64 d19, #0 1226; ARMV7-NEXT: vmovgt.f64 d17, d18 1227; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1228; ARMV7-NEXT: vmov r2, r3, d17 1229; ARMV7-NEXT: vmovgt.f64 d16, d19 1230; ARMV7-NEXT: vmov r0, r1, d16 1231; ARMV7-NEXT: bx lr 1232; ARMV7-NEXT: .p2align 3 1233; ARMV7-NEXT: @ %bb.1: 1234; ARMV7-NEXT: .LCPI30_0: 1235; ARMV7-NEXT: .long 0 @ double -0 1236; ARMV7-NEXT: .long 2147483648 1237; 1238; ARMV8-LABEL: fmaxnumv264_zero_intrinsic: 1239; ARMV8: @ %bb.0: 1240; ARMV8-NEXT: vldr d16, .LCPI30_0 1241; ARMV8-NEXT: vmov d18, r2, r3 1242; ARMV8-NEXT: vldr d17, .LCPI30_1 1243; ARMV8-NEXT: vmov d19, r0, r1 1244; ARMV8-NEXT: vmaxnm.f64 d16, d18, d16 1245; ARMV8-NEXT: vmaxnm.f64 d17, d19, d17 1246; ARMV8-NEXT: vmov r2, r3, d16 1247; ARMV8-NEXT: vmov r0, r1, d17 1248; ARMV8-NEXT: mov pc, lr 1249; ARMV8-NEXT: .p2align 3 1250; ARMV8-NEXT: @ %bb.1: 1251; ARMV8-NEXT: .LCPI30_0: 1252; ARMV8-NEXT: .long 0 @ double -0 1253; ARMV8-NEXT: .long 2147483648 1254; ARMV8-NEXT: .LCPI30_1: 1255; ARMV8-NEXT: .long 0 @ double 0 1256; ARMV8-NEXT: .long 0 1257; 1258; ARMV8M-LABEL: fmaxnumv264_zero_intrinsic: 1259; ARMV8M: @ %bb.0: 1260; ARMV8M-NEXT: vmov d2, r0, r1 1261; ARMV8M-NEXT: vldr d0, .LCPI30_0 1262; ARMV8M-NEXT: vcmp.f64 d2, #0 1263; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1264; ARMV8M-NEXT: vmov d3, r2, r3 1265; ARMV8M-NEXT: vcmp.f64 d3, d0 1266; ARMV8M-NEXT: vldr d1, .LCPI30_1 1267; ARMV8M-NEXT: vselgt.f64 d1, d2, d1 1268; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1269; ARMV8M-NEXT: vmov r0, r1, d1 1270; ARMV8M-NEXT: vselgt.f64 d0, d3, d0 1271; ARMV8M-NEXT: vmov r2, r3, d0 1272; ARMV8M-NEXT: bx lr 1273; ARMV8M-NEXT: .p2align 3 1274; ARMV8M-NEXT: @ %bb.1: 1275; ARMV8M-NEXT: .LCPI30_0: 1276; ARMV8M-NEXT: .long 0 @ double -0 1277; ARMV8M-NEXT: .long 2147483648 1278; ARMV8M-NEXT: .LCPI30_1: 1279; ARMV8M-NEXT: .long 0 @ double 0 1280; ARMV8M-NEXT: .long 0 1281 %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double 0.0, double -0.0>) 1282 ret <2 x double> %a 1283} 1284 1285define <2 x double> @fmaxnumv264_minus_zero_intrinsic(<2 x double> %x) { 1286; ARMV7-LABEL: fmaxnumv264_minus_zero_intrinsic: 1287; ARMV7: @ %bb.0: 1288; ARMV7-NEXT: vldr d16, .LCPI31_0 1289; ARMV7-NEXT: vmov d17, r0, r1 1290; ARMV7-NEXT: vmov d18, r2, r3 1291; ARMV7-NEXT: vcmp.f64 d17, d16 1292; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1293; ARMV7-NEXT: vcmp.f64 d18, d16 1294; ARMV7-NEXT: vmov.f64 d19, d16 1295; ARMV7-NEXT: vmovgt.f64 d19, d17 1296; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1297; ARMV7-NEXT: vmov r0, r1, d19 1298; ARMV7-NEXT: vmovgt.f64 d16, d18 1299; ARMV7-NEXT: vmov r2, r3, d16 1300; ARMV7-NEXT: bx lr 1301; ARMV7-NEXT: .p2align 3 1302; ARMV7-NEXT: @ %bb.1: 1303; ARMV7-NEXT: .LCPI31_0: 1304; ARMV7-NEXT: .long 0 @ double -0 1305; ARMV7-NEXT: .long 2147483648 1306; 1307; ARMV8-LABEL: fmaxnumv264_minus_zero_intrinsic: 1308; ARMV8: @ %bb.0: 1309; ARMV8-NEXT: vldr d16, .LCPI31_0 1310; ARMV8-NEXT: vmov d18, r0, r1 1311; ARMV8-NEXT: vmov d17, r2, r3 1312; ARMV8-NEXT: vmaxnm.f64 d18, d18, d16 1313; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 1314; ARMV8-NEXT: vmov r0, r1, d18 1315; ARMV8-NEXT: vmov r2, r3, d16 1316; ARMV8-NEXT: mov pc, lr 1317; ARMV8-NEXT: .p2align 3 1318; ARMV8-NEXT: @ %bb.1: 1319; ARMV8-NEXT: .LCPI31_0: 1320; ARMV8-NEXT: .long 0 @ double -0 1321; ARMV8-NEXT: .long 2147483648 1322; 1323; ARMV8M-LABEL: fmaxnumv264_minus_zero_intrinsic: 1324; ARMV8M: @ %bb.0: 1325; ARMV8M-NEXT: vldr d0, .LCPI31_0 1326; ARMV8M-NEXT: vmov d1, r0, r1 1327; ARMV8M-NEXT: vmov d2, r2, r3 1328; ARMV8M-NEXT: vcmp.f64 d1, d0 1329; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1330; ARMV8M-NEXT: vcmp.f64 d2, d0 1331; ARMV8M-NEXT: vselgt.f64 d1, d1, d0 1332; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1333; ARMV8M-NEXT: vmov r0, r1, d1 1334; ARMV8M-NEXT: vselgt.f64 d0, d2, d0 1335; ARMV8M-NEXT: vmov r2, r3, d0 1336; ARMV8M-NEXT: bx lr 1337; ARMV8M-NEXT: .p2align 3 1338; ARMV8M-NEXT: @ %bb.1: 1339; ARMV8M-NEXT: .LCPI31_0: 1340; ARMV8M-NEXT: .long 0 @ double -0 1341; ARMV8M-NEXT: .long 2147483648 1342 %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double -0.0, double -0.0>) 1343 ret <2 x double> %a 1344} 1345 1346define <2 x double> @fmaxnumv264_non_zero_intrinsic(<2 x double> %x) { 1347; ARMV7-LABEL: fmaxnumv264_non_zero_intrinsic: 1348; ARMV7: @ %bb.0: 1349; ARMV7-NEXT: vmov.f64 d16, #1.000000e+00 1350; ARMV7-NEXT: vmov d17, r0, r1 1351; ARMV7-NEXT: vcmp.f64 d17, d16 1352; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1353; ARMV7-NEXT: vmov d18, r2, r3 1354; ARMV7-NEXT: vcmp.f64 d18, d16 1355; ARMV7-NEXT: vmov.f64 d19, d16 1356; ARMV7-NEXT: vmovgt.f64 d19, d17 1357; ARMV7-NEXT: vmrs APSR_nzcv, fpscr 1358; ARMV7-NEXT: vmov r0, r1, d19 1359; ARMV7-NEXT: vmovgt.f64 d16, d18 1360; ARMV7-NEXT: vmov r2, r3, d16 1361; ARMV7-NEXT: bx lr 1362; 1363; ARMV8-LABEL: fmaxnumv264_non_zero_intrinsic: 1364; ARMV8: @ %bb.0: 1365; ARMV8-NEXT: vmov.f64 d16, #1.000000e+00 1366; ARMV8-NEXT: vmov d18, r0, r1 1367; ARMV8-NEXT: vmov d17, r2, r3 1368; ARMV8-NEXT: vmaxnm.f64 d18, d18, d16 1369; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16 1370; ARMV8-NEXT: vmov r0, r1, d18 1371; ARMV8-NEXT: vmov r2, r3, d16 1372; ARMV8-NEXT: mov pc, lr 1373; 1374; ARMV8M-LABEL: fmaxnumv264_non_zero_intrinsic: 1375; ARMV8M: @ %bb.0: 1376; ARMV8M-NEXT: vmov.f64 d0, #1.000000e+00 1377; ARMV8M-NEXT: vmov d1, r0, r1 1378; ARMV8M-NEXT: vcmp.f64 d1, d0 1379; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1380; ARMV8M-NEXT: vmov d2, r2, r3 1381; ARMV8M-NEXT: vcmp.f64 d2, d0 1382; ARMV8M-NEXT: vselgt.f64 d1, d1, d0 1383; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr 1384; ARMV8M-NEXT: vmov r0, r1, d1 1385; ARMV8M-NEXT: vselgt.f64 d0, d2, d0 1386; ARMV8M-NEXT: vmov r2, r3, d0 1387; ARMV8M-NEXT: bx lr 1388 %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>) 1389 ret <2 x double> %a 1390} 1391