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