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-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