1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=CHECK-LINUX64 3 ; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s --check-prefix=CHECK-WIN32-64 4 ; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefix=CHECK-X86 5 6 define void @g64xh(i64 inreg %x) nounwind { 7 ; CHECK-LINUX64-LABEL: g64xh: 8 ; CHECK-LINUX64: # %bb.0: 9 ; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x800 10 ; CHECK-LINUX64-NEXT: jne .LBB0_2 11 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 12 ; CHECK-LINUX64-NEXT: pushq %rax 13 ; CHECK-LINUX64-NEXT: callq bar 14 ; CHECK-LINUX64-NEXT: popq %rax 15 ; CHECK-LINUX64-NEXT: .LBB0_2: # %no 16 ; CHECK-LINUX64-NEXT: retq 17 ; 18 ; CHECK-WIN32-64-LABEL: g64xh: 19 ; CHECK-WIN32-64: # %bb.0: 20 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 21 ; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 22 ; CHECK-WIN32-64-NEXT: jne .LBB0_2 23 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 24 ; CHECK-WIN32-64-NEXT: callq bar 25 ; CHECK-WIN32-64-NEXT: .LBB0_2: # %no 26 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 27 ; CHECK-WIN32-64-NEXT: retq 28 ; 29 ; CHECK-X86-LABEL: g64xh: 30 ; CHECK-X86: # %bb.0: 31 ; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 32 ; CHECK-X86-NEXT: jne .LBB0_2 33 ; CHECK-X86-NEXT: # %bb.1: # %yes 34 ; CHECK-X86-NEXT: calll bar 35 ; CHECK-X86-NEXT: .LBB0_2: # %no 36 ; CHECK-X86-NEXT: retl 37 %t = and i64 %x, 2048 38 %s = icmp eq i64 %t, 0 39 br i1 %s, label %yes, label %no 40 41 yes: 42 call void @bar() 43 ret void 44 no: 45 ret void 46 } 47 48 define void @g64xl(i64 inreg %x) nounwind { 49 ; CHECK-LINUX64-LABEL: g64xl: 50 ; CHECK-LINUX64: # %bb.0: 51 ; CHECK-LINUX64-NEXT: testb $8, %dil 52 ; CHECK-LINUX64-NEXT: jne .LBB1_2 53 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 54 ; CHECK-LINUX64-NEXT: pushq %rax 55 ; CHECK-LINUX64-NEXT: callq bar 56 ; CHECK-LINUX64-NEXT: popq %rax 57 ; CHECK-LINUX64-NEXT: .LBB1_2: # %no 58 ; CHECK-LINUX64-NEXT: retq 59 ; 60 ; CHECK-WIN32-64-LABEL: g64xl: 61 ; CHECK-WIN32-64: # %bb.0: 62 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 63 ; CHECK-WIN32-64-NEXT: testb $8, %cl 64 ; CHECK-WIN32-64-NEXT: jne .LBB1_2 65 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 66 ; CHECK-WIN32-64-NEXT: callq bar 67 ; CHECK-WIN32-64-NEXT: .LBB1_2: # %no 68 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 69 ; CHECK-WIN32-64-NEXT: retq 70 ; 71 ; CHECK-X86-LABEL: g64xl: 72 ; CHECK-X86: # %bb.0: 73 ; CHECK-X86-NEXT: testb $8, %al 74 ; CHECK-X86-NEXT: jne .LBB1_2 75 ; CHECK-X86-NEXT: # %bb.1: # %yes 76 ; CHECK-X86-NEXT: calll bar 77 ; CHECK-X86-NEXT: .LBB1_2: # %no 78 ; CHECK-X86-NEXT: retl 79 %t = and i64 %x, 8 80 %s = icmp eq i64 %t, 0 81 br i1 %s, label %yes, label %no 82 83 yes: 84 call void @bar() 85 ret void 86 no: 87 ret void 88 } 89 90 define void @g32xh(i32 inreg %x) nounwind { 91 ; CHECK-LINUX64-LABEL: g32xh: 92 ; CHECK-LINUX64: # %bb.0: 93 ; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x800 94 ; CHECK-LINUX64-NEXT: jne .LBB2_2 95 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 96 ; CHECK-LINUX64-NEXT: pushq %rax 97 ; CHECK-LINUX64-NEXT: callq bar 98 ; CHECK-LINUX64-NEXT: popq %rax 99 ; CHECK-LINUX64-NEXT: .LBB2_2: # %no 100 ; CHECK-LINUX64-NEXT: retq 101 ; 102 ; CHECK-WIN32-64-LABEL: g32xh: 103 ; CHECK-WIN32-64: # %bb.0: 104 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 105 ; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 106 ; CHECK-WIN32-64-NEXT: jne .LBB2_2 107 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 108 ; CHECK-WIN32-64-NEXT: callq bar 109 ; CHECK-WIN32-64-NEXT: .LBB2_2: # %no 110 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 111 ; CHECK-WIN32-64-NEXT: retq 112 ; 113 ; CHECK-X86-LABEL: g32xh: 114 ; CHECK-X86: # %bb.0: 115 ; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 116 ; CHECK-X86-NEXT: jne .LBB2_2 117 ; CHECK-X86-NEXT: # %bb.1: # %yes 118 ; CHECK-X86-NEXT: calll bar 119 ; CHECK-X86-NEXT: .LBB2_2: # %no 120 ; CHECK-X86-NEXT: retl 121 %t = and i32 %x, 2048 122 %s = icmp eq i32 %t, 0 123 br i1 %s, label %yes, label %no 124 125 yes: 126 call void @bar() 127 ret void 128 no: 129 ret void 130 } 131 132 define void @g32xl(i32 inreg %x) nounwind { 133 ; CHECK-LINUX64-LABEL: g32xl: 134 ; CHECK-LINUX64: # %bb.0: 135 ; CHECK-LINUX64-NEXT: testb $8, %dil 136 ; CHECK-LINUX64-NEXT: jne .LBB3_2 137 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 138 ; CHECK-LINUX64-NEXT: pushq %rax 139 ; CHECK-LINUX64-NEXT: callq bar 140 ; CHECK-LINUX64-NEXT: popq %rax 141 ; CHECK-LINUX64-NEXT: .LBB3_2: # %no 142 ; CHECK-LINUX64-NEXT: retq 143 ; 144 ; CHECK-WIN32-64-LABEL: g32xl: 145 ; CHECK-WIN32-64: # %bb.0: 146 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 147 ; CHECK-WIN32-64-NEXT: testb $8, %cl 148 ; CHECK-WIN32-64-NEXT: jne .LBB3_2 149 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 150 ; CHECK-WIN32-64-NEXT: callq bar 151 ; CHECK-WIN32-64-NEXT: .LBB3_2: # %no 152 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 153 ; CHECK-WIN32-64-NEXT: retq 154 ; 155 ; CHECK-X86-LABEL: g32xl: 156 ; CHECK-X86: # %bb.0: 157 ; CHECK-X86-NEXT: testb $8, %al 158 ; CHECK-X86-NEXT: jne .LBB3_2 159 ; CHECK-X86-NEXT: # %bb.1: # %yes 160 ; CHECK-X86-NEXT: calll bar 161 ; CHECK-X86-NEXT: .LBB3_2: # %no 162 ; CHECK-X86-NEXT: retl 163 %t = and i32 %x, 8 164 %s = icmp eq i32 %t, 0 165 br i1 %s, label %yes, label %no 166 167 yes: 168 call void @bar() 169 ret void 170 no: 171 ret void 172 } 173 174 define void @g16xh(i16 inreg %x) nounwind { 175 ; CHECK-LINUX64-LABEL: g16xh: 176 ; CHECK-LINUX64: # %bb.0: 177 ; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x800 178 ; CHECK-LINUX64-NEXT: jne .LBB4_2 179 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 180 ; CHECK-LINUX64-NEXT: pushq %rax 181 ; CHECK-LINUX64-NEXT: callq bar 182 ; CHECK-LINUX64-NEXT: popq %rax 183 ; CHECK-LINUX64-NEXT: .LBB4_2: # %no 184 ; CHECK-LINUX64-NEXT: retq 185 ; 186 ; CHECK-WIN32-64-LABEL: g16xh: 187 ; CHECK-WIN32-64: # %bb.0: 188 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 189 ; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 190 ; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 191 ; CHECK-WIN32-64-NEXT: jne .LBB4_2 192 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 193 ; CHECK-WIN32-64-NEXT: callq bar 194 ; CHECK-WIN32-64-NEXT: .LBB4_2: # %no 195 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 196 ; CHECK-WIN32-64-NEXT: retq 197 ; 198 ; CHECK-X86-LABEL: g16xh: 199 ; CHECK-X86: # %bb.0: 200 ; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 201 ; CHECK-X86-NEXT: jne .LBB4_2 202 ; CHECK-X86-NEXT: # %bb.1: # %yes 203 ; CHECK-X86-NEXT: calll bar 204 ; CHECK-X86-NEXT: .LBB4_2: # %no 205 ; CHECK-X86-NEXT: retl 206 %t = and i16 %x, 2048 207 %s = icmp eq i16 %t, 0 208 br i1 %s, label %yes, label %no 209 210 yes: 211 call void @bar() 212 ret void 213 no: 214 ret void 215 } 216 217 define void @g16xl(i16 inreg %x) nounwind { 218 ; CHECK-LINUX64-LABEL: g16xl: 219 ; CHECK-LINUX64: # %bb.0: 220 ; CHECK-LINUX64-NEXT: testb $8, %dil 221 ; CHECK-LINUX64-NEXT: jne .LBB5_2 222 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes 223 ; CHECK-LINUX64-NEXT: pushq %rax 224 ; CHECK-LINUX64-NEXT: callq bar 225 ; CHECK-LINUX64-NEXT: popq %rax 226 ; CHECK-LINUX64-NEXT: .LBB5_2: # %no 227 ; CHECK-LINUX64-NEXT: retq 228 ; 229 ; CHECK-WIN32-64-LABEL: g16xl: 230 ; CHECK-WIN32-64: # %bb.0: 231 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 232 ; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 233 ; CHECK-WIN32-64-NEXT: testb $8, %cl 234 ; CHECK-WIN32-64-NEXT: jne .LBB5_2 235 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 236 ; CHECK-WIN32-64-NEXT: callq bar 237 ; CHECK-WIN32-64-NEXT: .LBB5_2: # %no 238 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 239 ; CHECK-WIN32-64-NEXT: retq 240 ; 241 ; CHECK-X86-LABEL: g16xl: 242 ; CHECK-X86: # %bb.0: 243 ; CHECK-X86-NEXT: testb $8, %al 244 ; CHECK-X86-NEXT: jne .LBB5_2 245 ; CHECK-X86-NEXT: # %bb.1: # %yes 246 ; CHECK-X86-NEXT: calll bar 247 ; CHECK-X86-NEXT: .LBB5_2: # %no 248 ; CHECK-X86-NEXT: retl 249 %t = and i16 %x, 8 250 %s = icmp eq i16 %t, 0 251 br i1 %s, label %yes, label %no 252 253 yes: 254 call void @bar() 255 ret void 256 no: 257 ret void 258 } 259 260 define void @g64x16(i64 inreg %x) nounwind { 261 ; CHECK-LINUX64-LABEL: g64x16: 262 ; CHECK-LINUX64: # %bb.0: 263 ; CHECK-LINUX64-NEXT: testl $32896, %edi # imm = 0x8080 264 ; CHECK-LINUX64-NEXT: je .LBB6_1 265 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 266 ; CHECK-LINUX64-NEXT: retq 267 ; CHECK-LINUX64-NEXT: .LBB6_1: # %yes 268 ; CHECK-LINUX64-NEXT: pushq %rax 269 ; CHECK-LINUX64-NEXT: callq bar 270 ; CHECK-LINUX64-NEXT: popq %rax 271 ; CHECK-LINUX64-NEXT: retq 272 ; 273 ; CHECK-WIN32-64-LABEL: g64x16: 274 ; CHECK-WIN32-64: # %bb.0: 275 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 276 ; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080 277 ; CHECK-WIN32-64-NEXT: je .LBB6_1 278 ; CHECK-WIN32-64-NEXT: # %bb.2: # %no 279 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 280 ; CHECK-WIN32-64-NEXT: retq 281 ; CHECK-WIN32-64-NEXT: .LBB6_1: # %yes 282 ; CHECK-WIN32-64-NEXT: callq bar 283 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 284 ; CHECK-WIN32-64-NEXT: retq 285 ; 286 ; CHECK-X86-LABEL: g64x16: 287 ; CHECK-X86: # %bb.0: 288 ; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080 289 ; CHECK-X86-NEXT: je .LBB6_1 290 ; CHECK-X86-NEXT: # %bb.2: # %no 291 ; CHECK-X86-NEXT: retl 292 ; CHECK-X86-NEXT: .LBB6_1: # %yes 293 ; CHECK-X86-NEXT: calll bar 294 ; CHECK-X86-NEXT: retl 295 %t = and i64 %x, 32896 296 %s = icmp eq i64 %t, 0 297 br i1 %s, label %yes, label %no 298 299 yes: 300 call void @bar() 301 ret void 302 no: 303 ret void 304 } 305 306 define void @g64x16minsize(i64 inreg %x) nounwind minsize { 307 ; CHECK-LINUX64-LABEL: g64x16minsize: 308 ; CHECK-LINUX64: # %bb.0: 309 ; CHECK-LINUX64-NEXT: testw $-32640, %di # imm = 0x8080 310 ; CHECK-LINUX64-NEXT: je .LBB7_1 311 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 312 ; CHECK-LINUX64-NEXT: retq 313 ; CHECK-LINUX64-NEXT: .LBB7_1: # %yes 314 ; CHECK-LINUX64-NEXT: pushq %rax 315 ; CHECK-LINUX64-NEXT: callq bar 316 ; CHECK-LINUX64-NEXT: popq %rax 317 ; CHECK-LINUX64-NEXT: retq 318 ; 319 ; CHECK-WIN32-64-LABEL: g64x16minsize: 320 ; CHECK-WIN32-64: # %bb.0: 321 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 322 ; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080 323 ; CHECK-WIN32-64-NEXT: jne .LBB7_2 324 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 325 ; CHECK-WIN32-64-NEXT: callq bar 326 ; CHECK-WIN32-64-NEXT: .LBB7_2: # %no 327 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 328 ; CHECK-WIN32-64-NEXT: retq 329 ; 330 ; CHECK-X86-LABEL: g64x16minsize: 331 ; CHECK-X86: # %bb.0: 332 ; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080 333 ; CHECK-X86-NEXT: je .LBB7_1 334 ; CHECK-X86-NEXT: # %bb.2: # %no 335 ; CHECK-X86-NEXT: retl 336 ; CHECK-X86-NEXT: .LBB7_1: # %yes 337 ; CHECK-X86-NEXT: calll bar 338 ; CHECK-X86-NEXT: retl 339 %t = and i64 %x, 32896 340 %s = icmp eq i64 %t, 0 341 br i1 %s, label %yes, label %no 342 343 yes: 344 call void @bar() 345 ret void 346 no: 347 ret void 348 } 349 350 define void @g32x16(i32 inreg %x) nounwind { 351 ; CHECK-LINUX64-LABEL: g32x16: 352 ; CHECK-LINUX64: # %bb.0: 353 ; CHECK-LINUX64-NEXT: testl $32896, %edi # imm = 0x8080 354 ; CHECK-LINUX64-NEXT: je .LBB8_1 355 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 356 ; CHECK-LINUX64-NEXT: retq 357 ; CHECK-LINUX64-NEXT: .LBB8_1: # %yes 358 ; CHECK-LINUX64-NEXT: pushq %rax 359 ; CHECK-LINUX64-NEXT: callq bar 360 ; CHECK-LINUX64-NEXT: popq %rax 361 ; CHECK-LINUX64-NEXT: retq 362 ; 363 ; CHECK-WIN32-64-LABEL: g32x16: 364 ; CHECK-WIN32-64: # %bb.0: 365 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 366 ; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080 367 ; CHECK-WIN32-64-NEXT: je .LBB8_1 368 ; CHECK-WIN32-64-NEXT: # %bb.2: # %no 369 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 370 ; CHECK-WIN32-64-NEXT: retq 371 ; CHECK-WIN32-64-NEXT: .LBB8_1: # %yes 372 ; CHECK-WIN32-64-NEXT: callq bar 373 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 374 ; CHECK-WIN32-64-NEXT: retq 375 ; 376 ; CHECK-X86-LABEL: g32x16: 377 ; CHECK-X86: # %bb.0: 378 ; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080 379 ; CHECK-X86-NEXT: je .LBB8_1 380 ; CHECK-X86-NEXT: # %bb.2: # %no 381 ; CHECK-X86-NEXT: retl 382 ; CHECK-X86-NEXT: .LBB8_1: # %yes 383 ; CHECK-X86-NEXT: calll bar 384 ; CHECK-X86-NEXT: retl 385 %t = and i32 %x, 32896 386 %s = icmp eq i32 %t, 0 387 br i1 %s, label %yes, label %no 388 389 yes: 390 call void @bar() 391 ret void 392 no: 393 ret void 394 } 395 396 define void @g32x16minsize(i32 inreg %x) nounwind minsize { 397 ; CHECK-LINUX64-LABEL: g32x16minsize: 398 ; CHECK-LINUX64: # %bb.0: 399 ; CHECK-LINUX64-NEXT: testw $-32640, %di # imm = 0x8080 400 ; CHECK-LINUX64-NEXT: je .LBB9_1 401 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 402 ; CHECK-LINUX64-NEXT: retq 403 ; CHECK-LINUX64-NEXT: .LBB9_1: # %yes 404 ; CHECK-LINUX64-NEXT: pushq %rax 405 ; CHECK-LINUX64-NEXT: callq bar 406 ; CHECK-LINUX64-NEXT: popq %rax 407 ; CHECK-LINUX64-NEXT: retq 408 ; 409 ; CHECK-WIN32-64-LABEL: g32x16minsize: 410 ; CHECK-WIN32-64: # %bb.0: 411 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 412 ; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080 413 ; CHECK-WIN32-64-NEXT: jne .LBB9_2 414 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 415 ; CHECK-WIN32-64-NEXT: callq bar 416 ; CHECK-WIN32-64-NEXT: .LBB9_2: # %no 417 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 418 ; CHECK-WIN32-64-NEXT: retq 419 ; 420 ; CHECK-X86-LABEL: g32x16minsize: 421 ; CHECK-X86: # %bb.0: 422 ; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080 423 ; CHECK-X86-NEXT: je .LBB9_1 424 ; CHECK-X86-NEXT: # %bb.2: # %no 425 ; CHECK-X86-NEXT: retl 426 ; CHECK-X86-NEXT: .LBB9_1: # %yes 427 ; CHECK-X86-NEXT: calll bar 428 ; CHECK-X86-NEXT: retl 429 %t = and i32 %x, 32896 430 %s = icmp eq i32 %t, 0 431 br i1 %s, label %yes, label %no 432 433 yes: 434 call void @bar() 435 ret void 436 no: 437 ret void 438 } 439 440 define void @g64x32(i64 inreg %x) nounwind { 441 ; CHECK-LINUX64-LABEL: g64x32: 442 ; CHECK-LINUX64: # %bb.0: 443 ; CHECK-LINUX64-NEXT: testl $268468352, %edi # imm = 0x10008080 444 ; CHECK-LINUX64-NEXT: je .LBB10_1 445 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 446 ; CHECK-LINUX64-NEXT: retq 447 ; CHECK-LINUX64-NEXT: .LBB10_1: # %yes 448 ; CHECK-LINUX64-NEXT: pushq %rax 449 ; CHECK-LINUX64-NEXT: callq bar 450 ; CHECK-LINUX64-NEXT: popq %rax 451 ; CHECK-LINUX64-NEXT: retq 452 ; 453 ; CHECK-WIN32-64-LABEL: g64x32: 454 ; CHECK-WIN32-64: # %bb.0: 455 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 456 ; CHECK-WIN32-64-NEXT: testl $268468352, %ecx # imm = 0x10008080 457 ; CHECK-WIN32-64-NEXT: je .LBB10_1 458 ; CHECK-WIN32-64-NEXT: # %bb.2: # %no 459 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 460 ; CHECK-WIN32-64-NEXT: retq 461 ; CHECK-WIN32-64-NEXT: .LBB10_1: # %yes 462 ; CHECK-WIN32-64-NEXT: callq bar 463 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 464 ; CHECK-WIN32-64-NEXT: retq 465 ; 466 ; CHECK-X86-LABEL: g64x32: 467 ; CHECK-X86: # %bb.0: 468 ; CHECK-X86-NEXT: testl $268468352, %eax # imm = 0x10008080 469 ; CHECK-X86-NEXT: je .LBB10_1 470 ; CHECK-X86-NEXT: # %bb.2: # %no 471 ; CHECK-X86-NEXT: retl 472 ; CHECK-X86-NEXT: .LBB10_1: # %yes 473 ; CHECK-X86-NEXT: calll bar 474 ; CHECK-X86-NEXT: retl 475 %t = and i64 %x, 268468352 476 %s = icmp eq i64 %t, 0 477 br i1 %s, label %yes, label %no 478 479 yes: 480 call void @bar() 481 ret void 482 no: 483 ret void 484 } 485 486 define void @truncand32(i16 inreg %x) nounwind { 487 ; CHECK-LINUX64-LABEL: truncand32: 488 ; CHECK-LINUX64: # %bb.0: 489 ; CHECK-LINUX64-NEXT: testl $2049, %edi # imm = 0x801 490 ; CHECK-LINUX64-NEXT: je .LBB11_1 491 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 492 ; CHECK-LINUX64-NEXT: retq 493 ; CHECK-LINUX64-NEXT: .LBB11_1: # %yes 494 ; CHECK-LINUX64-NEXT: pushq %rax 495 ; CHECK-LINUX64-NEXT: callq bar 496 ; CHECK-LINUX64-NEXT: popq %rax 497 ; CHECK-LINUX64-NEXT: retq 498 ; 499 ; CHECK-WIN32-64-LABEL: truncand32: 500 ; CHECK-WIN32-64: # %bb.0: 501 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 502 ; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 503 ; CHECK-WIN32-64-NEXT: testl $2049, %ecx # imm = 0x801 504 ; CHECK-WIN32-64-NEXT: je .LBB11_1 505 ; CHECK-WIN32-64-NEXT: # %bb.2: # %no 506 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 507 ; CHECK-WIN32-64-NEXT: retq 508 ; CHECK-WIN32-64-NEXT: .LBB11_1: # %yes 509 ; CHECK-WIN32-64-NEXT: callq bar 510 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 511 ; CHECK-WIN32-64-NEXT: retq 512 ; 513 ; CHECK-X86-LABEL: truncand32: 514 ; CHECK-X86: # %bb.0: 515 ; CHECK-X86-NEXT: testl $2049, %eax # imm = 0x801 516 ; CHECK-X86-NEXT: je .LBB11_1 517 ; CHECK-X86-NEXT: # %bb.2: # %no 518 ; CHECK-X86-NEXT: retl 519 ; CHECK-X86-NEXT: .LBB11_1: # %yes 520 ; CHECK-X86-NEXT: calll bar 521 ; CHECK-X86-NEXT: retl 522 %t = and i16 %x, 2049 523 %s = icmp eq i16 %t, 0 524 br i1 %s, label %yes, label %no 525 526 yes: 527 call void @bar() 528 ret void 529 no: 530 ret void 531 } 532 533 define void @testw(i16 inreg %x) nounwind minsize { 534 ; CHECK-LINUX64-LABEL: testw: 535 ; CHECK-LINUX64: # %bb.0: 536 ; CHECK-LINUX64-NEXT: testw $2049, %di # imm = 0x801 537 ; CHECK-LINUX64-NEXT: je .LBB12_1 538 ; CHECK-LINUX64-NEXT: # %bb.2: # %no 539 ; CHECK-LINUX64-NEXT: retq 540 ; CHECK-LINUX64-NEXT: .LBB12_1: # %yes 541 ; CHECK-LINUX64-NEXT: pushq %rax 542 ; CHECK-LINUX64-NEXT: callq bar 543 ; CHECK-LINUX64-NEXT: popq %rax 544 ; CHECK-LINUX64-NEXT: retq 545 ; 546 ; CHECK-WIN32-64-LABEL: testw: 547 ; CHECK-WIN32-64: # %bb.0: 548 ; CHECK-WIN32-64-NEXT: subq $40, %rsp 549 ; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 550 ; CHECK-WIN32-64-NEXT: testw $2049, %cx # imm = 0x801 551 ; CHECK-WIN32-64-NEXT: jne .LBB12_2 552 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 553 ; CHECK-WIN32-64-NEXT: callq bar 554 ; CHECK-WIN32-64-NEXT: .LBB12_2: # %no 555 ; CHECK-WIN32-64-NEXT: addq $40, %rsp 556 ; CHECK-WIN32-64-NEXT: retq 557 ; 558 ; CHECK-X86-LABEL: testw: 559 ; CHECK-X86: # %bb.0: 560 ; CHECK-X86-NEXT: testw $2049, %ax # imm = 0x801 561 ; CHECK-X86-NEXT: je .LBB12_1 562 ; CHECK-X86-NEXT: # %bb.2: # %no 563 ; CHECK-X86-NEXT: retl 564 ; CHECK-X86-NEXT: .LBB12_1: # %yes 565 ; CHECK-X86-NEXT: calll bar 566 ; CHECK-X86-NEXT: retl 567 %t = and i16 %x, 2049 568 %s = icmp eq i16 %t, 0 569 br i1 %s, label %yes, label %no 570 571 yes: 572 call void @bar() 573 ret void 574 no: 575 ret void 576 } 577 578 declare void @bar() 579