brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.8 KiB · 6f36434 Raw
691 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs -O0                                          | FileCheck %s --check-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs -O0 -fast-isel -fast-isel-abort=1            | FileCheck %s --check-prefix=SSE4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs                               -mattr=avx | FileCheck %s --check-prefix=AVX5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs -fast-isel -fast-isel-abort=1 -mattr=avx | FileCheck %s --check-prefix=AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs                               -mattr=avx512f | FileCheck %s --check-prefix=AVX5127; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs -fast-isel -fast-isel-abort=1 -mattr=avx512f | FileCheck %s --check-prefix=AVX5128 9; Test all cmp predicates that can be used with SSE.10 11define float @select_fcmp_oeq_f32(float %a, float %b, float %c, float %d) {12; SSE-LABEL: select_fcmp_oeq_f32:13; SSE:       # %bb.0:14; SSE-NEXT:    cmpeqss %xmm1, %xmm015; SSE-NEXT:    movaps %xmm0, %xmm116; SSE-NEXT:    andps %xmm2, %xmm117; SSE-NEXT:    andnps %xmm3, %xmm018; SSE-NEXT:    orps %xmm1, %xmm019; SSE-NEXT:    retq20;21; AVX-LABEL: select_fcmp_oeq_f32:22; AVX:       # %bb.0:23; AVX-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm024; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm025; AVX-NEXT:    retq26;27; AVX512-LABEL: select_fcmp_oeq_f32:28; AVX512:       # %bb.0:29; AVX512-NEXT:    vcmpeqss %xmm1, %xmm0, %k130; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}31; AVX512-NEXT:    vmovaps %xmm3, %xmm032; AVX512-NEXT:    retq33  %1 = fcmp oeq float %a, %b34  %2 = select i1 %1, float %c, float %d35  ret float %236}37 38define double @select_fcmp_oeq_f64(double %a, double %b, double %c, double %d) {39; SSE-LABEL: select_fcmp_oeq_f64:40; SSE:       # %bb.0:41; SSE-NEXT:    cmpeqsd %xmm1, %xmm042; SSE-NEXT:    movaps %xmm0, %xmm143; SSE-NEXT:    andpd %xmm2, %xmm144; SSE-NEXT:    andnpd %xmm3, %xmm045; SSE-NEXT:    orpd %xmm1, %xmm046; SSE-NEXT:    retq47;48; AVX-LABEL: select_fcmp_oeq_f64:49; AVX:       # %bb.0:50; AVX-NEXT:    vcmpeqsd %xmm1, %xmm0, %xmm051; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm052; AVX-NEXT:    retq53;54; AVX512-LABEL: select_fcmp_oeq_f64:55; AVX512:       # %bb.0:56; AVX512-NEXT:    vcmpeqsd %xmm1, %xmm0, %k157; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}58; AVX512-NEXT:    vmovapd %xmm3, %xmm059; AVX512-NEXT:    retq60  %1 = fcmp oeq double %a, %b61  %2 = select i1 %1, double %c, double %d62  ret double %263}64 65define float @select_fcmp_ogt_f32(float %a, float %b, float %c, float %d) {66; SSE-LABEL: select_fcmp_ogt_f32:67; SSE:       # %bb.0:68; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill69; SSE-NEXT:    movaps %xmm0, %xmm170; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload71; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero72; SSE-NEXT:    cmpltss %xmm1, %xmm073; SSE-NEXT:    movaps %xmm0, %xmm174; SSE-NEXT:    andps %xmm2, %xmm175; SSE-NEXT:    andnps %xmm3, %xmm076; SSE-NEXT:    orps %xmm1, %xmm077; SSE-NEXT:    retq78;79; AVX-LABEL: select_fcmp_ogt_f32:80; AVX:       # %bb.0:81; AVX-NEXT:    vcmpltss %xmm0, %xmm1, %xmm082; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm083; AVX-NEXT:    retq84;85; AVX512-LABEL: select_fcmp_ogt_f32:86; AVX512:       # %bb.0:87; AVX512-NEXT:    vcmpltss %xmm0, %xmm1, %k188; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}89; AVX512-NEXT:    vmovaps %xmm3, %xmm090; AVX512-NEXT:    retq91  %1 = fcmp ogt float %a, %b92  %2 = select i1 %1, float %c, float %d93  ret float %294}95 96define double @select_fcmp_ogt_f64(double %a, double %b, double %c, double %d) {97; SSE-LABEL: select_fcmp_ogt_f64:98; SSE:       # %bb.0:99; SSE-NEXT:    movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill100; SSE-NEXT:    movaps %xmm0, %xmm1101; SSE-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload102; SSE-NEXT:    # xmm0 = mem[0],zero103; SSE-NEXT:    cmpltsd %xmm1, %xmm0104; SSE-NEXT:    movaps %xmm0, %xmm1105; SSE-NEXT:    andpd %xmm2, %xmm1106; SSE-NEXT:    andnpd %xmm3, %xmm0107; SSE-NEXT:    orpd %xmm1, %xmm0108; SSE-NEXT:    retq109;110; AVX-LABEL: select_fcmp_ogt_f64:111; AVX:       # %bb.0:112; AVX-NEXT:    vcmpltsd %xmm0, %xmm1, %xmm0113; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0114; AVX-NEXT:    retq115;116; AVX512-LABEL: select_fcmp_ogt_f64:117; AVX512:       # %bb.0:118; AVX512-NEXT:    vcmpltsd %xmm0, %xmm1, %k1119; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}120; AVX512-NEXT:    vmovapd %xmm3, %xmm0121; AVX512-NEXT:    retq122  %1 = fcmp ogt double %a, %b123  %2 = select i1 %1, double %c, double %d124  ret double %2125}126 127define float @select_fcmp_oge_f32(float %a, float %b, float %c, float %d) {128; SSE-LABEL: select_fcmp_oge_f32:129; SSE:       # %bb.0:130; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill131; SSE-NEXT:    movaps %xmm0, %xmm1132; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload133; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero134; SSE-NEXT:    cmpless %xmm1, %xmm0135; SSE-NEXT:    movaps %xmm0, %xmm1136; SSE-NEXT:    andps %xmm2, %xmm1137; SSE-NEXT:    andnps %xmm3, %xmm0138; SSE-NEXT:    orps %xmm1, %xmm0139; SSE-NEXT:    retq140;141; AVX-LABEL: select_fcmp_oge_f32:142; AVX:       # %bb.0:143; AVX-NEXT:    vcmpless %xmm0, %xmm1, %xmm0144; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0145; AVX-NEXT:    retq146;147; AVX512-LABEL: select_fcmp_oge_f32:148; AVX512:       # %bb.0:149; AVX512-NEXT:    vcmpless %xmm0, %xmm1, %k1150; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}151; AVX512-NEXT:    vmovaps %xmm3, %xmm0152; AVX512-NEXT:    retq153  %1 = fcmp oge float %a, %b154  %2 = select i1 %1, float %c, float %d155  ret float %2156}157 158define double @select_fcmp_oge_f64(double %a, double %b, double %c, double %d) {159; SSE-LABEL: select_fcmp_oge_f64:160; SSE:       # %bb.0:161; SSE-NEXT:    movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill162; SSE-NEXT:    movaps %xmm0, %xmm1163; SSE-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload164; SSE-NEXT:    # xmm0 = mem[0],zero165; SSE-NEXT:    cmplesd %xmm1, %xmm0166; SSE-NEXT:    movaps %xmm0, %xmm1167; SSE-NEXT:    andpd %xmm2, %xmm1168; SSE-NEXT:    andnpd %xmm3, %xmm0169; SSE-NEXT:    orpd %xmm1, %xmm0170; SSE-NEXT:    retq171;172; AVX-LABEL: select_fcmp_oge_f64:173; AVX:       # %bb.0:174; AVX-NEXT:    vcmplesd %xmm0, %xmm1, %xmm0175; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0176; AVX-NEXT:    retq177;178; AVX512-LABEL: select_fcmp_oge_f64:179; AVX512:       # %bb.0:180; AVX512-NEXT:    vcmplesd %xmm0, %xmm1, %k1181; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}182; AVX512-NEXT:    vmovapd %xmm3, %xmm0183; AVX512-NEXT:    retq184  %1 = fcmp oge double %a, %b185  %2 = select i1 %1, double %c, double %d186  ret double %2187}188 189define float @select_fcmp_olt_f32(float %a, float %b, float %c, float %d) {190; SSE-LABEL: select_fcmp_olt_f32:191; SSE:       # %bb.0:192; SSE-NEXT:    cmpltss %xmm1, %xmm0193; SSE-NEXT:    movaps %xmm0, %xmm1194; SSE-NEXT:    andps %xmm2, %xmm1195; SSE-NEXT:    andnps %xmm3, %xmm0196; SSE-NEXT:    orps %xmm1, %xmm0197; SSE-NEXT:    retq198;199; AVX-LABEL: select_fcmp_olt_f32:200; AVX:       # %bb.0:201; AVX-NEXT:    vcmpltss %xmm1, %xmm0, %xmm0202; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0203; AVX-NEXT:    retq204;205; AVX512-LABEL: select_fcmp_olt_f32:206; AVX512:       # %bb.0:207; AVX512-NEXT:    vcmpltss %xmm1, %xmm0, %k1208; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}209; AVX512-NEXT:    vmovaps %xmm3, %xmm0210; AVX512-NEXT:    retq211  %1 = fcmp olt float %a, %b212  %2 = select i1 %1, float %c, float %d213  ret float %2214}215 216define double @select_fcmp_olt_f64(double %a, double %b, double %c, double %d) {217; SSE-LABEL: select_fcmp_olt_f64:218; SSE:       # %bb.0:219; SSE-NEXT:    cmpltsd %xmm1, %xmm0220; SSE-NEXT:    movaps %xmm0, %xmm1221; SSE-NEXT:    andpd %xmm2, %xmm1222; SSE-NEXT:    andnpd %xmm3, %xmm0223; SSE-NEXT:    orpd %xmm1, %xmm0224; SSE-NEXT:    retq225;226; AVX-LABEL: select_fcmp_olt_f64:227; AVX:       # %bb.0:228; AVX-NEXT:    vcmpltsd %xmm1, %xmm0, %xmm0229; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0230; AVX-NEXT:    retq231;232; AVX512-LABEL: select_fcmp_olt_f64:233; AVX512:       # %bb.0:234; AVX512-NEXT:    vcmpltsd %xmm1, %xmm0, %k1235; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}236; AVX512-NEXT:    vmovapd %xmm3, %xmm0237; AVX512-NEXT:    retq238  %1 = fcmp olt double %a, %b239  %2 = select i1 %1, double %c, double %d240  ret double %2241}242 243define float @select_fcmp_ole_f32(float %a, float %b, float %c, float %d) {244; SSE-LABEL: select_fcmp_ole_f32:245; SSE:       # %bb.0:246; SSE-NEXT:    cmpless %xmm1, %xmm0247; SSE-NEXT:    movaps %xmm0, %xmm1248; SSE-NEXT:    andps %xmm2, %xmm1249; SSE-NEXT:    andnps %xmm3, %xmm0250; SSE-NEXT:    orps %xmm1, %xmm0251; SSE-NEXT:    retq252;253; AVX-LABEL: select_fcmp_ole_f32:254; AVX:       # %bb.0:255; AVX-NEXT:    vcmpless %xmm1, %xmm0, %xmm0256; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0257; AVX-NEXT:    retq258;259; AVX512-LABEL: select_fcmp_ole_f32:260; AVX512:       # %bb.0:261; AVX512-NEXT:    vcmpless %xmm1, %xmm0, %k1262; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}263; AVX512-NEXT:    vmovaps %xmm3, %xmm0264; AVX512-NEXT:    retq265  %1 = fcmp ole float %a, %b266  %2 = select i1 %1, float %c, float %d267  ret float %2268}269 270define double @select_fcmp_ole_f64(double %a, double %b, double %c, double %d) {271; SSE-LABEL: select_fcmp_ole_f64:272; SSE:       # %bb.0:273; SSE-NEXT:    cmplesd %xmm1, %xmm0274; SSE-NEXT:    movaps %xmm0, %xmm1275; SSE-NEXT:    andpd %xmm2, %xmm1276; SSE-NEXT:    andnpd %xmm3, %xmm0277; SSE-NEXT:    orpd %xmm1, %xmm0278; SSE-NEXT:    retq279;280; AVX-LABEL: select_fcmp_ole_f64:281; AVX:       # %bb.0:282; AVX-NEXT:    vcmplesd %xmm1, %xmm0, %xmm0283; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0284; AVX-NEXT:    retq285;286; AVX512-LABEL: select_fcmp_ole_f64:287; AVX512:       # %bb.0:288; AVX512-NEXT:    vcmplesd %xmm1, %xmm0, %k1289; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}290; AVX512-NEXT:    vmovapd %xmm3, %xmm0291; AVX512-NEXT:    retq292  %1 = fcmp ole double %a, %b293  %2 = select i1 %1, double %c, double %d294  ret double %2295}296 297define float @select_fcmp_ord_f32(float %a, float %b, float %c, float %d) {298; SSE-LABEL: select_fcmp_ord_f32:299; SSE:       # %bb.0:300; SSE-NEXT:    cmpordss %xmm1, %xmm0301; SSE-NEXT:    movaps %xmm0, %xmm1302; SSE-NEXT:    andps %xmm2, %xmm1303; SSE-NEXT:    andnps %xmm3, %xmm0304; SSE-NEXT:    orps %xmm1, %xmm0305; SSE-NEXT:    retq306;307; AVX-LABEL: select_fcmp_ord_f32:308; AVX:       # %bb.0:309; AVX-NEXT:    vcmpordss %xmm1, %xmm0, %xmm0310; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0311; AVX-NEXT:    retq312;313; AVX512-LABEL: select_fcmp_ord_f32:314; AVX512:       # %bb.0:315; AVX512-NEXT:    vcmpordss %xmm1, %xmm0, %k1316; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}317; AVX512-NEXT:    vmovaps %xmm3, %xmm0318; AVX512-NEXT:    retq319  %1 = fcmp ord float %a, %b320  %2 = select i1 %1, float %c, float %d321  ret float %2322}323 324define double @select_fcmp_ord_f64(double %a, double %b, double %c, double %d) {325; SSE-LABEL: select_fcmp_ord_f64:326; SSE:       # %bb.0:327; SSE-NEXT:    cmpordsd %xmm1, %xmm0328; SSE-NEXT:    movaps %xmm0, %xmm1329; SSE-NEXT:    andpd %xmm2, %xmm1330; SSE-NEXT:    andnpd %xmm3, %xmm0331; SSE-NEXT:    orpd %xmm1, %xmm0332; SSE-NEXT:    retq333;334; AVX-LABEL: select_fcmp_ord_f64:335; AVX:       # %bb.0:336; AVX-NEXT:    vcmpordsd %xmm1, %xmm0, %xmm0337; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0338; AVX-NEXT:    retq339;340; AVX512-LABEL: select_fcmp_ord_f64:341; AVX512:       # %bb.0:342; AVX512-NEXT:    vcmpordsd %xmm1, %xmm0, %k1343; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}344; AVX512-NEXT:    vmovapd %xmm3, %xmm0345; AVX512-NEXT:    retq346  %1 = fcmp ord double %a, %b347  %2 = select i1 %1, double %c, double %d348  ret double %2349}350 351define float @select_fcmp_uno_f32(float %a, float %b, float %c, float %d) {352; SSE-LABEL: select_fcmp_uno_f32:353; SSE:       # %bb.0:354; SSE-NEXT:    cmpunordss %xmm1, %xmm0355; SSE-NEXT:    movaps %xmm0, %xmm1356; SSE-NEXT:    andps %xmm2, %xmm1357; SSE-NEXT:    andnps %xmm3, %xmm0358; SSE-NEXT:    orps %xmm1, %xmm0359; SSE-NEXT:    retq360;361; AVX-LABEL: select_fcmp_uno_f32:362; AVX:       # %bb.0:363; AVX-NEXT:    vcmpunordss %xmm1, %xmm0, %xmm0364; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0365; AVX-NEXT:    retq366;367; AVX512-LABEL: select_fcmp_uno_f32:368; AVX512:       # %bb.0:369; AVX512-NEXT:    vcmpunordss %xmm1, %xmm0, %k1370; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}371; AVX512-NEXT:    vmovaps %xmm3, %xmm0372; AVX512-NEXT:    retq373  %1 = fcmp uno float %a, %b374  %2 = select i1 %1, float %c, float %d375  ret float %2376}377 378define double @select_fcmp_uno_f64(double %a, double %b, double %c, double %d) {379; SSE-LABEL: select_fcmp_uno_f64:380; SSE:       # %bb.0:381; SSE-NEXT:    cmpunordsd %xmm1, %xmm0382; SSE-NEXT:    movaps %xmm0, %xmm1383; SSE-NEXT:    andpd %xmm2, %xmm1384; SSE-NEXT:    andnpd %xmm3, %xmm0385; SSE-NEXT:    orpd %xmm1, %xmm0386; SSE-NEXT:    retq387;388; AVX-LABEL: select_fcmp_uno_f64:389; AVX:       # %bb.0:390; AVX-NEXT:    vcmpunordsd %xmm1, %xmm0, %xmm0391; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0392; AVX-NEXT:    retq393;394; AVX512-LABEL: select_fcmp_uno_f64:395; AVX512:       # %bb.0:396; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm0, %k1397; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}398; AVX512-NEXT:    vmovapd %xmm3, %xmm0399; AVX512-NEXT:    retq400  %1 = fcmp uno double %a, %b401  %2 = select i1 %1, double %c, double %d402  ret double %2403}404 405define float @select_fcmp_ugt_f32(float %a, float %b, float %c, float %d) {406; SSE-LABEL: select_fcmp_ugt_f32:407; SSE:       # %bb.0:408; SSE-NEXT:    cmpnless %xmm1, %xmm0409; SSE-NEXT:    movaps %xmm0, %xmm1410; SSE-NEXT:    andps %xmm2, %xmm1411; SSE-NEXT:    andnps %xmm3, %xmm0412; SSE-NEXT:    orps %xmm1, %xmm0413; SSE-NEXT:    retq414;415; AVX-LABEL: select_fcmp_ugt_f32:416; AVX:       # %bb.0:417; AVX-NEXT:    vcmpnless %xmm1, %xmm0, %xmm0418; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0419; AVX-NEXT:    retq420;421; AVX512-LABEL: select_fcmp_ugt_f32:422; AVX512:       # %bb.0:423; AVX512-NEXT:    vcmpnless %xmm1, %xmm0, %k1424; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}425; AVX512-NEXT:    vmovaps %xmm3, %xmm0426; AVX512-NEXT:    retq427  %1 = fcmp ugt float %a, %b428  %2 = select i1 %1, float %c, float %d429  ret float %2430}431 432define double @select_fcmp_ugt_f64(double %a, double %b, double %c, double %d) {433; SSE-LABEL: select_fcmp_ugt_f64:434; SSE:       # %bb.0:435; SSE-NEXT:    cmpnlesd %xmm1, %xmm0436; SSE-NEXT:    movaps %xmm0, %xmm1437; SSE-NEXT:    andpd %xmm2, %xmm1438; SSE-NEXT:    andnpd %xmm3, %xmm0439; SSE-NEXT:    orpd %xmm1, %xmm0440; SSE-NEXT:    retq441;442; AVX-LABEL: select_fcmp_ugt_f64:443; AVX:       # %bb.0:444; AVX-NEXT:    vcmpnlesd %xmm1, %xmm0, %xmm0445; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0446; AVX-NEXT:    retq447;448; AVX512-LABEL: select_fcmp_ugt_f64:449; AVX512:       # %bb.0:450; AVX512-NEXT:    vcmpnlesd %xmm1, %xmm0, %k1451; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}452; AVX512-NEXT:    vmovapd %xmm3, %xmm0453; AVX512-NEXT:    retq454  %1 = fcmp ugt double %a, %b455  %2 = select i1 %1, double %c, double %d456  ret double %2457}458 459define float @select_fcmp_uge_f32(float %a, float %b, float %c, float %d) {460; SSE-LABEL: select_fcmp_uge_f32:461; SSE:       # %bb.0:462; SSE-NEXT:    cmpnltss %xmm1, %xmm0463; SSE-NEXT:    movaps %xmm0, %xmm1464; SSE-NEXT:    andps %xmm2, %xmm1465; SSE-NEXT:    andnps %xmm3, %xmm0466; SSE-NEXT:    orps %xmm1, %xmm0467; SSE-NEXT:    retq468;469; AVX-LABEL: select_fcmp_uge_f32:470; AVX:       # %bb.0:471; AVX-NEXT:    vcmpnltss %xmm1, %xmm0, %xmm0472; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0473; AVX-NEXT:    retq474;475; AVX512-LABEL: select_fcmp_uge_f32:476; AVX512:       # %bb.0:477; AVX512-NEXT:    vcmpnltss %xmm1, %xmm0, %k1478; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}479; AVX512-NEXT:    vmovaps %xmm3, %xmm0480; AVX512-NEXT:    retq481  %1 = fcmp uge float %a, %b482  %2 = select i1 %1, float %c, float %d483  ret float %2484}485 486define double @select_fcmp_uge_f64(double %a, double %b, double %c, double %d) {487; SSE-LABEL: select_fcmp_uge_f64:488; SSE:       # %bb.0:489; SSE-NEXT:    cmpnltsd %xmm1, %xmm0490; SSE-NEXT:    movaps %xmm0, %xmm1491; SSE-NEXT:    andpd %xmm2, %xmm1492; SSE-NEXT:    andnpd %xmm3, %xmm0493; SSE-NEXT:    orpd %xmm1, %xmm0494; SSE-NEXT:    retq495;496; AVX-LABEL: select_fcmp_uge_f64:497; AVX:       # %bb.0:498; AVX-NEXT:    vcmpnltsd %xmm1, %xmm0, %xmm0499; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0500; AVX-NEXT:    retq501;502; AVX512-LABEL: select_fcmp_uge_f64:503; AVX512:       # %bb.0:504; AVX512-NEXT:    vcmpnltsd %xmm1, %xmm0, %k1505; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}506; AVX512-NEXT:    vmovapd %xmm3, %xmm0507; AVX512-NEXT:    retq508  %1 = fcmp uge double %a, %b509  %2 = select i1 %1, double %c, double %d510  ret double %2511}512 513define float @select_fcmp_ult_f32(float %a, float %b, float %c, float %d) {514; SSE-LABEL: select_fcmp_ult_f32:515; SSE:       # %bb.0:516; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill517; SSE-NEXT:    movaps %xmm0, %xmm1518; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload519; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero520; SSE-NEXT:    cmpnless %xmm1, %xmm0521; SSE-NEXT:    movaps %xmm0, %xmm1522; SSE-NEXT:    andps %xmm2, %xmm1523; SSE-NEXT:    andnps %xmm3, %xmm0524; SSE-NEXT:    orps %xmm1, %xmm0525; SSE-NEXT:    retq526;527; AVX-LABEL: select_fcmp_ult_f32:528; AVX:       # %bb.0:529; AVX-NEXT:    vcmpnless %xmm0, %xmm1, %xmm0530; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0531; AVX-NEXT:    retq532;533; AVX512-LABEL: select_fcmp_ult_f32:534; AVX512:       # %bb.0:535; AVX512-NEXT:    vcmpnless %xmm0, %xmm1, %k1536; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}537; AVX512-NEXT:    vmovaps %xmm3, %xmm0538; AVX512-NEXT:    retq539  %1 = fcmp ult float %a, %b540  %2 = select i1 %1, float %c, float %d541  ret float %2542}543 544define double @select_fcmp_ult_f64(double %a, double %b, double %c, double %d) {545; SSE-LABEL: select_fcmp_ult_f64:546; SSE:       # %bb.0:547; SSE-NEXT:    movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill548; SSE-NEXT:    movaps %xmm0, %xmm1549; SSE-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload550; SSE-NEXT:    # xmm0 = mem[0],zero551; SSE-NEXT:    cmpnlesd %xmm1, %xmm0552; SSE-NEXT:    movaps %xmm0, %xmm1553; SSE-NEXT:    andpd %xmm2, %xmm1554; SSE-NEXT:    andnpd %xmm3, %xmm0555; SSE-NEXT:    orpd %xmm1, %xmm0556; SSE-NEXT:    retq557;558; AVX-LABEL: select_fcmp_ult_f64:559; AVX:       # %bb.0:560; AVX-NEXT:    vcmpnlesd %xmm0, %xmm1, %xmm0561; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0562; AVX-NEXT:    retq563;564; AVX512-LABEL: select_fcmp_ult_f64:565; AVX512:       # %bb.0:566; AVX512-NEXT:    vcmpnlesd %xmm0, %xmm1, %k1567; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}568; AVX512-NEXT:    vmovapd %xmm3, %xmm0569; AVX512-NEXT:    retq570  %1 = fcmp ult double %a, %b571  %2 = select i1 %1, double %c, double %d572  ret double %2573}574 575define float @select_fcmp_ule_f32(float %a, float %b, float %c, float %d) {576; SSE-LABEL: select_fcmp_ule_f32:577; SSE:       # %bb.0:578; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill579; SSE-NEXT:    movaps %xmm0, %xmm1580; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload581; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero582; SSE-NEXT:    cmpnltss %xmm1, %xmm0583; SSE-NEXT:    movaps %xmm0, %xmm1584; SSE-NEXT:    andps %xmm2, %xmm1585; SSE-NEXT:    andnps %xmm3, %xmm0586; SSE-NEXT:    orps %xmm1, %xmm0587; SSE-NEXT:    retq588;589; AVX-LABEL: select_fcmp_ule_f32:590; AVX:       # %bb.0:591; AVX-NEXT:    vcmpnltss %xmm0, %xmm1, %xmm0592; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0593; AVX-NEXT:    retq594;595; AVX512-LABEL: select_fcmp_ule_f32:596; AVX512:       # %bb.0:597; AVX512-NEXT:    vcmpnltss %xmm0, %xmm1, %k1598; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}599; AVX512-NEXT:    vmovaps %xmm3, %xmm0600; AVX512-NEXT:    retq601  %1 = fcmp ule float %a, %b602  %2 = select i1 %1, float %c, float %d603  ret float %2604}605 606define double @select_fcmp_ule_f64(double %a, double %b, double %c, double %d) {607; SSE-LABEL: select_fcmp_ule_f64:608; SSE:       # %bb.0:609; SSE-NEXT:    movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill610; SSE-NEXT:    movaps %xmm0, %xmm1611; SSE-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload612; SSE-NEXT:    # xmm0 = mem[0],zero613; SSE-NEXT:    cmpnltsd %xmm1, %xmm0614; SSE-NEXT:    movaps %xmm0, %xmm1615; SSE-NEXT:    andpd %xmm2, %xmm1616; SSE-NEXT:    andnpd %xmm3, %xmm0617; SSE-NEXT:    orpd %xmm1, %xmm0618; SSE-NEXT:    retq619;620; AVX-LABEL: select_fcmp_ule_f64:621; AVX:       # %bb.0:622; AVX-NEXT:    vcmpnltsd %xmm0, %xmm1, %xmm0623; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0624; AVX-NEXT:    retq625;626; AVX512-LABEL: select_fcmp_ule_f64:627; AVX512:       # %bb.0:628; AVX512-NEXT:    vcmpnltsd %xmm0, %xmm1, %k1629; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}630; AVX512-NEXT:    vmovapd %xmm3, %xmm0631; AVX512-NEXT:    retq632  %1 = fcmp ule double %a, %b633  %2 = select i1 %1, double %c, double %d634  ret double %2635}636 637define float @select_fcmp_une_f32(float %a, float %b, float %c, float %d) {638; SSE-LABEL: select_fcmp_une_f32:639; SSE:       # %bb.0:640; SSE-NEXT:    cmpneqss %xmm1, %xmm0641; SSE-NEXT:    movaps %xmm0, %xmm1642; SSE-NEXT:    andps %xmm2, %xmm1643; SSE-NEXT:    andnps %xmm3, %xmm0644; SSE-NEXT:    orps %xmm1, %xmm0645; SSE-NEXT:    retq646;647; AVX-LABEL: select_fcmp_une_f32:648; AVX:       # %bb.0:649; AVX-NEXT:    vcmpneqss %xmm1, %xmm0, %xmm0650; AVX-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0651; AVX-NEXT:    retq652;653; AVX512-LABEL: select_fcmp_une_f32:654; AVX512:       # %bb.0:655; AVX512-NEXT:    vcmpneqss %xmm1, %xmm0, %k1656; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}657; AVX512-NEXT:    vmovaps %xmm3, %xmm0658; AVX512-NEXT:    retq659  %1 = fcmp une float %a, %b660  %2 = select i1 %1, float %c, float %d661  ret float %2662}663 664define double @select_fcmp_une_f64(double %a, double %b, double %c, double %d) {665; SSE-LABEL: select_fcmp_une_f64:666; SSE:       # %bb.0:667; SSE-NEXT:    cmpneqsd %xmm1, %xmm0668; SSE-NEXT:    movaps %xmm0, %xmm1669; SSE-NEXT:    andpd %xmm2, %xmm1670; SSE-NEXT:    andnpd %xmm3, %xmm0671; SSE-NEXT:    orpd %xmm1, %xmm0672; SSE-NEXT:    retq673;674; AVX-LABEL: select_fcmp_une_f64:675; AVX:       # %bb.0:676; AVX-NEXT:    vcmpneqsd %xmm1, %xmm0, %xmm0677; AVX-NEXT:    vblendvpd %xmm0, %xmm2, %xmm3, %xmm0678; AVX-NEXT:    retq679;680; AVX512-LABEL: select_fcmp_une_f64:681; AVX512:       # %bb.0:682; AVX512-NEXT:    vcmpneqsd %xmm1, %xmm0, %k1683; AVX512-NEXT:    vmovsd %xmm2, %xmm3, %xmm3 {%k1}684; AVX512-NEXT:    vmovapd %xmm3, %xmm0685; AVX512-NEXT:    retq686  %1 = fcmp une double %a, %b687  %2 = select i1 %1, double %c, double %d688  ret double %2689}690 691