1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=ALL,SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE,SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512BW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL 8 9; 10; vXf32 11; 12 13define float @test_v1f32(<1 x float> %a0) { 14; ALL-LABEL: test_v1f32: 15; ALL: # %bb.0: 16; ALL-NEXT: retq 17 %1 = call float @llvm.vector.reduce.fmax.v1f32(<1 x float> %a0) 18 ret float %1 19} 20 21define float @test_v2f32(<2 x float> %a0) { 22; SSE2-LABEL: test_v2f32: 23; SSE2: # %bb.0: 24; SSE2-NEXT: movaps %xmm0, %xmm2 25; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[1,1] 26; SSE2-NEXT: movaps %xmm0, %xmm1 27; SSE2-NEXT: cmpunordss %xmm0, %xmm1 28; SSE2-NEXT: movaps %xmm1, %xmm3 29; SSE2-NEXT: andps %xmm2, %xmm3 30; SSE2-NEXT: maxss %xmm0, %xmm2 31; SSE2-NEXT: andnps %xmm2, %xmm1 32; SSE2-NEXT: orps %xmm3, %xmm1 33; SSE2-NEXT: movaps %xmm1, %xmm0 34; SSE2-NEXT: retq 35; 36; SSE41-LABEL: test_v2f32: 37; SSE41: # %bb.0: 38; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 39; SSE41-NEXT: movaps %xmm0, %xmm1 40; SSE41-NEXT: cmpunordss %xmm0, %xmm1 41; SSE41-NEXT: movaps %xmm1, %xmm3 42; SSE41-NEXT: andps %xmm2, %xmm3 43; SSE41-NEXT: maxss %xmm0, %xmm2 44; SSE41-NEXT: andnps %xmm2, %xmm1 45; SSE41-NEXT: orps %xmm3, %xmm1 46; SSE41-NEXT: movaps %xmm1, %xmm0 47; SSE41-NEXT: retq 48; 49; AVX-LABEL: test_v2f32: 50; AVX: # %bb.0: 51; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 52; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2 53; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0 54; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 55; AVX-NEXT: retq 56; 57; AVX512-LABEL: test_v2f32: 58; AVX512: # %bb.0: 59; AVX512-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 60; AVX512-NEXT: vmaxss %xmm0, %xmm2, %xmm1 61; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1 62; AVX512-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 63; AVX512-NEXT: vmovaps %xmm1, %xmm0 64; AVX512-NEXT: retq 65 %1 = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %a0) 66 ret float %1 67} 68 69define float @test_v3f32(<3 x float> %a0) { 70; SSE2-LABEL: test_v3f32: 71; SSE2: # %bb.0: 72; SSE2-NEXT: movaps %xmm0, %xmm1 73; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1] 74; SSE2-NEXT: movaps %xmm0, %xmm2 75; SSE2-NEXT: cmpunordss %xmm0, %xmm2 76; SSE2-NEXT: movaps %xmm2, %xmm3 77; SSE2-NEXT: andps %xmm1, %xmm3 78; SSE2-NEXT: maxss %xmm0, %xmm1 79; SSE2-NEXT: andnps %xmm1, %xmm2 80; SSE2-NEXT: orps %xmm3, %xmm2 81; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 82; SSE2-NEXT: movaps %xmm0, %xmm1 83; SSE2-NEXT: maxss %xmm2, %xmm1 84; SSE2-NEXT: cmpunordss %xmm2, %xmm2 85; SSE2-NEXT: andps %xmm2, %xmm0 86; SSE2-NEXT: andnps %xmm1, %xmm2 87; SSE2-NEXT: orps %xmm2, %xmm0 88; SSE2-NEXT: retq 89; 90; SSE41-LABEL: test_v3f32: 91; SSE41: # %bb.0: 92; SSE41-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 93; SSE41-NEXT: movaps %xmm0, %xmm2 94; SSE41-NEXT: cmpunordss %xmm0, %xmm2 95; SSE41-NEXT: movaps %xmm2, %xmm3 96; SSE41-NEXT: andps %xmm1, %xmm3 97; SSE41-NEXT: maxss %xmm0, %xmm1 98; SSE41-NEXT: andnps %xmm1, %xmm2 99; SSE41-NEXT: orps %xmm3, %xmm2 100; SSE41-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 101; SSE41-NEXT: movaps %xmm0, %xmm1 102; SSE41-NEXT: maxss %xmm2, %xmm1 103; SSE41-NEXT: cmpunordss %xmm2, %xmm2 104; SSE41-NEXT: andps %xmm2, %xmm0 105; SSE41-NEXT: andnps %xmm1, %xmm2 106; SSE41-NEXT: orps %xmm2, %xmm0 107; SSE41-NEXT: retq 108; 109; AVX-LABEL: test_v3f32: 110; AVX: # %bb.0: 111; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 112; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2 113; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3 114; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1 115; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 116; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] 117; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1 118; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 119; AVX-NEXT: retq 120; 121; AVX512-LABEL: test_v3f32: 122; AVX512: # %bb.0: 123; AVX512-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 124; AVX512-NEXT: vmaxss %xmm0, %xmm1, %xmm2 125; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1 126; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 127; AVX512-NEXT: vcmpunordss %xmm2, %xmm2, %k1 128; AVX512-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 129; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm0 130; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 131; AVX512-NEXT: retq 132 %1 = call float @llvm.vector.reduce.fmax.v3f32(<3 x float> %a0) 133 ret float %1 134} 135 136define float @test_v4f32(<4 x float> %a0) { 137; SSE2-LABEL: test_v4f32: 138; SSE2: # %bb.0: 139; SSE2-NEXT: movaps %xmm0, %xmm1 140; SSE2-NEXT: movaps %xmm0, %xmm2 141; SSE2-NEXT: movaps %xmm0, %xmm3 142; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1] 143; SSE2-NEXT: cmpunordss %xmm0, %xmm0 144; SSE2-NEXT: movaps %xmm0, %xmm4 145; SSE2-NEXT: andps %xmm3, %xmm4 146; SSE2-NEXT: maxss %xmm1, %xmm3 147; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3] 148; SSE2-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 149; SSE2-NEXT: andnps %xmm3, %xmm0 150; SSE2-NEXT: orps %xmm4, %xmm0 151; SSE2-NEXT: movaps %xmm2, %xmm3 152; SSE2-NEXT: maxss %xmm0, %xmm3 153; SSE2-NEXT: cmpunordss %xmm0, %xmm0 154; SSE2-NEXT: movaps %xmm0, %xmm4 155; SSE2-NEXT: andnps %xmm3, %xmm4 156; SSE2-NEXT: andps %xmm2, %xmm0 157; SSE2-NEXT: orps %xmm4, %xmm0 158; SSE2-NEXT: movaps %xmm1, %xmm2 159; SSE2-NEXT: maxss %xmm0, %xmm2 160; SSE2-NEXT: cmpunordss %xmm0, %xmm0 161; SSE2-NEXT: movaps %xmm0, %xmm3 162; SSE2-NEXT: andnps %xmm2, %xmm3 163; SSE2-NEXT: andps %xmm1, %xmm0 164; SSE2-NEXT: orps %xmm3, %xmm0 165; SSE2-NEXT: retq 166; 167; SSE41-LABEL: test_v4f32: 168; SSE41: # %bb.0: 169; SSE41-NEXT: movaps %xmm0, %xmm1 170; SSE41-NEXT: movaps %xmm0, %xmm2 171; SSE41-NEXT: movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 172; SSE41-NEXT: cmpunordss %xmm0, %xmm0 173; SSE41-NEXT: movaps %xmm0, %xmm4 174; SSE41-NEXT: andps %xmm3, %xmm4 175; SSE41-NEXT: maxss %xmm1, %xmm3 176; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3] 177; SSE41-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 178; SSE41-NEXT: andnps %xmm3, %xmm0 179; SSE41-NEXT: orps %xmm4, %xmm0 180; SSE41-NEXT: movaps %xmm2, %xmm3 181; SSE41-NEXT: maxss %xmm0, %xmm3 182; SSE41-NEXT: cmpunordss %xmm0, %xmm0 183; SSE41-NEXT: movaps %xmm0, %xmm4 184; SSE41-NEXT: andnps %xmm3, %xmm4 185; SSE41-NEXT: andps %xmm2, %xmm0 186; SSE41-NEXT: orps %xmm4, %xmm0 187; SSE41-NEXT: movaps %xmm1, %xmm2 188; SSE41-NEXT: maxss %xmm0, %xmm2 189; SSE41-NEXT: cmpunordss %xmm0, %xmm0 190; SSE41-NEXT: movaps %xmm0, %xmm3 191; SSE41-NEXT: andnps %xmm2, %xmm3 192; SSE41-NEXT: andps %xmm1, %xmm0 193; SSE41-NEXT: orps %xmm3, %xmm0 194; SSE41-NEXT: retq 195; 196; AVX-LABEL: test_v4f32: 197; AVX: # %bb.0: 198; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 199; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 200; AVX-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 201; AVX-NEXT: vmaxss %xmm0, %xmm3, %xmm4 202; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0 203; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm4, %xmm0 204; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3 205; AVX-NEXT: vmaxss %xmm0, %xmm2, %xmm0 206; AVX-NEXT: vblendvps %xmm3, %xmm2, %xmm0, %xmm0 207; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2 208; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm0 209; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0 210; AVX-NEXT: retq 211; 212; AVX512-LABEL: test_v4f32: 213; AVX512: # %bb.0: 214; AVX512-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 215; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 216; AVX512-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 217; AVX512-NEXT: vmaxss %xmm0, %xmm3, %xmm4 218; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1 219; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1} 220; AVX512-NEXT: vcmpunordss %xmm4, %xmm4, %k1 221; AVX512-NEXT: vmaxss %xmm4, %xmm2, %xmm0 222; AVX512-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1} 223; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1 224; AVX512-NEXT: vmaxss %xmm0, %xmm1, %xmm0 225; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 226; AVX512-NEXT: retq 227 %1 = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %a0) 228 ret float %1 229} 230 231define float @test_v8f32(<8 x float> %a0) { 232; SSE2-LABEL: test_v8f32: 233; SSE2: # %bb.0: 234; SSE2-NEXT: movaps %xmm1, %xmm2 235; SSE2-NEXT: maxps %xmm0, %xmm2 236; SSE2-NEXT: cmpunordps %xmm0, %xmm0 237; SSE2-NEXT: andps %xmm0, %xmm1 238; SSE2-NEXT: andnps %xmm2, %xmm0 239; SSE2-NEXT: orps %xmm1, %xmm0 240; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1] 241; SSE2-NEXT: movaps %xmm0, %xmm1 242; SSE2-NEXT: cmpunordss %xmm0, %xmm1 243; SSE2-NEXT: movaps %xmm1, %xmm3 244; SSE2-NEXT: andps %xmm2, %xmm3 245; SSE2-NEXT: maxss %xmm0, %xmm2 246; SSE2-NEXT: andnps %xmm2, %xmm1 247; SSE2-NEXT: orps %xmm3, %xmm1 248; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 249; SSE2-NEXT: movdqa %xmm2, %xmm3 250; SSE2-NEXT: maxss %xmm1, %xmm3 251; SSE2-NEXT: cmpunordss %xmm1, %xmm1 252; SSE2-NEXT: movaps %xmm1, %xmm4 253; SSE2-NEXT: andnps %xmm3, %xmm4 254; SSE2-NEXT: andps %xmm2, %xmm1 255; SSE2-NEXT: orps %xmm4, %xmm1 256; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3] 257; SSE2-NEXT: movdqa %xmm0, %xmm2 258; SSE2-NEXT: maxss %xmm1, %xmm2 259; SSE2-NEXT: cmpunordss %xmm1, %xmm1 260; SSE2-NEXT: movaps %xmm1, %xmm3 261; SSE2-NEXT: andnps %xmm2, %xmm3 262; SSE2-NEXT: andps %xmm0, %xmm1 263; SSE2-NEXT: orps %xmm3, %xmm1 264; SSE2-NEXT: movaps %xmm1, %xmm0 265; SSE2-NEXT: retq 266; 267; SSE41-LABEL: test_v8f32: 268; SSE41: # %bb.0: 269; SSE41-NEXT: movaps %xmm1, %xmm2 270; SSE41-NEXT: maxps %xmm0, %xmm2 271; SSE41-NEXT: cmpunordps %xmm0, %xmm0 272; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 273; SSE41-NEXT: movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3] 274; SSE41-NEXT: movaps %xmm2, %xmm0 275; SSE41-NEXT: cmpunordss %xmm2, %xmm0 276; SSE41-NEXT: movaps %xmm0, %xmm3 277; SSE41-NEXT: andps %xmm1, %xmm3 278; SSE41-NEXT: maxss %xmm2, %xmm1 279; SSE41-NEXT: andnps %xmm1, %xmm0 280; SSE41-NEXT: orps %xmm3, %xmm0 281; SSE41-NEXT: movaps %xmm2, %xmm1 282; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1] 283; SSE41-NEXT: movaps %xmm1, %xmm3 284; SSE41-NEXT: maxss %xmm0, %xmm3 285; SSE41-NEXT: cmpunordss %xmm0, %xmm0 286; SSE41-NEXT: movaps %xmm0, %xmm4 287; SSE41-NEXT: andnps %xmm3, %xmm4 288; SSE41-NEXT: andps %xmm1, %xmm0 289; SSE41-NEXT: orps %xmm4, %xmm0 290; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3] 291; SSE41-NEXT: movaps %xmm2, %xmm1 292; SSE41-NEXT: maxss %xmm0, %xmm1 293; SSE41-NEXT: cmpunordss %xmm0, %xmm0 294; SSE41-NEXT: movaps %xmm0, %xmm3 295; SSE41-NEXT: andnps %xmm1, %xmm3 296; SSE41-NEXT: andps %xmm2, %xmm0 297; SSE41-NEXT: orps %xmm3, %xmm0 298; SSE41-NEXT: retq 299; 300; AVX-LABEL: test_v8f32: 301; AVX: # %bb.0: 302; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 303; AVX-NEXT: vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3] 304; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm1[1,0] 305; AVX-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3] 306; AVX-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3] 307; AVX-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0] 308; AVX-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3] 309; AVX-NEXT: vmaxss %xmm0, %xmm7, %xmm8 310; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0 311; AVX-NEXT: vblendvps %xmm0, %xmm7, %xmm8, %xmm0 312; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm7 313; AVX-NEXT: vmaxss %xmm0, %xmm6, %xmm0 314; AVX-NEXT: vblendvps %xmm7, %xmm6, %xmm0, %xmm0 315; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm6 316; AVX-NEXT: vmaxss %xmm0, %xmm5, %xmm0 317; AVX-NEXT: vblendvps %xmm6, %xmm5, %xmm0, %xmm0 318; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm5 319; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm0 320; AVX-NEXT: vblendvps %xmm5, %xmm1, %xmm0, %xmm0 321; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1 322; AVX-NEXT: vmaxss %xmm0, %xmm4, %xmm0 323; AVX-NEXT: vblendvps %xmm1, %xmm4, %xmm0, %xmm0 324; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1 325; AVX-NEXT: vmaxss %xmm0, %xmm3, %xmm0 326; AVX-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0 327; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm1 328; AVX-NEXT: vmaxss %xmm0, %xmm2, %xmm0 329; AVX-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0 330; AVX-NEXT: vzeroupper 331; AVX-NEXT: retq 332; 333; AVX512BW-LABEL: test_v8f32: 334; AVX512BW: # %bb.0: 335; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm3 336; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3] 337; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm3[1,0] 338; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3] 339; AVX512BW-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3] 340; AVX512BW-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0] 341; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3] 342; AVX512BW-NEXT: vmaxss %xmm0, %xmm7, %xmm8 343; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 344; AVX512BW-NEXT: vmovss %xmm7, %xmm8, %xmm8 {%k1} 345; AVX512BW-NEXT: vcmpunordss %xmm8, %xmm8, %k1 346; AVX512BW-NEXT: vmaxss %xmm8, %xmm6, %xmm0 347; AVX512BW-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1} 348; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 349; AVX512BW-NEXT: vmaxss %xmm0, %xmm5, %xmm0 350; AVX512BW-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1} 351; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 352; AVX512BW-NEXT: vmaxss %xmm0, %xmm3, %xmm0 353; AVX512BW-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1} 354; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 355; AVX512BW-NEXT: vmaxss %xmm0, %xmm4, %xmm0 356; AVX512BW-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1} 357; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 358; AVX512BW-NEXT: vmaxss %xmm0, %xmm2, %xmm0 359; AVX512BW-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1} 360; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 361; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0 362; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 363; AVX512BW-NEXT: vzeroupper 364; AVX512BW-NEXT: retq 365; 366; AVX512VL-LABEL: test_v8f32: 367; AVX512VL: # %bb.0: 368; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1 369; AVX512VL-NEXT: vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3] 370; AVX512VL-NEXT: vshufpd {{.*#+}} xmm3 = xmm1[1,0] 371; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3] 372; AVX512VL-NEXT: vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3] 373; AVX512VL-NEXT: vshufpd {{.*#+}} xmm6 = xmm0[1,0] 374; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3] 375; AVX512VL-NEXT: vmaxss %xmm0, %xmm7, %xmm8 376; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 377; AVX512VL-NEXT: vmovss %xmm7, %xmm8, %xmm8 {%k1} 378; AVX512VL-NEXT: vcmpunordss %xmm8, %xmm8, %k1 379; AVX512VL-NEXT: vmaxss %xmm8, %xmm6, %xmm0 380; AVX512VL-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1} 381; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 382; AVX512VL-NEXT: vmaxss %xmm0, %xmm5, %xmm0 383; AVX512VL-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1} 384; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 385; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0 386; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 387; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 388; AVX512VL-NEXT: vmaxss %xmm0, %xmm4, %xmm0 389; AVX512VL-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1} 390; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 391; AVX512VL-NEXT: vmaxss %xmm0, %xmm3, %xmm0 392; AVX512VL-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1} 393; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 394; AVX512VL-NEXT: vmaxss %xmm0, %xmm2, %xmm0 395; AVX512VL-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1} 396; AVX512VL-NEXT: vzeroupper 397; AVX512VL-NEXT: retq 398 %1 = call float @llvm.vector.reduce.fmax.v8f32(<8 x float> %a0) 399 ret float %1 400} 401 402define float @test_v16f32(<16 x float> %a0) { 403; SSE2-LABEL: test_v16f32: 404; SSE2: # %bb.0: 405; SSE2-NEXT: movaps %xmm2, %xmm4 406; SSE2-NEXT: maxps %xmm0, %xmm4 407; SSE2-NEXT: cmpunordps %xmm0, %xmm0 408; SSE2-NEXT: andps %xmm0, %xmm2 409; SSE2-NEXT: andnps %xmm4, %xmm0 410; SSE2-NEXT: orps %xmm2, %xmm0 411; SSE2-NEXT: movaps %xmm3, %xmm2 412; SSE2-NEXT: maxps %xmm1, %xmm2 413; SSE2-NEXT: cmpunordps %xmm1, %xmm1 414; SSE2-NEXT: andps %xmm1, %xmm3 415; SSE2-NEXT: andnps %xmm2, %xmm1 416; SSE2-NEXT: orps %xmm3, %xmm1 417; SSE2-NEXT: movaps %xmm1, %xmm2 418; SSE2-NEXT: maxps %xmm0, %xmm2 419; SSE2-NEXT: cmpunordps %xmm0, %xmm0 420; SSE2-NEXT: andps %xmm0, %xmm1 421; SSE2-NEXT: andnps %xmm2, %xmm0 422; SSE2-NEXT: orps %xmm1, %xmm0 423; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1] 424; SSE2-NEXT: movaps %xmm0, %xmm1 425; SSE2-NEXT: cmpunordss %xmm0, %xmm1 426; SSE2-NEXT: movaps %xmm1, %xmm3 427; SSE2-NEXT: andps %xmm2, %xmm3 428; SSE2-NEXT: maxss %xmm0, %xmm2 429; SSE2-NEXT: andnps %xmm2, %xmm1 430; SSE2-NEXT: orps %xmm3, %xmm1 431; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 432; SSE2-NEXT: movdqa %xmm2, %xmm3 433; SSE2-NEXT: maxss %xmm1, %xmm3 434; SSE2-NEXT: cmpunordss %xmm1, %xmm1 435; SSE2-NEXT: movaps %xmm1, %xmm4 436; SSE2-NEXT: andnps %xmm3, %xmm4 437; SSE2-NEXT: andps %xmm2, %xmm1 438; SSE2-NEXT: orps %xmm4, %xmm1 439; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3] 440; SSE2-NEXT: movdqa %xmm0, %xmm2 441; SSE2-NEXT: maxss %xmm1, %xmm2 442; SSE2-NEXT: cmpunordss %xmm1, %xmm1 443; SSE2-NEXT: movaps %xmm1, %xmm3 444; SSE2-NEXT: andnps %xmm2, %xmm3 445; SSE2-NEXT: andps %xmm0, %xmm1 446; SSE2-NEXT: orps %xmm3, %xmm1 447; SSE2-NEXT: movaps %xmm1, %xmm0 448; SSE2-NEXT: retq 449; 450; SSE41-LABEL: test_v16f32: 451; SSE41: # %bb.0: 452; SSE41-NEXT: movaps %xmm2, %xmm4 453; SSE41-NEXT: maxps %xmm0, %xmm4 454; SSE41-NEXT: cmpunordps %xmm0, %xmm0 455; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm4 456; SSE41-NEXT: movaps %xmm3, %xmm2 457; SSE41-NEXT: maxps %xmm1, %xmm2 458; SSE41-NEXT: cmpunordps %xmm1, %xmm1 459; SSE41-NEXT: movaps %xmm1, %xmm0 460; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm2 461; SSE41-NEXT: movaps %xmm2, %xmm1 462; SSE41-NEXT: maxps %xmm4, %xmm1 463; SSE41-NEXT: cmpunordps %xmm4, %xmm4 464; SSE41-NEXT: movaps %xmm4, %xmm0 465; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1 466; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 467; SSE41-NEXT: movaps %xmm1, %xmm0 468; SSE41-NEXT: cmpunordss %xmm1, %xmm0 469; SSE41-NEXT: movaps %xmm0, %xmm3 470; SSE41-NEXT: andps %xmm2, %xmm3 471; SSE41-NEXT: maxss %xmm1, %xmm2 472; SSE41-NEXT: andnps %xmm2, %xmm0 473; SSE41-NEXT: orps %xmm3, %xmm0 474; SSE41-NEXT: movaps %xmm1, %xmm2 475; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] 476; SSE41-NEXT: movaps %xmm2, %xmm3 477; SSE41-NEXT: maxss %xmm0, %xmm3 478; SSE41-NEXT: cmpunordss %xmm0, %xmm0 479; SSE41-NEXT: movaps %xmm0, %xmm4 480; SSE41-NEXT: andnps %xmm3, %xmm4 481; SSE41-NEXT: andps %xmm2, %xmm0 482; SSE41-NEXT: orps %xmm4, %xmm0 483; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3] 484; SSE41-NEXT: movaps %xmm1, %xmm2 485; SSE41-NEXT: maxss %xmm0, %xmm2 486; SSE41-NEXT: cmpunordss %xmm0, %xmm0 487; SSE41-NEXT: movaps %xmm0, %xmm3 488; SSE41-NEXT: andnps %xmm2, %xmm3 489; SSE41-NEXT: andps %xmm1, %xmm0 490; SSE41-NEXT: orps %xmm3, %xmm0 491; SSE41-NEXT: retq 492; 493; AVX-LABEL: test_v16f32: 494; AVX: # %bb.0: 495; AVX-NEXT: vmaxps %ymm0, %ymm1, %ymm2 496; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0 497; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0 498; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 499; AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2 500; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm3 501; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1 502; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 503; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0] 504; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1 505; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1 506; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 507; AVX-NEXT: vshufps {{.*#+}} xmm3 = xmm0[3,3,3,3] 508; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1 509; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1 510; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 511; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 512; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1 513; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm1 514; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 515; AVX-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 516; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1 517; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1 518; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 519; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0] 520; AVX-NEXT: vmaxss %xmm1, %xmm3, %xmm1 521; AVX-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1 522; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 523; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 524; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm1 525; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 526; AVX-NEXT: vzeroupper 527; AVX-NEXT: retq 528; 529; AVX512BW-LABEL: test_v16f32: 530; AVX512BW: # %bb.0: 531; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 532; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 533; AVX512BW-NEXT: vmaxss %xmm0, %xmm2, %xmm3 534; AVX512BW-NEXT: vcmpunordss %xmm0, %xmm0, %k1 535; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 536; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 537; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 538; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3 539; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 540; AVX512BW-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3] 541; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 542; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3 543; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 544; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 545; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 546; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3 547; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 548; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 549; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3 550; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 551; AVX512BW-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0] 552; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 553; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3 554; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 555; AVX512BW-NEXT: vextractf32x4 $2, %zmm0, %xmm2 556; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[3,3,3,3] 557; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 558; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3 559; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 560; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3] 561; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 562; AVX512BW-NEXT: vmaxss %xmm3, %xmm2, %xmm3 563; AVX512BW-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 564; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 565; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3 566; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 567; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm2[1,0] 568; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 569; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm3 570; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 571; AVX512BW-NEXT: vextractf32x4 $3, %zmm0, %xmm0 572; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm2[3,3,3,3] 573; AVX512BW-NEXT: vcmpunordss %xmm3, %xmm3, %k1 574; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2 575; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 576; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 577; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1 578; AVX512BW-NEXT: vmaxss %xmm2, %xmm0, %xmm2 579; AVX512BW-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1} 580; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1 581; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2 582; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 583; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 584; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1 585; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2 586; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 587; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 588; AVX512BW-NEXT: vcmpunordss %xmm2, %xmm2, %k1 589; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm0 590; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 591; AVX512BW-NEXT: vzeroupper 592; AVX512BW-NEXT: retq 593; 594; AVX512VL-LABEL: test_v16f32: 595; AVX512VL: # %bb.0: 596; AVX512VL-NEXT: vextractf32x4 $3, %zmm0, %xmm3 597; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3] 598; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm3[1,0] 599; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3] 600; AVX512VL-NEXT: vextractf32x4 $2, %zmm0, %xmm6 601; AVX512VL-NEXT: vshufps {{.*#+}} xmm5 = xmm6[3,3,3,3] 602; AVX512VL-NEXT: vshufpd {{.*#+}} xmm7 = xmm6[1,0] 603; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm8 = xmm6[1,1,3,3] 604; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm9 605; AVX512VL-NEXT: vshufps {{.*#+}} xmm10 = xmm9[3,3,3,3] 606; AVX512VL-NEXT: vshufpd {{.*#+}} xmm11 = xmm9[1,0] 607; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm12 = xmm9[1,1,3,3] 608; AVX512VL-NEXT: vshufps {{.*#+}} xmm13 = xmm0[3,3,3,3] 609; AVX512VL-NEXT: vshufpd {{.*#+}} xmm14 = xmm0[1,0] 610; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm15 = xmm0[1,1,3,3] 611; AVX512VL-NEXT: vmaxss %xmm0, %xmm15, %xmm16 612; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 613; AVX512VL-NEXT: vmovss %xmm15, %xmm16, %xmm16 {%k1} 614; AVX512VL-NEXT: vcmpunordss %xmm16, %xmm16, %k1 615; AVX512VL-NEXT: vmaxss %xmm16, %xmm14, %xmm0 616; AVX512VL-NEXT: vmovss %xmm14, %xmm0, %xmm0 {%k1} 617; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 618; AVX512VL-NEXT: vmaxss %xmm0, %xmm13, %xmm0 619; AVX512VL-NEXT: vmovss %xmm13, %xmm0, %xmm0 {%k1} 620; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 621; AVX512VL-NEXT: vmaxss %xmm0, %xmm9, %xmm0 622; AVX512VL-NEXT: vmovss %xmm9, %xmm0, %xmm0 {%k1} 623; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 624; AVX512VL-NEXT: vmaxss %xmm0, %xmm12, %xmm0 625; AVX512VL-NEXT: vmovss %xmm12, %xmm0, %xmm0 {%k1} 626; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 627; AVX512VL-NEXT: vmaxss %xmm0, %xmm11, %xmm0 628; AVX512VL-NEXT: vmovss %xmm11, %xmm0, %xmm0 {%k1} 629; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 630; AVX512VL-NEXT: vmaxss %xmm0, %xmm10, %xmm0 631; AVX512VL-NEXT: vmovss %xmm10, %xmm0, %xmm0 {%k1} 632; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 633; AVX512VL-NEXT: vmaxss %xmm0, %xmm6, %xmm0 634; AVX512VL-NEXT: vmovss %xmm6, %xmm0, %xmm0 {%k1} 635; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 636; AVX512VL-NEXT: vmaxss %xmm0, %xmm8, %xmm0 637; AVX512VL-NEXT: vmovss %xmm8, %xmm0, %xmm0 {%k1} 638; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 639; AVX512VL-NEXT: vmaxss %xmm0, %xmm7, %xmm0 640; AVX512VL-NEXT: vmovss %xmm7, %xmm0, %xmm0 {%k1} 641; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 642; AVX512VL-NEXT: vmaxss %xmm0, %xmm5, %xmm0 643; AVX512VL-NEXT: vmovss %xmm5, %xmm0, %xmm0 {%k1} 644; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 645; AVX512VL-NEXT: vmaxss %xmm0, %xmm3, %xmm0 646; AVX512VL-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1} 647; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 648; AVX512VL-NEXT: vmaxss %xmm0, %xmm4, %xmm0 649; AVX512VL-NEXT: vmovss %xmm4, %xmm0, %xmm0 {%k1} 650; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 651; AVX512VL-NEXT: vmaxss %xmm0, %xmm2, %xmm0 652; AVX512VL-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1} 653; AVX512VL-NEXT: vcmpunordss %xmm0, %xmm0, %k1 654; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0 655; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 656; AVX512VL-NEXT: vzeroupper 657; AVX512VL-NEXT: retq 658 %1 = call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %a0) 659 ret float %1 660} 661 662; 663; vXf64 664; 665 666define double @test_v2f64(<2 x double> %a0) { 667; SSE-LABEL: test_v2f64: 668; SSE: # %bb.0: 669; SSE-NEXT: movapd %xmm0, %xmm2 670; SSE-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1] 671; SSE-NEXT: movapd %xmm0, %xmm1 672; SSE-NEXT: cmpunordsd %xmm0, %xmm1 673; SSE-NEXT: movapd %xmm1, %xmm3 674; SSE-NEXT: andpd %xmm2, %xmm3 675; SSE-NEXT: maxsd %xmm0, %xmm2 676; SSE-NEXT: andnpd %xmm2, %xmm1 677; SSE-NEXT: orpd %xmm3, %xmm1 678; SSE-NEXT: movapd %xmm1, %xmm0 679; SSE-NEXT: retq 680; 681; AVX-LABEL: test_v2f64: 682; AVX: # %bb.0: 683; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 684; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2 685; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0 686; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0 687; AVX-NEXT: retq 688; 689; AVX512-LABEL: test_v2f64: 690; AVX512: # %bb.0: 691; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 692; AVX512-NEXT: vmaxsd %xmm0, %xmm2, %xmm1 693; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 694; AVX512-NEXT: vmovsd %xmm2, %xmm1, %xmm1 {%k1} 695; AVX512-NEXT: vmovapd %xmm1, %xmm0 696; AVX512-NEXT: retq 697 %1 = call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %a0) 698 ret double %1 699} 700 701define double @test_v4f64(<4 x double> %a0) { 702; SSE2-LABEL: test_v4f64: 703; SSE2: # %bb.0: 704; SSE2-NEXT: movapd %xmm1, %xmm2 705; SSE2-NEXT: maxpd %xmm0, %xmm2 706; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 707; SSE2-NEXT: andpd %xmm0, %xmm1 708; SSE2-NEXT: andnpd %xmm2, %xmm0 709; SSE2-NEXT: orpd %xmm1, %xmm0 710; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 711; SSE2-NEXT: movapd %xmm0, %xmm1 712; SSE2-NEXT: cmpunordsd %xmm0, %xmm1 713; SSE2-NEXT: movapd %xmm1, %xmm3 714; SSE2-NEXT: andpd %xmm2, %xmm3 715; SSE2-NEXT: maxsd %xmm0, %xmm2 716; SSE2-NEXT: andnpd %xmm2, %xmm1 717; SSE2-NEXT: orpd %xmm3, %xmm1 718; SSE2-NEXT: movapd %xmm1, %xmm0 719; SSE2-NEXT: retq 720; 721; SSE41-LABEL: test_v4f64: 722; SSE41: # %bb.0: 723; SSE41-NEXT: movapd %xmm1, %xmm2 724; SSE41-NEXT: maxpd %xmm0, %xmm2 725; SSE41-NEXT: cmpunordpd %xmm0, %xmm0 726; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 727; SSE41-NEXT: movapd %xmm2, %xmm1 728; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1] 729; SSE41-NEXT: movapd %xmm2, %xmm0 730; SSE41-NEXT: cmpunordsd %xmm2, %xmm0 731; SSE41-NEXT: movapd %xmm0, %xmm3 732; SSE41-NEXT: andpd %xmm1, %xmm3 733; SSE41-NEXT: maxsd %xmm2, %xmm1 734; SSE41-NEXT: andnpd %xmm1, %xmm0 735; SSE41-NEXT: orpd %xmm3, %xmm0 736; SSE41-NEXT: retq 737; 738; AVX-LABEL: test_v4f64: 739; AVX: # %bb.0: 740; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 741; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0] 742; AVX-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0] 743; AVX-NEXT: vmaxsd %xmm0, %xmm3, %xmm4 744; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0 745; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm4, %xmm0 746; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm3 747; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm0 748; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm0, %xmm0 749; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm1 750; AVX-NEXT: vmaxsd %xmm0, %xmm2, %xmm0 751; AVX-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0 752; AVX-NEXT: vzeroupper 753; AVX-NEXT: retq 754; 755; AVX512-LABEL: test_v4f64: 756; AVX512: # %bb.0: 757; AVX512-NEXT: vextractf128 $1, %ymm0, %xmm1 758; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0] 759; AVX512-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0] 760; AVX512-NEXT: vmaxsd %xmm0, %xmm3, %xmm4 761; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 762; AVX512-NEXT: vmovsd %xmm3, %xmm4, %xmm4 {%k1} 763; AVX512-NEXT: vcmpunordsd %xmm4, %xmm4, %k1 764; AVX512-NEXT: vmaxsd %xmm4, %xmm1, %xmm0 765; AVX512-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 766; AVX512-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 767; AVX512-NEXT: vmaxsd %xmm0, %xmm2, %xmm0 768; AVX512-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1} 769; AVX512-NEXT: vzeroupper 770; AVX512-NEXT: retq 771 %1 = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %a0) 772 ret double %1 773} 774 775define double @test_v8f64(<8 x double> %a0) { 776; SSE2-LABEL: test_v8f64: 777; SSE2: # %bb.0: 778; SSE2-NEXT: movapd %xmm2, %xmm4 779; SSE2-NEXT: maxpd %xmm0, %xmm4 780; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 781; SSE2-NEXT: andpd %xmm0, %xmm2 782; SSE2-NEXT: andnpd %xmm4, %xmm0 783; SSE2-NEXT: orpd %xmm2, %xmm0 784; SSE2-NEXT: movapd %xmm3, %xmm2 785; SSE2-NEXT: maxpd %xmm1, %xmm2 786; SSE2-NEXT: cmpunordpd %xmm1, %xmm1 787; SSE2-NEXT: andpd %xmm1, %xmm3 788; SSE2-NEXT: andnpd %xmm2, %xmm1 789; SSE2-NEXT: orpd %xmm3, %xmm1 790; SSE2-NEXT: movapd %xmm1, %xmm2 791; SSE2-NEXT: maxpd %xmm0, %xmm2 792; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 793; SSE2-NEXT: andpd %xmm0, %xmm1 794; SSE2-NEXT: andnpd %xmm2, %xmm0 795; SSE2-NEXT: orpd %xmm1, %xmm0 796; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 797; SSE2-NEXT: movapd %xmm0, %xmm1 798; SSE2-NEXT: cmpunordsd %xmm0, %xmm1 799; SSE2-NEXT: movapd %xmm1, %xmm3 800; SSE2-NEXT: andpd %xmm2, %xmm3 801; SSE2-NEXT: maxsd %xmm0, %xmm2 802; SSE2-NEXT: andnpd %xmm2, %xmm1 803; SSE2-NEXT: orpd %xmm3, %xmm1 804; SSE2-NEXT: movapd %xmm1, %xmm0 805; SSE2-NEXT: retq 806; 807; SSE41-LABEL: test_v8f64: 808; SSE41: # %bb.0: 809; SSE41-NEXT: movapd %xmm2, %xmm4 810; SSE41-NEXT: maxpd %xmm0, %xmm4 811; SSE41-NEXT: cmpunordpd %xmm0, %xmm0 812; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 813; SSE41-NEXT: movapd %xmm3, %xmm2 814; SSE41-NEXT: maxpd %xmm1, %xmm2 815; SSE41-NEXT: cmpunordpd %xmm1, %xmm1 816; SSE41-NEXT: movapd %xmm1, %xmm0 817; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2 818; SSE41-NEXT: movapd %xmm2, %xmm1 819; SSE41-NEXT: maxpd %xmm4, %xmm1 820; SSE41-NEXT: cmpunordpd %xmm4, %xmm4 821; SSE41-NEXT: movapd %xmm4, %xmm0 822; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 823; SSE41-NEXT: movapd %xmm1, %xmm2 824; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] 825; SSE41-NEXT: movapd %xmm1, %xmm0 826; SSE41-NEXT: cmpunordsd %xmm1, %xmm0 827; SSE41-NEXT: movapd %xmm0, %xmm3 828; SSE41-NEXT: andpd %xmm2, %xmm3 829; SSE41-NEXT: maxsd %xmm1, %xmm2 830; SSE41-NEXT: andnpd %xmm2, %xmm0 831; SSE41-NEXT: orpd %xmm3, %xmm0 832; SSE41-NEXT: retq 833; 834; AVX-LABEL: test_v8f64: 835; AVX: # %bb.0: 836; AVX-NEXT: vmaxpd %ymm0, %ymm1, %ymm2 837; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0 838; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0 839; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 840; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2 841; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm3 842; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 843; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2 844; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 845; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 846; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1 847; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2 848; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] 849; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 850; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 851; AVX-NEXT: vzeroupper 852; AVX-NEXT: retq 853; 854; AVX512BW-LABEL: test_v8f64: 855; AVX512BW: # %bb.0: 856; AVX512BW-NEXT: vextractf32x4 $3, %zmm0, %xmm2 857; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm2[1,0] 858; AVX512BW-NEXT: vextractf32x4 $2, %zmm0, %xmm3 859; AVX512BW-NEXT: vshufpd {{.*#+}} xmm4 = xmm3[1,0] 860; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm5 861; AVX512BW-NEXT: vshufpd {{.*#+}} xmm6 = xmm5[1,0] 862; AVX512BW-NEXT: vshufpd {{.*#+}} xmm7 = xmm0[1,0] 863; AVX512BW-NEXT: vmaxsd %xmm0, %xmm7, %xmm8 864; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 865; AVX512BW-NEXT: vmovsd %xmm7, %xmm8, %xmm8 {%k1} 866; AVX512BW-NEXT: vcmpunordsd %xmm8, %xmm8, %k1 867; AVX512BW-NEXT: vmaxsd %xmm8, %xmm5, %xmm0 868; AVX512BW-NEXT: vmovsd %xmm5, %xmm0, %xmm0 {%k1} 869; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 870; AVX512BW-NEXT: vmaxsd %xmm0, %xmm6, %xmm0 871; AVX512BW-NEXT: vmovsd %xmm6, %xmm0, %xmm0 {%k1} 872; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 873; AVX512BW-NEXT: vmaxsd %xmm0, %xmm3, %xmm0 874; AVX512BW-NEXT: vmovsd %xmm3, %xmm0, %xmm0 {%k1} 875; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 876; AVX512BW-NEXT: vmaxsd %xmm0, %xmm4, %xmm0 877; AVX512BW-NEXT: vmovsd %xmm4, %xmm0, %xmm0 {%k1} 878; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 879; AVX512BW-NEXT: vmaxsd %xmm0, %xmm2, %xmm0 880; AVX512BW-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1} 881; AVX512BW-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 882; AVX512BW-NEXT: vmaxsd %xmm0, %xmm1, %xmm0 883; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 884; AVX512BW-NEXT: vzeroupper 885; AVX512BW-NEXT: retq 886; 887; AVX512VL-LABEL: test_v8f64: 888; AVX512VL: # %bb.0: 889; AVX512VL-NEXT: vextractf32x4 $3, %zmm0, %xmm1 890; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0] 891; AVX512VL-NEXT: vextractf32x4 $2, %zmm0, %xmm3 892; AVX512VL-NEXT: vshufpd {{.*#+}} xmm4 = xmm3[1,0] 893; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm5 894; AVX512VL-NEXT: vshufpd {{.*#+}} xmm6 = xmm5[1,0] 895; AVX512VL-NEXT: vshufpd {{.*#+}} xmm7 = xmm0[1,0] 896; AVX512VL-NEXT: vmaxsd %xmm0, %xmm7, %xmm8 897; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 898; AVX512VL-NEXT: vmovsd %xmm7, %xmm8, %xmm8 {%k1} 899; AVX512VL-NEXT: vcmpunordsd %xmm8, %xmm8, %k1 900; AVX512VL-NEXT: vmaxsd %xmm8, %xmm5, %xmm0 901; AVX512VL-NEXT: vmovsd %xmm5, %xmm0, %xmm0 {%k1} 902; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 903; AVX512VL-NEXT: vmaxsd %xmm0, %xmm6, %xmm0 904; AVX512VL-NEXT: vmovsd %xmm6, %xmm0, %xmm0 {%k1} 905; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 906; AVX512VL-NEXT: vmaxsd %xmm0, %xmm3, %xmm0 907; AVX512VL-NEXT: vmovsd %xmm3, %xmm0, %xmm0 {%k1} 908; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 909; AVX512VL-NEXT: vmaxsd %xmm0, %xmm4, %xmm0 910; AVX512VL-NEXT: vmovsd %xmm4, %xmm0, %xmm0 {%k1} 911; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 912; AVX512VL-NEXT: vmaxsd %xmm0, %xmm1, %xmm0 913; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 914; AVX512VL-NEXT: vcmpunordsd %xmm0, %xmm0, %k1 915; AVX512VL-NEXT: vmaxsd %xmm0, %xmm2, %xmm0 916; AVX512VL-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1} 917; AVX512VL-NEXT: vzeroupper 918; AVX512VL-NEXT: retq 919 %1 = call double @llvm.vector.reduce.fmax.v8f64(<8 x double> %a0) 920 ret double %1 921} 922 923define double @test_v16f64(<16 x double> %a0) { 924; SSE2-LABEL: test_v16f64: 925; SSE2: # %bb.0: 926; SSE2-NEXT: movapd %xmm4, %xmm8 927; SSE2-NEXT: maxpd %xmm0, %xmm8 928; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 929; SSE2-NEXT: andpd %xmm0, %xmm4 930; SSE2-NEXT: andnpd %xmm8, %xmm0 931; SSE2-NEXT: orpd %xmm4, %xmm0 932; SSE2-NEXT: movapd %xmm6, %xmm4 933; SSE2-NEXT: maxpd %xmm2, %xmm4 934; SSE2-NEXT: cmpunordpd %xmm2, %xmm2 935; SSE2-NEXT: andpd %xmm2, %xmm6 936; SSE2-NEXT: andnpd %xmm4, %xmm2 937; SSE2-NEXT: orpd %xmm6, %xmm2 938; SSE2-NEXT: movapd %xmm2, %xmm4 939; SSE2-NEXT: maxpd %xmm0, %xmm4 940; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 941; SSE2-NEXT: andpd %xmm0, %xmm2 942; SSE2-NEXT: andnpd %xmm4, %xmm0 943; SSE2-NEXT: orpd %xmm2, %xmm0 944; SSE2-NEXT: movapd %xmm5, %xmm2 945; SSE2-NEXT: maxpd %xmm1, %xmm2 946; SSE2-NEXT: cmpunordpd %xmm1, %xmm1 947; SSE2-NEXT: andpd %xmm1, %xmm5 948; SSE2-NEXT: andnpd %xmm2, %xmm1 949; SSE2-NEXT: orpd %xmm5, %xmm1 950; SSE2-NEXT: movapd %xmm7, %xmm2 951; SSE2-NEXT: maxpd %xmm3, %xmm2 952; SSE2-NEXT: cmpunordpd %xmm3, %xmm3 953; SSE2-NEXT: andpd %xmm3, %xmm7 954; SSE2-NEXT: andnpd %xmm2, %xmm3 955; SSE2-NEXT: orpd %xmm7, %xmm3 956; SSE2-NEXT: movapd %xmm3, %xmm2 957; SSE2-NEXT: maxpd %xmm1, %xmm2 958; SSE2-NEXT: cmpunordpd %xmm1, %xmm1 959; SSE2-NEXT: andpd %xmm1, %xmm3 960; SSE2-NEXT: andnpd %xmm2, %xmm1 961; SSE2-NEXT: orpd %xmm3, %xmm1 962; SSE2-NEXT: movapd %xmm1, %xmm2 963; SSE2-NEXT: maxpd %xmm0, %xmm2 964; SSE2-NEXT: cmpunordpd %xmm0, %xmm0 965; SSE2-NEXT: andpd %xmm0, %xmm1 966; SSE2-NEXT: andnpd %xmm2, %xmm0 967; SSE2-NEXT: orpd %xmm1, %xmm0 968; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 969; SSE2-NEXT: movapd %xmm0, %xmm1 970; SSE2-NEXT: cmpunordsd %xmm0, %xmm1 971; SSE2-NEXT: movapd %xmm1, %xmm3 972; SSE2-NEXT: andpd %xmm2, %xmm3 973; SSE2-NEXT: maxsd %xmm0, %xmm2 974; SSE2-NEXT: andnpd %xmm2, %xmm1 975; SSE2-NEXT: orpd %xmm3, %xmm1 976; SSE2-NEXT: movapd %xmm1, %xmm0 977; SSE2-NEXT: retq 978; 979; SSE41-LABEL: test_v16f64: 980; SSE41: # %bb.0: 981; SSE41-NEXT: movapd %xmm4, %xmm8 982; SSE41-NEXT: maxpd %xmm0, %xmm8 983; SSE41-NEXT: cmpunordpd %xmm0, %xmm0 984; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8 985; SSE41-NEXT: movapd %xmm6, %xmm4 986; SSE41-NEXT: maxpd %xmm2, %xmm4 987; SSE41-NEXT: cmpunordpd %xmm2, %xmm2 988; SSE41-NEXT: movapd %xmm2, %xmm0 989; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm4 990; SSE41-NEXT: movapd %xmm4, %xmm2 991; SSE41-NEXT: maxpd %xmm8, %xmm2 992; SSE41-NEXT: cmpunordpd %xmm8, %xmm8 993; SSE41-NEXT: movapd %xmm8, %xmm0 994; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 995; SSE41-NEXT: movapd %xmm5, %xmm4 996; SSE41-NEXT: maxpd %xmm1, %xmm4 997; SSE41-NEXT: cmpunordpd %xmm1, %xmm1 998; SSE41-NEXT: movapd %xmm1, %xmm0 999; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4 1000; SSE41-NEXT: movapd %xmm7, %xmm1 1001; SSE41-NEXT: maxpd %xmm3, %xmm1 1002; SSE41-NEXT: cmpunordpd %xmm3, %xmm3 1003; SSE41-NEXT: movapd %xmm3, %xmm0 1004; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1 1005; SSE41-NEXT: movapd %xmm1, %xmm3 1006; SSE41-NEXT: maxpd %xmm4, %xmm3 1007; SSE41-NEXT: cmpunordpd %xmm4, %xmm4 1008; SSE41-NEXT: movapd %xmm4, %xmm0 1009; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 1010; SSE41-NEXT: movapd %xmm3, %xmm1 1011; SSE41-NEXT: maxpd %xmm2, %xmm1 1012; SSE41-NEXT: cmpunordpd %xmm2, %xmm2 1013; SSE41-NEXT: movapd %xmm2, %xmm0 1014; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 1015; SSE41-NEXT: movapd %xmm1, %xmm2 1016; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] 1017; SSE41-NEXT: movapd %xmm1, %xmm0 1018; SSE41-NEXT: cmpunordsd %xmm1, %xmm0 1019; SSE41-NEXT: movapd %xmm0, %xmm3 1020; SSE41-NEXT: andpd %xmm2, %xmm3 1021; SSE41-NEXT: maxsd %xmm1, %xmm2 1022; SSE41-NEXT: andnpd %xmm2, %xmm0 1023; SSE41-NEXT: orpd %xmm3, %xmm0 1024; SSE41-NEXT: retq 1025; 1026; AVX-LABEL: test_v16f64: 1027; AVX: # %bb.0: 1028; AVX-NEXT: vmaxpd %ymm0, %ymm2, %ymm4 1029; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0 1030; AVX-NEXT: vblendvpd %ymm0, %ymm2, %ymm4, %ymm0 1031; AVX-NEXT: vmaxpd %ymm1, %ymm3, %ymm2 1032; AVX-NEXT: vcmpunordpd %ymm1, %ymm1, %ymm1 1033; AVX-NEXT: vblendvpd %ymm1, %ymm3, %ymm2, %ymm1 1034; AVX-NEXT: vmaxpd %ymm0, %ymm1, %ymm2 1035; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0 1036; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0 1037; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1038; AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2 1039; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm3 1040; AVX-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 1041; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2 1042; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 1043; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1044; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1 1045; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2 1046; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] 1047; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1048; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1049; AVX-NEXT: vzeroupper 1050; AVX-NEXT: retq 1051; 1052; AVX512-LABEL: test_v16f64: 1053; AVX512: # %bb.0: 1054; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm2 1055; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k1 1056; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1} 1057; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm2[1,0] 1058; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm1 1059; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1 1060; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1061; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1062; AVX512-NEXT: vextractf128 $1, %ymm2, %xmm0 1063; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1064; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1065; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1066; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] 1067; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1068; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1069; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1070; AVX512-NEXT: vextractf32x4 $2, %zmm2, %xmm0 1071; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1072; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1073; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1074; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] 1075; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1076; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1077; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1078; AVX512-NEXT: vextractf32x4 $3, %zmm2, %xmm0 1079; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1 1080; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1081; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1082; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 1083; AVX512-NEXT: vmaxsd %xmm1, %xmm2, %xmm0 1084; AVX512-NEXT: vmovsd %xmm2, %xmm0, %xmm0 {%k1} 1085; AVX512-NEXT: vzeroupper 1086; AVX512-NEXT: retq 1087 %1 = call double @llvm.vector.reduce.fmax.v16f64(<16 x double> %a0) 1088 ret double %1 1089} 1090 1091declare float @llvm.vector.reduce.fmax.v1f32(<1 x float>) 1092declare float @llvm.vector.reduce.fmax.v2f32(<2 x float>) 1093declare float @llvm.vector.reduce.fmax.v3f32(<3 x float>) 1094declare float @llvm.vector.reduce.fmax.v4f32(<4 x float>) 1095declare float @llvm.vector.reduce.fmax.v8f32(<8 x float>) 1096declare float @llvm.vector.reduce.fmax.v16f32(<16 x float>) 1097 1098declare double @llvm.vector.reduce.fmax.v2f64(<2 x double>) 1099declare double @llvm.vector.reduce.fmax.v4f64(<4 x double>) 1100declare double @llvm.vector.reduce.fmax.v8f64(<8 x double>) 1101declare double @llvm.vector.reduce.fmax.v16f64(<16 x double>) 1102