Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2                                                 | FileCheck %s --check-prefix=ALL --check-prefix=STRICT
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 -enable-unsafe-fp-math -enable-no-nans-fp-math  | FileCheck %s --check-prefix=ALL --check-prefix=RELAX --check-prefix=UNSAFE
      4 ; 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=FINITE
      5 
      6 ; Some of these patterns can be matched as SSE min or max. Some of
      7 ; them can be matched provided that the operands are swapped.
      8 ; Some of them can't be matched at all and require a comparison
      9 ; 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 %y
     13 ;  _y: use -0.0 instead of %y
     14 ; _inverse : swap the arms of the select.
     15 
     16 define double @ogt(double %x, double %y)  {
     17 ; ALL-LABEL: ogt:
     18 ; ALL:       # %bb.0:
     19 ; ALL-NEXT:    maxsd %xmm1, %xmm0
     20 ; ALL-NEXT:    retq
     21   %c = fcmp ogt double %x, %y
     22   %d = select i1 %c, double %x, double %y
     23   ret double %d
     24 }
     25 
     26 define double @olt(double %x, double %y)  {
     27 ; ALL-LABEL: olt:
     28 ; ALL:       # %bb.0:
     29 ; ALL-NEXT:    minsd %xmm1, %xmm0
     30 ; ALL-NEXT:    retq
     31   %c = fcmp olt double %x, %y
     32   %d = select i1 %c, double %x, double %y
     33   ret double %d
     34 }
     35 
     36 define double @ogt_inverse(double %x, double %y)  {
     37 ; STRICT-LABEL: ogt_inverse:
     38 ; STRICT:       # %bb.0:
     39 ; STRICT-NEXT:    minsd %xmm0, %xmm1
     40 ; STRICT-NEXT:    movapd %xmm1, %xmm0
     41 ; STRICT-NEXT:    retq
     42 ;
     43 ; UNSAFE-LABEL: ogt_inverse:
     44 ; UNSAFE:       # %bb.0:
     45 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
     46 ; UNSAFE-NEXT:    retq
     47 ;
     48 ; FINITE-LABEL: ogt_inverse:
     49 ; FINITE:       # %bb.0:
     50 ; FINITE-NEXT:    minsd %xmm0, %xmm1
     51 ; FINITE-NEXT:    movapd %xmm1, %xmm0
     52 ; FINITE-NEXT:    retq
     53   %c = fcmp ogt double %x, %y
     54   %d = select i1 %c, double %y, double %x
     55   ret double %d
     56 }
     57 
     58 define double @olt_inverse(double %x, double %y)  {
     59 ; STRICT-LABEL: olt_inverse:
     60 ; STRICT:       # %bb.0:
     61 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
     62 ; STRICT-NEXT:    movapd %xmm1, %xmm0
     63 ; STRICT-NEXT:    retq
     64 ;
     65 ; UNSAFE-LABEL: olt_inverse:
     66 ; UNSAFE:       # %bb.0:
     67 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
     68 ; UNSAFE-NEXT:    retq
     69 ;
     70 ; FINITE-LABEL: olt_inverse:
     71 ; FINITE:       # %bb.0:
     72 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
     73 ; FINITE-NEXT:    movapd %xmm1, %xmm0
     74 ; FINITE-NEXT:    retq
     75   %c = fcmp olt double %x, %y
     76   %d = select i1 %c, double %y, double %x
     77   ret double %d
     78 }
     79 
     80 define double @oge(double %x, double %y)  {
     81 ; STRICT-LABEL: oge:
     82 ; STRICT:       # %bb.0:
     83 ; STRICT-NEXT:    movapd %xmm1, %xmm2
     84 ; STRICT-NEXT:    cmplesd %xmm0, %xmm2
     85 ; STRICT-NEXT:    andpd %xmm2, %xmm0
     86 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
     87 ; STRICT-NEXT:    orpd %xmm2, %xmm0
     88 ; STRICT-NEXT:    retq
     89 ;
     90 ; RELAX-LABEL: oge:
     91 ; RELAX:       # %bb.0:
     92 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
     93 ; RELAX-NEXT:    retq
     94   %c = fcmp oge double %x, %y
     95   %d = select i1 %c, double %x, double %y
     96   ret double %d
     97 }
     98 
     99 define double @ole(double %x, double %y)  {
    100 ; STRICT-LABEL: ole:
    101 ; STRICT:       # %bb.0:
    102 ; STRICT-NEXT:    movapd %xmm0, %xmm2
    103 ; STRICT-NEXT:    cmplesd %xmm1, %xmm2
    104 ; STRICT-NEXT:    andpd %xmm2, %xmm0
    105 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
    106 ; STRICT-NEXT:    orpd %xmm0, %xmm2
    107 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    108 ; STRICT-NEXT:    retq
    109 ;
    110 ; RELAX-LABEL: ole:
    111 ; RELAX:       # %bb.0:
    112 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    113 ; RELAX-NEXT:    retq
    114   %c = fcmp ole double %x, %y
    115   %d = select i1 %c, double %x, double %y
    116   ret double %d
    117 }
    118 
    119 define double @oge_inverse(double %x, double %y)  {
    120 ; STRICT-LABEL: oge_inverse:
    121 ; STRICT:       # %bb.0:
    122 ; STRICT-NEXT:    movapd %xmm1, %xmm2
    123 ; STRICT-NEXT:    cmplesd %xmm0, %xmm2
    124 ; STRICT-NEXT:    andpd %xmm2, %xmm1
    125 ; STRICT-NEXT:    andnpd %xmm0, %xmm2
    126 ; STRICT-NEXT:    orpd %xmm1, %xmm2
    127 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    128 ; STRICT-NEXT:    retq
    129 ;
    130 ; UNSAFE-LABEL: oge_inverse:
    131 ; UNSAFE:       # %bb.0:
    132 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    133 ; UNSAFE-NEXT:    retq
    134 ;
    135 ; FINITE-LABEL: oge_inverse:
    136 ; FINITE:       # %bb.0:
    137 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    138 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    139 ; FINITE-NEXT:    retq
    140   %c = fcmp oge double %x, %y
    141   %d = select i1 %c, double %y, double %x
    142   ret double %d
    143 }
    144 
    145 define double @ole_inverse(double %x, double %y)  {
    146 ; STRICT-LABEL: ole_inverse:
    147 ; STRICT:       # %bb.0:
    148 ; STRICT-NEXT:    movapd %xmm0, %xmm2
    149 ; STRICT-NEXT:    cmplesd %xmm1, %xmm2
    150 ; STRICT-NEXT:    andpd %xmm2, %xmm1
    151 ; STRICT-NEXT:    andnpd %xmm0, %xmm2
    152 ; STRICT-NEXT:    orpd %xmm1, %xmm2
    153 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    154 ; STRICT-NEXT:    retq
    155 ;
    156 ; UNSAFE-LABEL: ole_inverse:
    157 ; UNSAFE:       # %bb.0:
    158 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    159 ; UNSAFE-NEXT:    retq
    160 ;
    161 ; FINITE-LABEL: ole_inverse:
    162 ; FINITE:       # %bb.0:
    163 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    164 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    165 ; FINITE-NEXT:    retq
    166   %c = fcmp ole double %x, %y
    167   %d = select i1 %c, double %y, double %x
    168   ret double %d
    169 }
    170 
    171 define double @ogt_x(double %x)  {
    172 ; ALL-LABEL: ogt_x:
    173 ; ALL:       # %bb.0:
    174 ; ALL-NEXT:    xorpd %xmm1, %xmm1
    175 ; ALL-NEXT:    maxsd %xmm1, %xmm0
    176 ; ALL-NEXT:    retq
    177   %c = fcmp ogt double %x, 0.000000e+00
    178   %d = select i1 %c, double %x, double 0.000000e+00
    179   ret double %d
    180 }
    181 
    182 define double @olt_x(double %x)  {
    183 ; ALL-LABEL: olt_x:
    184 ; ALL:       # %bb.0:
    185 ; ALL-NEXT:    xorpd %xmm1, %xmm1
    186 ; ALL-NEXT:    minsd %xmm1, %xmm0
    187 ; ALL-NEXT:    retq
    188   %c = fcmp olt double %x, 0.000000e+00
    189   %d = select i1 %c, double %x, double 0.000000e+00
    190   ret double %d
    191 }
    192 
    193 define double @ogt_inverse_x(double %x)  {
    194 ; STRICT-LABEL: ogt_inverse_x:
    195 ; STRICT:       # %bb.0:
    196 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    197 ; STRICT-NEXT:    minsd %xmm0, %xmm1
    198 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    199 ; STRICT-NEXT:    retq
    200 ;
    201 ; UNSAFE-LABEL: ogt_inverse_x:
    202 ; UNSAFE:       # %bb.0:
    203 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    204 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    205 ; UNSAFE-NEXT:    retq
    206 ;
    207 ; FINITE-LABEL: ogt_inverse_x:
    208 ; FINITE:       # %bb.0:
    209 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    210 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    211 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    212 ; FINITE-NEXT:    retq
    213   %c = fcmp ogt double %x, 0.000000e+00
    214   %d = select i1 %c, double 0.000000e+00, double %x
    215   ret double %d
    216 }
    217 
    218 define double @olt_inverse_x(double %x)  {
    219 ; STRICT-LABEL: olt_inverse_x:
    220 ; STRICT:       # %bb.0:
    221 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    222 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
    223 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    224 ; STRICT-NEXT:    retq
    225 ;
    226 ; UNSAFE-LABEL: olt_inverse_x:
    227 ; UNSAFE:       # %bb.0:
    228 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    229 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    230 ; UNSAFE-NEXT:    retq
    231 ;
    232 ; FINITE-LABEL: olt_inverse_x:
    233 ; FINITE:       # %bb.0:
    234 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    235 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    236 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    237 ; FINITE-NEXT:    retq
    238   %c = fcmp olt double %x, 0.000000e+00
    239   %d = select i1 %c, double 0.000000e+00, double %x
    240   ret double %d
    241 }
    242 
    243 define double @oge_x(double %x)  {
    244 ; STRICT-LABEL: oge_x:
    245 ; STRICT:       # %bb.0:
    246 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    247 ; STRICT-NEXT:    cmplesd %xmm0, %xmm1
    248 ; STRICT-NEXT:    andpd %xmm1, %xmm0
    249 ; STRICT-NEXT:    retq
    250 ;
    251 ; RELAX-LABEL: oge_x:
    252 ; RELAX:       # %bb.0:
    253 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    254 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
    255 ; RELAX-NEXT:    retq
    256   %c = fcmp oge double %x, 0.000000e+00
    257   %d = select i1 %c, double %x, double 0.000000e+00
    258   ret double %d
    259 }
    260 
    261 define double @ole_x(double %x)  {
    262 ; STRICT-LABEL: ole_x:
    263 ; STRICT:       # %bb.0:
    264 ; STRICT-NEXT:    xorpd %xmm2, %xmm2
    265 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    266 ; STRICT-NEXT:    cmplesd %xmm2, %xmm1
    267 ; STRICT-NEXT:    andpd %xmm0, %xmm1
    268 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    269 ; STRICT-NEXT:    retq
    270 ;
    271 ; RELAX-LABEL: ole_x:
    272 ; RELAX:       # %bb.0:
    273 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    274 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    275 ; RELAX-NEXT:    retq
    276   %c = fcmp ole double %x, 0.000000e+00
    277   %d = select i1 %c, double %x, double 0.000000e+00
    278   ret double %d
    279 }
    280 
    281 define double @oge_inverse_x(double %x)  {
    282 ; STRICT-LABEL: oge_inverse_x:
    283 ; STRICT:       # %bb.0:
    284 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    285 ; STRICT-NEXT:    cmplesd %xmm0, %xmm1
    286 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    287 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    288 ; STRICT-NEXT:    retq
    289 ;
    290 ; UNSAFE-LABEL: oge_inverse_x:
    291 ; UNSAFE:       # %bb.0:
    292 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    293 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    294 ; UNSAFE-NEXT:    retq
    295 ;
    296 ; FINITE-LABEL: oge_inverse_x:
    297 ; FINITE:       # %bb.0:
    298 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    299 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    300 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    301 ; FINITE-NEXT:    retq
    302   %c = fcmp oge double %x, 0.000000e+00
    303   %d = select i1 %c, double 0.000000e+00, double %x
    304   ret double %d
    305 }
    306 
    307 define double @ole_inverse_x(double %x)  {
    308 ; STRICT-LABEL: ole_inverse_x:
    309 ; STRICT:       # %bb.0:
    310 ; STRICT-NEXT:    xorpd %xmm2, %xmm2
    311 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    312 ; STRICT-NEXT:    cmplesd %xmm2, %xmm1
    313 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    314 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    315 ; STRICT-NEXT:    retq
    316 ;
    317 ; UNSAFE-LABEL: ole_inverse_x:
    318 ; UNSAFE:       # %bb.0:
    319 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    320 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    321 ; UNSAFE-NEXT:    retq
    322 ;
    323 ; FINITE-LABEL: ole_inverse_x:
    324 ; FINITE:       # %bb.0:
    325 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    326 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    327 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    328 ; FINITE-NEXT:    retq
    329   %c = fcmp ole double %x, 0.000000e+00
    330   %d = select i1 %c, double 0.000000e+00, double %x
    331   ret double %d
    332 }
    333 
    334 define double @ugt(double %x, double %y)  {
    335 ; STRICT-LABEL: ugt:
    336 ; STRICT:       # %bb.0:
    337 ; STRICT-NEXT:    movapd %xmm0, %xmm2
    338 ; STRICT-NEXT:    cmpnlesd %xmm1, %xmm2
    339 ; STRICT-NEXT:    andpd %xmm2, %xmm0
    340 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
    341 ; STRICT-NEXT:    orpd %xmm0, %xmm2
    342 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    343 ; STRICT-NEXT:    retq
    344 ;
    345 ; RELAX-LABEL: ugt:
    346 ; RELAX:       # %bb.0:
    347 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
    348 ; RELAX-NEXT:    retq
    349   %c = fcmp ugt double %x, %y
    350   %d = select i1 %c, double %x, double %y
    351   ret double %d
    352 }
    353 
    354 define double @ult(double %x, double %y)  {
    355 ; STRICT-LABEL: ult:
    356 ; STRICT:       # %bb.0:
    357 ; STRICT-NEXT:    movapd %xmm1, %xmm2
    358 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm2
    359 ; STRICT-NEXT:    andpd %xmm2, %xmm0
    360 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
    361 ; STRICT-NEXT:    orpd %xmm2, %xmm0
    362 ; STRICT-NEXT:    retq
    363 ;
    364 ; RELAX-LABEL: ult:
    365 ; RELAX:       # %bb.0:
    366 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    367 ; RELAX-NEXT:    retq
    368   %c = fcmp ult double %x, %y
    369   %d = select i1 %c, double %x, double %y
    370   ret double %d
    371 }
    372 
    373 define double @ugt_inverse(double %x, double %y)  {
    374 ; STRICT-LABEL: ugt_inverse:
    375 ; STRICT:       # %bb.0:
    376 ; STRICT-NEXT:    movapd %xmm0, %xmm2
    377 ; STRICT-NEXT:    cmpnlesd %xmm1, %xmm2
    378 ; STRICT-NEXT:    andpd %xmm2, %xmm1
    379 ; STRICT-NEXT:    andnpd %xmm0, %xmm2
    380 ; STRICT-NEXT:    orpd %xmm1, %xmm2
    381 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    382 ; STRICT-NEXT:    retq
    383 ;
    384 ; UNSAFE-LABEL: ugt_inverse:
    385 ; UNSAFE:       # %bb.0:
    386 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    387 ; UNSAFE-NEXT:    retq
    388 ;
    389 ; FINITE-LABEL: ugt_inverse:
    390 ; FINITE:       # %bb.0:
    391 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    392 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    393 ; FINITE-NEXT:    retq
    394   %c = fcmp ugt double %x, %y
    395   %d = select i1 %c, double %y, double %x
    396   ret double %d
    397 }
    398 
    399 define double @ult_inverse(double %x, double %y)  {
    400 ; STRICT-LABEL: ult_inverse:
    401 ; STRICT:       # %bb.0:
    402 ; STRICT-NEXT:    movapd %xmm1, %xmm2
    403 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm2
    404 ; STRICT-NEXT:    andpd %xmm2, %xmm1
    405 ; STRICT-NEXT:    andnpd %xmm0, %xmm2
    406 ; STRICT-NEXT:    orpd %xmm1, %xmm2
    407 ; STRICT-NEXT:    movapd %xmm2, %xmm0
    408 ; STRICT-NEXT:    retq
    409 ;
    410 ; UNSAFE-LABEL: ult_inverse:
    411 ; UNSAFE:       # %bb.0:
    412 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    413 ; UNSAFE-NEXT:    retq
    414 ;
    415 ; FINITE-LABEL: ult_inverse:
    416 ; FINITE:       # %bb.0:
    417 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    418 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    419 ; FINITE-NEXT:    retq
    420   %c = fcmp ult double %x, %y
    421   %d = select i1 %c, double %y, double %x
    422   ret double %d
    423 }
    424 
    425 define double @uge(double %x, double %y)  {
    426 ; STRICT-LABEL: uge:
    427 ; STRICT:       # %bb.0:
    428 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
    429 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    430 ; STRICT-NEXT:    retq
    431 ;
    432 ; RELAX-LABEL: uge:
    433 ; RELAX:       # %bb.0:
    434 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
    435 ; RELAX-NEXT:    retq
    436   %c = fcmp uge double %x, %y
    437   %d = select i1 %c, double %x, double %y
    438   ret double %d
    439 }
    440 
    441 define double @ule(double %x, double %y)  {
    442 ; STRICT-LABEL: ule:
    443 ; STRICT:       # %bb.0:
    444 ; STRICT-NEXT:    minsd %xmm0, %xmm1
    445 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    446 ; STRICT-NEXT:    retq
    447 ;
    448 ; RELAX-LABEL: ule:
    449 ; RELAX:       # %bb.0:
    450 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    451 ; RELAX-NEXT:    retq
    452   %c = fcmp ule double %x, %y
    453   %d = select i1 %c, double %x, double %y
    454   ret double %d
    455 }
    456 
    457 define double @uge_inverse(double %x, double %y)  {
    458 ; STRICT-LABEL: uge_inverse:
    459 ; STRICT:       # %bb.0:
    460 ; STRICT-NEXT:    minsd %xmm1, %xmm0
    461 ; STRICT-NEXT:    retq
    462 ;
    463 ; UNSAFE-LABEL: uge_inverse:
    464 ; UNSAFE:       # %bb.0:
    465 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    466 ; UNSAFE-NEXT:    retq
    467 ;
    468 ; FINITE-LABEL: uge_inverse:
    469 ; FINITE:       # %bb.0:
    470 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    471 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    472 ; FINITE-NEXT:    retq
    473   %c = fcmp uge double %x, %y
    474   %d = select i1 %c, double %y, double %x
    475   ret double %d
    476 }
    477 
    478 define double @ule_inverse(double %x, double %y)  {
    479 ; STRICT-LABEL: ule_inverse:
    480 ; STRICT:       # %bb.0:
    481 ; STRICT-NEXT:    maxsd %xmm1, %xmm0
    482 ; STRICT-NEXT:    retq
    483 ;
    484 ; UNSAFE-LABEL: ule_inverse:
    485 ; UNSAFE:       # %bb.0:
    486 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    487 ; UNSAFE-NEXT:    retq
    488 ;
    489 ; FINITE-LABEL: ule_inverse:
    490 ; FINITE:       # %bb.0:
    491 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    492 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    493 ; FINITE-NEXT:    retq
    494   %c = fcmp ule double %x, %y
    495   %d = select i1 %c, double %y, double %x
    496   ret double %d
    497 }
    498 
    499 define double @ugt_x(double %x)  {
    500 ; STRICT-LABEL: ugt_x:
    501 ; STRICT:       # %bb.0:
    502 ; STRICT-NEXT:    xorpd %xmm2, %xmm2
    503 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    504 ; STRICT-NEXT:    cmpnlesd %xmm2, %xmm1
    505 ; STRICT-NEXT:    andpd %xmm0, %xmm1
    506 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    507 ; STRICT-NEXT:    retq
    508 ;
    509 ; RELAX-LABEL: ugt_x:
    510 ; RELAX:       # %bb.0:
    511 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    512 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
    513 ; RELAX-NEXT:    retq
    514   %c = fcmp ugt double %x, 0.000000e+00
    515   %d = select i1 %c, double %x, double 0.000000e+00
    516   ret double %d
    517 }
    518 
    519 define double @ult_x(double %x)  {
    520 ; STRICT-LABEL: ult_x:
    521 ; STRICT:       # %bb.0:
    522 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    523 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm1
    524 ; STRICT-NEXT:    andpd %xmm1, %xmm0
    525 ; STRICT-NEXT:    retq
    526 ;
    527 ; RELAX-LABEL: ult_x:
    528 ; RELAX:       # %bb.0:
    529 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    530 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    531 ; RELAX-NEXT:    retq
    532   %c = fcmp ult double %x, 0.000000e+00
    533   %d = select i1 %c, double %x, double 0.000000e+00
    534   ret double %d
    535 }
    536 
    537 define double @ugt_inverse_x(double %x)  {
    538 ; STRICT-LABEL: ugt_inverse_x:
    539 ; STRICT:       # %bb.0:
    540 ; STRICT-NEXT:    xorpd %xmm2, %xmm2
    541 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    542 ; STRICT-NEXT:    cmpnlesd %xmm2, %xmm1
    543 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    544 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    545 ; STRICT-NEXT:    retq
    546 ;
    547 ; UNSAFE-LABEL: ugt_inverse_x:
    548 ; UNSAFE:       # %bb.0:
    549 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    550 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    551 ; UNSAFE-NEXT:    retq
    552 ;
    553 ; FINITE-LABEL: ugt_inverse_x:
    554 ; FINITE:       # %bb.0:
    555 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    556 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    557 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    558 ; FINITE-NEXT:    retq
    559   %c = fcmp ugt double %x, 0.000000e+00
    560   %d = select i1 %c, double 0.000000e+00, double %x
    561   ret double %d
    562 }
    563 
    564 define double @ult_inverse_x(double %x)  {
    565 ; STRICT-LABEL: ult_inverse_x:
    566 ; STRICT:       # %bb.0:
    567 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    568 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm1
    569 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    570 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    571 ; STRICT-NEXT:    retq
    572 ;
    573 ; UNSAFE-LABEL: ult_inverse_x:
    574 ; UNSAFE:       # %bb.0:
    575 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    576 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    577 ; UNSAFE-NEXT:    retq
    578 ;
    579 ; FINITE-LABEL: ult_inverse_x:
    580 ; FINITE:       # %bb.0:
    581 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    582 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    583 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    584 ; FINITE-NEXT:    retq
    585   %c = fcmp ult double %x, 0.000000e+00
    586   %d = select i1 %c, double 0.000000e+00, double %x
    587   ret double %d
    588 }
    589 
    590 define double @uge_x(double %x)  {
    591 ; STRICT-LABEL: uge_x:
    592 ; STRICT:       # %bb.0:
    593 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    594 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
    595 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    596 ; STRICT-NEXT:    retq
    597 ;
    598 ; RELAX-LABEL: uge_x:
    599 ; RELAX:       # %bb.0:
    600 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    601 ; RELAX-NEXT:    maxsd %xmm1, %xmm0
    602 ; RELAX-NEXT:    retq
    603   %c = fcmp uge double %x, 0.000000e+00
    604   %d = select i1 %c, double %x, double 0.000000e+00
    605   ret double %d
    606 }
    607 
    608 define double @ule_x(double %x)  {
    609 ; STRICT-LABEL: ule_x:
    610 ; STRICT:       # %bb.0:
    611 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    612 ; STRICT-NEXT:    minsd %xmm0, %xmm1
    613 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    614 ; STRICT-NEXT:    retq
    615 ;
    616 ; RELAX-LABEL: ule_x:
    617 ; RELAX:       # %bb.0:
    618 ; RELAX-NEXT:    xorpd %xmm1, %xmm1
    619 ; RELAX-NEXT:    minsd %xmm1, %xmm0
    620 ; RELAX-NEXT:    retq
    621   %c = fcmp ule double %x, 0.000000e+00
    622   %d = select i1 %c, double %x, double 0.000000e+00
    623   ret double %d
    624 }
    625 
    626 define double @uge_inverse_x(double %x)  {
    627 ; STRICT-LABEL: uge_inverse_x:
    628 ; STRICT:       # %bb.0:
    629 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    630 ; STRICT-NEXT:    minsd %xmm1, %xmm0
    631 ; STRICT-NEXT:    retq
    632 ;
    633 ; UNSAFE-LABEL: uge_inverse_x:
    634 ; UNSAFE:       # %bb.0:
    635 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    636 ; UNSAFE-NEXT:    minsd %xmm1, %xmm0
    637 ; UNSAFE-NEXT:    retq
    638 ;
    639 ; FINITE-LABEL: uge_inverse_x:
    640 ; FINITE:       # %bb.0:
    641 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    642 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    643 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    644 ; FINITE-NEXT:    retq
    645   %c = fcmp uge double %x, 0.000000e+00
    646   %d = select i1 %c, double 0.000000e+00, double %x
    647   ret double %d
    648 }
    649 
    650 define double @ule_inverse_x(double %x)  {
    651 ; STRICT-LABEL: ule_inverse_x:
    652 ; STRICT:       # %bb.0:
    653 ; STRICT-NEXT:    xorpd %xmm1, %xmm1
    654 ; STRICT-NEXT:    maxsd %xmm1, %xmm0
    655 ; STRICT-NEXT:    retq
    656 ;
    657 ; UNSAFE-LABEL: ule_inverse_x:
    658 ; UNSAFE:       # %bb.0:
    659 ; UNSAFE-NEXT:    xorpd %xmm1, %xmm1
    660 ; UNSAFE-NEXT:    maxsd %xmm1, %xmm0
    661 ; UNSAFE-NEXT:    retq
    662 ;
    663 ; FINITE-LABEL: ule_inverse_x:
    664 ; FINITE:       # %bb.0:
    665 ; FINITE-NEXT:    xorpd %xmm1, %xmm1
    666 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    667 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    668 ; FINITE-NEXT:    retq
    669   %c = fcmp ule double %x, 0.000000e+00
    670   %d = select i1 %c, double 0.000000e+00, double %x
    671   ret double %d
    672 }
    673 
    674 define double @ogt_y(double %x)  {
    675 ; ALL-LABEL: ogt_y:
    676 ; ALL:       # %bb.0:
    677 ; ALL-NEXT:    maxsd {{.*}}(%rip), %xmm0
    678 ; ALL-NEXT:    retq
    679   %c = fcmp ogt double %x, -0.000000e+00
    680   %d = select i1 %c, double %x, double -0.000000e+00
    681   ret double %d
    682 }
    683 
    684 define double @olt_y(double %x)  {
    685 ; ALL-LABEL: olt_y:
    686 ; ALL:       # %bb.0:
    687 ; ALL-NEXT:    minsd {{.*}}(%rip), %xmm0
    688 ; ALL-NEXT:    retq
    689   %c = fcmp olt double %x, -0.000000e+00
    690   %d = select i1 %c, double %x, double -0.000000e+00
    691   ret double %d
    692 }
    693 
    694 define double @ogt_inverse_y(double %x)  {
    695 ; STRICT-LABEL: ogt_inverse_y:
    696 ; STRICT:       # %bb.0:
    697 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    698 ; STRICT-NEXT:    minsd %xmm0, %xmm1
    699 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    700 ; STRICT-NEXT:    retq
    701 ;
    702 ; UNSAFE-LABEL: ogt_inverse_y:
    703 ; UNSAFE:       # %bb.0:
    704 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
    705 ; UNSAFE-NEXT:    retq
    706 ;
    707 ; FINITE-LABEL: ogt_inverse_y:
    708 ; FINITE:       # %bb.0:
    709 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    710 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    711 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    712 ; FINITE-NEXT:    retq
    713   %c = fcmp ogt double %x, -0.000000e+00
    714   %d = select i1 %c, double -0.000000e+00, double %x
    715   ret double %d
    716 }
    717 
    718 define double @olt_inverse_y(double %x)  {
    719 ; STRICT-LABEL: olt_inverse_y:
    720 ; STRICT:       # %bb.0:
    721 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    722 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
    723 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    724 ; STRICT-NEXT:    retq
    725 ;
    726 ; UNSAFE-LABEL: olt_inverse_y:
    727 ; UNSAFE:       # %bb.0:
    728 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
    729 ; UNSAFE-NEXT:    retq
    730 ;
    731 ; FINITE-LABEL: olt_inverse_y:
    732 ; FINITE:       # %bb.0:
    733 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    734 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    735 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    736 ; FINITE-NEXT:    retq
    737   %c = fcmp olt double %x, -0.000000e+00
    738   %d = select i1 %c, double -0.000000e+00, double %x
    739   ret double %d
    740 }
    741 
    742 define double @oge_y(double %x)  {
    743 ; STRICT-LABEL: oge_y:
    744 ; STRICT:       # %bb.0:
    745 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    746 ; STRICT-NEXT:    movapd %xmm1, %xmm2
    747 ; STRICT-NEXT:    cmplesd %xmm0, %xmm2
    748 ; STRICT-NEXT:    andpd %xmm2, %xmm0
    749 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
    750 ; STRICT-NEXT:    orpd %xmm2, %xmm0
    751 ; STRICT-NEXT:    retq
    752 ;
    753 ; RELAX-LABEL: oge_y:
    754 ; RELAX:       # %bb.0:
    755 ; RELAX-NEXT:    maxsd {{.*}}(%rip), %xmm0
    756 ; RELAX-NEXT:    retq
    757   %c = fcmp oge double %x, -0.000000e+00
    758   %d = select i1 %c, double %x, double -0.000000e+00
    759   ret double %d
    760 }
    761 
    762 define double @ole_y(double %x)  {
    763 ; STRICT-LABEL: ole_y:
    764 ; STRICT:       # %bb.0:
    765 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    766 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    767 ; STRICT-NEXT:    cmplesd %xmm2, %xmm1
    768 ; STRICT-NEXT:    andpd %xmm1, %xmm0
    769 ; STRICT-NEXT:    andnpd %xmm2, %xmm1
    770 ; STRICT-NEXT:    orpd %xmm0, %xmm1
    771 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    772 ; STRICT-NEXT:    retq
    773 ;
    774 ; RELAX-LABEL: ole_y:
    775 ; RELAX:       # %bb.0:
    776 ; RELAX-NEXT:    minsd {{.*}}(%rip), %xmm0
    777 ; RELAX-NEXT:    retq
    778   %c = fcmp ole double %x, -0.000000e+00
    779   %d = select i1 %c, double %x, double -0.000000e+00
    780   ret double %d
    781 }
    782 
    783 define double @oge_inverse_y(double %x)  {
    784 ; STRICT-LABEL: oge_inverse_y:
    785 ; STRICT:       # %bb.0:
    786 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    787 ; STRICT-NEXT:    movapd %xmm2, %xmm1
    788 ; STRICT-NEXT:    cmplesd %xmm0, %xmm1
    789 ; STRICT-NEXT:    andpd %xmm1, %xmm2
    790 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    791 ; STRICT-NEXT:    orpd %xmm2, %xmm1
    792 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    793 ; STRICT-NEXT:    retq
    794 ;
    795 ; UNSAFE-LABEL: oge_inverse_y:
    796 ; UNSAFE:       # %bb.0:
    797 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
    798 ; UNSAFE-NEXT:    retq
    799 ;
    800 ; FINITE-LABEL: oge_inverse_y:
    801 ; FINITE:       # %bb.0:
    802 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    803 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    804 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    805 ; FINITE-NEXT:    retq
    806   %c = fcmp oge double %x, -0.000000e+00
    807   %d = select i1 %c, double -0.000000e+00, double %x
    808   ret double %d
    809 }
    810 
    811 define double @ole_inverse_y(double %x)  {
    812 ; STRICT-LABEL: ole_inverse_y:
    813 ; STRICT:       # %bb.0:
    814 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    815 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    816 ; STRICT-NEXT:    cmplesd %xmm2, %xmm1
    817 ; STRICT-NEXT:    andpd %xmm1, %xmm2
    818 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    819 ; STRICT-NEXT:    orpd %xmm2, %xmm1
    820 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    821 ; STRICT-NEXT:    retq
    822 ;
    823 ; UNSAFE-LABEL: ole_inverse_y:
    824 ; UNSAFE:       # %bb.0:
    825 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
    826 ; UNSAFE-NEXT:    retq
    827 ;
    828 ; FINITE-LABEL: ole_inverse_y:
    829 ; FINITE:       # %bb.0:
    830 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    831 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    832 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    833 ; FINITE-NEXT:    retq
    834   %c = fcmp ole double %x, -0.000000e+00
    835   %d = select i1 %c, double -0.000000e+00, double %x
    836   ret double %d
    837 }
    838 
    839 define double @ugt_y(double %x)  {
    840 ; STRICT-LABEL: ugt_y:
    841 ; STRICT:       # %bb.0:
    842 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    843 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    844 ; STRICT-NEXT:    cmpnlesd %xmm2, %xmm1
    845 ; STRICT-NEXT:    andpd %xmm1, %xmm0
    846 ; STRICT-NEXT:    andnpd %xmm2, %xmm1
    847 ; STRICT-NEXT:    orpd %xmm0, %xmm1
    848 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    849 ; STRICT-NEXT:    retq
    850 ;
    851 ; RELAX-LABEL: ugt_y:
    852 ; RELAX:       # %bb.0:
    853 ; RELAX-NEXT:    maxsd {{.*}}(%rip), %xmm0
    854 ; RELAX-NEXT:    retq
    855   %c = fcmp ugt double %x, -0.000000e+00
    856   %d = select i1 %c, double %x, double -0.000000e+00
    857   ret double %d
    858 }
    859 
    860 define double @ult_y(double %x)  {
    861 ; STRICT-LABEL: ult_y:
    862 ; STRICT:       # %bb.0:
    863 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    864 ; STRICT-NEXT:    movapd %xmm1, %xmm2
    865 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm2
    866 ; STRICT-NEXT:    andpd %xmm2, %xmm0
    867 ; STRICT-NEXT:    andnpd %xmm1, %xmm2
    868 ; STRICT-NEXT:    orpd %xmm2, %xmm0
    869 ; STRICT-NEXT:    retq
    870 ;
    871 ; RELAX-LABEL: ult_y:
    872 ; RELAX:       # %bb.0:
    873 ; RELAX-NEXT:    minsd {{.*}}(%rip), %xmm0
    874 ; RELAX-NEXT:    retq
    875   %c = fcmp ult double %x, -0.000000e+00
    876   %d = select i1 %c, double %x, double -0.000000e+00
    877   ret double %d
    878 }
    879 
    880 define double @ugt_inverse_y(double %x)  {
    881 ; STRICT-LABEL: ugt_inverse_y:
    882 ; STRICT:       # %bb.0:
    883 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    884 ; STRICT-NEXT:    movapd %xmm0, %xmm1
    885 ; STRICT-NEXT:    cmpnlesd %xmm2, %xmm1
    886 ; STRICT-NEXT:    andpd %xmm1, %xmm2
    887 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    888 ; STRICT-NEXT:    orpd %xmm2, %xmm1
    889 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    890 ; STRICT-NEXT:    retq
    891 ;
    892 ; UNSAFE-LABEL: ugt_inverse_y:
    893 ; UNSAFE:       # %bb.0:
    894 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
    895 ; UNSAFE-NEXT:    retq
    896 ;
    897 ; FINITE-LABEL: ugt_inverse_y:
    898 ; FINITE:       # %bb.0:
    899 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    900 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    901 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    902 ; FINITE-NEXT:    retq
    903   %c = fcmp ugt double %x, -0.000000e+00
    904   %d = select i1 %c, double -0.000000e+00, double %x
    905   ret double %d
    906 }
    907 
    908 define double @ult_inverse_y(double %x)  {
    909 ; STRICT-LABEL: ult_inverse_y:
    910 ; STRICT:       # %bb.0:
    911 ; STRICT-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    912 ; STRICT-NEXT:    movapd %xmm2, %xmm1
    913 ; STRICT-NEXT:    cmpnlesd %xmm0, %xmm1
    914 ; STRICT-NEXT:    andpd %xmm1, %xmm2
    915 ; STRICT-NEXT:    andnpd %xmm0, %xmm1
    916 ; STRICT-NEXT:    orpd %xmm2, %xmm1
    917 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    918 ; STRICT-NEXT:    retq
    919 ;
    920 ; UNSAFE-LABEL: ult_inverse_y:
    921 ; UNSAFE:       # %bb.0:
    922 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
    923 ; UNSAFE-NEXT:    retq
    924 ;
    925 ; FINITE-LABEL: ult_inverse_y:
    926 ; FINITE:       # %bb.0:
    927 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    928 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
    929 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    930 ; FINITE-NEXT:    retq
    931   %c = fcmp ult double %x, -0.000000e+00
    932   %d = select i1 %c, double -0.000000e+00, double %x
    933   ret double %d
    934 }
    935 
    936 define double @uge_y(double %x)  {
    937 ; STRICT-LABEL: uge_y:
    938 ; STRICT:       # %bb.0:
    939 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    940 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
    941 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    942 ; STRICT-NEXT:    retq
    943 ;
    944 ; RELAX-LABEL: uge_y:
    945 ; RELAX:       # %bb.0:
    946 ; RELAX-NEXT:    maxsd {{.*}}(%rip), %xmm0
    947 ; RELAX-NEXT:    retq
    948   %c = fcmp uge double %x, -0.000000e+00
    949   %d = select i1 %c, double %x, double -0.000000e+00
    950   ret double %d
    951 }
    952 
    953 define double @ule_y(double %x)  {
    954 ; STRICT-LABEL: ule_y:
    955 ; STRICT:       # %bb.0:
    956 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    957 ; STRICT-NEXT:    minsd %xmm0, %xmm1
    958 ; STRICT-NEXT:    movapd %xmm1, %xmm0
    959 ; STRICT-NEXT:    retq
    960 ;
    961 ; RELAX-LABEL: ule_y:
    962 ; RELAX:       # %bb.0:
    963 ; RELAX-NEXT:    minsd {{.*}}(%rip), %xmm0
    964 ; RELAX-NEXT:    retq
    965   %c = fcmp ule double %x, -0.000000e+00
    966   %d = select i1 %c, double %x, double -0.000000e+00
    967   ret double %d
    968 }
    969 
    970 define double @uge_inverse_y(double %x)  {
    971 ; STRICT-LABEL: uge_inverse_y:
    972 ; STRICT:       # %bb.0:
    973 ; STRICT-NEXT:    minsd {{.*}}(%rip), %xmm0
    974 ; STRICT-NEXT:    retq
    975 ;
    976 ; UNSAFE-LABEL: uge_inverse_y:
    977 ; UNSAFE:       # %bb.0:
    978 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
    979 ; UNSAFE-NEXT:    retq
    980 ;
    981 ; FINITE-LABEL: uge_inverse_y:
    982 ; FINITE:       # %bb.0:
    983 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
    984 ; FINITE-NEXT:    minsd %xmm0, %xmm1
    985 ; FINITE-NEXT:    movapd %xmm1, %xmm0
    986 ; FINITE-NEXT:    retq
    987   %c = fcmp uge double %x, -0.000000e+00
    988   %d = select i1 %c, double -0.000000e+00, double %x
    989   ret double %d
    990 }
    991 
    992 define double @ule_inverse_y(double %x)  {
    993 ; STRICT-LABEL: ule_inverse_y:
    994 ; STRICT:       # %bb.0:
    995 ; STRICT-NEXT:    maxsd {{.*}}(%rip), %xmm0
    996 ; STRICT-NEXT:    retq
    997 ;
    998 ; UNSAFE-LABEL: ule_inverse_y:
    999 ; UNSAFE:       # %bb.0:
   1000 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1001 ; UNSAFE-NEXT:    retq
   1002 ;
   1003 ; FINITE-LABEL: ule_inverse_y:
   1004 ; FINITE:       # %bb.0:
   1005 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1006 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
   1007 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1008 ; FINITE-NEXT:    retq
   1009   %c = fcmp ule double %x, -0.000000e+00
   1010   %d = select i1 %c, double -0.000000e+00, double %x
   1011   ret double %d
   1012 }
   1013 
   1014 ; Test a few more misc. cases.
   1015 
   1016 define double @clampTo3k_a(double %x)  {
   1017 ; STRICT-LABEL: clampTo3k_a:
   1018 ; STRICT:       # %bb.0:
   1019 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1020 ; STRICT-NEXT:    minsd %xmm0, %xmm1
   1021 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1022 ; STRICT-NEXT:    retq
   1023 ;
   1024 ; UNSAFE-LABEL: clampTo3k_a:
   1025 ; UNSAFE:       # %bb.0:
   1026 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
   1027 ; UNSAFE-NEXT:    retq
   1028 ;
   1029 ; FINITE-LABEL: clampTo3k_a:
   1030 ; FINITE:       # %bb.0:
   1031 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1032 ; FINITE-NEXT:    minsd %xmm0, %xmm1
   1033 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1034 ; FINITE-NEXT:    retq
   1035   %t0 = fcmp ogt double %x, 3.000000e+03
   1036   %y = select i1 %t0, double 3.000000e+03, double %x
   1037   ret double %y
   1038 }
   1039 
   1040 define double @clampTo3k_b(double %x)  {
   1041 ; STRICT-LABEL: clampTo3k_b:
   1042 ; STRICT:       # %bb.0:
   1043 ; STRICT-NEXT:    minsd {{.*}}(%rip), %xmm0
   1044 ; STRICT-NEXT:    retq
   1045 ;
   1046 ; UNSAFE-LABEL: clampTo3k_b:
   1047 ; UNSAFE:       # %bb.0:
   1048 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
   1049 ; UNSAFE-NEXT:    retq
   1050 ;
   1051 ; FINITE-LABEL: clampTo3k_b:
   1052 ; FINITE:       # %bb.0:
   1053 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1054 ; FINITE-NEXT:    minsd %xmm0, %xmm1
   1055 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1056 ; FINITE-NEXT:    retq
   1057   %t0 = fcmp uge double %x, 3.000000e+03
   1058   %y = select i1 %t0, double 3.000000e+03, double %x
   1059   ret double %y
   1060 }
   1061 
   1062 define double @clampTo3k_c(double %x)  {
   1063 ; STRICT-LABEL: clampTo3k_c:
   1064 ; STRICT:       # %bb.0:
   1065 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1066 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
   1067 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1068 ; STRICT-NEXT:    retq
   1069 ;
   1070 ; UNSAFE-LABEL: clampTo3k_c:
   1071 ; UNSAFE:       # %bb.0:
   1072 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1073 ; UNSAFE-NEXT:    retq
   1074 ;
   1075 ; FINITE-LABEL: clampTo3k_c:
   1076 ; FINITE:       # %bb.0:
   1077 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1078 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
   1079 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1080 ; FINITE-NEXT:    retq
   1081   %t0 = fcmp olt double %x, 3.000000e+03
   1082   %y = select i1 %t0, double 3.000000e+03, double %x
   1083   ret double %y
   1084 }
   1085 
   1086 define double @clampTo3k_d(double %x)  {
   1087 ; STRICT-LABEL: clampTo3k_d:
   1088 ; STRICT:       # %bb.0:
   1089 ; STRICT-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1090 ; STRICT-NEXT:    retq
   1091 ;
   1092 ; UNSAFE-LABEL: clampTo3k_d:
   1093 ; UNSAFE:       # %bb.0:
   1094 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1095 ; UNSAFE-NEXT:    retq
   1096 ;
   1097 ; FINITE-LABEL: clampTo3k_d:
   1098 ; FINITE:       # %bb.0:
   1099 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1100 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
   1101 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1102 ; FINITE-NEXT:    retq
   1103   %t0 = fcmp ule double %x, 3.000000e+03
   1104   %y = select i1 %t0, double 3.000000e+03, double %x
   1105   ret double %y
   1106 }
   1107 
   1108 define double @clampTo3k_e(double %x)  {
   1109 ; STRICT-LABEL: clampTo3k_e:
   1110 ; STRICT:       # %bb.0:
   1111 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1112 ; STRICT-NEXT:    maxsd %xmm0, %xmm1
   1113 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1114 ; STRICT-NEXT:    retq
   1115 ;
   1116 ; UNSAFE-LABEL: clampTo3k_e:
   1117 ; UNSAFE:       # %bb.0:
   1118 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1119 ; UNSAFE-NEXT:    retq
   1120 ;
   1121 ; FINITE-LABEL: clampTo3k_e:
   1122 ; FINITE:       # %bb.0:
   1123 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1124 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
   1125 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1126 ; FINITE-NEXT:    retq
   1127   %t0 = fcmp olt double %x, 3.000000e+03
   1128   %y = select i1 %t0, double 3.000000e+03, double %x
   1129   ret double %y
   1130 }
   1131 
   1132 define double @clampTo3k_f(double %x)  {
   1133 ; STRICT-LABEL: clampTo3k_f:
   1134 ; STRICT:       # %bb.0:
   1135 ; STRICT-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1136 ; STRICT-NEXT:    retq
   1137 ;
   1138 ; UNSAFE-LABEL: clampTo3k_f:
   1139 ; UNSAFE:       # %bb.0:
   1140 ; UNSAFE-NEXT:    maxsd {{.*}}(%rip), %xmm0
   1141 ; UNSAFE-NEXT:    retq
   1142 ;
   1143 ; FINITE-LABEL: clampTo3k_f:
   1144 ; FINITE:       # %bb.0:
   1145 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1146 ; FINITE-NEXT:    maxsd %xmm0, %xmm1
   1147 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1148 ; FINITE-NEXT:    retq
   1149   %t0 = fcmp ule double %x, 3.000000e+03
   1150   %y = select i1 %t0, double 3.000000e+03, double %x
   1151   ret double %y
   1152 }
   1153 
   1154 define double @clampTo3k_g(double %x)  {
   1155 ; STRICT-LABEL: clampTo3k_g:
   1156 ; STRICT:       # %bb.0:
   1157 ; STRICT-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1158 ; STRICT-NEXT:    minsd %xmm0, %xmm1
   1159 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1160 ; STRICT-NEXT:    retq
   1161 ;
   1162 ; UNSAFE-LABEL: clampTo3k_g:
   1163 ; UNSAFE:       # %bb.0:
   1164 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
   1165 ; UNSAFE-NEXT:    retq
   1166 ;
   1167 ; FINITE-LABEL: clampTo3k_g:
   1168 ; FINITE:       # %bb.0:
   1169 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1170 ; FINITE-NEXT:    minsd %xmm0, %xmm1
   1171 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1172 ; FINITE-NEXT:    retq
   1173   %t0 = fcmp ogt double %x, 3.000000e+03
   1174   %y = select i1 %t0, double 3.000000e+03, double %x
   1175   ret double %y
   1176 }
   1177 
   1178 define double @clampTo3k_h(double %x)  {
   1179 ; STRICT-LABEL: clampTo3k_h:
   1180 ; STRICT:       # %bb.0:
   1181 ; STRICT-NEXT:    minsd {{.*}}(%rip), %xmm0
   1182 ; STRICT-NEXT:    retq
   1183 ;
   1184 ; UNSAFE-LABEL: clampTo3k_h:
   1185 ; UNSAFE:       # %bb.0:
   1186 ; UNSAFE-NEXT:    minsd {{.*}}(%rip), %xmm0
   1187 ; UNSAFE-NEXT:    retq
   1188 ;
   1189 ; FINITE-LABEL: clampTo3k_h:
   1190 ; FINITE:       # %bb.0:
   1191 ; FINITE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
   1192 ; FINITE-NEXT:    minsd %xmm0, %xmm1
   1193 ; FINITE-NEXT:    movapd %xmm1, %xmm0
   1194 ; FINITE-NEXT:    retq
   1195   %t0 = fcmp uge double %x, 3.000000e+03
   1196   %y = select i1 %t0, double 3.000000e+03, double %x
   1197   ret double %y
   1198 }
   1199 
   1200 define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y)  {
   1201 ; STRICT-LABEL: test_maxpd:
   1202 ; STRICT:       # %bb.0:
   1203 ; STRICT-NEXT:    movapd %xmm0, %xmm2
   1204 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1205 ; STRICT-NEXT:    cmplepd %xmm2, %xmm0
   1206 ; STRICT-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
   1207 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1208 ; STRICT-NEXT:    retq
   1209 ;
   1210 ; RELAX-LABEL: test_maxpd:
   1211 ; RELAX:       # %bb.0:
   1212 ; RELAX-NEXT:    maxpd %xmm1, %xmm0
   1213 ; RELAX-NEXT:    retq
   1214   %max_is_x = fcmp oge <2 x double> %x, %y
   1215   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
   1216   ret <2 x double> %max
   1217 }
   1218 
   1219 define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y)  {
   1220 ; STRICT-LABEL: test_minpd:
   1221 ; STRICT:       # %bb.0:
   1222 ; STRICT-NEXT:    movapd %xmm0, %xmm2
   1223 ; STRICT-NEXT:    cmplepd %xmm1, %xmm0
   1224 ; STRICT-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
   1225 ; STRICT-NEXT:    movapd %xmm1, %xmm0
   1226 ; STRICT-NEXT:    retq
   1227 ;
   1228 ; RELAX-LABEL: test_minpd:
   1229 ; RELAX:       # %bb.0:
   1230 ; RELAX-NEXT:    minpd %xmm1, %xmm0
   1231 ; RELAX-NEXT:    retq
   1232   %min_is_x = fcmp ole <2 x double> %x, %y
   1233   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
   1234   ret <2 x double> %min
   1235 }
   1236 
   1237 define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y)  {
   1238 ; STRICT-LABEL: test_maxps:
   1239 ; STRICT:       # %bb.0:
   1240 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1241 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1242 ; STRICT-NEXT:    cmpleps %xmm2, %xmm0
   1243 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1244 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1245 ; STRICT-NEXT:    retq
   1246 ;
   1247 ; RELAX-LABEL: test_maxps:
   1248 ; RELAX:       # %bb.0:
   1249 ; RELAX-NEXT:    maxps %xmm1, %xmm0
   1250 ; RELAX-NEXT:    retq
   1251   %max_is_x = fcmp oge <4 x float> %x, %y
   1252   %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
   1253   ret <4 x float> %max
   1254 }
   1255 
   1256 define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y)  {
   1257 ; STRICT-LABEL: test_minps:
   1258 ; STRICT:       # %bb.0:
   1259 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1260 ; STRICT-NEXT:    cmpleps %xmm1, %xmm0
   1261 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1262 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1263 ; STRICT-NEXT:    retq
   1264 ;
   1265 ; RELAX-LABEL: test_minps:
   1266 ; RELAX:       # %bb.0:
   1267 ; RELAX-NEXT:    minps %xmm1, %xmm0
   1268 ; RELAX-NEXT:    retq
   1269   %min_is_x = fcmp ole <4 x float> %x, %y
   1270   %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
   1271   ret <4 x float> %min
   1272 }
   1273 
   1274 define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y)  {
   1275 ; STRICT-LABEL: test_maxps_illegal_v2f32:
   1276 ; STRICT:       # %bb.0:
   1277 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1278 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1279 ; STRICT-NEXT:    cmpleps %xmm2, %xmm0
   1280 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1281 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1282 ; STRICT-NEXT:    retq
   1283 ;
   1284 ; RELAX-LABEL: test_maxps_illegal_v2f32:
   1285 ; RELAX:       # %bb.0:
   1286 ; RELAX-NEXT:    maxps %xmm1, %xmm0
   1287 ; RELAX-NEXT:    retq
   1288   %max_is_x = fcmp oge <2 x float> %x, %y
   1289   %max = select <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y
   1290   ret <2 x float> %max
   1291 }
   1292 
   1293 define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y)  {
   1294 ; STRICT-LABEL: test_minps_illegal_v2f32:
   1295 ; STRICT:       # %bb.0:
   1296 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1297 ; STRICT-NEXT:    cmpleps %xmm1, %xmm0
   1298 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1299 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1300 ; STRICT-NEXT:    retq
   1301 ;
   1302 ; RELAX-LABEL: test_minps_illegal_v2f32:
   1303 ; RELAX:       # %bb.0:
   1304 ; RELAX-NEXT:    minps %xmm1, %xmm0
   1305 ; RELAX-NEXT:    retq
   1306   %min_is_x = fcmp ole <2 x float> %x, %y
   1307   %min = select <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y
   1308   ret <2 x float> %min
   1309 }
   1310 
   1311 define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y)  {
   1312 ; STRICT-LABEL: test_maxps_illegal_v3f32:
   1313 ; STRICT:       # %bb.0:
   1314 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1315 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1316 ; STRICT-NEXT:    cmpleps %xmm2, %xmm0
   1317 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1318 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1319 ; STRICT-NEXT:    retq
   1320 ;
   1321 ; RELAX-LABEL: test_maxps_illegal_v3f32:
   1322 ; RELAX:       # %bb.0:
   1323 ; RELAX-NEXT:    maxps %xmm1, %xmm0
   1324 ; RELAX-NEXT:    retq
   1325   %max_is_x = fcmp oge <3 x float> %x, %y
   1326   %max = select <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y
   1327   ret <3 x float> %max
   1328 }
   1329 
   1330 define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y)  {
   1331 ; STRICT-LABEL: test_minps_illegal_v3f32:
   1332 ; STRICT:       # %bb.0:
   1333 ; STRICT-NEXT:    movaps %xmm0, %xmm2
   1334 ; STRICT-NEXT:    cmpleps %xmm1, %xmm0
   1335 ; STRICT-NEXT:    blendvps %xmm0, %xmm2, %xmm1
   1336 ; STRICT-NEXT:    movaps %xmm1, %xmm0
   1337 ; STRICT-NEXT:    retq
   1338 ;
   1339 ; RELAX-LABEL: test_minps_illegal_v3f32:
   1340 ; RELAX:       # %bb.0:
   1341 ; RELAX-NEXT:    minps %xmm1, %xmm0
   1342 ; RELAX-NEXT:    retq
   1343   %min_is_x = fcmp ole <3 x float> %x, %y
   1344   %min = select <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y
   1345   ret <3 x float> %min
   1346 }
   1347 
   1348