1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s --check-prefix=ALL --check-prefix=SDAG 3 ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 | FileCheck %s --check-prefix=ALL --check-prefix=FAST --check-prefix=FAST_NOAVX 4 ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -mattr=avx | FileCheck %s --check-prefix=ALL --check-prefix=FAST --check-prefix=FAST_AVX 5 ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -mattr=avx512f | FileCheck %s --check-prefix=ALL --check-prefix=FAST --check-prefix=FAST_AVX 6 7 define zeroext i1 @fcmp_oeq(float %x, float %y) { 8 ; SDAG-LABEL: fcmp_oeq: 9 ; SDAG: ## %bb.0: 10 ; SDAG-NEXT: cmpeqss %xmm1, %xmm0 11 ; SDAG-NEXT: movd %xmm0, %eax 12 ; SDAG-NEXT: andl $1, %eax 13 ; SDAG-NEXT: ## kill: def $al killed $al killed $eax 14 ; SDAG-NEXT: retq 15 ; 16 ; FAST_NOAVX-LABEL: fcmp_oeq: 17 ; FAST_NOAVX: ## %bb.0: 18 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 19 ; FAST_NOAVX-NEXT: sete %al 20 ; FAST_NOAVX-NEXT: setnp %cl 21 ; FAST_NOAVX-NEXT: andb %al, %cl 22 ; FAST_NOAVX-NEXT: andb $1, %cl 23 ; FAST_NOAVX-NEXT: movzbl %cl, %eax 24 ; FAST_NOAVX-NEXT: retq 25 ; 26 ; FAST_AVX-LABEL: fcmp_oeq: 27 ; FAST_AVX: ## %bb.0: 28 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 29 ; FAST_AVX-NEXT: sete %al 30 ; FAST_AVX-NEXT: setnp %cl 31 ; FAST_AVX-NEXT: andb %al, %cl 32 ; FAST_AVX-NEXT: andb $1, %cl 33 ; FAST_AVX-NEXT: movzbl %cl, %eax 34 ; FAST_AVX-NEXT: retq 35 %1 = fcmp oeq float %x, %y 36 ret i1 %1 37 } 38 39 define zeroext i1 @fcmp_ogt(float %x, float %y) { 40 ; SDAG-LABEL: fcmp_ogt: 41 ; SDAG: ## %bb.0: 42 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 43 ; SDAG-NEXT: seta %al 44 ; SDAG-NEXT: retq 45 ; 46 ; FAST_NOAVX-LABEL: fcmp_ogt: 47 ; FAST_NOAVX: ## %bb.0: 48 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 49 ; FAST_NOAVX-NEXT: seta %al 50 ; FAST_NOAVX-NEXT: andb $1, %al 51 ; FAST_NOAVX-NEXT: movzbl %al, %eax 52 ; FAST_NOAVX-NEXT: retq 53 ; 54 ; FAST_AVX-LABEL: fcmp_ogt: 55 ; FAST_AVX: ## %bb.0: 56 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 57 ; FAST_AVX-NEXT: seta %al 58 ; FAST_AVX-NEXT: andb $1, %al 59 ; FAST_AVX-NEXT: movzbl %al, %eax 60 ; FAST_AVX-NEXT: retq 61 %1 = fcmp ogt float %x, %y 62 ret i1 %1 63 } 64 65 define zeroext i1 @fcmp_oge(float %x, float %y) { 66 ; SDAG-LABEL: fcmp_oge: 67 ; SDAG: ## %bb.0: 68 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 69 ; SDAG-NEXT: setae %al 70 ; SDAG-NEXT: retq 71 ; 72 ; FAST_NOAVX-LABEL: fcmp_oge: 73 ; FAST_NOAVX: ## %bb.0: 74 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 75 ; FAST_NOAVX-NEXT: setae %al 76 ; FAST_NOAVX-NEXT: andb $1, %al 77 ; FAST_NOAVX-NEXT: movzbl %al, %eax 78 ; FAST_NOAVX-NEXT: retq 79 ; 80 ; FAST_AVX-LABEL: fcmp_oge: 81 ; FAST_AVX: ## %bb.0: 82 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 83 ; FAST_AVX-NEXT: setae %al 84 ; FAST_AVX-NEXT: andb $1, %al 85 ; FAST_AVX-NEXT: movzbl %al, %eax 86 ; FAST_AVX-NEXT: retq 87 %1 = fcmp oge float %x, %y 88 ret i1 %1 89 } 90 91 define zeroext i1 @fcmp_olt(float %x, float %y) { 92 ; SDAG-LABEL: fcmp_olt: 93 ; SDAG: ## %bb.0: 94 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 95 ; SDAG-NEXT: seta %al 96 ; SDAG-NEXT: retq 97 ; 98 ; FAST_NOAVX-LABEL: fcmp_olt: 99 ; FAST_NOAVX: ## %bb.0: 100 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 101 ; FAST_NOAVX-NEXT: seta %al 102 ; FAST_NOAVX-NEXT: andb $1, %al 103 ; FAST_NOAVX-NEXT: movzbl %al, %eax 104 ; FAST_NOAVX-NEXT: retq 105 ; 106 ; FAST_AVX-LABEL: fcmp_olt: 107 ; FAST_AVX: ## %bb.0: 108 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 109 ; FAST_AVX-NEXT: seta %al 110 ; FAST_AVX-NEXT: andb $1, %al 111 ; FAST_AVX-NEXT: movzbl %al, %eax 112 ; FAST_AVX-NEXT: retq 113 %1 = fcmp olt float %x, %y 114 ret i1 %1 115 } 116 117 define zeroext i1 @fcmp_ole(float %x, float %y) { 118 ; SDAG-LABEL: fcmp_ole: 119 ; SDAG: ## %bb.0: 120 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 121 ; SDAG-NEXT: setae %al 122 ; SDAG-NEXT: retq 123 ; 124 ; FAST_NOAVX-LABEL: fcmp_ole: 125 ; FAST_NOAVX: ## %bb.0: 126 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 127 ; FAST_NOAVX-NEXT: setae %al 128 ; FAST_NOAVX-NEXT: andb $1, %al 129 ; FAST_NOAVX-NEXT: movzbl %al, %eax 130 ; FAST_NOAVX-NEXT: retq 131 ; 132 ; FAST_AVX-LABEL: fcmp_ole: 133 ; FAST_AVX: ## %bb.0: 134 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 135 ; FAST_AVX-NEXT: setae %al 136 ; FAST_AVX-NEXT: andb $1, %al 137 ; FAST_AVX-NEXT: movzbl %al, %eax 138 ; FAST_AVX-NEXT: retq 139 %1 = fcmp ole float %x, %y 140 ret i1 %1 141 } 142 143 define zeroext i1 @fcmp_one(float %x, float %y) { 144 ; SDAG-LABEL: fcmp_one: 145 ; SDAG: ## %bb.0: 146 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 147 ; SDAG-NEXT: setne %al 148 ; SDAG-NEXT: retq 149 ; 150 ; FAST_NOAVX-LABEL: fcmp_one: 151 ; FAST_NOAVX: ## %bb.0: 152 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 153 ; FAST_NOAVX-NEXT: setne %al 154 ; FAST_NOAVX-NEXT: andb $1, %al 155 ; FAST_NOAVX-NEXT: movzbl %al, %eax 156 ; FAST_NOAVX-NEXT: retq 157 ; 158 ; FAST_AVX-LABEL: fcmp_one: 159 ; FAST_AVX: ## %bb.0: 160 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 161 ; FAST_AVX-NEXT: setne %al 162 ; FAST_AVX-NEXT: andb $1, %al 163 ; FAST_AVX-NEXT: movzbl %al, %eax 164 ; FAST_AVX-NEXT: retq 165 %1 = fcmp one float %x, %y 166 ret i1 %1 167 } 168 169 define zeroext i1 @fcmp_ord(float %x, float %y) { 170 ; SDAG-LABEL: fcmp_ord: 171 ; SDAG: ## %bb.0: 172 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 173 ; SDAG-NEXT: setnp %al 174 ; SDAG-NEXT: retq 175 ; 176 ; FAST_NOAVX-LABEL: fcmp_ord: 177 ; FAST_NOAVX: ## %bb.0: 178 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 179 ; FAST_NOAVX-NEXT: setnp %al 180 ; FAST_NOAVX-NEXT: andb $1, %al 181 ; FAST_NOAVX-NEXT: movzbl %al, %eax 182 ; FAST_NOAVX-NEXT: retq 183 ; 184 ; FAST_AVX-LABEL: fcmp_ord: 185 ; FAST_AVX: ## %bb.0: 186 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 187 ; FAST_AVX-NEXT: setnp %al 188 ; FAST_AVX-NEXT: andb $1, %al 189 ; FAST_AVX-NEXT: movzbl %al, %eax 190 ; FAST_AVX-NEXT: retq 191 %1 = fcmp ord float %x, %y 192 ret i1 %1 193 } 194 195 define zeroext i1 @fcmp_uno(float %x, float %y) { 196 ; SDAG-LABEL: fcmp_uno: 197 ; SDAG: ## %bb.0: 198 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 199 ; SDAG-NEXT: setp %al 200 ; SDAG-NEXT: retq 201 ; 202 ; FAST_NOAVX-LABEL: fcmp_uno: 203 ; FAST_NOAVX: ## %bb.0: 204 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 205 ; FAST_NOAVX-NEXT: setp %al 206 ; FAST_NOAVX-NEXT: andb $1, %al 207 ; FAST_NOAVX-NEXT: movzbl %al, %eax 208 ; FAST_NOAVX-NEXT: retq 209 ; 210 ; FAST_AVX-LABEL: fcmp_uno: 211 ; FAST_AVX: ## %bb.0: 212 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 213 ; FAST_AVX-NEXT: setp %al 214 ; FAST_AVX-NEXT: andb $1, %al 215 ; FAST_AVX-NEXT: movzbl %al, %eax 216 ; FAST_AVX-NEXT: retq 217 %1 = fcmp uno float %x, %y 218 ret i1 %1 219 } 220 221 define zeroext i1 @fcmp_ueq(float %x, float %y) { 222 ; SDAG-LABEL: fcmp_ueq: 223 ; SDAG: ## %bb.0: 224 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 225 ; SDAG-NEXT: sete %al 226 ; SDAG-NEXT: retq 227 ; 228 ; FAST_NOAVX-LABEL: fcmp_ueq: 229 ; FAST_NOAVX: ## %bb.0: 230 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 231 ; FAST_NOAVX-NEXT: sete %al 232 ; FAST_NOAVX-NEXT: andb $1, %al 233 ; FAST_NOAVX-NEXT: movzbl %al, %eax 234 ; FAST_NOAVX-NEXT: retq 235 ; 236 ; FAST_AVX-LABEL: fcmp_ueq: 237 ; FAST_AVX: ## %bb.0: 238 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 239 ; FAST_AVX-NEXT: sete %al 240 ; FAST_AVX-NEXT: andb $1, %al 241 ; FAST_AVX-NEXT: movzbl %al, %eax 242 ; FAST_AVX-NEXT: retq 243 %1 = fcmp ueq float %x, %y 244 ret i1 %1 245 } 246 247 define zeroext i1 @fcmp_ugt(float %x, float %y) { 248 ; SDAG-LABEL: fcmp_ugt: 249 ; SDAG: ## %bb.0: 250 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 251 ; SDAG-NEXT: setb %al 252 ; SDAG-NEXT: retq 253 ; 254 ; FAST_NOAVX-LABEL: fcmp_ugt: 255 ; FAST_NOAVX: ## %bb.0: 256 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 257 ; FAST_NOAVX-NEXT: setb %al 258 ; FAST_NOAVX-NEXT: andb $1, %al 259 ; FAST_NOAVX-NEXT: movzbl %al, %eax 260 ; FAST_NOAVX-NEXT: retq 261 ; 262 ; FAST_AVX-LABEL: fcmp_ugt: 263 ; FAST_AVX: ## %bb.0: 264 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 265 ; FAST_AVX-NEXT: setb %al 266 ; FAST_AVX-NEXT: andb $1, %al 267 ; FAST_AVX-NEXT: movzbl %al, %eax 268 ; FAST_AVX-NEXT: retq 269 %1 = fcmp ugt float %x, %y 270 ret i1 %1 271 } 272 273 define zeroext i1 @fcmp_uge(float %x, float %y) { 274 ; SDAG-LABEL: fcmp_uge: 275 ; SDAG: ## %bb.0: 276 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 277 ; SDAG-NEXT: setbe %al 278 ; SDAG-NEXT: retq 279 ; 280 ; FAST_NOAVX-LABEL: fcmp_uge: 281 ; FAST_NOAVX: ## %bb.0: 282 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 283 ; FAST_NOAVX-NEXT: setbe %al 284 ; FAST_NOAVX-NEXT: andb $1, %al 285 ; FAST_NOAVX-NEXT: movzbl %al, %eax 286 ; FAST_NOAVX-NEXT: retq 287 ; 288 ; FAST_AVX-LABEL: fcmp_uge: 289 ; FAST_AVX: ## %bb.0: 290 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 291 ; FAST_AVX-NEXT: setbe %al 292 ; FAST_AVX-NEXT: andb $1, %al 293 ; FAST_AVX-NEXT: movzbl %al, %eax 294 ; FAST_AVX-NEXT: retq 295 %1 = fcmp uge float %x, %y 296 ret i1 %1 297 } 298 299 define zeroext i1 @fcmp_ult(float %x, float %y) { 300 ; SDAG-LABEL: fcmp_ult: 301 ; SDAG: ## %bb.0: 302 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 303 ; SDAG-NEXT: setb %al 304 ; SDAG-NEXT: retq 305 ; 306 ; FAST_NOAVX-LABEL: fcmp_ult: 307 ; FAST_NOAVX: ## %bb.0: 308 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 309 ; FAST_NOAVX-NEXT: setb %al 310 ; FAST_NOAVX-NEXT: andb $1, %al 311 ; FAST_NOAVX-NEXT: movzbl %al, %eax 312 ; FAST_NOAVX-NEXT: retq 313 ; 314 ; FAST_AVX-LABEL: fcmp_ult: 315 ; FAST_AVX: ## %bb.0: 316 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 317 ; FAST_AVX-NEXT: setb %al 318 ; FAST_AVX-NEXT: andb $1, %al 319 ; FAST_AVX-NEXT: movzbl %al, %eax 320 ; FAST_AVX-NEXT: retq 321 %1 = fcmp ult float %x, %y 322 ret i1 %1 323 } 324 325 define zeroext i1 @fcmp_ule(float %x, float %y) { 326 ; SDAG-LABEL: fcmp_ule: 327 ; SDAG: ## %bb.0: 328 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 329 ; SDAG-NEXT: setbe %al 330 ; SDAG-NEXT: retq 331 ; 332 ; FAST_NOAVX-LABEL: fcmp_ule: 333 ; FAST_NOAVX: ## %bb.0: 334 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 335 ; FAST_NOAVX-NEXT: setbe %al 336 ; FAST_NOAVX-NEXT: andb $1, %al 337 ; FAST_NOAVX-NEXT: movzbl %al, %eax 338 ; FAST_NOAVX-NEXT: retq 339 ; 340 ; FAST_AVX-LABEL: fcmp_ule: 341 ; FAST_AVX: ## %bb.0: 342 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 343 ; FAST_AVX-NEXT: setbe %al 344 ; FAST_AVX-NEXT: andb $1, %al 345 ; FAST_AVX-NEXT: movzbl %al, %eax 346 ; FAST_AVX-NEXT: retq 347 %1 = fcmp ule float %x, %y 348 ret i1 %1 349 } 350 351 define zeroext i1 @fcmp_une(float %x, float %y) { 352 ; SDAG-LABEL: fcmp_une: 353 ; SDAG: ## %bb.0: 354 ; SDAG-NEXT: cmpneqss %xmm1, %xmm0 355 ; SDAG-NEXT: movd %xmm0, %eax 356 ; SDAG-NEXT: andl $1, %eax 357 ; SDAG-NEXT: ## kill: def $al killed $al killed $eax 358 ; SDAG-NEXT: retq 359 ; 360 ; FAST_NOAVX-LABEL: fcmp_une: 361 ; FAST_NOAVX: ## %bb.0: 362 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 363 ; FAST_NOAVX-NEXT: setne %al 364 ; FAST_NOAVX-NEXT: setp %cl 365 ; FAST_NOAVX-NEXT: orb %al, %cl 366 ; FAST_NOAVX-NEXT: andb $1, %cl 367 ; FAST_NOAVX-NEXT: movzbl %cl, %eax 368 ; FAST_NOAVX-NEXT: retq 369 ; 370 ; FAST_AVX-LABEL: fcmp_une: 371 ; FAST_AVX: ## %bb.0: 372 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 373 ; FAST_AVX-NEXT: setne %al 374 ; FAST_AVX-NEXT: setp %cl 375 ; FAST_AVX-NEXT: orb %al, %cl 376 ; FAST_AVX-NEXT: andb $1, %cl 377 ; FAST_AVX-NEXT: movzbl %cl, %eax 378 ; FAST_AVX-NEXT: retq 379 %1 = fcmp une float %x, %y 380 ret i1 %1 381 } 382 383 define zeroext i1 @icmp_eq(i32 %x, i32 %y) { 384 ; SDAG-LABEL: icmp_eq: 385 ; SDAG: ## %bb.0: 386 ; SDAG-NEXT: cmpl %esi, %edi 387 ; SDAG-NEXT: sete %al 388 ; SDAG-NEXT: retq 389 ; 390 ; FAST-LABEL: icmp_eq: 391 ; FAST: ## %bb.0: 392 ; FAST-NEXT: cmpl %esi, %edi 393 ; FAST-NEXT: sete %al 394 ; FAST-NEXT: andb $1, %al 395 ; FAST-NEXT: movzbl %al, %eax 396 ; FAST-NEXT: retq 397 %1 = icmp eq i32 %x, %y 398 ret i1 %1 399 } 400 401 define zeroext i1 @icmp_ne(i32 %x, i32 %y) { 402 ; SDAG-LABEL: icmp_ne: 403 ; SDAG: ## %bb.0: 404 ; SDAG-NEXT: cmpl %esi, %edi 405 ; SDAG-NEXT: setne %al 406 ; SDAG-NEXT: retq 407 ; 408 ; FAST-LABEL: icmp_ne: 409 ; FAST: ## %bb.0: 410 ; FAST-NEXT: cmpl %esi, %edi 411 ; FAST-NEXT: setne %al 412 ; FAST-NEXT: andb $1, %al 413 ; FAST-NEXT: movzbl %al, %eax 414 ; FAST-NEXT: retq 415 %1 = icmp ne i32 %x, %y 416 ret i1 %1 417 } 418 419 define zeroext i1 @icmp_ugt(i32 %x, i32 %y) { 420 ; SDAG-LABEL: icmp_ugt: 421 ; SDAG: ## %bb.0: 422 ; SDAG-NEXT: cmpl %esi, %edi 423 ; SDAG-NEXT: seta %al 424 ; SDAG-NEXT: retq 425 ; 426 ; FAST-LABEL: icmp_ugt: 427 ; FAST: ## %bb.0: 428 ; FAST-NEXT: cmpl %esi, %edi 429 ; FAST-NEXT: seta %al 430 ; FAST-NEXT: andb $1, %al 431 ; FAST-NEXT: movzbl %al, %eax 432 ; FAST-NEXT: retq 433 %1 = icmp ugt i32 %x, %y 434 ret i1 %1 435 } 436 437 define zeroext i1 @icmp_uge(i32 %x, i32 %y) { 438 ; SDAG-LABEL: icmp_uge: 439 ; SDAG: ## %bb.0: 440 ; SDAG-NEXT: cmpl %esi, %edi 441 ; SDAG-NEXT: setae %al 442 ; SDAG-NEXT: retq 443 ; 444 ; FAST-LABEL: icmp_uge: 445 ; FAST: ## %bb.0: 446 ; FAST-NEXT: cmpl %esi, %edi 447 ; FAST-NEXT: setae %al 448 ; FAST-NEXT: andb $1, %al 449 ; FAST-NEXT: movzbl %al, %eax 450 ; FAST-NEXT: retq 451 %1 = icmp uge i32 %x, %y 452 ret i1 %1 453 } 454 455 define zeroext i1 @icmp_ult(i32 %x, i32 %y) { 456 ; SDAG-LABEL: icmp_ult: 457 ; SDAG: ## %bb.0: 458 ; SDAG-NEXT: cmpl %esi, %edi 459 ; SDAG-NEXT: setb %al 460 ; SDAG-NEXT: retq 461 ; 462 ; FAST-LABEL: icmp_ult: 463 ; FAST: ## %bb.0: 464 ; FAST-NEXT: cmpl %esi, %edi 465 ; FAST-NEXT: setb %al 466 ; FAST-NEXT: andb $1, %al 467 ; FAST-NEXT: movzbl %al, %eax 468 ; FAST-NEXT: retq 469 %1 = icmp ult i32 %x, %y 470 ret i1 %1 471 } 472 473 define zeroext i1 @icmp_ule(i32 %x, i32 %y) { 474 ; SDAG-LABEL: icmp_ule: 475 ; SDAG: ## %bb.0: 476 ; SDAG-NEXT: cmpl %esi, %edi 477 ; SDAG-NEXT: setbe %al 478 ; SDAG-NEXT: retq 479 ; 480 ; FAST-LABEL: icmp_ule: 481 ; FAST: ## %bb.0: 482 ; FAST-NEXT: cmpl %esi, %edi 483 ; FAST-NEXT: setbe %al 484 ; FAST-NEXT: andb $1, %al 485 ; FAST-NEXT: movzbl %al, %eax 486 ; FAST-NEXT: retq 487 %1 = icmp ule i32 %x, %y 488 ret i1 %1 489 } 490 491 define zeroext i1 @icmp_sgt(i32 %x, i32 %y) { 492 ; SDAG-LABEL: icmp_sgt: 493 ; SDAG: ## %bb.0: 494 ; SDAG-NEXT: cmpl %esi, %edi 495 ; SDAG-NEXT: setg %al 496 ; SDAG-NEXT: retq 497 ; 498 ; FAST-LABEL: icmp_sgt: 499 ; FAST: ## %bb.0: 500 ; FAST-NEXT: cmpl %esi, %edi 501 ; FAST-NEXT: setg %al 502 ; FAST-NEXT: andb $1, %al 503 ; FAST-NEXT: movzbl %al, %eax 504 ; FAST-NEXT: retq 505 %1 = icmp sgt i32 %x, %y 506 ret i1 %1 507 } 508 509 define zeroext i1 @icmp_sge(i32 %x, i32 %y) { 510 ; SDAG-LABEL: icmp_sge: 511 ; SDAG: ## %bb.0: 512 ; SDAG-NEXT: cmpl %esi, %edi 513 ; SDAG-NEXT: setge %al 514 ; SDAG-NEXT: retq 515 ; 516 ; FAST-LABEL: icmp_sge: 517 ; FAST: ## %bb.0: 518 ; FAST-NEXT: cmpl %esi, %edi 519 ; FAST-NEXT: setge %al 520 ; FAST-NEXT: andb $1, %al 521 ; FAST-NEXT: movzbl %al, %eax 522 ; FAST-NEXT: retq 523 %1 = icmp sge i32 %x, %y 524 ret i1 %1 525 } 526 527 define zeroext i1 @icmp_slt(i32 %x, i32 %y) { 528 ; SDAG-LABEL: icmp_slt: 529 ; SDAG: ## %bb.0: 530 ; SDAG-NEXT: cmpl %esi, %edi 531 ; SDAG-NEXT: setl %al 532 ; SDAG-NEXT: retq 533 ; 534 ; FAST-LABEL: icmp_slt: 535 ; FAST: ## %bb.0: 536 ; FAST-NEXT: cmpl %esi, %edi 537 ; FAST-NEXT: setl %al 538 ; FAST-NEXT: andb $1, %al 539 ; FAST-NEXT: movzbl %al, %eax 540 ; FAST-NEXT: retq 541 %1 = icmp slt i32 %x, %y 542 ret i1 %1 543 } 544 545 define zeroext i1 @icmp_sle(i32 %x, i32 %y) { 546 ; SDAG-LABEL: icmp_sle: 547 ; SDAG: ## %bb.0: 548 ; SDAG-NEXT: cmpl %esi, %edi 549 ; SDAG-NEXT: setle %al 550 ; SDAG-NEXT: retq 551 ; 552 ; FAST-LABEL: icmp_sle: 553 ; FAST: ## %bb.0: 554 ; FAST-NEXT: cmpl %esi, %edi 555 ; FAST-NEXT: setle %al 556 ; FAST-NEXT: andb $1, %al 557 ; FAST-NEXT: movzbl %al, %eax 558 ; FAST-NEXT: retq 559 %1 = icmp sle i32 %x, %y 560 ret i1 %1 561 } 562 563 ; Test cmp folding and condition optimization. 564 define zeroext i1 @fcmp_oeq2(float %x) { 565 ; SDAG-LABEL: fcmp_oeq2: 566 ; SDAG: ## %bb.0: 567 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 568 ; SDAG-NEXT: setnp %al 569 ; SDAG-NEXT: retq 570 ; 571 ; FAST_NOAVX-LABEL: fcmp_oeq2: 572 ; FAST_NOAVX: ## %bb.0: 573 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 574 ; FAST_NOAVX-NEXT: setnp %al 575 ; FAST_NOAVX-NEXT: andb $1, %al 576 ; FAST_NOAVX-NEXT: movzbl %al, %eax 577 ; FAST_NOAVX-NEXT: retq 578 ; 579 ; FAST_AVX-LABEL: fcmp_oeq2: 580 ; FAST_AVX: ## %bb.0: 581 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 582 ; FAST_AVX-NEXT: setnp %al 583 ; FAST_AVX-NEXT: andb $1, %al 584 ; FAST_AVX-NEXT: movzbl %al, %eax 585 ; FAST_AVX-NEXT: retq 586 %1 = fcmp oeq float %x, %x 587 ret i1 %1 588 } 589 590 define zeroext i1 @fcmp_oeq3(float %x) { 591 ; SDAG-LABEL: fcmp_oeq3: 592 ; SDAG: ## %bb.0: 593 ; SDAG-NEXT: xorps %xmm1, %xmm1 594 ; SDAG-NEXT: cmpeqss %xmm0, %xmm1 595 ; SDAG-NEXT: movd %xmm1, %eax 596 ; SDAG-NEXT: andl $1, %eax 597 ; SDAG-NEXT: ## kill: def $al killed $al killed $eax 598 ; SDAG-NEXT: retq 599 ; 600 ; FAST_NOAVX-LABEL: fcmp_oeq3: 601 ; FAST_NOAVX: ## %bb.0: 602 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 603 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 604 ; FAST_NOAVX-NEXT: sete %al 605 ; FAST_NOAVX-NEXT: setnp %cl 606 ; FAST_NOAVX-NEXT: andb %al, %cl 607 ; FAST_NOAVX-NEXT: andb $1, %cl 608 ; FAST_NOAVX-NEXT: movzbl %cl, %eax 609 ; FAST_NOAVX-NEXT: retq 610 ; 611 ; FAST_AVX-LABEL: fcmp_oeq3: 612 ; FAST_AVX: ## %bb.0: 613 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 614 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 615 ; FAST_AVX-NEXT: sete %al 616 ; FAST_AVX-NEXT: setnp %cl 617 ; FAST_AVX-NEXT: andb %al, %cl 618 ; FAST_AVX-NEXT: andb $1, %cl 619 ; FAST_AVX-NEXT: movzbl %cl, %eax 620 ; FAST_AVX-NEXT: retq 621 %1 = fcmp oeq float %x, 0.000000e+00 622 ret i1 %1 623 } 624 625 define zeroext i1 @fcmp_ogt2(float %x) { 626 ; SDAG-LABEL: fcmp_ogt2: 627 ; SDAG: ## %bb.0: 628 ; SDAG-NEXT: xorl %eax, %eax 629 ; SDAG-NEXT: retq 630 ; 631 ; FAST-LABEL: fcmp_ogt2: 632 ; FAST: ## %bb.0: 633 ; FAST-NEXT: xorl %eax, %eax 634 ; FAST-NEXT: andb $1, %al 635 ; FAST-NEXT: movzbl %al, %eax 636 ; FAST-NEXT: retq 637 %1 = fcmp ogt float %x, %x 638 ret i1 %1 639 } 640 641 define zeroext i1 @fcmp_ogt3(float %x) { 642 ; SDAG-LABEL: fcmp_ogt3: 643 ; SDAG: ## %bb.0: 644 ; SDAG-NEXT: xorps %xmm1, %xmm1 645 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 646 ; SDAG-NEXT: seta %al 647 ; SDAG-NEXT: retq 648 ; 649 ; FAST_NOAVX-LABEL: fcmp_ogt3: 650 ; FAST_NOAVX: ## %bb.0: 651 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 652 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 653 ; FAST_NOAVX-NEXT: seta %al 654 ; FAST_NOAVX-NEXT: andb $1, %al 655 ; FAST_NOAVX-NEXT: movzbl %al, %eax 656 ; FAST_NOAVX-NEXT: retq 657 ; 658 ; FAST_AVX-LABEL: fcmp_ogt3: 659 ; FAST_AVX: ## %bb.0: 660 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 661 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 662 ; FAST_AVX-NEXT: seta %al 663 ; FAST_AVX-NEXT: andb $1, %al 664 ; FAST_AVX-NEXT: movzbl %al, %eax 665 ; FAST_AVX-NEXT: retq 666 %1 = fcmp ogt float %x, 0.000000e+00 667 ret i1 %1 668 } 669 670 define zeroext i1 @fcmp_oge2(float %x) { 671 ; SDAG-LABEL: fcmp_oge2: 672 ; SDAG: ## %bb.0: 673 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 674 ; SDAG-NEXT: setnp %al 675 ; SDAG-NEXT: retq 676 ; 677 ; FAST_NOAVX-LABEL: fcmp_oge2: 678 ; FAST_NOAVX: ## %bb.0: 679 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 680 ; FAST_NOAVX-NEXT: setnp %al 681 ; FAST_NOAVX-NEXT: andb $1, %al 682 ; FAST_NOAVX-NEXT: movzbl %al, %eax 683 ; FAST_NOAVX-NEXT: retq 684 ; 685 ; FAST_AVX-LABEL: fcmp_oge2: 686 ; FAST_AVX: ## %bb.0: 687 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 688 ; FAST_AVX-NEXT: setnp %al 689 ; FAST_AVX-NEXT: andb $1, %al 690 ; FAST_AVX-NEXT: movzbl %al, %eax 691 ; FAST_AVX-NEXT: retq 692 %1 = fcmp oge float %x, %x 693 ret i1 %1 694 } 695 696 define zeroext i1 @fcmp_oge3(float %x) { 697 ; SDAG-LABEL: fcmp_oge3: 698 ; SDAG: ## %bb.0: 699 ; SDAG-NEXT: xorps %xmm1, %xmm1 700 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 701 ; SDAG-NEXT: setae %al 702 ; SDAG-NEXT: retq 703 ; 704 ; FAST_NOAVX-LABEL: fcmp_oge3: 705 ; FAST_NOAVX: ## %bb.0: 706 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 707 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 708 ; FAST_NOAVX-NEXT: setae %al 709 ; FAST_NOAVX-NEXT: andb $1, %al 710 ; FAST_NOAVX-NEXT: movzbl %al, %eax 711 ; FAST_NOAVX-NEXT: retq 712 ; 713 ; FAST_AVX-LABEL: fcmp_oge3: 714 ; FAST_AVX: ## %bb.0: 715 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 716 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 717 ; FAST_AVX-NEXT: setae %al 718 ; FAST_AVX-NEXT: andb $1, %al 719 ; FAST_AVX-NEXT: movzbl %al, %eax 720 ; FAST_AVX-NEXT: retq 721 %1 = fcmp oge float %x, 0.000000e+00 722 ret i1 %1 723 } 724 725 define zeroext i1 @fcmp_olt2(float %x) { 726 ; SDAG-LABEL: fcmp_olt2: 727 ; SDAG: ## %bb.0: 728 ; SDAG-NEXT: xorl %eax, %eax 729 ; SDAG-NEXT: retq 730 ; 731 ; FAST-LABEL: fcmp_olt2: 732 ; FAST: ## %bb.0: 733 ; FAST-NEXT: xorl %eax, %eax 734 ; FAST-NEXT: andb $1, %al 735 ; FAST-NEXT: movzbl %al, %eax 736 ; FAST-NEXT: retq 737 %1 = fcmp olt float %x, %x 738 ret i1 %1 739 } 740 741 define zeroext i1 @fcmp_olt3(float %x) { 742 ; SDAG-LABEL: fcmp_olt3: 743 ; SDAG: ## %bb.0: 744 ; SDAG-NEXT: xorps %xmm1, %xmm1 745 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 746 ; SDAG-NEXT: seta %al 747 ; SDAG-NEXT: retq 748 ; 749 ; FAST_NOAVX-LABEL: fcmp_olt3: 750 ; FAST_NOAVX: ## %bb.0: 751 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 752 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 753 ; FAST_NOAVX-NEXT: seta %al 754 ; FAST_NOAVX-NEXT: andb $1, %al 755 ; FAST_NOAVX-NEXT: movzbl %al, %eax 756 ; FAST_NOAVX-NEXT: retq 757 ; 758 ; FAST_AVX-LABEL: fcmp_olt3: 759 ; FAST_AVX: ## %bb.0: 760 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 761 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 762 ; FAST_AVX-NEXT: seta %al 763 ; FAST_AVX-NEXT: andb $1, %al 764 ; FAST_AVX-NEXT: movzbl %al, %eax 765 ; FAST_AVX-NEXT: retq 766 %1 = fcmp olt float %x, 0.000000e+00 767 ret i1 %1 768 } 769 770 define zeroext i1 @fcmp_ole2(float %x) { 771 ; SDAG-LABEL: fcmp_ole2: 772 ; SDAG: ## %bb.0: 773 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 774 ; SDAG-NEXT: setnp %al 775 ; SDAG-NEXT: retq 776 ; 777 ; FAST_NOAVX-LABEL: fcmp_ole2: 778 ; FAST_NOAVX: ## %bb.0: 779 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 780 ; FAST_NOAVX-NEXT: setnp %al 781 ; FAST_NOAVX-NEXT: andb $1, %al 782 ; FAST_NOAVX-NEXT: movzbl %al, %eax 783 ; FAST_NOAVX-NEXT: retq 784 ; 785 ; FAST_AVX-LABEL: fcmp_ole2: 786 ; FAST_AVX: ## %bb.0: 787 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 788 ; FAST_AVX-NEXT: setnp %al 789 ; FAST_AVX-NEXT: andb $1, %al 790 ; FAST_AVX-NEXT: movzbl %al, %eax 791 ; FAST_AVX-NEXT: retq 792 %1 = fcmp ole float %x, %x 793 ret i1 %1 794 } 795 796 define zeroext i1 @fcmp_ole3(float %x) { 797 ; SDAG-LABEL: fcmp_ole3: 798 ; SDAG: ## %bb.0: 799 ; SDAG-NEXT: xorps %xmm1, %xmm1 800 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 801 ; SDAG-NEXT: setae %al 802 ; SDAG-NEXT: retq 803 ; 804 ; FAST_NOAVX-LABEL: fcmp_ole3: 805 ; FAST_NOAVX: ## %bb.0: 806 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 807 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 808 ; FAST_NOAVX-NEXT: setae %al 809 ; FAST_NOAVX-NEXT: andb $1, %al 810 ; FAST_NOAVX-NEXT: movzbl %al, %eax 811 ; FAST_NOAVX-NEXT: retq 812 ; 813 ; FAST_AVX-LABEL: fcmp_ole3: 814 ; FAST_AVX: ## %bb.0: 815 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 816 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 817 ; FAST_AVX-NEXT: setae %al 818 ; FAST_AVX-NEXT: andb $1, %al 819 ; FAST_AVX-NEXT: movzbl %al, %eax 820 ; FAST_AVX-NEXT: retq 821 %1 = fcmp ole float %x, 0.000000e+00 822 ret i1 %1 823 } 824 825 define zeroext i1 @fcmp_one2(float %x) { 826 ; SDAG-LABEL: fcmp_one2: 827 ; SDAG: ## %bb.0: 828 ; SDAG-NEXT: xorl %eax, %eax 829 ; SDAG-NEXT: retq 830 ; 831 ; FAST-LABEL: fcmp_one2: 832 ; FAST: ## %bb.0: 833 ; FAST-NEXT: xorl %eax, %eax 834 ; FAST-NEXT: andb $1, %al 835 ; FAST-NEXT: movzbl %al, %eax 836 ; FAST-NEXT: retq 837 %1 = fcmp one float %x, %x 838 ret i1 %1 839 } 840 841 define zeroext i1 @fcmp_one3(float %x) { 842 ; SDAG-LABEL: fcmp_one3: 843 ; SDAG: ## %bb.0: 844 ; SDAG-NEXT: xorps %xmm1, %xmm1 845 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 846 ; SDAG-NEXT: setne %al 847 ; SDAG-NEXT: retq 848 ; 849 ; FAST_NOAVX-LABEL: fcmp_one3: 850 ; FAST_NOAVX: ## %bb.0: 851 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 852 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 853 ; FAST_NOAVX-NEXT: setne %al 854 ; FAST_NOAVX-NEXT: andb $1, %al 855 ; FAST_NOAVX-NEXT: movzbl %al, %eax 856 ; FAST_NOAVX-NEXT: retq 857 ; 858 ; FAST_AVX-LABEL: fcmp_one3: 859 ; FAST_AVX: ## %bb.0: 860 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 861 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 862 ; FAST_AVX-NEXT: setne %al 863 ; FAST_AVX-NEXT: andb $1, %al 864 ; FAST_AVX-NEXT: movzbl %al, %eax 865 ; FAST_AVX-NEXT: retq 866 %1 = fcmp one float %x, 0.000000e+00 867 ret i1 %1 868 } 869 870 define zeroext i1 @fcmp_ord2(float %x) { 871 ; SDAG-LABEL: fcmp_ord2: 872 ; SDAG: ## %bb.0: 873 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 874 ; SDAG-NEXT: setnp %al 875 ; SDAG-NEXT: retq 876 ; 877 ; FAST_NOAVX-LABEL: fcmp_ord2: 878 ; FAST_NOAVX: ## %bb.0: 879 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 880 ; FAST_NOAVX-NEXT: setnp %al 881 ; FAST_NOAVX-NEXT: andb $1, %al 882 ; FAST_NOAVX-NEXT: movzbl %al, %eax 883 ; FAST_NOAVX-NEXT: retq 884 ; 885 ; FAST_AVX-LABEL: fcmp_ord2: 886 ; FAST_AVX: ## %bb.0: 887 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 888 ; FAST_AVX-NEXT: setnp %al 889 ; FAST_AVX-NEXT: andb $1, %al 890 ; FAST_AVX-NEXT: movzbl %al, %eax 891 ; FAST_AVX-NEXT: retq 892 %1 = fcmp ord float %x, %x 893 ret i1 %1 894 } 895 896 define zeroext i1 @fcmp_ord3(float %x) { 897 ; SDAG-LABEL: fcmp_ord3: 898 ; SDAG: ## %bb.0: 899 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 900 ; SDAG-NEXT: setnp %al 901 ; SDAG-NEXT: retq 902 ; 903 ; FAST_NOAVX-LABEL: fcmp_ord3: 904 ; FAST_NOAVX: ## %bb.0: 905 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 906 ; FAST_NOAVX-NEXT: setnp %al 907 ; FAST_NOAVX-NEXT: andb $1, %al 908 ; FAST_NOAVX-NEXT: movzbl %al, %eax 909 ; FAST_NOAVX-NEXT: retq 910 ; 911 ; FAST_AVX-LABEL: fcmp_ord3: 912 ; FAST_AVX: ## %bb.0: 913 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 914 ; FAST_AVX-NEXT: setnp %al 915 ; FAST_AVX-NEXT: andb $1, %al 916 ; FAST_AVX-NEXT: movzbl %al, %eax 917 ; FAST_AVX-NEXT: retq 918 %1 = fcmp ord float %x, 0.000000e+00 919 ret i1 %1 920 } 921 922 define zeroext i1 @fcmp_uno2(float %x) { 923 ; SDAG-LABEL: fcmp_uno2: 924 ; SDAG: ## %bb.0: 925 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 926 ; SDAG-NEXT: setp %al 927 ; SDAG-NEXT: retq 928 ; 929 ; FAST_NOAVX-LABEL: fcmp_uno2: 930 ; FAST_NOAVX: ## %bb.0: 931 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 932 ; FAST_NOAVX-NEXT: setp %al 933 ; FAST_NOAVX-NEXT: andb $1, %al 934 ; FAST_NOAVX-NEXT: movzbl %al, %eax 935 ; FAST_NOAVX-NEXT: retq 936 ; 937 ; FAST_AVX-LABEL: fcmp_uno2: 938 ; FAST_AVX: ## %bb.0: 939 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 940 ; FAST_AVX-NEXT: setp %al 941 ; FAST_AVX-NEXT: andb $1, %al 942 ; FAST_AVX-NEXT: movzbl %al, %eax 943 ; FAST_AVX-NEXT: retq 944 %1 = fcmp uno float %x, %x 945 ret i1 %1 946 } 947 948 define zeroext i1 @fcmp_uno3(float %x) { 949 ; SDAG-LABEL: fcmp_uno3: 950 ; SDAG: ## %bb.0: 951 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 952 ; SDAG-NEXT: setp %al 953 ; SDAG-NEXT: retq 954 ; 955 ; FAST_NOAVX-LABEL: fcmp_uno3: 956 ; FAST_NOAVX: ## %bb.0: 957 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 958 ; FAST_NOAVX-NEXT: setp %al 959 ; FAST_NOAVX-NEXT: andb $1, %al 960 ; FAST_NOAVX-NEXT: movzbl %al, %eax 961 ; FAST_NOAVX-NEXT: retq 962 ; 963 ; FAST_AVX-LABEL: fcmp_uno3: 964 ; FAST_AVX: ## %bb.0: 965 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 966 ; FAST_AVX-NEXT: setp %al 967 ; FAST_AVX-NEXT: andb $1, %al 968 ; FAST_AVX-NEXT: movzbl %al, %eax 969 ; FAST_AVX-NEXT: retq 970 %1 = fcmp uno float %x, 0.000000e+00 971 ret i1 %1 972 } 973 974 define zeroext i1 @fcmp_ueq2(float %x) { 975 ; SDAG-LABEL: fcmp_ueq2: 976 ; SDAG: ## %bb.0: 977 ; SDAG-NEXT: movb $1, %al 978 ; SDAG-NEXT: retq 979 ; 980 ; FAST-LABEL: fcmp_ueq2: 981 ; FAST: ## %bb.0: 982 ; FAST-NEXT: movb $1, %al 983 ; FAST-NEXT: andb $1, %al 984 ; FAST-NEXT: movzbl %al, %eax 985 ; FAST-NEXT: retq 986 %1 = fcmp ueq float %x, %x 987 ret i1 %1 988 } 989 990 define zeroext i1 @fcmp_ueq3(float %x) { 991 ; SDAG-LABEL: fcmp_ueq3: 992 ; SDAG: ## %bb.0: 993 ; SDAG-NEXT: xorps %xmm1, %xmm1 994 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 995 ; SDAG-NEXT: sete %al 996 ; SDAG-NEXT: retq 997 ; 998 ; FAST_NOAVX-LABEL: fcmp_ueq3: 999 ; FAST_NOAVX: ## %bb.0: 1000 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1001 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 1002 ; FAST_NOAVX-NEXT: sete %al 1003 ; FAST_NOAVX-NEXT: andb $1, %al 1004 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1005 ; FAST_NOAVX-NEXT: retq 1006 ; 1007 ; FAST_AVX-LABEL: fcmp_ueq3: 1008 ; FAST_AVX: ## %bb.0: 1009 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1010 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 1011 ; FAST_AVX-NEXT: sete %al 1012 ; FAST_AVX-NEXT: andb $1, %al 1013 ; FAST_AVX-NEXT: movzbl %al, %eax 1014 ; FAST_AVX-NEXT: retq 1015 %1 = fcmp ueq float %x, 0.000000e+00 1016 ret i1 %1 1017 } 1018 1019 define zeroext i1 @fcmp_ugt2(float %x) { 1020 ; SDAG-LABEL: fcmp_ugt2: 1021 ; SDAG: ## %bb.0: 1022 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 1023 ; SDAG-NEXT: setp %al 1024 ; SDAG-NEXT: retq 1025 ; 1026 ; FAST_NOAVX-LABEL: fcmp_ugt2: 1027 ; FAST_NOAVX: ## %bb.0: 1028 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 1029 ; FAST_NOAVX-NEXT: setp %al 1030 ; FAST_NOAVX-NEXT: andb $1, %al 1031 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1032 ; FAST_NOAVX-NEXT: retq 1033 ; 1034 ; FAST_AVX-LABEL: fcmp_ugt2: 1035 ; FAST_AVX: ## %bb.0: 1036 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 1037 ; FAST_AVX-NEXT: setp %al 1038 ; FAST_AVX-NEXT: andb $1, %al 1039 ; FAST_AVX-NEXT: movzbl %al, %eax 1040 ; FAST_AVX-NEXT: retq 1041 %1 = fcmp ugt float %x, %x 1042 ret i1 %1 1043 } 1044 1045 define zeroext i1 @fcmp_ugt3(float %x) { 1046 ; SDAG-LABEL: fcmp_ugt3: 1047 ; SDAG: ## %bb.0: 1048 ; SDAG-NEXT: xorps %xmm1, %xmm1 1049 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 1050 ; SDAG-NEXT: setb %al 1051 ; SDAG-NEXT: retq 1052 ; 1053 ; FAST_NOAVX-LABEL: fcmp_ugt3: 1054 ; FAST_NOAVX: ## %bb.0: 1055 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1056 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 1057 ; FAST_NOAVX-NEXT: setb %al 1058 ; FAST_NOAVX-NEXT: andb $1, %al 1059 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1060 ; FAST_NOAVX-NEXT: retq 1061 ; 1062 ; FAST_AVX-LABEL: fcmp_ugt3: 1063 ; FAST_AVX: ## %bb.0: 1064 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1065 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 1066 ; FAST_AVX-NEXT: setb %al 1067 ; FAST_AVX-NEXT: andb $1, %al 1068 ; FAST_AVX-NEXT: movzbl %al, %eax 1069 ; FAST_AVX-NEXT: retq 1070 %1 = fcmp ugt float %x, 0.000000e+00 1071 ret i1 %1 1072 } 1073 1074 define zeroext i1 @fcmp_uge2(float %x) { 1075 ; SDAG-LABEL: fcmp_uge2: 1076 ; SDAG: ## %bb.0: 1077 ; SDAG-NEXT: movb $1, %al 1078 ; SDAG-NEXT: retq 1079 ; 1080 ; FAST-LABEL: fcmp_uge2: 1081 ; FAST: ## %bb.0: 1082 ; FAST-NEXT: movb $1, %al 1083 ; FAST-NEXT: andb $1, %al 1084 ; FAST-NEXT: movzbl %al, %eax 1085 ; FAST-NEXT: retq 1086 %1 = fcmp uge float %x, %x 1087 ret i1 %1 1088 } 1089 1090 define zeroext i1 @fcmp_uge3(float %x) { 1091 ; SDAG-LABEL: fcmp_uge3: 1092 ; SDAG: ## %bb.0: 1093 ; SDAG-NEXT: xorps %xmm1, %xmm1 1094 ; SDAG-NEXT: ucomiss %xmm0, %xmm1 1095 ; SDAG-NEXT: setbe %al 1096 ; SDAG-NEXT: retq 1097 ; 1098 ; FAST_NOAVX-LABEL: fcmp_uge3: 1099 ; FAST_NOAVX: ## %bb.0: 1100 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1101 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm1 1102 ; FAST_NOAVX-NEXT: setbe %al 1103 ; FAST_NOAVX-NEXT: andb $1, %al 1104 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1105 ; FAST_NOAVX-NEXT: retq 1106 ; 1107 ; FAST_AVX-LABEL: fcmp_uge3: 1108 ; FAST_AVX: ## %bb.0: 1109 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1110 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm1 1111 ; FAST_AVX-NEXT: setbe %al 1112 ; FAST_AVX-NEXT: andb $1, %al 1113 ; FAST_AVX-NEXT: movzbl %al, %eax 1114 ; FAST_AVX-NEXT: retq 1115 %1 = fcmp uge float %x, 0.000000e+00 1116 ret i1 %1 1117 } 1118 1119 define zeroext i1 @fcmp_ult2(float %x) { 1120 ; SDAG-LABEL: fcmp_ult2: 1121 ; SDAG: ## %bb.0: 1122 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 1123 ; SDAG-NEXT: setp %al 1124 ; SDAG-NEXT: retq 1125 ; 1126 ; FAST_NOAVX-LABEL: fcmp_ult2: 1127 ; FAST_NOAVX: ## %bb.0: 1128 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 1129 ; FAST_NOAVX-NEXT: setp %al 1130 ; FAST_NOAVX-NEXT: andb $1, %al 1131 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1132 ; FAST_NOAVX-NEXT: retq 1133 ; 1134 ; FAST_AVX-LABEL: fcmp_ult2: 1135 ; FAST_AVX: ## %bb.0: 1136 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 1137 ; FAST_AVX-NEXT: setp %al 1138 ; FAST_AVX-NEXT: andb $1, %al 1139 ; FAST_AVX-NEXT: movzbl %al, %eax 1140 ; FAST_AVX-NEXT: retq 1141 %1 = fcmp ult float %x, %x 1142 ret i1 %1 1143 } 1144 1145 define zeroext i1 @fcmp_ult3(float %x) { 1146 ; SDAG-LABEL: fcmp_ult3: 1147 ; SDAG: ## %bb.0: 1148 ; SDAG-NEXT: xorps %xmm1, %xmm1 1149 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 1150 ; SDAG-NEXT: setb %al 1151 ; SDAG-NEXT: retq 1152 ; 1153 ; FAST_NOAVX-LABEL: fcmp_ult3: 1154 ; FAST_NOAVX: ## %bb.0: 1155 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1156 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 1157 ; FAST_NOAVX-NEXT: setb %al 1158 ; FAST_NOAVX-NEXT: andb $1, %al 1159 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1160 ; FAST_NOAVX-NEXT: retq 1161 ; 1162 ; FAST_AVX-LABEL: fcmp_ult3: 1163 ; FAST_AVX: ## %bb.0: 1164 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1165 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 1166 ; FAST_AVX-NEXT: setb %al 1167 ; FAST_AVX-NEXT: andb $1, %al 1168 ; FAST_AVX-NEXT: movzbl %al, %eax 1169 ; FAST_AVX-NEXT: retq 1170 %1 = fcmp ult float %x, 0.000000e+00 1171 ret i1 %1 1172 } 1173 1174 define zeroext i1 @fcmp_ule2(float %x) { 1175 ; SDAG-LABEL: fcmp_ule2: 1176 ; SDAG: ## %bb.0: 1177 ; SDAG-NEXT: movb $1, %al 1178 ; SDAG-NEXT: retq 1179 ; 1180 ; FAST-LABEL: fcmp_ule2: 1181 ; FAST: ## %bb.0: 1182 ; FAST-NEXT: movb $1, %al 1183 ; FAST-NEXT: andb $1, %al 1184 ; FAST-NEXT: movzbl %al, %eax 1185 ; FAST-NEXT: retq 1186 %1 = fcmp ule float %x, %x 1187 ret i1 %1 1188 } 1189 1190 define zeroext i1 @fcmp_ule3(float %x) { 1191 ; SDAG-LABEL: fcmp_ule3: 1192 ; SDAG: ## %bb.0: 1193 ; SDAG-NEXT: xorps %xmm1, %xmm1 1194 ; SDAG-NEXT: ucomiss %xmm1, %xmm0 1195 ; SDAG-NEXT: setbe %al 1196 ; SDAG-NEXT: retq 1197 ; 1198 ; FAST_NOAVX-LABEL: fcmp_ule3: 1199 ; FAST_NOAVX: ## %bb.0: 1200 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1201 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 1202 ; FAST_NOAVX-NEXT: setbe %al 1203 ; FAST_NOAVX-NEXT: andb $1, %al 1204 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1205 ; FAST_NOAVX-NEXT: retq 1206 ; 1207 ; FAST_AVX-LABEL: fcmp_ule3: 1208 ; FAST_AVX: ## %bb.0: 1209 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1210 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 1211 ; FAST_AVX-NEXT: setbe %al 1212 ; FAST_AVX-NEXT: andb $1, %al 1213 ; FAST_AVX-NEXT: movzbl %al, %eax 1214 ; FAST_AVX-NEXT: retq 1215 %1 = fcmp ule float %x, 0.000000e+00 1216 ret i1 %1 1217 } 1218 1219 define zeroext i1 @fcmp_une2(float %x) { 1220 ; SDAG-LABEL: fcmp_une2: 1221 ; SDAG: ## %bb.0: 1222 ; SDAG-NEXT: ucomiss %xmm0, %xmm0 1223 ; SDAG-NEXT: setp %al 1224 ; SDAG-NEXT: retq 1225 ; 1226 ; FAST_NOAVX-LABEL: fcmp_une2: 1227 ; FAST_NOAVX: ## %bb.0: 1228 ; FAST_NOAVX-NEXT: ucomiss %xmm0, %xmm0 1229 ; FAST_NOAVX-NEXT: setp %al 1230 ; FAST_NOAVX-NEXT: andb $1, %al 1231 ; FAST_NOAVX-NEXT: movzbl %al, %eax 1232 ; FAST_NOAVX-NEXT: retq 1233 ; 1234 ; FAST_AVX-LABEL: fcmp_une2: 1235 ; FAST_AVX: ## %bb.0: 1236 ; FAST_AVX-NEXT: vucomiss %xmm0, %xmm0 1237 ; FAST_AVX-NEXT: setp %al 1238 ; FAST_AVX-NEXT: andb $1, %al 1239 ; FAST_AVX-NEXT: movzbl %al, %eax 1240 ; FAST_AVX-NEXT: retq 1241 %1 = fcmp une float %x, %x 1242 ret i1 %1 1243 } 1244 1245 define zeroext i1 @fcmp_une3(float %x) { 1246 ; SDAG-LABEL: fcmp_une3: 1247 ; SDAG: ## %bb.0: 1248 ; SDAG-NEXT: xorps %xmm1, %xmm1 1249 ; SDAG-NEXT: cmpneqss %xmm0, %xmm1 1250 ; SDAG-NEXT: movd %xmm1, %eax 1251 ; SDAG-NEXT: andl $1, %eax 1252 ; SDAG-NEXT: ## kill: def $al killed $al killed $eax 1253 ; SDAG-NEXT: retq 1254 ; 1255 ; FAST_NOAVX-LABEL: fcmp_une3: 1256 ; FAST_NOAVX: ## %bb.0: 1257 ; FAST_NOAVX-NEXT: xorps %xmm1, %xmm1 1258 ; FAST_NOAVX-NEXT: ucomiss %xmm1, %xmm0 1259 ; FAST_NOAVX-NEXT: setne %al 1260 ; FAST_NOAVX-NEXT: setp %cl 1261 ; FAST_NOAVX-NEXT: orb %al, %cl 1262 ; FAST_NOAVX-NEXT: andb $1, %cl 1263 ; FAST_NOAVX-NEXT: movzbl %cl, %eax 1264 ; FAST_NOAVX-NEXT: retq 1265 ; 1266 ; FAST_AVX-LABEL: fcmp_une3: 1267 ; FAST_AVX: ## %bb.0: 1268 ; FAST_AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1269 ; FAST_AVX-NEXT: vucomiss %xmm1, %xmm0 1270 ; FAST_AVX-NEXT: setne %al 1271 ; FAST_AVX-NEXT: setp %cl 1272 ; FAST_AVX-NEXT: orb %al, %cl 1273 ; FAST_AVX-NEXT: andb $1, %cl 1274 ; FAST_AVX-NEXT: movzbl %cl, %eax 1275 ; FAST_AVX-NEXT: retq 1276 %1 = fcmp une float %x, 0.000000e+00 1277 ret i1 %1 1278 } 1279 1280 define zeroext i1 @icmp_eq2(i32 %x) { 1281 ; SDAG-LABEL: icmp_eq2: 1282 ; SDAG: ## %bb.0: 1283 ; SDAG-NEXT: movb $1, %al 1284 ; SDAG-NEXT: retq 1285 ; 1286 ; FAST-LABEL: icmp_eq2: 1287 ; FAST: ## %bb.0: 1288 ; FAST-NEXT: movb $1, %al 1289 ; FAST-NEXT: andb $1, %al 1290 ; FAST-NEXT: movzbl %al, %eax 1291 ; FAST-NEXT: retq 1292 %1 = icmp eq i32 %x, %x 1293 ret i1 %1 1294 } 1295 1296 define zeroext i1 @icmp_ne2(i32 %x) { 1297 ; SDAG-LABEL: icmp_ne2: 1298 ; SDAG: ## %bb.0: 1299 ; SDAG-NEXT: xorl %eax, %eax 1300 ; SDAG-NEXT: retq 1301 ; 1302 ; FAST-LABEL: icmp_ne2: 1303 ; FAST: ## %bb.0: 1304 ; FAST-NEXT: xorl %eax, %eax 1305 ; FAST-NEXT: andb $1, %al 1306 ; FAST-NEXT: movzbl %al, %eax 1307 ; FAST-NEXT: retq 1308 %1 = icmp ne i32 %x, %x 1309 ret i1 %1 1310 } 1311 1312 define zeroext i1 @icmp_ugt2(i32 %x) { 1313 ; SDAG-LABEL: icmp_ugt2: 1314 ; SDAG: ## %bb.0: 1315 ; SDAG-NEXT: xorl %eax, %eax 1316 ; SDAG-NEXT: retq 1317 ; 1318 ; FAST-LABEL: icmp_ugt2: 1319 ; FAST: ## %bb.0: 1320 ; FAST-NEXT: xorl %eax, %eax 1321 ; FAST-NEXT: andb $1, %al 1322 ; FAST-NEXT: movzbl %al, %eax 1323 ; FAST-NEXT: retq 1324 %1 = icmp ugt i32 %x, %x 1325 ret i1 %1 1326 } 1327 1328 define zeroext i1 @icmp_uge2(i32 %x) { 1329 ; SDAG-LABEL: icmp_uge2: 1330 ; SDAG: ## %bb.0: 1331 ; SDAG-NEXT: movb $1, %al 1332 ; SDAG-NEXT: retq 1333 ; 1334 ; FAST-LABEL: icmp_uge2: 1335 ; FAST: ## %bb.0: 1336 ; FAST-NEXT: movb $1, %al 1337 ; FAST-NEXT: andb $1, %al 1338 ; FAST-NEXT: movzbl %al, %eax 1339 ; FAST-NEXT: retq 1340 %1 = icmp uge i32 %x, %x 1341 ret i1 %1 1342 } 1343 1344 define zeroext i1 @icmp_ult2(i32 %x) { 1345 ; SDAG-LABEL: icmp_ult2: 1346 ; SDAG: ## %bb.0: 1347 ; SDAG-NEXT: xorl %eax, %eax 1348 ; SDAG-NEXT: retq 1349 ; 1350 ; FAST-LABEL: icmp_ult2: 1351 ; FAST: ## %bb.0: 1352 ; FAST-NEXT: xorl %eax, %eax 1353 ; FAST-NEXT: andb $1, %al 1354 ; FAST-NEXT: movzbl %al, %eax 1355 ; FAST-NEXT: retq 1356 %1 = icmp ult i32 %x, %x 1357 ret i1 %1 1358 } 1359 1360 define zeroext i1 @icmp_ule2(i32 %x) { 1361 ; SDAG-LABEL: icmp_ule2: 1362 ; SDAG: ## %bb.0: 1363 ; SDAG-NEXT: movb $1, %al 1364 ; SDAG-NEXT: retq 1365 ; 1366 ; FAST-LABEL: icmp_ule2: 1367 ; FAST: ## %bb.0: 1368 ; FAST-NEXT: movb $1, %al 1369 ; FAST-NEXT: andb $1, %al 1370 ; FAST-NEXT: movzbl %al, %eax 1371 ; FAST-NEXT: retq 1372 %1 = icmp ule i32 %x, %x 1373 ret i1 %1 1374 } 1375 1376 define zeroext i1 @icmp_sgt2(i32 %x) { 1377 ; SDAG-LABEL: icmp_sgt2: 1378 ; SDAG: ## %bb.0: 1379 ; SDAG-NEXT: xorl %eax, %eax 1380 ; SDAG-NEXT: retq 1381 ; 1382 ; FAST-LABEL: icmp_sgt2: 1383 ; FAST: ## %bb.0: 1384 ; FAST-NEXT: xorl %eax, %eax 1385 ; FAST-NEXT: andb $1, %al 1386 ; FAST-NEXT: movzbl %al, %eax 1387 ; FAST-NEXT: retq 1388 %1 = icmp sgt i32 %x, %x 1389 ret i1 %1 1390 } 1391 1392 define zeroext i1 @icmp_sge2(i32 %x) { 1393 ; SDAG-LABEL: icmp_sge2: 1394 ; SDAG: ## %bb.0: 1395 ; SDAG-NEXT: movb $1, %al 1396 ; SDAG-NEXT: retq 1397 ; 1398 ; FAST-LABEL: icmp_sge2: 1399 ; FAST: ## %bb.0: 1400 ; FAST-NEXT: movb $1, %al 1401 ; FAST-NEXT: andb $1, %al 1402 ; FAST-NEXT: movzbl %al, %eax 1403 ; FAST-NEXT: retq 1404 %1 = icmp sge i32 %x, %x 1405 ret i1 %1 1406 } 1407 1408 define zeroext i1 @icmp_slt2(i32 %x) { 1409 ; SDAG-LABEL: icmp_slt2: 1410 ; SDAG: ## %bb.0: 1411 ; SDAG-NEXT: xorl %eax, %eax 1412 ; SDAG-NEXT: retq 1413 ; 1414 ; FAST-LABEL: icmp_slt2: 1415 ; FAST: ## %bb.0: 1416 ; FAST-NEXT: xorl %eax, %eax 1417 ; FAST-NEXT: andb $1, %al 1418 ; FAST-NEXT: movzbl %al, %eax 1419 ; FAST-NEXT: retq 1420 %1 = icmp slt i32 %x, %x 1421 ret i1 %1 1422 } 1423 1424 define zeroext i1 @icmp_sle2(i32 %x) { 1425 ; SDAG-LABEL: icmp_sle2: 1426 ; SDAG: ## %bb.0: 1427 ; SDAG-NEXT: movb $1, %al 1428 ; SDAG-NEXT: retq 1429 ; 1430 ; FAST-LABEL: icmp_sle2: 1431 ; FAST: ## %bb.0: 1432 ; FAST-NEXT: movb $1, %al 1433 ; FAST-NEXT: andb $1, %al 1434 ; FAST-NEXT: movzbl %al, %eax 1435 ; FAST-NEXT: retq 1436 %1 = icmp sle i32 %x, %x 1437 ret i1 %1 1438 } 1439 1440