1338 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=STRICT3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 -enable-no-signed-zeros-fp-math -enable-no-nans-fp-math | FileCheck %s --check-prefix=ALL --check-prefix=RELAX --check-prefix=UNSAFE4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 -enable-no-nans-fp-math | FileCheck %s --check-prefix=ALL --check-prefix=RELAX --check-prefix=FINITE5 6; Some of these patterns can be matched as SSE min or max. Some of7; them can be matched provided that the operands are swapped.8; Some of them can't be matched at all and require a comparison9; and a conditional branch.10 11; The naming convention is {,x_,y_}{o,u}{gt,lt,ge,le}{,_inverse}12; _x: use 0.0 instead of %y13; _y: use -0.0 instead of %y14; _inverse : swap the arms of the select.15 16define double @ogt(double %x, double %y) {17; ALL-LABEL: ogt:18; ALL: # %bb.0:19; ALL-NEXT: maxsd %xmm1, %xmm020; ALL-NEXT: retq21 %c = fcmp ogt double %x, %y22 %d = select i1 %c, double %x, double %y23 ret double %d24}25 26define double @olt(double %x, double %y) {27; ALL-LABEL: olt:28; ALL: # %bb.0:29; ALL-NEXT: minsd %xmm1, %xmm030; ALL-NEXT: retq31 %c = fcmp olt double %x, %y32 %d = select i1 %c, double %x, double %y33 ret double %d34}35 36define double @ogt_inverse(double %x, double %y) {37; STRICT-LABEL: ogt_inverse:38; STRICT: # %bb.0:39; STRICT-NEXT: minsd %xmm0, %xmm140; STRICT-NEXT: movapd %xmm1, %xmm041; STRICT-NEXT: retq42;43; UNSAFE-LABEL: ogt_inverse:44; UNSAFE: # %bb.0:45; UNSAFE-NEXT: minsd %xmm1, %xmm046; UNSAFE-NEXT: retq47;48; FINITE-LABEL: ogt_inverse:49; FINITE: # %bb.0:50; FINITE-NEXT: minsd %xmm0, %xmm151; FINITE-NEXT: movapd %xmm1, %xmm052; FINITE-NEXT: retq53 %c = fcmp ogt double %x, %y54 %d = select i1 %c, double %y, double %x55 ret double %d56}57 58define double @olt_inverse(double %x, double %y) {59; STRICT-LABEL: olt_inverse:60; STRICT: # %bb.0:61; STRICT-NEXT: maxsd %xmm0, %xmm162; STRICT-NEXT: movapd %xmm1, %xmm063; STRICT-NEXT: retq64;65; UNSAFE-LABEL: olt_inverse:66; UNSAFE: # %bb.0:67; UNSAFE-NEXT: maxsd %xmm1, %xmm068; UNSAFE-NEXT: retq69;70; FINITE-LABEL: olt_inverse:71; FINITE: # %bb.0:72; FINITE-NEXT: maxsd %xmm0, %xmm173; FINITE-NEXT: movapd %xmm1, %xmm074; FINITE-NEXT: retq75 %c = fcmp olt double %x, %y76 %d = select i1 %c, double %y, double %x77 ret double %d78}79 80define double @oge(double %x, double %y) {81; STRICT-LABEL: oge:82; STRICT: # %bb.0:83; STRICT-NEXT: movapd %xmm0, %xmm284; STRICT-NEXT: movapd %xmm1, %xmm085; STRICT-NEXT: cmplesd %xmm2, %xmm086; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm187; STRICT-NEXT: movapd %xmm1, %xmm088; STRICT-NEXT: retq89;90; RELAX-LABEL: oge:91; RELAX: # %bb.0:92; RELAX-NEXT: maxsd %xmm1, %xmm093; RELAX-NEXT: retq94 %c = fcmp oge double %x, %y95 %d = select i1 %c, double %x, double %y96 ret double %d97}98 99define double @ole(double %x, double %y) {100; STRICT-LABEL: ole:101; STRICT: # %bb.0:102; STRICT-NEXT: movapd %xmm0, %xmm2103; STRICT-NEXT: cmplesd %xmm1, %xmm0104; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1105; STRICT-NEXT: movapd %xmm1, %xmm0106; STRICT-NEXT: retq107;108; RELAX-LABEL: ole:109; RELAX: # %bb.0:110; RELAX-NEXT: minsd %xmm1, %xmm0111; RELAX-NEXT: retq112 %c = fcmp ole double %x, %y113 %d = select i1 %c, double %x, double %y114 ret double %d115}116 117define double @oge_inverse(double %x, double %y) {118; STRICT-LABEL: oge_inverse:119; STRICT: # %bb.0:120; STRICT-NEXT: movapd %xmm0, %xmm2121; STRICT-NEXT: movapd %xmm1, %xmm0122; STRICT-NEXT: cmplesd %xmm2, %xmm0123; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2124; STRICT-NEXT: movapd %xmm2, %xmm0125; STRICT-NEXT: retq126;127; UNSAFE-LABEL: oge_inverse:128; UNSAFE: # %bb.0:129; UNSAFE-NEXT: minsd %xmm1, %xmm0130; UNSAFE-NEXT: retq131;132; FINITE-LABEL: oge_inverse:133; FINITE: # %bb.0:134; FINITE-NEXT: minsd %xmm0, %xmm1135; FINITE-NEXT: movapd %xmm1, %xmm0136; FINITE-NEXT: retq137 %c = fcmp oge double %x, %y138 %d = select i1 %c, double %y, double %x139 ret double %d140}141 142define double @ole_inverse(double %x, double %y) {143; STRICT-LABEL: ole_inverse:144; STRICT: # %bb.0:145; STRICT-NEXT: movapd %xmm0, %xmm2146; STRICT-NEXT: cmplesd %xmm1, %xmm0147; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2148; STRICT-NEXT: movapd %xmm2, %xmm0149; STRICT-NEXT: retq150;151; UNSAFE-LABEL: ole_inverse:152; UNSAFE: # %bb.0:153; UNSAFE-NEXT: maxsd %xmm1, %xmm0154; UNSAFE-NEXT: retq155;156; FINITE-LABEL: ole_inverse:157; FINITE: # %bb.0:158; FINITE-NEXT: maxsd %xmm0, %xmm1159; FINITE-NEXT: movapd %xmm1, %xmm0160; FINITE-NEXT: retq161 %c = fcmp ole double %x, %y162 %d = select i1 %c, double %y, double %x163 ret double %d164}165 166define double @ogt_x(double %x) {167; ALL-LABEL: ogt_x:168; ALL: # %bb.0:169; ALL-NEXT: xorpd %xmm1, %xmm1170; ALL-NEXT: maxsd %xmm1, %xmm0171; ALL-NEXT: retq172 %c = fcmp ogt double %x, 0.000000e+00173 %d = select i1 %c, double %x, double 0.000000e+00174 ret double %d175}176 177define double @olt_x(double %x) {178; ALL-LABEL: olt_x:179; ALL: # %bb.0:180; ALL-NEXT: xorpd %xmm1, %xmm1181; ALL-NEXT: minsd %xmm1, %xmm0182; ALL-NEXT: retq183 %c = fcmp olt double %x, 0.000000e+00184 %d = select i1 %c, double %x, double 0.000000e+00185 ret double %d186}187 188define double @ogt_inverse_x(double %x) {189; STRICT-LABEL: ogt_inverse_x:190; STRICT: # %bb.0:191; STRICT-NEXT: xorpd %xmm1, %xmm1192; STRICT-NEXT: minsd %xmm0, %xmm1193; STRICT-NEXT: movapd %xmm1, %xmm0194; STRICT-NEXT: retq195;196; UNSAFE-LABEL: ogt_inverse_x:197; UNSAFE: # %bb.0:198; UNSAFE-NEXT: xorpd %xmm1, %xmm1199; UNSAFE-NEXT: minsd %xmm1, %xmm0200; UNSAFE-NEXT: retq201;202; FINITE-LABEL: ogt_inverse_x:203; FINITE: # %bb.0:204; FINITE-NEXT: xorpd %xmm1, %xmm1205; FINITE-NEXT: minsd %xmm0, %xmm1206; FINITE-NEXT: movapd %xmm1, %xmm0207; FINITE-NEXT: retq208 %c = fcmp ogt double %x, 0.000000e+00209 %d = select i1 %c, double 0.000000e+00, double %x210 ret double %d211}212 213define double @olt_inverse_x(double %x) {214; STRICT-LABEL: olt_inverse_x:215; STRICT: # %bb.0:216; STRICT-NEXT: xorpd %xmm1, %xmm1217; STRICT-NEXT: maxsd %xmm0, %xmm1218; STRICT-NEXT: movapd %xmm1, %xmm0219; STRICT-NEXT: retq220;221; UNSAFE-LABEL: olt_inverse_x:222; UNSAFE: # %bb.0:223; UNSAFE-NEXT: xorpd %xmm1, %xmm1224; UNSAFE-NEXT: maxsd %xmm1, %xmm0225; UNSAFE-NEXT: retq226;227; FINITE-LABEL: olt_inverse_x:228; FINITE: # %bb.0:229; FINITE-NEXT: xorpd %xmm1, %xmm1230; FINITE-NEXT: maxsd %xmm0, %xmm1231; FINITE-NEXT: movapd %xmm1, %xmm0232; FINITE-NEXT: retq233 %c = fcmp olt double %x, 0.000000e+00234 %d = select i1 %c, double 0.000000e+00, double %x235 ret double %d236}237 238define double @oge_x(double %x) {239; STRICT-LABEL: oge_x:240; STRICT: # %bb.0:241; STRICT-NEXT: xorpd %xmm1, %xmm1242; STRICT-NEXT: cmplesd %xmm0, %xmm1243; STRICT-NEXT: andpd %xmm1, %xmm0244; STRICT-NEXT: retq245;246; RELAX-LABEL: oge_x:247; RELAX: # %bb.0:248; RELAX-NEXT: xorpd %xmm1, %xmm1249; RELAX-NEXT: maxsd %xmm1, %xmm0250; RELAX-NEXT: retq251 %c = fcmp oge double %x, 0.000000e+00252 %d = select i1 %c, double %x, double 0.000000e+00253 ret double %d254}255 256define double @ole_x(double %x) {257; STRICT-LABEL: ole_x:258; STRICT: # %bb.0:259; STRICT-NEXT: xorpd %xmm1, %xmm1260; STRICT-NEXT: movapd %xmm0, %xmm2261; STRICT-NEXT: cmplesd %xmm1, %xmm2262; STRICT-NEXT: andpd %xmm2, %xmm0263; STRICT-NEXT: retq264;265; RELAX-LABEL: ole_x:266; RELAX: # %bb.0:267; RELAX-NEXT: xorpd %xmm1, %xmm1268; RELAX-NEXT: minsd %xmm1, %xmm0269; RELAX-NEXT: retq270 %c = fcmp ole double %x, 0.000000e+00271 %d = select i1 %c, double %x, double 0.000000e+00272 ret double %d273}274 275define double @oge_inverse_x(double %x) {276; STRICT-LABEL: oge_inverse_x:277; STRICT: # %bb.0:278; STRICT-NEXT: xorpd %xmm1, %xmm1279; STRICT-NEXT: cmplesd %xmm0, %xmm1280; STRICT-NEXT: andnpd %xmm0, %xmm1281; STRICT-NEXT: movapd %xmm1, %xmm0282; STRICT-NEXT: retq283;284; UNSAFE-LABEL: oge_inverse_x:285; UNSAFE: # %bb.0:286; UNSAFE-NEXT: xorpd %xmm1, %xmm1287; UNSAFE-NEXT: minsd %xmm1, %xmm0288; UNSAFE-NEXT: retq289;290; FINITE-LABEL: oge_inverse_x:291; FINITE: # %bb.0:292; FINITE-NEXT: xorpd %xmm1, %xmm1293; FINITE-NEXT: minsd %xmm0, %xmm1294; FINITE-NEXT: movapd %xmm1, %xmm0295; FINITE-NEXT: retq296 %c = fcmp oge double %x, 0.000000e+00297 %d = select i1 %c, double 0.000000e+00, double %x298 ret double %d299}300 301define double @ole_inverse_x(double %x) {302; STRICT-LABEL: ole_inverse_x:303; STRICT: # %bb.0:304; STRICT-NEXT: xorpd %xmm2, %xmm2305; STRICT-NEXT: movapd %xmm0, %xmm1306; STRICT-NEXT: cmplesd %xmm2, %xmm1307; STRICT-NEXT: andnpd %xmm0, %xmm1308; STRICT-NEXT: movapd %xmm1, %xmm0309; STRICT-NEXT: retq310;311; UNSAFE-LABEL: ole_inverse_x:312; UNSAFE: # %bb.0:313; UNSAFE-NEXT: xorpd %xmm1, %xmm1314; UNSAFE-NEXT: maxsd %xmm1, %xmm0315; UNSAFE-NEXT: retq316;317; FINITE-LABEL: ole_inverse_x:318; FINITE: # %bb.0:319; FINITE-NEXT: xorpd %xmm1, %xmm1320; FINITE-NEXT: maxsd %xmm0, %xmm1321; FINITE-NEXT: movapd %xmm1, %xmm0322; FINITE-NEXT: retq323 %c = fcmp ole double %x, 0.000000e+00324 %d = select i1 %c, double 0.000000e+00, double %x325 ret double %d326}327 328define double @ugt(double %x, double %y) {329; STRICT-LABEL: ugt:330; STRICT: # %bb.0:331; STRICT-NEXT: movapd %xmm0, %xmm2332; STRICT-NEXT: cmpnlesd %xmm1, %xmm0333; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1334; STRICT-NEXT: movapd %xmm1, %xmm0335; STRICT-NEXT: retq336;337; RELAX-LABEL: ugt:338; RELAX: # %bb.0:339; RELAX-NEXT: maxsd %xmm1, %xmm0340; RELAX-NEXT: retq341 %c = fcmp ugt double %x, %y342 %d = select i1 %c, double %x, double %y343 ret double %d344}345 346define double @ult(double %x, double %y) {347; STRICT-LABEL: ult:348; STRICT: # %bb.0:349; STRICT-NEXT: movapd %xmm0, %xmm2350; STRICT-NEXT: movapd %xmm1, %xmm0351; STRICT-NEXT: cmpnlesd %xmm2, %xmm0352; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1353; STRICT-NEXT: movapd %xmm1, %xmm0354; STRICT-NEXT: retq355;356; RELAX-LABEL: ult:357; RELAX: # %bb.0:358; RELAX-NEXT: minsd %xmm1, %xmm0359; RELAX-NEXT: retq360 %c = fcmp ult double %x, %y361 %d = select i1 %c, double %x, double %y362 ret double %d363}364 365define double @ugt_inverse(double %x, double %y) {366; STRICT-LABEL: ugt_inverse:367; STRICT: # %bb.0:368; STRICT-NEXT: movapd %xmm0, %xmm2369; STRICT-NEXT: cmpnlesd %xmm1, %xmm0370; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2371; STRICT-NEXT: movapd %xmm2, %xmm0372; STRICT-NEXT: retq373;374; UNSAFE-LABEL: ugt_inverse:375; UNSAFE: # %bb.0:376; UNSAFE-NEXT: minsd %xmm1, %xmm0377; UNSAFE-NEXT: retq378;379; FINITE-LABEL: ugt_inverse:380; FINITE: # %bb.0:381; FINITE-NEXT: minsd %xmm0, %xmm1382; FINITE-NEXT: movapd %xmm1, %xmm0383; FINITE-NEXT: retq384 %c = fcmp ugt double %x, %y385 %d = select i1 %c, double %y, double %x386 ret double %d387}388 389define double @ult_inverse(double %x, double %y) {390; STRICT-LABEL: ult_inverse:391; STRICT: # %bb.0:392; STRICT-NEXT: movapd %xmm0, %xmm2393; STRICT-NEXT: movapd %xmm1, %xmm0394; STRICT-NEXT: cmpnlesd %xmm2, %xmm0395; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2396; STRICT-NEXT: movapd %xmm2, %xmm0397; STRICT-NEXT: retq398;399; UNSAFE-LABEL: ult_inverse:400; UNSAFE: # %bb.0:401; UNSAFE-NEXT: maxsd %xmm1, %xmm0402; UNSAFE-NEXT: retq403;404; FINITE-LABEL: ult_inverse:405; FINITE: # %bb.0:406; FINITE-NEXT: maxsd %xmm0, %xmm1407; FINITE-NEXT: movapd %xmm1, %xmm0408; FINITE-NEXT: retq409 %c = fcmp ult double %x, %y410 %d = select i1 %c, double %y, double %x411 ret double %d412}413 414define double @uge(double %x, double %y) {415; STRICT-LABEL: uge:416; STRICT: # %bb.0:417; STRICT-NEXT: maxsd %xmm0, %xmm1418; STRICT-NEXT: movapd %xmm1, %xmm0419; STRICT-NEXT: retq420;421; RELAX-LABEL: uge:422; RELAX: # %bb.0:423; RELAX-NEXT: maxsd %xmm1, %xmm0424; RELAX-NEXT: retq425 %c = fcmp uge double %x, %y426 %d = select i1 %c, double %x, double %y427 ret double %d428}429 430define double @ule(double %x, double %y) {431; STRICT-LABEL: ule:432; STRICT: # %bb.0:433; STRICT-NEXT: minsd %xmm0, %xmm1434; STRICT-NEXT: movapd %xmm1, %xmm0435; STRICT-NEXT: retq436;437; RELAX-LABEL: ule:438; RELAX: # %bb.0:439; RELAX-NEXT: minsd %xmm1, %xmm0440; RELAX-NEXT: retq441 %c = fcmp ule double %x, %y442 %d = select i1 %c, double %x, double %y443 ret double %d444}445 446define double @uge_inverse(double %x, double %y) {447; STRICT-LABEL: uge_inverse:448; STRICT: # %bb.0:449; STRICT-NEXT: minsd %xmm1, %xmm0450; STRICT-NEXT: retq451;452; UNSAFE-LABEL: uge_inverse:453; UNSAFE: # %bb.0:454; UNSAFE-NEXT: minsd %xmm1, %xmm0455; UNSAFE-NEXT: retq456;457; FINITE-LABEL: uge_inverse:458; FINITE: # %bb.0:459; FINITE-NEXT: minsd %xmm0, %xmm1460; FINITE-NEXT: movapd %xmm1, %xmm0461; FINITE-NEXT: retq462 %c = fcmp uge double %x, %y463 %d = select i1 %c, double %y, double %x464 ret double %d465}466 467define double @ule_inverse(double %x, double %y) {468; STRICT-LABEL: ule_inverse:469; STRICT: # %bb.0:470; STRICT-NEXT: maxsd %xmm1, %xmm0471; STRICT-NEXT: retq472;473; UNSAFE-LABEL: ule_inverse:474; UNSAFE: # %bb.0:475; UNSAFE-NEXT: maxsd %xmm1, %xmm0476; UNSAFE-NEXT: retq477;478; FINITE-LABEL: ule_inverse:479; FINITE: # %bb.0:480; FINITE-NEXT: maxsd %xmm0, %xmm1481; FINITE-NEXT: movapd %xmm1, %xmm0482; FINITE-NEXT: retq483 %c = fcmp ule double %x, %y484 %d = select i1 %c, double %y, double %x485 ret double %d486}487 488define double @ugt_x(double %x) {489; STRICT-LABEL: ugt_x:490; STRICT: # %bb.0:491; STRICT-NEXT: xorpd %xmm1, %xmm1492; STRICT-NEXT: movapd %xmm0, %xmm2493; STRICT-NEXT: cmpnlesd %xmm1, %xmm2494; STRICT-NEXT: andpd %xmm2, %xmm0495; STRICT-NEXT: retq496;497; RELAX-LABEL: ugt_x:498; RELAX: # %bb.0:499; RELAX-NEXT: xorpd %xmm1, %xmm1500; RELAX-NEXT: maxsd %xmm1, %xmm0501; RELAX-NEXT: retq502 %c = fcmp ugt double %x, 0.000000e+00503 %d = select i1 %c, double %x, double 0.000000e+00504 ret double %d505}506 507define double @ult_x(double %x) {508; STRICT-LABEL: ult_x:509; STRICT: # %bb.0:510; STRICT-NEXT: xorpd %xmm1, %xmm1511; STRICT-NEXT: cmpnlesd %xmm0, %xmm1512; STRICT-NEXT: andpd %xmm1, %xmm0513; STRICT-NEXT: retq514;515; RELAX-LABEL: ult_x:516; RELAX: # %bb.0:517; RELAX-NEXT: xorpd %xmm1, %xmm1518; RELAX-NEXT: minsd %xmm1, %xmm0519; RELAX-NEXT: retq520 %c = fcmp ult double %x, 0.000000e+00521 %d = select i1 %c, double %x, double 0.000000e+00522 ret double %d523}524 525define double @ugt_inverse_x(double %x) {526; STRICT-LABEL: ugt_inverse_x:527; STRICT: # %bb.0:528; STRICT-NEXT: xorpd %xmm2, %xmm2529; STRICT-NEXT: movapd %xmm0, %xmm1530; STRICT-NEXT: cmpnlesd %xmm2, %xmm1531; STRICT-NEXT: andnpd %xmm0, %xmm1532; STRICT-NEXT: movapd %xmm1, %xmm0533; STRICT-NEXT: retq534;535; UNSAFE-LABEL: ugt_inverse_x:536; UNSAFE: # %bb.0:537; UNSAFE-NEXT: xorpd %xmm1, %xmm1538; UNSAFE-NEXT: minsd %xmm1, %xmm0539; UNSAFE-NEXT: retq540;541; FINITE-LABEL: ugt_inverse_x:542; FINITE: # %bb.0:543; FINITE-NEXT: xorpd %xmm1, %xmm1544; FINITE-NEXT: minsd %xmm0, %xmm1545; FINITE-NEXT: movapd %xmm1, %xmm0546; FINITE-NEXT: retq547 %c = fcmp ugt double %x, 0.000000e+00548 %d = select i1 %c, double 0.000000e+00, double %x549 ret double %d550}551 552define double @ult_inverse_x(double %x) {553; STRICT-LABEL: ult_inverse_x:554; STRICT: # %bb.0:555; STRICT-NEXT: xorpd %xmm1, %xmm1556; STRICT-NEXT: cmpnlesd %xmm0, %xmm1557; STRICT-NEXT: andnpd %xmm0, %xmm1558; STRICT-NEXT: movapd %xmm1, %xmm0559; STRICT-NEXT: retq560;561; UNSAFE-LABEL: ult_inverse_x:562; UNSAFE: # %bb.0:563; UNSAFE-NEXT: xorpd %xmm1, %xmm1564; UNSAFE-NEXT: maxsd %xmm1, %xmm0565; UNSAFE-NEXT: retq566;567; FINITE-LABEL: ult_inverse_x:568; FINITE: # %bb.0:569; FINITE-NEXT: xorpd %xmm1, %xmm1570; FINITE-NEXT: maxsd %xmm0, %xmm1571; FINITE-NEXT: movapd %xmm1, %xmm0572; FINITE-NEXT: retq573 %c = fcmp ult double %x, 0.000000e+00574 %d = select i1 %c, double 0.000000e+00, double %x575 ret double %d576}577 578define double @uge_x(double %x) {579; STRICT-LABEL: uge_x:580; STRICT: # %bb.0:581; STRICT-NEXT: xorpd %xmm1, %xmm1582; STRICT-NEXT: maxsd %xmm0, %xmm1583; STRICT-NEXT: movapd %xmm1, %xmm0584; STRICT-NEXT: retq585;586; RELAX-LABEL: uge_x:587; RELAX: # %bb.0:588; RELAX-NEXT: xorpd %xmm1, %xmm1589; RELAX-NEXT: maxsd %xmm1, %xmm0590; RELAX-NEXT: retq591 %c = fcmp uge double %x, 0.000000e+00592 %d = select i1 %c, double %x, double 0.000000e+00593 ret double %d594}595 596define double @ule_x(double %x) {597; STRICT-LABEL: ule_x:598; STRICT: # %bb.0:599; STRICT-NEXT: xorpd %xmm1, %xmm1600; STRICT-NEXT: minsd %xmm0, %xmm1601; STRICT-NEXT: movapd %xmm1, %xmm0602; STRICT-NEXT: retq603;604; RELAX-LABEL: ule_x:605; RELAX: # %bb.0:606; RELAX-NEXT: xorpd %xmm1, %xmm1607; RELAX-NEXT: minsd %xmm1, %xmm0608; RELAX-NEXT: retq609 %c = fcmp ule double %x, 0.000000e+00610 %d = select i1 %c, double %x, double 0.000000e+00611 ret double %d612}613 614define double @uge_inverse_x(double %x) {615; STRICT-LABEL: uge_inverse_x:616; STRICT: # %bb.0:617; STRICT-NEXT: xorpd %xmm1, %xmm1618; STRICT-NEXT: minsd %xmm1, %xmm0619; STRICT-NEXT: retq620;621; UNSAFE-LABEL: uge_inverse_x:622; UNSAFE: # %bb.0:623; UNSAFE-NEXT: xorpd %xmm1, %xmm1624; UNSAFE-NEXT: minsd %xmm1, %xmm0625; UNSAFE-NEXT: retq626;627; FINITE-LABEL: uge_inverse_x:628; FINITE: # %bb.0:629; FINITE-NEXT: xorpd %xmm1, %xmm1630; FINITE-NEXT: minsd %xmm0, %xmm1631; FINITE-NEXT: movapd %xmm1, %xmm0632; FINITE-NEXT: retq633 %c = fcmp uge double %x, 0.000000e+00634 %d = select i1 %c, double 0.000000e+00, double %x635 ret double %d636}637 638define double @ule_inverse_x(double %x) {639; STRICT-LABEL: ule_inverse_x:640; STRICT: # %bb.0:641; STRICT-NEXT: xorpd %xmm1, %xmm1642; STRICT-NEXT: maxsd %xmm1, %xmm0643; STRICT-NEXT: retq644;645; UNSAFE-LABEL: ule_inverse_x:646; UNSAFE: # %bb.0:647; UNSAFE-NEXT: xorpd %xmm1, %xmm1648; UNSAFE-NEXT: maxsd %xmm1, %xmm0649; UNSAFE-NEXT: retq650;651; FINITE-LABEL: ule_inverse_x:652; FINITE: # %bb.0:653; FINITE-NEXT: xorpd %xmm1, %xmm1654; FINITE-NEXT: maxsd %xmm0, %xmm1655; FINITE-NEXT: movapd %xmm1, %xmm0656; FINITE-NEXT: retq657 %c = fcmp ule double %x, 0.000000e+00658 %d = select i1 %c, double 0.000000e+00, double %x659 ret double %d660}661 662define double @ogt_y(double %x) {663; ALL-LABEL: ogt_y:664; ALL: # %bb.0:665; ALL-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0666; ALL-NEXT: retq667 %c = fcmp ogt double %x, -0.000000e+00668 %d = select i1 %c, double %x, double -0.000000e+00669 ret double %d670}671 672define double @olt_y(double %x) {673; ALL-LABEL: olt_y:674; ALL: # %bb.0:675; ALL-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0676; ALL-NEXT: retq677 %c = fcmp olt double %x, -0.000000e+00678 %d = select i1 %c, double %x, double -0.000000e+00679 ret double %d680}681 682define double @ogt_inverse_y(double %x) {683; STRICT-LABEL: ogt_inverse_y:684; STRICT: # %bb.0:685; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]686; STRICT-NEXT: minsd %xmm0, %xmm1687; STRICT-NEXT: movapd %xmm1, %xmm0688; STRICT-NEXT: retq689;690; UNSAFE-LABEL: ogt_inverse_y:691; UNSAFE: # %bb.0:692; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0693; UNSAFE-NEXT: retq694;695; FINITE-LABEL: ogt_inverse_y:696; FINITE: # %bb.0:697; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]698; FINITE-NEXT: minsd %xmm0, %xmm1699; FINITE-NEXT: movapd %xmm1, %xmm0700; FINITE-NEXT: retq701 %c = fcmp ogt double %x, -0.000000e+00702 %d = select i1 %c, double -0.000000e+00, double %x703 ret double %d704}705 706define double @olt_inverse_y(double %x) {707; STRICT-LABEL: olt_inverse_y:708; STRICT: # %bb.0:709; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]710; STRICT-NEXT: maxsd %xmm0, %xmm1711; STRICT-NEXT: movapd %xmm1, %xmm0712; STRICT-NEXT: retq713;714; UNSAFE-LABEL: olt_inverse_y:715; UNSAFE: # %bb.0:716; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0717; UNSAFE-NEXT: retq718;719; FINITE-LABEL: olt_inverse_y:720; FINITE: # %bb.0:721; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]722; FINITE-NEXT: maxsd %xmm0, %xmm1723; FINITE-NEXT: movapd %xmm1, %xmm0724; FINITE-NEXT: retq725 %c = fcmp olt double %x, -0.000000e+00726 %d = select i1 %c, double -0.000000e+00, double %x727 ret double %d728}729 730define double @oge_y(double %x) {731; STRICT-LABEL: oge_y:732; STRICT: # %bb.0:733; STRICT-NEXT: movapd %xmm0, %xmm1734; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]735; STRICT-NEXT: cmplesd %xmm1, %xmm0736; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]737; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2738; STRICT-NEXT: movapd %xmm2, %xmm0739; STRICT-NEXT: retq740;741; RELAX-LABEL: oge_y:742; RELAX: # %bb.0:743; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0744; RELAX-NEXT: retq745 %c = fcmp oge double %x, -0.000000e+00746 %d = select i1 %c, double %x, double -0.000000e+00747 ret double %d748}749 750define double @ole_y(double %x) {751; STRICT-LABEL: ole_y:752; STRICT: # %bb.0:753; STRICT-NEXT: movapd %xmm0, %xmm1754; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0755; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]756; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2757; STRICT-NEXT: movapd %xmm2, %xmm0758; STRICT-NEXT: retq759;760; RELAX-LABEL: ole_y:761; RELAX: # %bb.0:762; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0763; RELAX-NEXT: retq764 %c = fcmp ole double %x, -0.000000e+00765 %d = select i1 %c, double %x, double -0.000000e+00766 ret double %d767}768 769define double @oge_inverse_y(double %x) {770; STRICT-LABEL: oge_inverse_y:771; STRICT: # %bb.0:772; STRICT-NEXT: movapd %xmm0, %xmm1773; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]774; STRICT-NEXT: cmplesd %xmm1, %xmm0775; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1776; STRICT-NEXT: movapd %xmm1, %xmm0777; STRICT-NEXT: retq778;779; UNSAFE-LABEL: oge_inverse_y:780; UNSAFE: # %bb.0:781; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0782; UNSAFE-NEXT: retq783;784; FINITE-LABEL: oge_inverse_y:785; FINITE: # %bb.0:786; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]787; FINITE-NEXT: minsd %xmm0, %xmm1788; FINITE-NEXT: movapd %xmm1, %xmm0789; FINITE-NEXT: retq790 %c = fcmp oge double %x, -0.000000e+00791 %d = select i1 %c, double -0.000000e+00, double %x792 ret double %d793}794 795define double @ole_inverse_y(double %x) {796; STRICT-LABEL: ole_inverse_y:797; STRICT: # %bb.0:798; STRICT-NEXT: movapd %xmm0, %xmm1799; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0800; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1801; STRICT-NEXT: movapd %xmm1, %xmm0802; STRICT-NEXT: retq803;804; UNSAFE-LABEL: ole_inverse_y:805; UNSAFE: # %bb.0:806; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0807; UNSAFE-NEXT: retq808;809; FINITE-LABEL: ole_inverse_y:810; FINITE: # %bb.0:811; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]812; FINITE-NEXT: maxsd %xmm0, %xmm1813; FINITE-NEXT: movapd %xmm1, %xmm0814; FINITE-NEXT: retq815 %c = fcmp ole double %x, -0.000000e+00816 %d = select i1 %c, double -0.000000e+00, double %x817 ret double %d818}819 820define double @ugt_y(double %x) {821; STRICT-LABEL: ugt_y:822; STRICT: # %bb.0:823; STRICT-NEXT: movapd %xmm0, %xmm1824; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0825; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]826; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2827; STRICT-NEXT: movapd %xmm2, %xmm0828; STRICT-NEXT: retq829;830; RELAX-LABEL: ugt_y:831; RELAX: # %bb.0:832; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0833; RELAX-NEXT: retq834 %c = fcmp ugt double %x, -0.000000e+00835 %d = select i1 %c, double %x, double -0.000000e+00836 ret double %d837}838 839define double @ult_y(double %x) {840; STRICT-LABEL: ult_y:841; STRICT: # %bb.0:842; STRICT-NEXT: movapd %xmm0, %xmm1843; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]844; STRICT-NEXT: cmpnlesd %xmm1, %xmm0845; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]846; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2847; STRICT-NEXT: movapd %xmm2, %xmm0848; STRICT-NEXT: retq849;850; RELAX-LABEL: ult_y:851; RELAX: # %bb.0:852; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0853; RELAX-NEXT: retq854 %c = fcmp ult double %x, -0.000000e+00855 %d = select i1 %c, double %x, double -0.000000e+00856 ret double %d857}858 859define double @ugt_inverse_y(double %x) {860; STRICT-LABEL: ugt_inverse_y:861; STRICT: # %bb.0:862; STRICT-NEXT: movapd %xmm0, %xmm1863; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0864; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1865; STRICT-NEXT: movapd %xmm1, %xmm0866; STRICT-NEXT: retq867;868; UNSAFE-LABEL: ugt_inverse_y:869; UNSAFE: # %bb.0:870; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0871; UNSAFE-NEXT: retq872;873; FINITE-LABEL: ugt_inverse_y:874; FINITE: # %bb.0:875; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]876; FINITE-NEXT: minsd %xmm0, %xmm1877; FINITE-NEXT: movapd %xmm1, %xmm0878; FINITE-NEXT: retq879 %c = fcmp ugt double %x, -0.000000e+00880 %d = select i1 %c, double -0.000000e+00, double %x881 ret double %d882}883 884define double @ult_inverse_y(double %x) {885; STRICT-LABEL: ult_inverse_y:886; STRICT: # %bb.0:887; STRICT-NEXT: movapd %xmm0, %xmm1888; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]889; STRICT-NEXT: cmpnlesd %xmm1, %xmm0890; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1891; STRICT-NEXT: movapd %xmm1, %xmm0892; STRICT-NEXT: retq893;894; UNSAFE-LABEL: ult_inverse_y:895; UNSAFE: # %bb.0:896; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0897; UNSAFE-NEXT: retq898;899; FINITE-LABEL: ult_inverse_y:900; FINITE: # %bb.0:901; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]902; FINITE-NEXT: maxsd %xmm0, %xmm1903; FINITE-NEXT: movapd %xmm1, %xmm0904; FINITE-NEXT: retq905 %c = fcmp ult double %x, -0.000000e+00906 %d = select i1 %c, double -0.000000e+00, double %x907 ret double %d908}909 910define double @uge_y(double %x) {911; STRICT-LABEL: uge_y:912; STRICT: # %bb.0:913; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]914; STRICT-NEXT: maxsd %xmm0, %xmm1915; STRICT-NEXT: movapd %xmm1, %xmm0916; STRICT-NEXT: retq917;918; RELAX-LABEL: uge_y:919; RELAX: # %bb.0:920; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0921; RELAX-NEXT: retq922 %c = fcmp uge double %x, -0.000000e+00923 %d = select i1 %c, double %x, double -0.000000e+00924 ret double %d925}926 927define double @ule_y(double %x) {928; STRICT-LABEL: ule_y:929; STRICT: # %bb.0:930; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]931; STRICT-NEXT: minsd %xmm0, %xmm1932; STRICT-NEXT: movapd %xmm1, %xmm0933; STRICT-NEXT: retq934;935; RELAX-LABEL: ule_y:936; RELAX: # %bb.0:937; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0938; RELAX-NEXT: retq939 %c = fcmp ule double %x, -0.000000e+00940 %d = select i1 %c, double %x, double -0.000000e+00941 ret double %d942}943 944define double @uge_inverse_y(double %x) {945; STRICT-LABEL: uge_inverse_y:946; STRICT: # %bb.0:947; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0948; STRICT-NEXT: retq949;950; UNSAFE-LABEL: uge_inverse_y:951; UNSAFE: # %bb.0:952; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0953; UNSAFE-NEXT: retq954;955; FINITE-LABEL: uge_inverse_y:956; FINITE: # %bb.0:957; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]958; FINITE-NEXT: minsd %xmm0, %xmm1959; FINITE-NEXT: movapd %xmm1, %xmm0960; FINITE-NEXT: retq961 %c = fcmp uge double %x, -0.000000e+00962 %d = select i1 %c, double -0.000000e+00, double %x963 ret double %d964}965 966define double @ule_inverse_y(double %x) {967; STRICT-LABEL: ule_inverse_y:968; STRICT: # %bb.0:969; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0970; STRICT-NEXT: retq971;972; UNSAFE-LABEL: ule_inverse_y:973; UNSAFE: # %bb.0:974; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0975; UNSAFE-NEXT: retq976;977; FINITE-LABEL: ule_inverse_y:978; FINITE: # %bb.0:979; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]980; FINITE-NEXT: maxsd %xmm0, %xmm1981; FINITE-NEXT: movapd %xmm1, %xmm0982; FINITE-NEXT: retq983 %c = fcmp ule double %x, -0.000000e+00984 %d = select i1 %c, double -0.000000e+00, double %x985 ret double %d986}987 988; Test a few more misc. cases.989 990define double @clampTo3k_a(double %x) {991; STRICT-LABEL: clampTo3k_a:992; STRICT: # %bb.0:993; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]994; STRICT-NEXT: minsd %xmm0, %xmm1995; STRICT-NEXT: movapd %xmm1, %xmm0996; STRICT-NEXT: retq997;998; UNSAFE-LABEL: clampTo3k_a:999; UNSAFE: # %bb.0:1000; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01001; UNSAFE-NEXT: retq1002;1003; FINITE-LABEL: clampTo3k_a:1004; FINITE: # %bb.0:1005; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1006; FINITE-NEXT: minsd %xmm0, %xmm11007; FINITE-NEXT: movapd %xmm1, %xmm01008; FINITE-NEXT: retq1009 %t0 = fcmp ogt double %x, 3.000000e+031010 %y = select i1 %t0, double 3.000000e+03, double %x1011 ret double %y1012}1013 1014define double @clampTo3k_b(double %x) {1015; STRICT-LABEL: clampTo3k_b:1016; STRICT: # %bb.0:1017; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01018; STRICT-NEXT: retq1019;1020; UNSAFE-LABEL: clampTo3k_b:1021; UNSAFE: # %bb.0:1022; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01023; UNSAFE-NEXT: retq1024;1025; FINITE-LABEL: clampTo3k_b:1026; FINITE: # %bb.0:1027; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1028; FINITE-NEXT: minsd %xmm0, %xmm11029; FINITE-NEXT: movapd %xmm1, %xmm01030; FINITE-NEXT: retq1031 %t0 = fcmp uge double %x, 3.000000e+031032 %y = select i1 %t0, double 3.000000e+03, double %x1033 ret double %y1034}1035 1036define double @clampTo3k_c(double %x) {1037; STRICT-LABEL: clampTo3k_c:1038; STRICT: # %bb.0:1039; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1040; STRICT-NEXT: maxsd %xmm0, %xmm11041; STRICT-NEXT: movapd %xmm1, %xmm01042; STRICT-NEXT: retq1043;1044; UNSAFE-LABEL: clampTo3k_c:1045; UNSAFE: # %bb.0:1046; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01047; UNSAFE-NEXT: retq1048;1049; FINITE-LABEL: clampTo3k_c:1050; FINITE: # %bb.0:1051; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1052; FINITE-NEXT: maxsd %xmm0, %xmm11053; FINITE-NEXT: movapd %xmm1, %xmm01054; FINITE-NEXT: retq1055 %t0 = fcmp olt double %x, 3.000000e+031056 %y = select i1 %t0, double 3.000000e+03, double %x1057 ret double %y1058}1059 1060define double @clampTo3k_d(double %x) {1061; STRICT-LABEL: clampTo3k_d:1062; STRICT: # %bb.0:1063; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01064; STRICT-NEXT: retq1065;1066; UNSAFE-LABEL: clampTo3k_d:1067; UNSAFE: # %bb.0:1068; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01069; UNSAFE-NEXT: retq1070;1071; FINITE-LABEL: clampTo3k_d:1072; FINITE: # %bb.0:1073; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1074; FINITE-NEXT: maxsd %xmm0, %xmm11075; FINITE-NEXT: movapd %xmm1, %xmm01076; FINITE-NEXT: retq1077 %t0 = fcmp ule double %x, 3.000000e+031078 %y = select i1 %t0, double 3.000000e+03, double %x1079 ret double %y1080}1081 1082define double @clampTo3k_e(double %x) {1083; STRICT-LABEL: clampTo3k_e:1084; STRICT: # %bb.0:1085; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1086; STRICT-NEXT: maxsd %xmm0, %xmm11087; STRICT-NEXT: movapd %xmm1, %xmm01088; STRICT-NEXT: retq1089;1090; UNSAFE-LABEL: clampTo3k_e:1091; UNSAFE: # %bb.0:1092; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01093; UNSAFE-NEXT: retq1094;1095; FINITE-LABEL: clampTo3k_e:1096; FINITE: # %bb.0:1097; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1098; FINITE-NEXT: maxsd %xmm0, %xmm11099; FINITE-NEXT: movapd %xmm1, %xmm01100; FINITE-NEXT: retq1101 %t0 = fcmp olt double %x, 3.000000e+031102 %y = select i1 %t0, double 3.000000e+03, double %x1103 ret double %y1104}1105 1106define double @clampTo3k_f(double %x) {1107; STRICT-LABEL: clampTo3k_f:1108; STRICT: # %bb.0:1109; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01110; STRICT-NEXT: retq1111;1112; UNSAFE-LABEL: clampTo3k_f:1113; UNSAFE: # %bb.0:1114; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01115; UNSAFE-NEXT: retq1116;1117; FINITE-LABEL: clampTo3k_f:1118; FINITE: # %bb.0:1119; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1120; FINITE-NEXT: maxsd %xmm0, %xmm11121; FINITE-NEXT: movapd %xmm1, %xmm01122; FINITE-NEXT: retq1123 %t0 = fcmp ule double %x, 3.000000e+031124 %y = select i1 %t0, double 3.000000e+03, double %x1125 ret double %y1126}1127 1128define double @clampTo3k_g(double %x) {1129; STRICT-LABEL: clampTo3k_g:1130; STRICT: # %bb.0:1131; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1132; STRICT-NEXT: minsd %xmm0, %xmm11133; STRICT-NEXT: movapd %xmm1, %xmm01134; STRICT-NEXT: retq1135;1136; UNSAFE-LABEL: clampTo3k_g:1137; UNSAFE: # %bb.0:1138; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01139; UNSAFE-NEXT: retq1140;1141; FINITE-LABEL: clampTo3k_g:1142; FINITE: # %bb.0:1143; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1144; FINITE-NEXT: minsd %xmm0, %xmm11145; FINITE-NEXT: movapd %xmm1, %xmm01146; FINITE-NEXT: retq1147 %t0 = fcmp ogt double %x, 3.000000e+031148 %y = select i1 %t0, double 3.000000e+03, double %x1149 ret double %y1150}1151 1152define double @clampTo3k_h(double %x) {1153; STRICT-LABEL: clampTo3k_h:1154; STRICT: # %bb.0:1155; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01156; STRICT-NEXT: retq1157;1158; UNSAFE-LABEL: clampTo3k_h:1159; UNSAFE: # %bb.0:1160; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01161; UNSAFE-NEXT: retq1162;1163; FINITE-LABEL: clampTo3k_h:1164; FINITE: # %bb.0:1165; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]1166; FINITE-NEXT: minsd %xmm0, %xmm11167; FINITE-NEXT: movapd %xmm1, %xmm01168; FINITE-NEXT: retq1169 %t0 = fcmp uge double %x, 3.000000e+031170 %y = select i1 %t0, double 3.000000e+03, double %x1171 ret double %y1172}1173 1174define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y) {1175; STRICT-LABEL: test_maxpd:1176; STRICT: # %bb.0:1177; STRICT-NEXT: movapd %xmm0, %xmm21178; STRICT-NEXT: movapd %xmm1, %xmm01179; STRICT-NEXT: cmplepd %xmm2, %xmm01180; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm11181; STRICT-NEXT: movapd %xmm1, %xmm01182; STRICT-NEXT: retq1183;1184; RELAX-LABEL: test_maxpd:1185; RELAX: # %bb.0:1186; RELAX-NEXT: maxpd %xmm1, %xmm01187; RELAX-NEXT: retq1188 %max_is_x = fcmp oge <2 x double> %x, %y1189 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y1190 ret <2 x double> %max1191}1192 1193define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y) {1194; STRICT-LABEL: test_minpd:1195; STRICT: # %bb.0:1196; STRICT-NEXT: movapd %xmm0, %xmm21197; STRICT-NEXT: cmplepd %xmm1, %xmm01198; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm11199; STRICT-NEXT: movapd %xmm1, %xmm01200; STRICT-NEXT: retq1201;1202; RELAX-LABEL: test_minpd:1203; RELAX: # %bb.0:1204; RELAX-NEXT: minpd %xmm1, %xmm01205; RELAX-NEXT: retq1206 %min_is_x = fcmp ole <2 x double> %x, %y1207 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y1208 ret <2 x double> %min1209}1210 1211define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y) {1212; STRICT-LABEL: test_maxps:1213; STRICT: # %bb.0:1214; STRICT-NEXT: movaps %xmm0, %xmm21215; STRICT-NEXT: movaps %xmm1, %xmm01216; STRICT-NEXT: cmpleps %xmm2, %xmm01217; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11218; STRICT-NEXT: movaps %xmm1, %xmm01219; STRICT-NEXT: retq1220;1221; RELAX-LABEL: test_maxps:1222; RELAX: # %bb.0:1223; RELAX-NEXT: maxps %xmm1, %xmm01224; RELAX-NEXT: retq1225 %max_is_x = fcmp oge <4 x float> %x, %y1226 %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y1227 ret <4 x float> %max1228}1229 1230define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y) {1231; STRICT-LABEL: test_minps:1232; STRICT: # %bb.0:1233; STRICT-NEXT: movaps %xmm0, %xmm21234; STRICT-NEXT: cmpleps %xmm1, %xmm01235; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11236; STRICT-NEXT: movaps %xmm1, %xmm01237; STRICT-NEXT: retq1238;1239; RELAX-LABEL: test_minps:1240; RELAX: # %bb.0:1241; RELAX-NEXT: minps %xmm1, %xmm01242; RELAX-NEXT: retq1243 %min_is_x = fcmp ole <4 x float> %x, %y1244 %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y1245 ret <4 x float> %min1246}1247 1248define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {1249; STRICT-LABEL: test_maxps_illegal_v2f32:1250; STRICT: # %bb.0:1251; STRICT-NEXT: movaps %xmm0, %xmm21252; STRICT-NEXT: movaps %xmm1, %xmm01253; STRICT-NEXT: cmpleps %xmm2, %xmm01254; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11255; STRICT-NEXT: movaps %xmm1, %xmm01256; STRICT-NEXT: retq1257;1258; RELAX-LABEL: test_maxps_illegal_v2f32:1259; RELAX: # %bb.0:1260; RELAX-NEXT: maxps %xmm1, %xmm01261; RELAX-NEXT: retq1262 %max_is_x = fcmp oge <2 x float> %x, %y1263 %max = select <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y1264 ret <2 x float> %max1265}1266 1267define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {1268; STRICT-LABEL: test_minps_illegal_v2f32:1269; STRICT: # %bb.0:1270; STRICT-NEXT: movaps %xmm0, %xmm21271; STRICT-NEXT: cmpleps %xmm1, %xmm01272; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11273; STRICT-NEXT: movaps %xmm1, %xmm01274; STRICT-NEXT: retq1275;1276; RELAX-LABEL: test_minps_illegal_v2f32:1277; RELAX: # %bb.0:1278; RELAX-NEXT: minps %xmm1, %xmm01279; RELAX-NEXT: retq1280 %min_is_x = fcmp ole <2 x float> %x, %y1281 %min = select <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y1282 ret <2 x float> %min1283}1284 1285define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {1286; STRICT-LABEL: test_maxps_illegal_v3f32:1287; STRICT: # %bb.0:1288; STRICT-NEXT: movaps %xmm0, %xmm21289; STRICT-NEXT: movaps %xmm1, %xmm01290; STRICT-NEXT: cmpleps %xmm2, %xmm01291; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11292; STRICT-NEXT: movaps %xmm1, %xmm01293; STRICT-NEXT: retq1294;1295; RELAX-LABEL: test_maxps_illegal_v3f32:1296; RELAX: # %bb.0:1297; RELAX-NEXT: maxps %xmm1, %xmm01298; RELAX-NEXT: retq1299 %max_is_x = fcmp oge <3 x float> %x, %y1300 %max = select <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y1301 ret <3 x float> %max1302}1303 1304define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {1305; STRICT-LABEL: test_minps_illegal_v3f32:1306; STRICT: # %bb.0:1307; STRICT-NEXT: movaps %xmm0, %xmm21308; STRICT-NEXT: cmpleps %xmm1, %xmm01309; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm11310; STRICT-NEXT: movaps %xmm1, %xmm01311; STRICT-NEXT: retq1312;1313; RELAX-LABEL: test_minps_illegal_v3f32:1314; RELAX: # %bb.0:1315; RELAX-NEXT: minps %xmm1, %xmm01316; RELAX-NEXT: retq1317 %min_is_x = fcmp ole <3 x float> %x, %y1318 %min = select <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y1319 ret <3 x float> %min1320}1321 1322; OSS-Fuzz #138381323; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=138381324define float @ossfuzz13838(float %x) {1325; ALL-LABEL: ossfuzz13838:1326; ALL: # %bb.0: # %bb1327; ALL-NEXT: movss {{.*#+}} xmm0 = [2.55E+2,0.0E+0,0.0E+0,0.0E+0]1328; ALL-NEXT: retq1329bb:1330 %cmp2 = fcmp fast olt float %x, 2.550000e+021331 %B1 = urem i1 %cmp2, %cmp21332 %min = select i1 %B1, float %x, float 2.550000e+021333 %B = frem float %min, 0x47EFFFFFE00000001334 %cmp1 = fcmp fast olt float %B, 1.000000e+001335 %r = select i1 %cmp1, float 1.000000e+00, float %min1336 ret float %r1337}1338