1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 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.fmaximum.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: movd %xmm0, %eax 27; SSE2-NEXT: testl %eax, %eax 28; SSE2-NEXT: movaps %xmm0, %xmm3 29; SSE2-NEXT: js .LBB1_2 30; SSE2-NEXT: # %bb.1: 31; SSE2-NEXT: movaps %xmm2, %xmm3 32; SSE2-NEXT: .LBB1_2: 33; SSE2-NEXT: movaps %xmm3, %xmm1 34; SSE2-NEXT: cmpunordss %xmm3, %xmm1 35; SSE2-NEXT: movaps %xmm1, %xmm4 36; SSE2-NEXT: andps %xmm3, %xmm4 37; SSE2-NEXT: js .LBB1_4 38; SSE2-NEXT: # %bb.3: 39; SSE2-NEXT: movaps %xmm0, %xmm2 40; SSE2-NEXT: .LBB1_4: 41; SSE2-NEXT: maxss %xmm2, %xmm3 42; SSE2-NEXT: andnps %xmm3, %xmm1 43; SSE2-NEXT: orps %xmm4, %xmm1 44; SSE2-NEXT: movaps %xmm1, %xmm0 45; SSE2-NEXT: retq 46; 47; SSE41-LABEL: test_v2f32: 48; SSE41: # %bb.0: 49; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 50; SSE41-NEXT: movd %xmm0, %eax 51; SSE41-NEXT: testl %eax, %eax 52; SSE41-NEXT: movaps %xmm0, %xmm3 53; SSE41-NEXT: js .LBB1_2 54; SSE41-NEXT: # %bb.1: 55; SSE41-NEXT: movaps %xmm2, %xmm3 56; SSE41-NEXT: .LBB1_2: 57; SSE41-NEXT: movaps %xmm3, %xmm1 58; SSE41-NEXT: cmpunordss %xmm3, %xmm1 59; SSE41-NEXT: movaps %xmm1, %xmm4 60; SSE41-NEXT: andps %xmm3, %xmm4 61; SSE41-NEXT: js .LBB1_4 62; SSE41-NEXT: # %bb.3: 63; SSE41-NEXT: movaps %xmm0, %xmm2 64; SSE41-NEXT: .LBB1_4: 65; SSE41-NEXT: maxss %xmm2, %xmm3 66; SSE41-NEXT: andnps %xmm3, %xmm1 67; SSE41-NEXT: orps %xmm4, %xmm1 68; SSE41-NEXT: movaps %xmm1, %xmm0 69; SSE41-NEXT: retq 70; 71; AVX-LABEL: test_v2f32: 72; AVX: # %bb.0: 73; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 74; AVX-NEXT: vmovd %xmm0, %eax 75; AVX-NEXT: testl %eax, %eax 76; AVX-NEXT: js .LBB1_1 77; AVX-NEXT: # %bb.2: 78; AVX-NEXT: vmovaps %xmm0, %xmm2 79; AVX-NEXT: jmp .LBB1_3 80; AVX-NEXT: .LBB1_1: 81; AVX-NEXT: vmovaps %xmm1, %xmm2 82; AVX-NEXT: vmovaps %xmm0, %xmm1 83; AVX-NEXT: .LBB1_3: 84; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm0 85; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2 86; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0 87; AVX-NEXT: retq 88; 89; AVX512-LABEL: test_v2f32: 90; AVX512: # %bb.0: 91; AVX512-NEXT: vmovd %xmm0, %eax 92; AVX512-NEXT: testl %eax, %eax 93; AVX512-NEXT: sets %al 94; AVX512-NEXT: kmovd %eax, %k1 95; AVX512-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 96; AVX512-NEXT: vmovaps %xmm0, %xmm2 97; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 98; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 99; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm0 100; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1 101; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 102; AVX512-NEXT: retq 103 %1 = call float @llvm.vector.reduce.fmaximum.v2f32(<2 x float> %a0) 104 ret float %1 105} 106 107define float @test_v4f32(<4 x float> %a0) { 108; SSE2-LABEL: test_v4f32: 109; SSE2: # %bb.0: 110; SSE2-NEXT: movaps %xmm0, %xmm3 111; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1] 112; SSE2-NEXT: movd %xmm0, %eax 113; SSE2-NEXT: testl %eax, %eax 114; SSE2-NEXT: movaps %xmm0, %xmm4 115; SSE2-NEXT: js .LBB2_2 116; SSE2-NEXT: # %bb.1: 117; SSE2-NEXT: movaps %xmm3, %xmm4 118; SSE2-NEXT: .LBB2_2: 119; SSE2-NEXT: movaps %xmm0, %xmm1 120; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 121; SSE2-NEXT: movaps %xmm4, %xmm2 122; SSE2-NEXT: cmpunordss %xmm4, %xmm2 123; SSE2-NEXT: movaps %xmm2, %xmm5 124; SSE2-NEXT: andps %xmm4, %xmm5 125; SSE2-NEXT: js .LBB2_4 126; SSE2-NEXT: # %bb.3: 127; SSE2-NEXT: movaps %xmm0, %xmm3 128; SSE2-NEXT: .LBB2_4: 129; SSE2-NEXT: maxss %xmm3, %xmm4 130; SSE2-NEXT: andnps %xmm4, %xmm2 131; SSE2-NEXT: orps %xmm5, %xmm2 132; SSE2-NEXT: movd %xmm2, %eax 133; SSE2-NEXT: testl %eax, %eax 134; SSE2-NEXT: movaps %xmm2, %xmm4 135; SSE2-NEXT: js .LBB2_6 136; SSE2-NEXT: # %bb.5: 137; SSE2-NEXT: movaps %xmm1, %xmm4 138; SSE2-NEXT: .LBB2_6: 139; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 140; SSE2-NEXT: movaps %xmm4, %xmm3 141; SSE2-NEXT: cmpunordss %xmm4, %xmm3 142; SSE2-NEXT: movaps %xmm3, %xmm5 143; SSE2-NEXT: andps %xmm4, %xmm5 144; SSE2-NEXT: js .LBB2_8 145; SSE2-NEXT: # %bb.7: 146; SSE2-NEXT: movaps %xmm2, %xmm1 147; SSE2-NEXT: .LBB2_8: 148; SSE2-NEXT: maxss %xmm1, %xmm4 149; SSE2-NEXT: andnps %xmm4, %xmm3 150; SSE2-NEXT: orps %xmm5, %xmm3 151; SSE2-NEXT: movd %xmm3, %eax 152; SSE2-NEXT: testl %eax, %eax 153; SSE2-NEXT: movaps %xmm3, %xmm2 154; SSE2-NEXT: js .LBB2_10 155; SSE2-NEXT: # %bb.9: 156; SSE2-NEXT: movaps %xmm0, %xmm2 157; SSE2-NEXT: .LBB2_10: 158; SSE2-NEXT: movaps %xmm2, %xmm1 159; SSE2-NEXT: cmpunordss %xmm2, %xmm1 160; SSE2-NEXT: movaps %xmm1, %xmm4 161; SSE2-NEXT: andps %xmm2, %xmm4 162; SSE2-NEXT: js .LBB2_12 163; SSE2-NEXT: # %bb.11: 164; SSE2-NEXT: movaps %xmm3, %xmm0 165; SSE2-NEXT: .LBB2_12: 166; SSE2-NEXT: maxss %xmm0, %xmm2 167; SSE2-NEXT: andnps %xmm2, %xmm1 168; SSE2-NEXT: orps %xmm4, %xmm1 169; SSE2-NEXT: movaps %xmm1, %xmm0 170; SSE2-NEXT: retq 171; 172; SSE41-LABEL: test_v4f32: 173; SSE41: # %bb.0: 174; SSE41-NEXT: movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 175; SSE41-NEXT: movd %xmm0, %eax 176; SSE41-NEXT: testl %eax, %eax 177; SSE41-NEXT: movaps %xmm0, %xmm4 178; SSE41-NEXT: js .LBB2_2 179; SSE41-NEXT: # %bb.1: 180; SSE41-NEXT: movaps %xmm3, %xmm4 181; SSE41-NEXT: .LBB2_2: 182; SSE41-NEXT: movaps %xmm0, %xmm1 183; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 184; SSE41-NEXT: movaps %xmm4, %xmm2 185; SSE41-NEXT: cmpunordss %xmm4, %xmm2 186; SSE41-NEXT: movaps %xmm2, %xmm5 187; SSE41-NEXT: andps %xmm4, %xmm5 188; SSE41-NEXT: js .LBB2_4 189; SSE41-NEXT: # %bb.3: 190; SSE41-NEXT: movaps %xmm0, %xmm3 191; SSE41-NEXT: .LBB2_4: 192; SSE41-NEXT: maxss %xmm3, %xmm4 193; SSE41-NEXT: andnps %xmm4, %xmm2 194; SSE41-NEXT: orps %xmm5, %xmm2 195; SSE41-NEXT: movd %xmm2, %eax 196; SSE41-NEXT: testl %eax, %eax 197; SSE41-NEXT: movaps %xmm2, %xmm4 198; SSE41-NEXT: js .LBB2_6 199; SSE41-NEXT: # %bb.5: 200; SSE41-NEXT: movaps %xmm1, %xmm4 201; SSE41-NEXT: .LBB2_6: 202; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 203; SSE41-NEXT: movaps %xmm4, %xmm3 204; SSE41-NEXT: cmpunordss %xmm4, %xmm3 205; SSE41-NEXT: movaps %xmm3, %xmm5 206; SSE41-NEXT: andps %xmm4, %xmm5 207; SSE41-NEXT: js .LBB2_8 208; SSE41-NEXT: # %bb.7: 209; SSE41-NEXT: movaps %xmm2, %xmm1 210; SSE41-NEXT: .LBB2_8: 211; SSE41-NEXT: maxss %xmm1, %xmm4 212; SSE41-NEXT: andnps %xmm4, %xmm3 213; SSE41-NEXT: orps %xmm5, %xmm3 214; SSE41-NEXT: movd %xmm3, %eax 215; SSE41-NEXT: testl %eax, %eax 216; SSE41-NEXT: movaps %xmm3, %xmm2 217; SSE41-NEXT: js .LBB2_10 218; SSE41-NEXT: # %bb.9: 219; SSE41-NEXT: movaps %xmm0, %xmm2 220; SSE41-NEXT: .LBB2_10: 221; SSE41-NEXT: movaps %xmm2, %xmm1 222; SSE41-NEXT: cmpunordss %xmm2, %xmm1 223; SSE41-NEXT: movaps %xmm1, %xmm4 224; SSE41-NEXT: andps %xmm2, %xmm4 225; SSE41-NEXT: js .LBB2_12 226; SSE41-NEXT: # %bb.11: 227; SSE41-NEXT: movaps %xmm3, %xmm0 228; SSE41-NEXT: .LBB2_12: 229; SSE41-NEXT: maxss %xmm0, %xmm2 230; SSE41-NEXT: andnps %xmm2, %xmm1 231; SSE41-NEXT: orps %xmm4, %xmm1 232; SSE41-NEXT: movaps %xmm1, %xmm0 233; SSE41-NEXT: retq 234; 235; AVX-LABEL: test_v4f32: 236; AVX: # %bb.0: 237; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 238; AVX-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 239; AVX-NEXT: vmovd %xmm0, %eax 240; AVX-NEXT: testl %eax, %eax 241; AVX-NEXT: js .LBB2_1 242; AVX-NEXT: # %bb.2: 243; AVX-NEXT: vmovaps %xmm0, %xmm3 244; AVX-NEXT: jmp .LBB2_3 245; AVX-NEXT: .LBB2_1: 246; AVX-NEXT: vmovaps %xmm2, %xmm3 247; AVX-NEXT: vmovaps %xmm0, %xmm2 248; AVX-NEXT: .LBB2_3: 249; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 250; AVX-NEXT: vmaxss %xmm3, %xmm2, %xmm3 251; AVX-NEXT: vcmpunordss %xmm2, %xmm2, %xmm4 252; AVX-NEXT: vblendvps %xmm4, %xmm2, %xmm3, %xmm3 253; AVX-NEXT: vmovd %xmm3, %eax 254; AVX-NEXT: testl %eax, %eax 255; AVX-NEXT: js .LBB2_4 256; AVX-NEXT: # %bb.5: 257; AVX-NEXT: vmovaps %xmm3, %xmm2 258; AVX-NEXT: jmp .LBB2_6 259; AVX-NEXT: .LBB2_4: 260; AVX-NEXT: vmovapd %xmm1, %xmm2 261; AVX-NEXT: vmovaps %xmm3, %xmm1 262; AVX-NEXT: .LBB2_6: 263; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2 264; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3 265; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1 266; AVX-NEXT: vmovd %xmm1, %eax 267; AVX-NEXT: testl %eax, %eax 268; AVX-NEXT: js .LBB2_7 269; AVX-NEXT: # %bb.8: 270; AVX-NEXT: vmovaps %xmm1, %xmm2 271; AVX-NEXT: jmp .LBB2_9 272; AVX-NEXT: .LBB2_7: 273; AVX-NEXT: vmovaps %xmm0, %xmm2 274; AVX-NEXT: vmovaps %xmm1, %xmm0 275; AVX-NEXT: .LBB2_9: 276; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1 277; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2 278; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 279; AVX-NEXT: retq 280; 281; AVX512-LABEL: test_v4f32: 282; AVX512: # %bb.0: 283; AVX512-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 284; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0] 285; AVX512-NEXT: vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3] 286; AVX512-NEXT: vmovd %xmm0, %eax 287; AVX512-NEXT: testl %eax, %eax 288; AVX512-NEXT: sets %al 289; AVX512-NEXT: kmovd %eax, %k1 290; AVX512-NEXT: vmovaps %xmm0, %xmm4 291; AVX512-NEXT: vmovss %xmm3, %xmm4, %xmm4 {%k1} 292; AVX512-NEXT: vmovss %xmm0, %xmm3, %xmm3 {%k1} 293; AVX512-NEXT: vmaxss %xmm4, %xmm3, %xmm0 294; AVX512-NEXT: vcmpunordss %xmm3, %xmm3, %k1 295; AVX512-NEXT: vmovss %xmm3, %xmm0, %xmm0 {%k1} 296; AVX512-NEXT: vmovd %xmm0, %eax 297; AVX512-NEXT: testl %eax, %eax 298; AVX512-NEXT: sets %al 299; AVX512-NEXT: kmovd %eax, %k1 300; AVX512-NEXT: vmovaps %xmm0, %xmm3 301; AVX512-NEXT: vmovss %xmm2, %xmm3, %xmm3 {%k1} 302; AVX512-NEXT: vmovss %xmm0, %xmm2, %xmm2 {%k1} 303; AVX512-NEXT: vmaxss %xmm3, %xmm2, %xmm0 304; AVX512-NEXT: vcmpunordss %xmm2, %xmm2, %k1 305; AVX512-NEXT: vmovss %xmm2, %xmm0, %xmm0 {%k1} 306; AVX512-NEXT: vmovd %xmm0, %eax 307; AVX512-NEXT: testl %eax, %eax 308; AVX512-NEXT: sets %al 309; AVX512-NEXT: kmovd %eax, %k1 310; AVX512-NEXT: vmovaps %xmm0, %xmm2 311; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 312; AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 313; AVX512-NEXT: vmaxss %xmm2, %xmm1, %xmm0 314; AVX512-NEXT: vcmpunordss %xmm1, %xmm1, %k1 315; AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 316; AVX512-NEXT: retq 317 %1 = call float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %a0) 318 ret float %1 319} 320 321define float @test_v8f32(<8 x float> %a0) { 322; SSE2-LABEL: test_v8f32: 323; SSE2: # %bb.0: 324; SSE2-NEXT: pxor %xmm2, %xmm2 325; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 326; SSE2-NEXT: movdqa %xmm2, %xmm3 327; SSE2-NEXT: pandn %xmm0, %xmm3 328; SSE2-NEXT: movdqa %xmm2, %xmm4 329; SSE2-NEXT: pandn %xmm1, %xmm4 330; SSE2-NEXT: pand %xmm2, %xmm1 331; SSE2-NEXT: por %xmm3, %xmm1 332; SSE2-NEXT: pand %xmm0, %xmm2 333; SSE2-NEXT: por %xmm4, %xmm2 334; SSE2-NEXT: movdqa %xmm2, %xmm3 335; SSE2-NEXT: maxps %xmm1, %xmm3 336; SSE2-NEXT: movdqa %xmm2, %xmm0 337; SSE2-NEXT: cmpunordps %xmm2, %xmm0 338; SSE2-NEXT: andps %xmm0, %xmm2 339; SSE2-NEXT: andnps %xmm3, %xmm0 340; SSE2-NEXT: orps %xmm2, %xmm0 341; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1] 342; SSE2-NEXT: movd %xmm0, %eax 343; SSE2-NEXT: testl %eax, %eax 344; SSE2-NEXT: movdqa %xmm0, %xmm3 345; SSE2-NEXT: js .LBB3_2 346; SSE2-NEXT: # %bb.1: 347; SSE2-NEXT: movdqa %xmm2, %xmm3 348; SSE2-NEXT: .LBB3_2: 349; SSE2-NEXT: movdqa %xmm3, %xmm1 350; SSE2-NEXT: cmpunordss %xmm3, %xmm1 351; SSE2-NEXT: movaps %xmm1, %xmm4 352; SSE2-NEXT: andps %xmm3, %xmm4 353; SSE2-NEXT: js .LBB3_4 354; SSE2-NEXT: # %bb.3: 355; SSE2-NEXT: movdqa %xmm0, %xmm2 356; SSE2-NEXT: .LBB3_4: 357; SSE2-NEXT: maxss %xmm2, %xmm3 358; SSE2-NEXT: andnps %xmm3, %xmm1 359; SSE2-NEXT: orps %xmm4, %xmm1 360; SSE2-NEXT: movd %xmm1, %eax 361; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3] 362; SSE2-NEXT: testl %eax, %eax 363; SSE2-NEXT: movdqa %xmm1, %xmm4 364; SSE2-NEXT: js .LBB3_6 365; SSE2-NEXT: # %bb.5: 366; SSE2-NEXT: movdqa %xmm3, %xmm4 367; SSE2-NEXT: .LBB3_6: 368; SSE2-NEXT: movdqa %xmm4, %xmm2 369; SSE2-NEXT: cmpunordss %xmm4, %xmm2 370; SSE2-NEXT: movaps %xmm2, %xmm5 371; SSE2-NEXT: andps %xmm4, %xmm5 372; SSE2-NEXT: js .LBB3_8 373; SSE2-NEXT: # %bb.7: 374; SSE2-NEXT: movdqa %xmm1, %xmm3 375; SSE2-NEXT: .LBB3_8: 376; SSE2-NEXT: maxss %xmm3, %xmm4 377; SSE2-NEXT: andnps %xmm4, %xmm2 378; SSE2-NEXT: orps %xmm5, %xmm2 379; SSE2-NEXT: movd %xmm2, %eax 380; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3] 381; SSE2-NEXT: testl %eax, %eax 382; SSE2-NEXT: movdqa %xmm2, %xmm3 383; SSE2-NEXT: js .LBB3_10 384; SSE2-NEXT: # %bb.9: 385; SSE2-NEXT: movdqa %xmm1, %xmm3 386; SSE2-NEXT: .LBB3_10: 387; SSE2-NEXT: movdqa %xmm3, %xmm0 388; SSE2-NEXT: cmpunordss %xmm3, %xmm0 389; SSE2-NEXT: movaps %xmm0, %xmm4 390; SSE2-NEXT: andps %xmm3, %xmm4 391; SSE2-NEXT: js .LBB3_12 392; SSE2-NEXT: # %bb.11: 393; SSE2-NEXT: movdqa %xmm2, %xmm1 394; SSE2-NEXT: .LBB3_12: 395; SSE2-NEXT: maxss %xmm1, %xmm3 396; SSE2-NEXT: andnps %xmm3, %xmm0 397; SSE2-NEXT: orps %xmm4, %xmm0 398; SSE2-NEXT: retq 399; 400; SSE41-LABEL: test_v8f32: 401; SSE41: # %bb.0: 402; SSE41-NEXT: movaps %xmm0, %xmm3 403; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3 404; SSE41-NEXT: blendvps %xmm0, %xmm0, %xmm1 405; SSE41-NEXT: movaps %xmm1, %xmm2 406; SSE41-NEXT: maxps %xmm3, %xmm2 407; SSE41-NEXT: movaps %xmm1, %xmm0 408; SSE41-NEXT: cmpunordps %xmm1, %xmm0 409; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 410; SSE41-NEXT: movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3] 411; SSE41-NEXT: movd %xmm2, %eax 412; SSE41-NEXT: testl %eax, %eax 413; SSE41-NEXT: movaps %xmm2, %xmm3 414; SSE41-NEXT: js .LBB3_2 415; SSE41-NEXT: # %bb.1: 416; SSE41-NEXT: movaps %xmm1, %xmm3 417; SSE41-NEXT: .LBB3_2: 418; SSE41-NEXT: movaps %xmm3, %xmm0 419; SSE41-NEXT: cmpunordss %xmm3, %xmm0 420; SSE41-NEXT: movaps %xmm0, %xmm4 421; SSE41-NEXT: andps %xmm3, %xmm4 422; SSE41-NEXT: js .LBB3_4 423; SSE41-NEXT: # %bb.3: 424; SSE41-NEXT: movaps %xmm2, %xmm1 425; SSE41-NEXT: .LBB3_4: 426; SSE41-NEXT: maxss %xmm1, %xmm3 427; SSE41-NEXT: andnps %xmm3, %xmm0 428; SSE41-NEXT: orps %xmm4, %xmm0 429; SSE41-NEXT: movd %xmm0, %eax 430; SSE41-NEXT: movaps %xmm2, %xmm3 431; SSE41-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm2[1] 432; SSE41-NEXT: testl %eax, %eax 433; SSE41-NEXT: movaps %xmm0, %xmm4 434; SSE41-NEXT: js .LBB3_6 435; SSE41-NEXT: # %bb.5: 436; SSE41-NEXT: movaps %xmm3, %xmm4 437; SSE41-NEXT: .LBB3_6: 438; SSE41-NEXT: movaps %xmm4, %xmm1 439; SSE41-NEXT: cmpunordss %xmm4, %xmm1 440; SSE41-NEXT: movaps %xmm1, %xmm5 441; SSE41-NEXT: andps %xmm4, %xmm5 442; SSE41-NEXT: js .LBB3_8 443; SSE41-NEXT: # %bb.7: 444; SSE41-NEXT: movaps %xmm0, %xmm3 445; SSE41-NEXT: .LBB3_8: 446; SSE41-NEXT: maxss %xmm3, %xmm4 447; SSE41-NEXT: andnps %xmm4, %xmm1 448; SSE41-NEXT: orps %xmm5, %xmm1 449; SSE41-NEXT: movd %xmm1, %eax 450; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,3,3,3] 451; SSE41-NEXT: testl %eax, %eax 452; SSE41-NEXT: movaps %xmm1, %xmm3 453; SSE41-NEXT: js .LBB3_10 454; SSE41-NEXT: # %bb.9: 455; SSE41-NEXT: movaps %xmm2, %xmm3 456; SSE41-NEXT: .LBB3_10: 457; SSE41-NEXT: movaps %xmm3, %xmm0 458; SSE41-NEXT: cmpunordss %xmm3, %xmm0 459; SSE41-NEXT: movaps %xmm0, %xmm4 460; SSE41-NEXT: andps %xmm3, %xmm4 461; SSE41-NEXT: js .LBB3_12 462; SSE41-NEXT: # %bb.11: 463; SSE41-NEXT: movaps %xmm1, %xmm2 464; SSE41-NEXT: .LBB3_12: 465; SSE41-NEXT: maxss %xmm2, %xmm3 466; SSE41-NEXT: andnps %xmm3, %xmm0 467; SSE41-NEXT: orps %xmm4, %xmm0 468; SSE41-NEXT: retq 469; 470; AVX-LABEL: test_v8f32: 471; AVX: # %bb.0: 472; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 473; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2 474; AVX-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0 475; AVX-NEXT: vmaxps %xmm2, %xmm0, %xmm1 476; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2 477; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 478; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 479; AVX-NEXT: vmovd %xmm0, %eax 480; AVX-NEXT: testl %eax, %eax 481; AVX-NEXT: js .LBB3_1 482; AVX-NEXT: # %bb.2: 483; AVX-NEXT: vmovaps %xmm0, %xmm2 484; AVX-NEXT: jmp .LBB3_3 485; AVX-NEXT: .LBB3_1: 486; AVX-NEXT: vmovaps %xmm1, %xmm2 487; AVX-NEXT: vmovaps %xmm0, %xmm1 488; AVX-NEXT: .LBB3_3: 489; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2 490; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3 491; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm2 492; AVX-NEXT: vmovd %xmm2, %eax 493; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 494; AVX-NEXT: testl %eax, %eax 495; AVX-NEXT: js .LBB3_4 496; AVX-NEXT: # %bb.5: 497; AVX-NEXT: vmovaps %xmm2, %xmm3 498; AVX-NEXT: jmp .LBB3_6 499; AVX-NEXT: .LBB3_4: 500; AVX-NEXT: vmovapd %xmm1, %xmm3 501; AVX-NEXT: vmovaps %xmm2, %xmm1 502; AVX-NEXT: .LBB3_6: 503; AVX-NEXT: vmaxss %xmm3, %xmm1, %xmm2 504; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3 505; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1 506; AVX-NEXT: vmovd %xmm1, %eax 507; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 508; AVX-NEXT: testl %eax, %eax 509; AVX-NEXT: js .LBB3_7 510; AVX-NEXT: # %bb.8: 511; AVX-NEXT: vmovaps %xmm1, %xmm2 512; AVX-NEXT: jmp .LBB3_9 513; AVX-NEXT: .LBB3_7: 514; AVX-NEXT: vmovaps %xmm0, %xmm2 515; AVX-NEXT: vmovaps %xmm1, %xmm0 516; AVX-NEXT: .LBB3_9: 517; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1 518; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2 519; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 520; AVX-NEXT: vzeroupper 521; AVX-NEXT: retq 522; 523; AVX512BW-LABEL: test_v8f32: 524; AVX512BW: # %bb.0: 525; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 526; AVX512BW-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2 527; AVX512BW-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0 528; AVX512BW-NEXT: vmaxps %xmm2, %xmm0, %xmm1 529; AVX512BW-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2 530; AVX512BW-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 531; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 532; AVX512BW-NEXT: vmovd %xmm0, %eax 533; AVX512BW-NEXT: testl %eax, %eax 534; AVX512BW-NEXT: sets %al 535; AVX512BW-NEXT: kmovd %eax, %k1 536; AVX512BW-NEXT: vmovaps %xmm0, %xmm2 537; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 538; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 539; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2 540; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 541; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 542; AVX512BW-NEXT: vmovd %xmm2, %eax 543; AVX512BW-NEXT: testl %eax, %eax 544; AVX512BW-NEXT: sets %al 545; AVX512BW-NEXT: kmovd %eax, %k1 546; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 547; AVX512BW-NEXT: vmovaps %xmm2, %xmm3 548; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 549; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 550; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2 551; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 552; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 553; AVX512BW-NEXT: vmovd %xmm2, %eax 554; AVX512BW-NEXT: testl %eax, %eax 555; AVX512BW-NEXT: sets %al 556; AVX512BW-NEXT: kmovd %eax, %k1 557; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 558; AVX512BW-NEXT: vmovaps %xmm2, %xmm0 559; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 560; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 561; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0 562; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 563; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 564; AVX512BW-NEXT: vzeroupper 565; AVX512BW-NEXT: retq 566; 567; AVX512VL-LABEL: test_v8f32: 568; AVX512VL: # %bb.0: 569; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 570; AVX512VL-NEXT: vpcmpgtd %xmm0, %xmm1, %k1 571; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 572; AVX512VL-NEXT: vblendmps %xmm1, %xmm0, %xmm2 {%k1} 573; AVX512VL-NEXT: vmovaps %xmm0, %xmm1 {%k1} 574; AVX512VL-NEXT: vmaxps %xmm2, %xmm1, %xmm0 575; AVX512VL-NEXT: vcmpunordps %xmm1, %xmm1, %k1 576; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 {%k1} 577; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 578; AVX512VL-NEXT: vmovd %xmm0, %eax 579; AVX512VL-NEXT: testl %eax, %eax 580; AVX512VL-NEXT: sets %al 581; AVX512VL-NEXT: kmovd %eax, %k1 582; AVX512VL-NEXT: vmovaps %xmm0, %xmm2 583; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 584; AVX512VL-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 585; AVX512VL-NEXT: vmaxss %xmm2, %xmm1, %xmm2 586; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 587; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 588; AVX512VL-NEXT: vmovd %xmm2, %eax 589; AVX512VL-NEXT: testl %eax, %eax 590; AVX512VL-NEXT: sets %al 591; AVX512VL-NEXT: kmovd %eax, %k1 592; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 593; AVX512VL-NEXT: vmovaps %xmm2, %xmm3 594; AVX512VL-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 595; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 596; AVX512VL-NEXT: vmaxss %xmm3, %xmm1, %xmm2 597; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 598; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 599; AVX512VL-NEXT: vmovd %xmm2, %eax 600; AVX512VL-NEXT: testl %eax, %eax 601; AVX512VL-NEXT: sets %al 602; AVX512VL-NEXT: kmovd %eax, %k1 603; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 604; AVX512VL-NEXT: vmovaps %xmm2, %xmm0 605; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 606; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 607; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0 608; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 609; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 610; AVX512VL-NEXT: vzeroupper 611; AVX512VL-NEXT: retq 612 %1 = call float @llvm.vector.reduce.fmaximum.v8f32(<8 x float> %a0) 613 ret float %1 614} 615 616define float @test_v16f32(<16 x float> %a0) { 617; SSE2-LABEL: test_v16f32: 618; SSE2: # %bb.0: 619; SSE2-NEXT: pxor %xmm4, %xmm4 620; SSE2-NEXT: pxor %xmm5, %xmm5 621; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 622; SSE2-NEXT: movdqa %xmm5, %xmm6 623; SSE2-NEXT: pandn %xmm0, %xmm6 624; SSE2-NEXT: movdqa %xmm5, %xmm7 625; SSE2-NEXT: pandn %xmm2, %xmm7 626; SSE2-NEXT: pand %xmm5, %xmm2 627; SSE2-NEXT: por %xmm6, %xmm2 628; SSE2-NEXT: pand %xmm0, %xmm5 629; SSE2-NEXT: por %xmm7, %xmm5 630; SSE2-NEXT: movdqa %xmm5, %xmm6 631; SSE2-NEXT: maxps %xmm2, %xmm6 632; SSE2-NEXT: movdqa %xmm5, %xmm0 633; SSE2-NEXT: cmpunordps %xmm5, %xmm0 634; SSE2-NEXT: andps %xmm0, %xmm5 635; SSE2-NEXT: andnps %xmm6, %xmm0 636; SSE2-NEXT: orps %xmm5, %xmm0 637; SSE2-NEXT: pxor %xmm2, %xmm2 638; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 639; SSE2-NEXT: movdqa %xmm2, %xmm5 640; SSE2-NEXT: pandn %xmm0, %xmm5 641; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 642; SSE2-NEXT: movdqa %xmm4, %xmm6 643; SSE2-NEXT: pandn %xmm1, %xmm6 644; SSE2-NEXT: movdqa %xmm4, %xmm7 645; SSE2-NEXT: pandn %xmm3, %xmm7 646; SSE2-NEXT: pand %xmm4, %xmm3 647; SSE2-NEXT: por %xmm6, %xmm3 648; SSE2-NEXT: pand %xmm1, %xmm4 649; SSE2-NEXT: por %xmm7, %xmm4 650; SSE2-NEXT: movdqa %xmm4, %xmm1 651; SSE2-NEXT: maxps %xmm3, %xmm1 652; SSE2-NEXT: movdqa %xmm4, %xmm3 653; SSE2-NEXT: cmpunordps %xmm4, %xmm3 654; SSE2-NEXT: andps %xmm3, %xmm4 655; SSE2-NEXT: andnps %xmm1, %xmm3 656; SSE2-NEXT: orps %xmm4, %xmm3 657; SSE2-NEXT: movdqa %xmm2, %xmm1 658; SSE2-NEXT: pandn %xmm3, %xmm1 659; SSE2-NEXT: pand %xmm2, %xmm3 660; SSE2-NEXT: por %xmm5, %xmm3 661; SSE2-NEXT: pand %xmm0, %xmm2 662; SSE2-NEXT: por %xmm1, %xmm2 663; SSE2-NEXT: movdqa %xmm2, %xmm1 664; SSE2-NEXT: maxps %xmm3, %xmm1 665; SSE2-NEXT: movdqa %xmm2, %xmm0 666; SSE2-NEXT: cmpunordps %xmm2, %xmm0 667; SSE2-NEXT: andps %xmm0, %xmm2 668; SSE2-NEXT: andnps %xmm1, %xmm0 669; SSE2-NEXT: orps %xmm2, %xmm0 670; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1] 671; SSE2-NEXT: movd %xmm0, %eax 672; SSE2-NEXT: testl %eax, %eax 673; SSE2-NEXT: movdqa %xmm0, %xmm3 674; SSE2-NEXT: js .LBB4_2 675; SSE2-NEXT: # %bb.1: 676; SSE2-NEXT: movdqa %xmm2, %xmm3 677; SSE2-NEXT: .LBB4_2: 678; SSE2-NEXT: movdqa %xmm3, %xmm1 679; SSE2-NEXT: cmpunordss %xmm3, %xmm1 680; SSE2-NEXT: movaps %xmm1, %xmm4 681; SSE2-NEXT: andps %xmm3, %xmm4 682; SSE2-NEXT: js .LBB4_4 683; SSE2-NEXT: # %bb.3: 684; SSE2-NEXT: movdqa %xmm0, %xmm2 685; SSE2-NEXT: .LBB4_4: 686; SSE2-NEXT: maxss %xmm2, %xmm3 687; SSE2-NEXT: andnps %xmm3, %xmm1 688; SSE2-NEXT: orps %xmm4, %xmm1 689; SSE2-NEXT: movd %xmm1, %eax 690; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3] 691; SSE2-NEXT: testl %eax, %eax 692; SSE2-NEXT: movdqa %xmm1, %xmm4 693; SSE2-NEXT: js .LBB4_6 694; SSE2-NEXT: # %bb.5: 695; SSE2-NEXT: movdqa %xmm3, %xmm4 696; SSE2-NEXT: .LBB4_6: 697; SSE2-NEXT: movdqa %xmm4, %xmm2 698; SSE2-NEXT: cmpunordss %xmm4, %xmm2 699; SSE2-NEXT: movaps %xmm2, %xmm5 700; SSE2-NEXT: andps %xmm4, %xmm5 701; SSE2-NEXT: js .LBB4_8 702; SSE2-NEXT: # %bb.7: 703; SSE2-NEXT: movdqa %xmm1, %xmm3 704; SSE2-NEXT: .LBB4_8: 705; SSE2-NEXT: maxss %xmm3, %xmm4 706; SSE2-NEXT: andnps %xmm4, %xmm2 707; SSE2-NEXT: orps %xmm5, %xmm2 708; SSE2-NEXT: movd %xmm2, %eax 709; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3] 710; SSE2-NEXT: testl %eax, %eax 711; SSE2-NEXT: movdqa %xmm2, %xmm3 712; SSE2-NEXT: js .LBB4_10 713; SSE2-NEXT: # %bb.9: 714; SSE2-NEXT: movdqa %xmm1, %xmm3 715; SSE2-NEXT: .LBB4_10: 716; SSE2-NEXT: movdqa %xmm3, %xmm0 717; SSE2-NEXT: cmpunordss %xmm3, %xmm0 718; SSE2-NEXT: movaps %xmm0, %xmm4 719; SSE2-NEXT: andps %xmm3, %xmm4 720; SSE2-NEXT: js .LBB4_12 721; SSE2-NEXT: # %bb.11: 722; SSE2-NEXT: movdqa %xmm2, %xmm1 723; SSE2-NEXT: .LBB4_12: 724; SSE2-NEXT: maxss %xmm1, %xmm3 725; SSE2-NEXT: andnps %xmm3, %xmm0 726; SSE2-NEXT: orps %xmm4, %xmm0 727; SSE2-NEXT: retq 728; 729; SSE41-LABEL: test_v16f32: 730; SSE41: # %bb.0: 731; SSE41-NEXT: movaps %xmm0, %xmm4 732; SSE41-NEXT: movaps %xmm1, %xmm6 733; SSE41-NEXT: movaps %xmm1, %xmm0 734; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm6 735; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3 736; SSE41-NEXT: movaps %xmm3, %xmm5 737; SSE41-NEXT: maxps %xmm6, %xmm5 738; SSE41-NEXT: movaps %xmm3, %xmm0 739; SSE41-NEXT: cmpunordps %xmm3, %xmm0 740; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm5 741; SSE41-NEXT: movaps %xmm4, %xmm3 742; SSE41-NEXT: movaps %xmm4, %xmm0 743; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm3 744; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm2 745; SSE41-NEXT: movaps %xmm2, %xmm1 746; SSE41-NEXT: maxps %xmm3, %xmm1 747; SSE41-NEXT: movaps %xmm2, %xmm0 748; SSE41-NEXT: cmpunordps %xmm2, %xmm0 749; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1 750; SSE41-NEXT: movaps %xmm1, %xmm2 751; SSE41-NEXT: movaps %xmm1, %xmm0 752; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2 753; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm5 754; SSE41-NEXT: movaps %xmm5, %xmm1 755; SSE41-NEXT: maxps %xmm2, %xmm1 756; SSE41-NEXT: movaps %xmm5, %xmm0 757; SSE41-NEXT: cmpunordps %xmm5, %xmm0 758; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm1 759; SSE41-NEXT: movshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 760; SSE41-NEXT: movd %xmm1, %eax 761; SSE41-NEXT: testl %eax, %eax 762; SSE41-NEXT: movaps %xmm1, %xmm3 763; SSE41-NEXT: js .LBB4_2 764; SSE41-NEXT: # %bb.1: 765; SSE41-NEXT: movaps %xmm2, %xmm3 766; SSE41-NEXT: .LBB4_2: 767; SSE41-NEXT: movaps %xmm3, %xmm0 768; SSE41-NEXT: cmpunordss %xmm3, %xmm0 769; SSE41-NEXT: movaps %xmm0, %xmm4 770; SSE41-NEXT: andps %xmm3, %xmm4 771; SSE41-NEXT: js .LBB4_4 772; SSE41-NEXT: # %bb.3: 773; SSE41-NEXT: movaps %xmm1, %xmm2 774; SSE41-NEXT: .LBB4_4: 775; SSE41-NEXT: maxss %xmm2, %xmm3 776; SSE41-NEXT: andnps %xmm3, %xmm0 777; SSE41-NEXT: orps %xmm4, %xmm0 778; SSE41-NEXT: movd %xmm0, %eax 779; SSE41-NEXT: movaps %xmm1, %xmm3 780; SSE41-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1] 781; SSE41-NEXT: testl %eax, %eax 782; SSE41-NEXT: movaps %xmm0, %xmm4 783; SSE41-NEXT: js .LBB4_6 784; SSE41-NEXT: # %bb.5: 785; SSE41-NEXT: movaps %xmm3, %xmm4 786; SSE41-NEXT: .LBB4_6: 787; SSE41-NEXT: movaps %xmm4, %xmm2 788; SSE41-NEXT: cmpunordss %xmm4, %xmm2 789; SSE41-NEXT: movaps %xmm2, %xmm5 790; SSE41-NEXT: andps %xmm4, %xmm5 791; SSE41-NEXT: js .LBB4_8 792; SSE41-NEXT: # %bb.7: 793; SSE41-NEXT: movaps %xmm0, %xmm3 794; SSE41-NEXT: .LBB4_8: 795; SSE41-NEXT: maxss %xmm3, %xmm4 796; SSE41-NEXT: andnps %xmm4, %xmm2 797; SSE41-NEXT: orps %xmm5, %xmm2 798; SSE41-NEXT: movd %xmm2, %eax 799; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3,3,3] 800; SSE41-NEXT: testl %eax, %eax 801; SSE41-NEXT: movaps %xmm2, %xmm3 802; SSE41-NEXT: js .LBB4_10 803; SSE41-NEXT: # %bb.9: 804; SSE41-NEXT: movaps %xmm1, %xmm3 805; SSE41-NEXT: .LBB4_10: 806; SSE41-NEXT: movaps %xmm3, %xmm0 807; SSE41-NEXT: cmpunordss %xmm3, %xmm0 808; SSE41-NEXT: movaps %xmm0, %xmm4 809; SSE41-NEXT: andps %xmm3, %xmm4 810; SSE41-NEXT: js .LBB4_12 811; SSE41-NEXT: # %bb.11: 812; SSE41-NEXT: movaps %xmm2, %xmm1 813; SSE41-NEXT: .LBB4_12: 814; SSE41-NEXT: maxss %xmm1, %xmm3 815; SSE41-NEXT: andnps %xmm3, %xmm0 816; SSE41-NEXT: orps %xmm4, %xmm0 817; SSE41-NEXT: retq 818; 819; AVX-LABEL: test_v16f32: 820; AVX: # %bb.0: 821; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm0, %ymm2 822; AVX-NEXT: vblendvps %ymm0, %ymm0, %ymm1, %ymm0 823; AVX-NEXT: vmaxps %ymm2, %ymm0, %ymm1 824; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm2 825; AVX-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0 826; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 827; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2 828; AVX-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0 829; AVX-NEXT: vmaxps %xmm2, %xmm0, %xmm1 830; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2 831; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 832; AVX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 833; AVX-NEXT: vmovd %xmm0, %eax 834; AVX-NEXT: testl %eax, %eax 835; AVX-NEXT: js .LBB4_1 836; AVX-NEXT: # %bb.2: 837; AVX-NEXT: vmovaps %xmm0, %xmm2 838; AVX-NEXT: jmp .LBB4_3 839; AVX-NEXT: .LBB4_1: 840; AVX-NEXT: vmovaps %xmm1, %xmm2 841; AVX-NEXT: vmovaps %xmm0, %xmm1 842; AVX-NEXT: .LBB4_3: 843; AVX-NEXT: vmaxss %xmm2, %xmm1, %xmm2 844; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3 845; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm2 846; AVX-NEXT: vmovd %xmm2, %eax 847; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 848; AVX-NEXT: testl %eax, %eax 849; AVX-NEXT: js .LBB4_4 850; AVX-NEXT: # %bb.5: 851; AVX-NEXT: vmovaps %xmm2, %xmm3 852; AVX-NEXT: jmp .LBB4_6 853; AVX-NEXT: .LBB4_4: 854; AVX-NEXT: vmovapd %xmm1, %xmm3 855; AVX-NEXT: vmovaps %xmm2, %xmm1 856; AVX-NEXT: .LBB4_6: 857; AVX-NEXT: vmaxss %xmm3, %xmm1, %xmm2 858; AVX-NEXT: vcmpunordss %xmm1, %xmm1, %xmm3 859; AVX-NEXT: vblendvps %xmm3, %xmm1, %xmm2, %xmm1 860; AVX-NEXT: vmovd %xmm1, %eax 861; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 862; AVX-NEXT: testl %eax, %eax 863; AVX-NEXT: js .LBB4_7 864; AVX-NEXT: # %bb.8: 865; AVX-NEXT: vmovaps %xmm1, %xmm2 866; AVX-NEXT: jmp .LBB4_9 867; AVX-NEXT: .LBB4_7: 868; AVX-NEXT: vmovaps %xmm0, %xmm2 869; AVX-NEXT: vmovaps %xmm1, %xmm0 870; AVX-NEXT: .LBB4_9: 871; AVX-NEXT: vmaxss %xmm2, %xmm0, %xmm1 872; AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2 873; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 874; AVX-NEXT: vzeroupper 875; AVX-NEXT: retq 876; 877; AVX512BW-LABEL: test_v16f32: 878; AVX512BW: # %bb.0: 879; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm1 880; AVX512BW-NEXT: vblendvps %ymm0, %ymm1, %ymm0, %ymm2 881; AVX512BW-NEXT: vblendvps %ymm0, %ymm0, %ymm1, %ymm0 882; AVX512BW-NEXT: vmaxps %ymm2, %ymm0, %ymm1 883; AVX512BW-NEXT: vcmpunordps %ymm0, %ymm0, %ymm2 884; AVX512BW-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0 885; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 886; AVX512BW-NEXT: vblendvps %xmm0, %xmm1, %xmm0, %xmm2 887; AVX512BW-NEXT: vblendvps %xmm0, %xmm0, %xmm1, %xmm0 888; AVX512BW-NEXT: vmaxps %xmm2, %xmm0, %xmm1 889; AVX512BW-NEXT: vcmpunordps %xmm0, %xmm0, %xmm2 890; AVX512BW-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0 891; AVX512BW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 892; AVX512BW-NEXT: vmovd %xmm0, %eax 893; AVX512BW-NEXT: testl %eax, %eax 894; AVX512BW-NEXT: sets %al 895; AVX512BW-NEXT: kmovd %eax, %k1 896; AVX512BW-NEXT: vmovaps %xmm0, %xmm2 897; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 898; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 899; AVX512BW-NEXT: vmaxss %xmm2, %xmm1, %xmm2 900; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 901; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 902; AVX512BW-NEXT: vmovd %xmm2, %eax 903; AVX512BW-NEXT: testl %eax, %eax 904; AVX512BW-NEXT: sets %al 905; AVX512BW-NEXT: kmovd %eax, %k1 906; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 907; AVX512BW-NEXT: vmovaps %xmm2, %xmm3 908; AVX512BW-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 909; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 910; AVX512BW-NEXT: vmaxss %xmm3, %xmm1, %xmm2 911; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 912; AVX512BW-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 913; AVX512BW-NEXT: vmovd %xmm2, %eax 914; AVX512BW-NEXT: testl %eax, %eax 915; AVX512BW-NEXT: sets %al 916; AVX512BW-NEXT: kmovd %eax, %k1 917; AVX512BW-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 918; AVX512BW-NEXT: vmovaps %xmm2, %xmm0 919; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 920; AVX512BW-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 921; AVX512BW-NEXT: vmaxss %xmm0, %xmm1, %xmm0 922; AVX512BW-NEXT: vcmpunordss %xmm1, %xmm1, %k1 923; AVX512BW-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 924; AVX512BW-NEXT: vzeroupper 925; AVX512BW-NEXT: retq 926; 927; AVX512VL-LABEL: test_v16f32: 928; AVX512VL: # %bb.0: 929; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 930; AVX512VL-NEXT: vpcmpgtd %ymm0, %ymm1, %k1 931; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 932; AVX512VL-NEXT: vblendmps %ymm1, %ymm0, %ymm2 {%k1} 933; AVX512VL-NEXT: vmovaps %ymm0, %ymm1 {%k1} 934; AVX512VL-NEXT: vmaxps %ymm2, %ymm1, %ymm0 935; AVX512VL-NEXT: vcmpunordps %ymm1, %ymm1, %k1 936; AVX512VL-NEXT: vmovaps %ymm1, %ymm0 {%k1} 937; AVX512VL-NEXT: vxorps %xmm1, %xmm1, %xmm1 938; AVX512VL-NEXT: vpcmpgtd %xmm0, %xmm1, %k1 939; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1 940; AVX512VL-NEXT: vblendmps %xmm1, %xmm0, %xmm2 {%k1} 941; AVX512VL-NEXT: vmovaps %xmm0, %xmm1 {%k1} 942; AVX512VL-NEXT: vmaxps %xmm2, %xmm1, %xmm0 943; AVX512VL-NEXT: vcmpunordps %xmm1, %xmm1, %k1 944; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 {%k1} 945; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 946; AVX512VL-NEXT: vmovd %xmm0, %eax 947; AVX512VL-NEXT: testl %eax, %eax 948; AVX512VL-NEXT: sets %al 949; AVX512VL-NEXT: kmovd %eax, %k1 950; AVX512VL-NEXT: vmovaps %xmm0, %xmm2 951; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 952; AVX512VL-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} 953; AVX512VL-NEXT: vmaxss %xmm2, %xmm1, %xmm2 954; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 955; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 956; AVX512VL-NEXT: vmovd %xmm2, %eax 957; AVX512VL-NEXT: testl %eax, %eax 958; AVX512VL-NEXT: sets %al 959; AVX512VL-NEXT: kmovd %eax, %k1 960; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 961; AVX512VL-NEXT: vmovaps %xmm2, %xmm3 962; AVX512VL-NEXT: vmovss %xmm1, %xmm3, %xmm3 {%k1} 963; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 964; AVX512VL-NEXT: vmaxss %xmm3, %xmm1, %xmm2 965; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 966; AVX512VL-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1} 967; AVX512VL-NEXT: vmovd %xmm2, %eax 968; AVX512VL-NEXT: testl %eax, %eax 969; AVX512VL-NEXT: sets %al 970; AVX512VL-NEXT: kmovd %eax, %k1 971; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3] 972; AVX512VL-NEXT: vmovaps %xmm2, %xmm0 973; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 974; AVX512VL-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1} 975; AVX512VL-NEXT: vmaxss %xmm0, %xmm1, %xmm0 976; AVX512VL-NEXT: vcmpunordss %xmm1, %xmm1, %k1 977; AVX512VL-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1} 978; AVX512VL-NEXT: vzeroupper 979; AVX512VL-NEXT: retq 980 %1 = call float @llvm.vector.reduce.fmaximum.v16f32(<16 x float> %a0) 981 ret float %1 982} 983 984; 985; vXf64 986; 987 988define double @test_v2f64(<2 x double> %a0) { 989; SSE-LABEL: test_v2f64: 990; SSE: # %bb.0: 991; SSE-NEXT: movdqa %xmm0, %xmm2 992; SSE-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm0[1] 993; SSE-NEXT: movq %xmm0, %rax 994; SSE-NEXT: testq %rax, %rax 995; SSE-NEXT: movdqa %xmm0, %xmm3 996; SSE-NEXT: js .LBB5_2 997; SSE-NEXT: # %bb.1: 998; SSE-NEXT: movdqa %xmm2, %xmm3 999; SSE-NEXT: .LBB5_2: 1000; SSE-NEXT: movdqa %xmm3, %xmm1 1001; SSE-NEXT: cmpunordsd %xmm3, %xmm1 1002; SSE-NEXT: movapd %xmm1, %xmm4 1003; SSE-NEXT: andpd %xmm3, %xmm4 1004; SSE-NEXT: js .LBB5_4 1005; SSE-NEXT: # %bb.3: 1006; SSE-NEXT: movdqa %xmm0, %xmm2 1007; SSE-NEXT: .LBB5_4: 1008; SSE-NEXT: maxsd %xmm2, %xmm3 1009; SSE-NEXT: andnpd %xmm3, %xmm1 1010; SSE-NEXT: orpd %xmm4, %xmm1 1011; SSE-NEXT: movapd %xmm1, %xmm0 1012; SSE-NEXT: retq 1013; 1014; AVX-LABEL: test_v2f64: 1015; AVX: # %bb.0: 1016; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1017; AVX-NEXT: vmovq %xmm0, %rax 1018; AVX-NEXT: testq %rax, %rax 1019; AVX-NEXT: js .LBB5_1 1020; AVX-NEXT: # %bb.2: 1021; AVX-NEXT: vmovapd %xmm0, %xmm2 1022; AVX-NEXT: jmp .LBB5_3 1023; AVX-NEXT: .LBB5_1: 1024; AVX-NEXT: vmovapd %xmm1, %xmm2 1025; AVX-NEXT: vmovapd %xmm0, %xmm1 1026; AVX-NEXT: .LBB5_3: 1027; AVX-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1028; AVX-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2 1029; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0 1030; AVX-NEXT: retq 1031; 1032; AVX512-LABEL: test_v2f64: 1033; AVX512: # %bb.0: 1034; AVX512-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1035; AVX512-NEXT: vmovq %xmm0, %rax 1036; AVX512-NEXT: testq %rax, %rax 1037; AVX512-NEXT: sets %al 1038; AVX512-NEXT: kmovd %eax, %k1 1039; AVX512-NEXT: vmovapd %xmm0, %xmm2 1040; AVX512-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1041; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1042; AVX512-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1043; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1044; AVX512-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1045; AVX512-NEXT: retq 1046 %1 = call double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %a0) 1047 ret double %1 1048} 1049 1050define double @test_v4f64(<4 x double> %a0) { 1051; SSE2-LABEL: test_v4f64: 1052; SSE2: # %bb.0: 1053; SSE2-NEXT: movaps %xmm0, %xmm2 1054; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[3,3] 1055; SSE2-NEXT: pxor %xmm3, %xmm3 1056; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1057; SSE2-NEXT: movdqa %xmm3, %xmm2 1058; SSE2-NEXT: pandn %xmm0, %xmm2 1059; SSE2-NEXT: movdqa %xmm3, %xmm4 1060; SSE2-NEXT: pandn %xmm1, %xmm4 1061; SSE2-NEXT: pand %xmm3, %xmm1 1062; SSE2-NEXT: por %xmm2, %xmm1 1063; SSE2-NEXT: pand %xmm0, %xmm3 1064; SSE2-NEXT: por %xmm4, %xmm3 1065; SSE2-NEXT: movdqa %xmm3, %xmm0 1066; SSE2-NEXT: maxpd %xmm1, %xmm0 1067; SSE2-NEXT: movdqa %xmm3, %xmm1 1068; SSE2-NEXT: cmpunordpd %xmm3, %xmm1 1069; SSE2-NEXT: andpd %xmm1, %xmm3 1070; SSE2-NEXT: andnpd %xmm0, %xmm1 1071; SSE2-NEXT: orpd %xmm3, %xmm1 1072; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 1073; SSE2-NEXT: movq %xmm1, %rax 1074; SSE2-NEXT: testq %rax, %rax 1075; SSE2-NEXT: movdqa %xmm1, %xmm3 1076; SSE2-NEXT: js .LBB6_2 1077; SSE2-NEXT: # %bb.1: 1078; SSE2-NEXT: movdqa %xmm2, %xmm3 1079; SSE2-NEXT: .LBB6_2: 1080; SSE2-NEXT: movdqa %xmm3, %xmm0 1081; SSE2-NEXT: cmpunordsd %xmm3, %xmm0 1082; SSE2-NEXT: movapd %xmm0, %xmm4 1083; SSE2-NEXT: andpd %xmm3, %xmm4 1084; SSE2-NEXT: js .LBB6_4 1085; SSE2-NEXT: # %bb.3: 1086; SSE2-NEXT: movdqa %xmm1, %xmm2 1087; SSE2-NEXT: .LBB6_4: 1088; SSE2-NEXT: maxsd %xmm2, %xmm3 1089; SSE2-NEXT: andnpd %xmm3, %xmm0 1090; SSE2-NEXT: orpd %xmm4, %xmm0 1091; SSE2-NEXT: retq 1092; 1093; SSE41-LABEL: test_v4f64: 1094; SSE41: # %bb.0: 1095; SSE41-NEXT: movapd %xmm0, %xmm3 1096; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 1097; SSE41-NEXT: blendvpd %xmm0, %xmm0, %xmm1 1098; SSE41-NEXT: movapd %xmm1, %xmm2 1099; SSE41-NEXT: maxpd %xmm3, %xmm2 1100; SSE41-NEXT: movapd %xmm1, %xmm0 1101; SSE41-NEXT: cmpunordpd %xmm1, %xmm0 1102; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1103; SSE41-NEXT: movapd %xmm2, %xmm1 1104; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1] 1105; SSE41-NEXT: movq %xmm2, %rax 1106; SSE41-NEXT: testq %rax, %rax 1107; SSE41-NEXT: movapd %xmm2, %xmm3 1108; SSE41-NEXT: js .LBB6_2 1109; SSE41-NEXT: # %bb.1: 1110; SSE41-NEXT: movapd %xmm1, %xmm3 1111; SSE41-NEXT: .LBB6_2: 1112; SSE41-NEXT: movapd %xmm3, %xmm0 1113; SSE41-NEXT: cmpunordsd %xmm3, %xmm0 1114; SSE41-NEXT: movapd %xmm0, %xmm4 1115; SSE41-NEXT: andpd %xmm3, %xmm4 1116; SSE41-NEXT: js .LBB6_4 1117; SSE41-NEXT: # %bb.3: 1118; SSE41-NEXT: movapd %xmm2, %xmm1 1119; SSE41-NEXT: .LBB6_4: 1120; SSE41-NEXT: maxsd %xmm1, %xmm3 1121; SSE41-NEXT: andnpd %xmm3, %xmm0 1122; SSE41-NEXT: orpd %xmm4, %xmm0 1123; SSE41-NEXT: retq 1124; 1125; AVX-LABEL: test_v4f64: 1126; AVX: # %bb.0: 1127; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1128; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1129; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1130; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1131; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1132; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1 1133; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0] 1134; AVX-NEXT: vmovq %xmm1, %rax 1135; AVX-NEXT: testq %rax, %rax 1136; AVX-NEXT: js .LBB6_1 1137; AVX-NEXT: # %bb.2: 1138; AVX-NEXT: vmovapd %xmm1, %xmm2 1139; AVX-NEXT: jmp .LBB6_3 1140; AVX-NEXT: .LBB6_1: 1141; AVX-NEXT: vmovapd %xmm0, %xmm2 1142; AVX-NEXT: vmovapd %xmm1, %xmm0 1143; AVX-NEXT: .LBB6_3: 1144; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm1 1145; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm2 1146; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1147; AVX-NEXT: vzeroupper 1148; AVX-NEXT: retq 1149; 1150; AVX512BW-LABEL: test_v4f64: 1151; AVX512BW: # %bb.0: 1152; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 1153; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1154; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1155; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1156; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1157; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1158; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1159; AVX512BW-NEXT: vmovq %xmm0, %rax 1160; AVX512BW-NEXT: testq %rax, %rax 1161; AVX512BW-NEXT: sets %al 1162; AVX512BW-NEXT: kmovd %eax, %k1 1163; AVX512BW-NEXT: vmovapd %xmm0, %xmm2 1164; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1165; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1166; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1167; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1168; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1169; AVX512BW-NEXT: vzeroupper 1170; AVX512BW-NEXT: retq 1171; 1172; AVX512VL-LABEL: test_v4f64: 1173; AVX512VL: # %bb.0: 1174; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1175; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k1 1176; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 1177; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1} 1178; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1} 1179; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm0 1180; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k1 1181; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1} 1182; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1183; AVX512VL-NEXT: vmovq %xmm0, %rax 1184; AVX512VL-NEXT: testq %rax, %rax 1185; AVX512VL-NEXT: sets %al 1186; AVX512VL-NEXT: kmovd %eax, %k1 1187; AVX512VL-NEXT: vmovapd %xmm0, %xmm2 1188; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1189; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1190; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1191; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1192; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1193; AVX512VL-NEXT: vzeroupper 1194; AVX512VL-NEXT: retq 1195 %1 = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %a0) 1196 ret double %1 1197} 1198 1199define double @test_v8f64(<8 x double> %a0) { 1200; SSE2-LABEL: test_v8f64: 1201; SSE2: # %bb.0: 1202; SSE2-NEXT: movaps %xmm0, %xmm5 1203; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[1,1],xmm0[3,3] 1204; SSE2-NEXT: pxor %xmm4, %xmm4 1205; SSE2-NEXT: pxor %xmm6, %xmm6 1206; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 1207; SSE2-NEXT: movdqa %xmm6, %xmm5 1208; SSE2-NEXT: pandn %xmm0, %xmm5 1209; SSE2-NEXT: movdqa %xmm6, %xmm7 1210; SSE2-NEXT: pandn %xmm2, %xmm7 1211; SSE2-NEXT: pand %xmm6, %xmm2 1212; SSE2-NEXT: por %xmm5, %xmm2 1213; SSE2-NEXT: pand %xmm0, %xmm6 1214; SSE2-NEXT: por %xmm7, %xmm6 1215; SSE2-NEXT: movdqa %xmm6, %xmm0 1216; SSE2-NEXT: maxpd %xmm2, %xmm0 1217; SSE2-NEXT: movdqa %xmm6, %xmm2 1218; SSE2-NEXT: cmpunordpd %xmm6, %xmm2 1219; SSE2-NEXT: andpd %xmm2, %xmm6 1220; SSE2-NEXT: andnpd %xmm0, %xmm2 1221; SSE2-NEXT: orpd %xmm6, %xmm2 1222; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1223; SSE2-NEXT: xorpd %xmm0, %xmm0 1224; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 1225; SSE2-NEXT: movdqa %xmm0, %xmm5 1226; SSE2-NEXT: pandn %xmm2, %xmm5 1227; SSE2-NEXT: movaps %xmm1, %xmm6 1228; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3] 1229; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 1230; SSE2-NEXT: movdqa %xmm4, %xmm6 1231; SSE2-NEXT: pandn %xmm1, %xmm6 1232; SSE2-NEXT: movdqa %xmm4, %xmm7 1233; SSE2-NEXT: pandn %xmm3, %xmm7 1234; SSE2-NEXT: pand %xmm4, %xmm3 1235; SSE2-NEXT: por %xmm6, %xmm3 1236; SSE2-NEXT: pand %xmm1, %xmm4 1237; SSE2-NEXT: por %xmm7, %xmm4 1238; SSE2-NEXT: movdqa %xmm4, %xmm1 1239; SSE2-NEXT: maxpd %xmm3, %xmm1 1240; SSE2-NEXT: movdqa %xmm4, %xmm3 1241; SSE2-NEXT: cmpunordpd %xmm4, %xmm3 1242; SSE2-NEXT: andpd %xmm3, %xmm4 1243; SSE2-NEXT: andnpd %xmm1, %xmm3 1244; SSE2-NEXT: orpd %xmm4, %xmm3 1245; SSE2-NEXT: movdqa %xmm0, %xmm1 1246; SSE2-NEXT: pandn %xmm3, %xmm1 1247; SSE2-NEXT: pand %xmm0, %xmm3 1248; SSE2-NEXT: por %xmm5, %xmm3 1249; SSE2-NEXT: pand %xmm2, %xmm0 1250; SSE2-NEXT: por %xmm1, %xmm0 1251; SSE2-NEXT: movdqa %xmm0, %xmm2 1252; SSE2-NEXT: maxpd %xmm3, %xmm2 1253; SSE2-NEXT: movdqa %xmm0, %xmm1 1254; SSE2-NEXT: cmpunordpd %xmm0, %xmm1 1255; SSE2-NEXT: andpd %xmm1, %xmm0 1256; SSE2-NEXT: andnpd %xmm2, %xmm1 1257; SSE2-NEXT: orpd %xmm0, %xmm1 1258; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 1259; SSE2-NEXT: movq %xmm1, %rax 1260; SSE2-NEXT: testq %rax, %rax 1261; SSE2-NEXT: movdqa %xmm1, %xmm3 1262; SSE2-NEXT: js .LBB7_2 1263; SSE2-NEXT: # %bb.1: 1264; SSE2-NEXT: movdqa %xmm2, %xmm3 1265; SSE2-NEXT: .LBB7_2: 1266; SSE2-NEXT: movdqa %xmm3, %xmm0 1267; SSE2-NEXT: cmpunordsd %xmm3, %xmm0 1268; SSE2-NEXT: movapd %xmm0, %xmm4 1269; SSE2-NEXT: andpd %xmm3, %xmm4 1270; SSE2-NEXT: js .LBB7_4 1271; SSE2-NEXT: # %bb.3: 1272; SSE2-NEXT: movdqa %xmm1, %xmm2 1273; SSE2-NEXT: .LBB7_4: 1274; SSE2-NEXT: maxsd %xmm2, %xmm3 1275; SSE2-NEXT: andnpd %xmm3, %xmm0 1276; SSE2-NEXT: orpd %xmm4, %xmm0 1277; SSE2-NEXT: retq 1278; 1279; SSE41-LABEL: test_v8f64: 1280; SSE41: # %bb.0: 1281; SSE41-NEXT: movapd %xmm0, %xmm4 1282; SSE41-NEXT: movapd %xmm1, %xmm6 1283; SSE41-NEXT: movapd %xmm1, %xmm0 1284; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm6 1285; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 1286; SSE41-NEXT: movapd %xmm3, %xmm5 1287; SSE41-NEXT: maxpd %xmm6, %xmm5 1288; SSE41-NEXT: movapd %xmm3, %xmm0 1289; SSE41-NEXT: cmpunordpd %xmm3, %xmm0 1290; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5 1291; SSE41-NEXT: movapd %xmm4, %xmm3 1292; SSE41-NEXT: movapd %xmm4, %xmm0 1293; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3 1294; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 1295; SSE41-NEXT: movapd %xmm2, %xmm1 1296; SSE41-NEXT: maxpd %xmm3, %xmm1 1297; SSE41-NEXT: movapd %xmm2, %xmm0 1298; SSE41-NEXT: cmpunordpd %xmm2, %xmm0 1299; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1300; SSE41-NEXT: movapd %xmm1, %xmm2 1301; SSE41-NEXT: movapd %xmm1, %xmm0 1302; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2 1303; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5 1304; SSE41-NEXT: movapd %xmm5, %xmm1 1305; SSE41-NEXT: maxpd %xmm2, %xmm1 1306; SSE41-NEXT: movapd %xmm5, %xmm0 1307; SSE41-NEXT: cmpunordpd %xmm5, %xmm0 1308; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1309; SSE41-NEXT: movapd %xmm1, %xmm2 1310; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] 1311; SSE41-NEXT: movq %xmm1, %rax 1312; SSE41-NEXT: testq %rax, %rax 1313; SSE41-NEXT: movapd %xmm1, %xmm3 1314; SSE41-NEXT: js .LBB7_2 1315; SSE41-NEXT: # %bb.1: 1316; SSE41-NEXT: movapd %xmm2, %xmm3 1317; SSE41-NEXT: .LBB7_2: 1318; SSE41-NEXT: movapd %xmm3, %xmm0 1319; SSE41-NEXT: cmpunordsd %xmm3, %xmm0 1320; SSE41-NEXT: movapd %xmm0, %xmm4 1321; SSE41-NEXT: andpd %xmm3, %xmm4 1322; SSE41-NEXT: js .LBB7_4 1323; SSE41-NEXT: # %bb.3: 1324; SSE41-NEXT: movapd %xmm1, %xmm2 1325; SSE41-NEXT: .LBB7_4: 1326; SSE41-NEXT: maxsd %xmm2, %xmm3 1327; SSE41-NEXT: andnpd %xmm3, %xmm0 1328; SSE41-NEXT: orpd %xmm4, %xmm0 1329; SSE41-NEXT: retq 1330; 1331; AVX-LABEL: test_v8f64: 1332; AVX: # %bb.0: 1333; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm2 1334; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm0 1335; AVX-NEXT: vmaxpd %ymm2, %ymm0, %ymm1 1336; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm2 1337; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1338; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1339; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1340; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1341; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1342; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1343; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1 1344; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0] 1345; AVX-NEXT: vmovq %xmm1, %rax 1346; AVX-NEXT: testq %rax, %rax 1347; AVX-NEXT: js .LBB7_1 1348; AVX-NEXT: # %bb.2: 1349; AVX-NEXT: vmovapd %xmm1, %xmm2 1350; AVX-NEXT: jmp .LBB7_3 1351; AVX-NEXT: .LBB7_1: 1352; AVX-NEXT: vmovapd %xmm0, %xmm2 1353; AVX-NEXT: vmovapd %xmm1, %xmm0 1354; AVX-NEXT: .LBB7_3: 1355; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm1 1356; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm2 1357; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1358; AVX-NEXT: vzeroupper 1359; AVX-NEXT: retq 1360; 1361; AVX512BW-LABEL: test_v8f64: 1362; AVX512BW: # %bb.0: 1363; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm1 1364; AVX512BW-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm2 1365; AVX512BW-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm0 1366; AVX512BW-NEXT: vmaxpd %ymm2, %ymm0, %ymm1 1367; AVX512BW-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm2 1368; AVX512BW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1369; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 1370; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1371; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1372; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1373; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1374; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1375; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1376; AVX512BW-NEXT: vmovq %xmm0, %rax 1377; AVX512BW-NEXT: testq %rax, %rax 1378; AVX512BW-NEXT: sets %al 1379; AVX512BW-NEXT: kmovd %eax, %k1 1380; AVX512BW-NEXT: vmovapd %xmm0, %xmm2 1381; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1382; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1383; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1384; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1385; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1386; AVX512BW-NEXT: vzeroupper 1387; AVX512BW-NEXT: retq 1388; 1389; AVX512VL-LABEL: test_v8f64: 1390; AVX512VL: # %bb.0: 1391; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1392; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm1, %k1 1393; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1394; AVX512VL-NEXT: vblendmpd %ymm1, %ymm0, %ymm2 {%k1} 1395; AVX512VL-NEXT: vmovapd %ymm0, %ymm1 {%k1} 1396; AVX512VL-NEXT: vmaxpd %ymm2, %ymm1, %ymm0 1397; AVX512VL-NEXT: vcmpunordpd %ymm1, %ymm1, %k1 1398; AVX512VL-NEXT: vmovapd %ymm1, %ymm0 {%k1} 1399; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm1 1400; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k1 1401; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1 1402; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1} 1403; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1} 1404; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm0 1405; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k1 1406; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1} 1407; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1408; AVX512VL-NEXT: vmovq %xmm0, %rax 1409; AVX512VL-NEXT: testq %rax, %rax 1410; AVX512VL-NEXT: sets %al 1411; AVX512VL-NEXT: kmovd %eax, %k1 1412; AVX512VL-NEXT: vmovapd %xmm0, %xmm2 1413; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1414; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1415; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1416; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1417; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1418; AVX512VL-NEXT: vzeroupper 1419; AVX512VL-NEXT: retq 1420 %1 = call double @llvm.vector.reduce.fmaximum.v8f64(<8 x double> %a0) 1421 ret double %1 1422} 1423 1424define double @test_v16f64(<16 x double> %a0) { 1425; SSE2-LABEL: test_v16f64: 1426; SSE2: # %bb.0: 1427; SSE2-NEXT: movaps %xmm0, %xmm9 1428; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[1,1],xmm0[3,3] 1429; SSE2-NEXT: pxor %xmm8, %xmm8 1430; SSE2-NEXT: pxor %xmm10, %xmm10 1431; SSE2-NEXT: pcmpgtd %xmm9, %xmm10 1432; SSE2-NEXT: movdqa %xmm10, %xmm9 1433; SSE2-NEXT: pandn %xmm0, %xmm9 1434; SSE2-NEXT: movdqa %xmm10, %xmm11 1435; SSE2-NEXT: pandn %xmm4, %xmm11 1436; SSE2-NEXT: pand %xmm10, %xmm4 1437; SSE2-NEXT: por %xmm9, %xmm4 1438; SSE2-NEXT: pand %xmm0, %xmm10 1439; SSE2-NEXT: por %xmm11, %xmm10 1440; SSE2-NEXT: movdqa %xmm10, %xmm0 1441; SSE2-NEXT: maxpd %xmm4, %xmm0 1442; SSE2-NEXT: movdqa %xmm10, %xmm4 1443; SSE2-NEXT: cmpunordpd %xmm10, %xmm4 1444; SSE2-NEXT: andpd %xmm4, %xmm10 1445; SSE2-NEXT: andnpd %xmm0, %xmm4 1446; SSE2-NEXT: orpd %xmm10, %xmm4 1447; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3] 1448; SSE2-NEXT: xorpd %xmm0, %xmm0 1449; SSE2-NEXT: pcmpgtd %xmm9, %xmm0 1450; SSE2-NEXT: movdqa %xmm0, %xmm9 1451; SSE2-NEXT: pandn %xmm4, %xmm9 1452; SSE2-NEXT: movaps %xmm2, %xmm10 1453; SSE2-NEXT: shufps {{.*#+}} xmm10 = xmm10[1,1],xmm2[3,3] 1454; SSE2-NEXT: pxor %xmm11, %xmm11 1455; SSE2-NEXT: pcmpgtd %xmm10, %xmm11 1456; SSE2-NEXT: movdqa %xmm11, %xmm10 1457; SSE2-NEXT: pandn %xmm2, %xmm10 1458; SSE2-NEXT: movdqa %xmm11, %xmm12 1459; SSE2-NEXT: pandn %xmm6, %xmm12 1460; SSE2-NEXT: pand %xmm11, %xmm6 1461; SSE2-NEXT: por %xmm10, %xmm6 1462; SSE2-NEXT: pand %xmm2, %xmm11 1463; SSE2-NEXT: por %xmm12, %xmm11 1464; SSE2-NEXT: movdqa %xmm11, %xmm2 1465; SSE2-NEXT: maxpd %xmm6, %xmm2 1466; SSE2-NEXT: movdqa %xmm11, %xmm6 1467; SSE2-NEXT: cmpunordpd %xmm11, %xmm6 1468; SSE2-NEXT: andpd %xmm6, %xmm11 1469; SSE2-NEXT: andnpd %xmm2, %xmm6 1470; SSE2-NEXT: orpd %xmm11, %xmm6 1471; SSE2-NEXT: movdqa %xmm0, %xmm2 1472; SSE2-NEXT: pandn %xmm6, %xmm2 1473; SSE2-NEXT: pand %xmm0, %xmm6 1474; SSE2-NEXT: por %xmm9, %xmm6 1475; SSE2-NEXT: pand %xmm4, %xmm0 1476; SSE2-NEXT: por %xmm2, %xmm0 1477; SSE2-NEXT: movdqa %xmm0, %xmm4 1478; SSE2-NEXT: maxpd %xmm6, %xmm4 1479; SSE2-NEXT: movdqa %xmm0, %xmm2 1480; SSE2-NEXT: cmpunordpd %xmm0, %xmm2 1481; SSE2-NEXT: andpd %xmm2, %xmm0 1482; SSE2-NEXT: andnpd %xmm4, %xmm2 1483; SSE2-NEXT: orpd %xmm0, %xmm2 1484; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1485; SSE2-NEXT: xorpd %xmm0, %xmm0 1486; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 1487; SSE2-NEXT: movdqa %xmm0, %xmm4 1488; SSE2-NEXT: pandn %xmm2, %xmm4 1489; SSE2-NEXT: movaps %xmm1, %xmm6 1490; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3] 1491; SSE2-NEXT: pxor %xmm9, %xmm9 1492; SSE2-NEXT: pcmpgtd %xmm6, %xmm9 1493; SSE2-NEXT: movdqa %xmm9, %xmm6 1494; SSE2-NEXT: pandn %xmm1, %xmm6 1495; SSE2-NEXT: movdqa %xmm9, %xmm10 1496; SSE2-NEXT: pandn %xmm5, %xmm10 1497; SSE2-NEXT: pand %xmm9, %xmm5 1498; SSE2-NEXT: por %xmm6, %xmm5 1499; SSE2-NEXT: pand %xmm1, %xmm9 1500; SSE2-NEXT: por %xmm10, %xmm9 1501; SSE2-NEXT: movdqa %xmm9, %xmm1 1502; SSE2-NEXT: maxpd %xmm5, %xmm1 1503; SSE2-NEXT: movdqa %xmm9, %xmm5 1504; SSE2-NEXT: cmpunordpd %xmm9, %xmm5 1505; SSE2-NEXT: andpd %xmm5, %xmm9 1506; SSE2-NEXT: andnpd %xmm1, %xmm5 1507; SSE2-NEXT: orpd %xmm9, %xmm5 1508; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3] 1509; SSE2-NEXT: xorpd %xmm1, %xmm1 1510; SSE2-NEXT: pcmpgtd %xmm6, %xmm1 1511; SSE2-NEXT: movdqa %xmm1, %xmm6 1512; SSE2-NEXT: pandn %xmm5, %xmm6 1513; SSE2-NEXT: movaps %xmm3, %xmm9 1514; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[1,1],xmm3[3,3] 1515; SSE2-NEXT: pcmpgtd %xmm9, %xmm8 1516; SSE2-NEXT: movdqa %xmm8, %xmm9 1517; SSE2-NEXT: pandn %xmm3, %xmm9 1518; SSE2-NEXT: movdqa %xmm8, %xmm10 1519; SSE2-NEXT: pandn %xmm7, %xmm10 1520; SSE2-NEXT: pand %xmm8, %xmm7 1521; SSE2-NEXT: por %xmm9, %xmm7 1522; SSE2-NEXT: pand %xmm3, %xmm8 1523; SSE2-NEXT: por %xmm10, %xmm8 1524; SSE2-NEXT: movdqa %xmm8, %xmm3 1525; SSE2-NEXT: maxpd %xmm7, %xmm3 1526; SSE2-NEXT: movdqa %xmm8, %xmm7 1527; SSE2-NEXT: cmpunordpd %xmm8, %xmm7 1528; SSE2-NEXT: andpd %xmm7, %xmm8 1529; SSE2-NEXT: andnpd %xmm3, %xmm7 1530; SSE2-NEXT: orpd %xmm8, %xmm7 1531; SSE2-NEXT: movdqa %xmm1, %xmm3 1532; SSE2-NEXT: pandn %xmm7, %xmm3 1533; SSE2-NEXT: pand %xmm1, %xmm7 1534; SSE2-NEXT: por %xmm6, %xmm7 1535; SSE2-NEXT: pand %xmm5, %xmm1 1536; SSE2-NEXT: por %xmm3, %xmm1 1537; SSE2-NEXT: movdqa %xmm1, %xmm3 1538; SSE2-NEXT: maxpd %xmm7, %xmm3 1539; SSE2-NEXT: movdqa %xmm1, %xmm5 1540; SSE2-NEXT: cmpunordpd %xmm1, %xmm5 1541; SSE2-NEXT: andpd %xmm5, %xmm1 1542; SSE2-NEXT: andnpd %xmm3, %xmm5 1543; SSE2-NEXT: orpd %xmm1, %xmm5 1544; SSE2-NEXT: movdqa %xmm0, %xmm1 1545; SSE2-NEXT: pandn %xmm5, %xmm1 1546; SSE2-NEXT: pand %xmm0, %xmm5 1547; SSE2-NEXT: por %xmm4, %xmm5 1548; SSE2-NEXT: pand %xmm2, %xmm0 1549; SSE2-NEXT: por %xmm1, %xmm0 1550; SSE2-NEXT: movdqa %xmm0, %xmm2 1551; SSE2-NEXT: maxpd %xmm5, %xmm2 1552; SSE2-NEXT: movdqa %xmm0, %xmm1 1553; SSE2-NEXT: cmpunordpd %xmm0, %xmm1 1554; SSE2-NEXT: andpd %xmm1, %xmm0 1555; SSE2-NEXT: andnpd %xmm2, %xmm1 1556; SSE2-NEXT: orpd %xmm0, %xmm1 1557; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 1558; SSE2-NEXT: movq %xmm1, %rax 1559; SSE2-NEXT: testq %rax, %rax 1560; SSE2-NEXT: movdqa %xmm1, %xmm3 1561; SSE2-NEXT: js .LBB8_2 1562; SSE2-NEXT: # %bb.1: 1563; SSE2-NEXT: movdqa %xmm2, %xmm3 1564; SSE2-NEXT: .LBB8_2: 1565; SSE2-NEXT: movdqa %xmm3, %xmm0 1566; SSE2-NEXT: cmpunordsd %xmm3, %xmm0 1567; SSE2-NEXT: movapd %xmm0, %xmm4 1568; SSE2-NEXT: andpd %xmm3, %xmm4 1569; SSE2-NEXT: js .LBB8_4 1570; SSE2-NEXT: # %bb.3: 1571; SSE2-NEXT: movdqa %xmm1, %xmm2 1572; SSE2-NEXT: .LBB8_4: 1573; SSE2-NEXT: maxsd %xmm2, %xmm3 1574; SSE2-NEXT: andnpd %xmm3, %xmm0 1575; SSE2-NEXT: orpd %xmm4, %xmm0 1576; SSE2-NEXT: retq 1577; 1578; SSE41-LABEL: test_v16f64: 1579; SSE41: # %bb.0: 1580; SSE41-NEXT: movapd %xmm1, %xmm8 1581; SSE41-NEXT: movapd %xmm0, %xmm1 1582; SSE41-NEXT: movapd %xmm3, %xmm10 1583; SSE41-NEXT: movapd %xmm3, %xmm0 1584; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm10 1585; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7 1586; SSE41-NEXT: movapd %xmm7, %xmm9 1587; SSE41-NEXT: maxpd %xmm10, %xmm9 1588; SSE41-NEXT: movapd %xmm7, %xmm0 1589; SSE41-NEXT: cmpunordpd %xmm7, %xmm0 1590; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm9 1591; SSE41-NEXT: movapd %xmm8, %xmm7 1592; SSE41-NEXT: movapd %xmm8, %xmm0 1593; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7 1594; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5 1595; SSE41-NEXT: movapd %xmm5, %xmm3 1596; SSE41-NEXT: maxpd %xmm7, %xmm3 1597; SSE41-NEXT: movapd %xmm5, %xmm0 1598; SSE41-NEXT: cmpunordpd %xmm5, %xmm0 1599; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm3 1600; SSE41-NEXT: movapd %xmm3, %xmm5 1601; SSE41-NEXT: movapd %xmm3, %xmm0 1602; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm5 1603; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm9 1604; SSE41-NEXT: movapd %xmm9, %xmm3 1605; SSE41-NEXT: maxpd %xmm5, %xmm3 1606; SSE41-NEXT: movapd %xmm9, %xmm0 1607; SSE41-NEXT: cmpunordpd %xmm9, %xmm0 1608; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm3 1609; SSE41-NEXT: movapd %xmm2, %xmm5 1610; SSE41-NEXT: movapd %xmm2, %xmm0 1611; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm5 1612; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6 1613; SSE41-NEXT: movapd %xmm6, %xmm2 1614; SSE41-NEXT: maxpd %xmm5, %xmm2 1615; SSE41-NEXT: movapd %xmm6, %xmm0 1616; SSE41-NEXT: cmpunordpd %xmm6, %xmm0 1617; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm2 1618; SSE41-NEXT: movapd %xmm1, %xmm5 1619; SSE41-NEXT: movapd %xmm1, %xmm0 1620; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5 1621; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1622; SSE41-NEXT: movapd %xmm4, %xmm1 1623; SSE41-NEXT: maxpd %xmm5, %xmm1 1624; SSE41-NEXT: movapd %xmm4, %xmm0 1625; SSE41-NEXT: cmpunordpd %xmm4, %xmm0 1626; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 1627; SSE41-NEXT: movapd %xmm1, %xmm4 1628; SSE41-NEXT: movapd %xmm1, %xmm0 1629; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 1630; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1631; SSE41-NEXT: movapd %xmm2, %xmm1 1632; SSE41-NEXT: maxpd %xmm4, %xmm1 1633; SSE41-NEXT: movapd %xmm2, %xmm0 1634; SSE41-NEXT: cmpunordpd %xmm2, %xmm0 1635; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1636; SSE41-NEXT: movapd %xmm1, %xmm2 1637; SSE41-NEXT: movapd %xmm1, %xmm0 1638; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2 1639; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 1640; SSE41-NEXT: movapd %xmm3, %xmm1 1641; SSE41-NEXT: maxpd %xmm2, %xmm1 1642; SSE41-NEXT: movapd %xmm3, %xmm0 1643; SSE41-NEXT: cmpunordpd %xmm3, %xmm0 1644; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 1645; SSE41-NEXT: movapd %xmm1, %xmm2 1646; SSE41-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] 1647; SSE41-NEXT: movq %xmm1, %rax 1648; SSE41-NEXT: testq %rax, %rax 1649; SSE41-NEXT: movapd %xmm1, %xmm3 1650; SSE41-NEXT: js .LBB8_2 1651; SSE41-NEXT: # %bb.1: 1652; SSE41-NEXT: movapd %xmm2, %xmm3 1653; SSE41-NEXT: .LBB8_2: 1654; SSE41-NEXT: movapd %xmm3, %xmm0 1655; SSE41-NEXT: cmpunordsd %xmm3, %xmm0 1656; SSE41-NEXT: movapd %xmm0, %xmm4 1657; SSE41-NEXT: andpd %xmm3, %xmm4 1658; SSE41-NEXT: js .LBB8_4 1659; SSE41-NEXT: # %bb.3: 1660; SSE41-NEXT: movapd %xmm1, %xmm2 1661; SSE41-NEXT: .LBB8_4: 1662; SSE41-NEXT: maxsd %xmm2, %xmm3 1663; SSE41-NEXT: andnpd %xmm3, %xmm0 1664; SSE41-NEXT: orpd %xmm4, %xmm0 1665; SSE41-NEXT: retq 1666; 1667; AVX-LABEL: test_v16f64: 1668; AVX: # %bb.0: 1669; AVX-NEXT: vblendvpd %ymm1, %ymm3, %ymm1, %ymm4 1670; AVX-NEXT: vblendvpd %ymm1, %ymm1, %ymm3, %ymm1 1671; AVX-NEXT: vmaxpd %ymm4, %ymm1, %ymm3 1672; AVX-NEXT: vcmpunordpd %ymm1, %ymm1, %ymm4 1673; AVX-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 1674; AVX-NEXT: vblendvpd %ymm0, %ymm2, %ymm0, %ymm3 1675; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm2, %ymm0 1676; AVX-NEXT: vmaxpd %ymm3, %ymm0, %ymm2 1677; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm3 1678; AVX-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1679; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm2 1680; AVX-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm0 1681; AVX-NEXT: vmaxpd %ymm2, %ymm0, %ymm1 1682; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm2 1683; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1684; AVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1685; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1686; AVX-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1687; AVX-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1688; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1689; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm1 1690; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0] 1691; AVX-NEXT: vmovq %xmm1, %rax 1692; AVX-NEXT: testq %rax, %rax 1693; AVX-NEXT: js .LBB8_1 1694; AVX-NEXT: # %bb.2: 1695; AVX-NEXT: vmovapd %xmm1, %xmm2 1696; AVX-NEXT: jmp .LBB8_3 1697; AVX-NEXT: .LBB8_1: 1698; AVX-NEXT: vmovapd %xmm0, %xmm2 1699; AVX-NEXT: vmovapd %xmm1, %xmm0 1700; AVX-NEXT: .LBB8_3: 1701; AVX-NEXT: vmaxsd %xmm2, %xmm0, %xmm1 1702; AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm2 1703; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1704; AVX-NEXT: vzeroupper 1705; AVX-NEXT: retq 1706; 1707; AVX512BW-LABEL: test_v16f64: 1708; AVX512BW: # %bb.0: 1709; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 1710; AVX512BW-NEXT: vpcmpgtq %zmm0, %zmm2, %k1 1711; AVX512BW-NEXT: vblendmpd %zmm1, %zmm0, %zmm2 {%k1} 1712; AVX512BW-NEXT: vmovapd %zmm0, %zmm1 {%k1} 1713; AVX512BW-NEXT: vmaxpd %zmm2, %zmm1, %zmm0 1714; AVX512BW-NEXT: vcmpunordpd %zmm1, %zmm1, %k1 1715; AVX512BW-NEXT: vmovapd %zmm1, %zmm0 {%k1} 1716; AVX512BW-NEXT: vextractf64x4 $1, %zmm0, %ymm1 1717; AVX512BW-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm2 1718; AVX512BW-NEXT: vblendvpd %ymm0, %ymm0, %ymm1, %ymm0 1719; AVX512BW-NEXT: vmaxpd %ymm2, %ymm0, %ymm1 1720; AVX512BW-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm2 1721; AVX512BW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1722; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm1 1723; AVX512BW-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm2 1724; AVX512BW-NEXT: vblendvpd %xmm0, %xmm0, %xmm1, %xmm0 1725; AVX512BW-NEXT: vmaxpd %xmm2, %xmm0, %xmm1 1726; AVX512BW-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm2 1727; AVX512BW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1728; AVX512BW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1729; AVX512BW-NEXT: vmovq %xmm0, %rax 1730; AVX512BW-NEXT: testq %rax, %rax 1731; AVX512BW-NEXT: sets %al 1732; AVX512BW-NEXT: kmovd %eax, %k1 1733; AVX512BW-NEXT: vmovapd %xmm0, %xmm2 1734; AVX512BW-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1735; AVX512BW-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1736; AVX512BW-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1737; AVX512BW-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1738; AVX512BW-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1739; AVX512BW-NEXT: vzeroupper 1740; AVX512BW-NEXT: retq 1741; 1742; AVX512VL-LABEL: test_v16f64: 1743; AVX512VL: # %bb.0: 1744; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2 1745; AVX512VL-NEXT: vpcmpgtq %zmm0, %zmm2, %k1 1746; AVX512VL-NEXT: vblendmpd %zmm1, %zmm0, %zmm2 {%k1} 1747; AVX512VL-NEXT: vmovapd %zmm0, %zmm1 {%k1} 1748; AVX512VL-NEXT: vmaxpd %zmm2, %zmm1, %zmm0 1749; AVX512VL-NEXT: vcmpunordpd %zmm1, %zmm1, %k1 1750; AVX512VL-NEXT: vmovapd %zmm1, %zmm0 {%k1} 1751; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm1 1752; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm1, %k1 1753; AVX512VL-NEXT: vextractf64x4 $1, %zmm0, %ymm1 1754; AVX512VL-NEXT: vblendmpd %ymm1, %ymm0, %ymm2 {%k1} 1755; AVX512VL-NEXT: vmovapd %ymm0, %ymm1 {%k1} 1756; AVX512VL-NEXT: vmaxpd %ymm2, %ymm1, %ymm0 1757; AVX512VL-NEXT: vcmpunordpd %ymm1, %ymm1, %k1 1758; AVX512VL-NEXT: vmovapd %ymm1, %ymm0 {%k1} 1759; AVX512VL-NEXT: vxorpd %xmm1, %xmm1, %xmm1 1760; AVX512VL-NEXT: vpcmpgtq %xmm0, %xmm1, %k1 1761; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1 1762; AVX512VL-NEXT: vblendmpd %xmm1, %xmm0, %xmm2 {%k1} 1763; AVX512VL-NEXT: vmovapd %xmm0, %xmm1 {%k1} 1764; AVX512VL-NEXT: vmaxpd %xmm2, %xmm1, %xmm0 1765; AVX512VL-NEXT: vcmpunordpd %xmm1, %xmm1, %k1 1766; AVX512VL-NEXT: vmovapd %xmm1, %xmm0 {%k1} 1767; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 1768; AVX512VL-NEXT: vmovq %xmm0, %rax 1769; AVX512VL-NEXT: testq %rax, %rax 1770; AVX512VL-NEXT: sets %al 1771; AVX512VL-NEXT: kmovd %eax, %k1 1772; AVX512VL-NEXT: vmovapd %xmm0, %xmm2 1773; AVX512VL-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1} 1774; AVX512VL-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1} 1775; AVX512VL-NEXT: vmaxsd %xmm2, %xmm1, %xmm0 1776; AVX512VL-NEXT: vcmpunordsd %xmm1, %xmm1, %k1 1777; AVX512VL-NEXT: vmovsd %xmm1, %xmm0, %xmm0 {%k1} 1778; AVX512VL-NEXT: vzeroupper 1779; AVX512VL-NEXT: retq 1780 %1 = call double @llvm.vector.reduce.fmaximum.v16f64(<16 x double> %a0) 1781 ret double %1 1782} 1783 1784declare float @llvm.vector.reduce.fmaximum.v1f32(<1 x float>) 1785declare float @llvm.vector.reduce.fmaximum.v2f32(<2 x float>) 1786declare float @llvm.vector.reduce.fmaximum.v3f32(<3 x float>) 1787declare float @llvm.vector.reduce.fmaximum.v4f32(<4 x float>) 1788declare float @llvm.vector.reduce.fmaximum.v8f32(<8 x float>) 1789declare float @llvm.vector.reduce.fmaximum.v16f32(<16 x float>) 1790 1791declare double @llvm.vector.reduce.fmaximum.v2f64(<2 x double>) 1792declare double @llvm.vector.reduce.fmaximum.v4f64(<4 x double>) 1793declare double @llvm.vector.reduce.fmaximum.v8f64(<8 x double>) 1794declare double @llvm.vector.reduce.fmaximum.v16f64(<16 x double>) 1795