]> granicus.if.org Git - llvm/commitdiff
[AVX-512] Add avx512f command lines to fast isel SSE select test.
authorCraig Topper <craig.topper@gmail.com>
Mon, 5 Dec 2016 04:51:28 +0000 (04:51 +0000)
committerCraig Topper <craig.topper@gmail.com>
Mon, 5 Dec 2016 04:51:28 +0000 (04:51 +0000)
Currently the fast isel code emits an avx1 instruction sequence even with avx512. This is different than normal isel. A follow up commit will fix this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288635 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/X86/fast-isel-select-sse.ll

index 026732d8ce5f70953d13e1214b2697925e06d337..9c24118e41d69c2a6ac085c5c64930ac648febeb 100644 (file)
@@ -3,6 +3,8 @@
 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -fast-isel -fast-isel-abort=1            | FileCheck %s --check-prefix=SSE
 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown                               -mattr=avx | FileCheck %s --check-prefix=AVX
 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -fast-isel -fast-isel-abort=1 -mattr=avx | FileCheck %s --check-prefix=AVX
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown                               -mattr=avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512SLOW
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -fast-isel -fast-isel-abort=1 -mattr=avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512FAST
 
 ; Test all cmp predicates that can be used with SSE.
 
@@ -20,6 +22,19 @@ define float @select_fcmp_oeq_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_oeq_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpeqss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_oeq_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp oeq float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -40,6 +55,19 @@ define double @select_fcmp_oeq_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpeqsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_oeq_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpeqsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_oeq_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpeqsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp oeq double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -61,6 +89,19 @@ define float @select_fcmp_ogt_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpltss %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ogt_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpltss %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ogt_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpltss %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ogt float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -82,6 +123,19 @@ define double @select_fcmp_ogt_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpltsd %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ogt_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpltsd %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ogt_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpltsd %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ogt double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -103,6 +157,19 @@ define float @select_fcmp_oge_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpless %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_oge_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpless %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_oge_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpless %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp oge float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -124,6 +191,19 @@ define double @select_fcmp_oge_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmplesd %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_oge_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmplesd %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_oge_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmplesd %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp oge double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -144,6 +224,19 @@ define float @select_fcmp_olt_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpltss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_olt_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpltss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_olt_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpltss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp olt float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -164,6 +257,19 @@ define double @select_fcmp_olt_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpltsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_olt_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpltsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_olt_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpltsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp olt double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -184,6 +290,19 @@ define float @select_fcmp_ole_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpless %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ole_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpless %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ole_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpless %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ole float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -204,6 +323,19 @@ define double @select_fcmp_ole_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmplesd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ole_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmplesd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ole_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmplesd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ole double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -224,6 +356,19 @@ define float @select_fcmp_ord_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpordss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ord_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpordss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ord_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpordss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ord float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -244,6 +389,19 @@ define double @select_fcmp_ord_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpordsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ord_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpordsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ord_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpordsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ord double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -264,6 +422,19 @@ define float @select_fcmp_uno_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpunordss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_uno_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpunordss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_uno_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpunordss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp uno float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -284,6 +455,19 @@ define double @select_fcmp_uno_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpunordsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_uno_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpunordsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_uno_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpunordsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp uno double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -304,6 +488,19 @@ define float @select_fcmp_ugt_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpnless %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ugt_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnless %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ugt_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnless %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ugt float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -324,6 +521,19 @@ define double @select_fcmp_ugt_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpnlesd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ugt_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnlesd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ugt_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnlesd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ugt double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -344,6 +554,19 @@ define float @select_fcmp_uge_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpnltss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_uge_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnltss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_uge_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnltss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp uge float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -364,6 +587,19 @@ define double @select_fcmp_uge_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpnltsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_uge_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnltsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_uge_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnltsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp uge double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -385,6 +621,19 @@ define float @select_fcmp_ult_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpnless %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ult_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnless %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ult_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnless %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ult float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -406,6 +655,19 @@ define double @select_fcmp_ult_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpnlesd %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ult_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnlesd %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ult_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnlesd %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ult double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -427,6 +689,19 @@ define float @select_fcmp_ule_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpnltss %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ule_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnltss %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ule_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnltss %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ule float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -448,6 +723,19 @@ define double @select_fcmp_ule_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpnltsd %xmm0, %xmm1, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_ule_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpnltsd %xmm0, %xmm1, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_ule_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpnltsd %xmm0, %xmm1, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp ule double %a, %b
   %2 = select i1 %1, double %c, double %d
@@ -468,6 +756,19 @@ define float @select_fcmp_une_f32(float %a, float %b, float %c, float %d) {
 ; AVX-NEXT:    vcmpneqss %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_une_f32:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpneqss %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovss %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovaps %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_une_f32:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpneqss %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp une float %a, %b
   %2 = select i1 %1, float %c, float %d
@@ -488,6 +789,19 @@ define double @select_fcmp_une_f64(double %a, double %b, double %c, double %d) {
 ; AVX-NEXT:    vcmpneqsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
 ; AVX-NEXT:    retq
+;
+; AVX512SLOW-LABEL: select_fcmp_une_f64:
+; AVX512SLOW:       # BB#0:
+; AVX512SLOW-NEXT:    vcmpneqsd %xmm1, %xmm0, %k1
+; AVX512SLOW-NEXT:    vmovsd %xmm2, %xmm0, %xmm3 {%k1}
+; AVX512SLOW-NEXT:    vmovapd %xmm3, %xmm0
+; AVX512SLOW-NEXT:    retq
+;
+; AVX512FAST-LABEL: select_fcmp_une_f64:
+; AVX512FAST:       # BB#0:
+; AVX512FAST-NEXT:    vcmpneqsd %xmm1, %xmm0, %xmm0
+; AVX512FAST-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
+; AVX512FAST-NEXT:    retq
 ;
   %1 = fcmp une double %a, %b
   %2 = select i1 %1, double %c, double %d