brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.1 KiB · 7904b21 Raw
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