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