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=i686-unknown -mattr=+sse2 | FileCheck %s -check-prefixes=X32
      3 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 | FileCheck %s -check-prefixes=X64,X64-LIN
      4 ; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse2 | FileCheck %s -check-prefixes=X64,X64-WIN
      5 
      6 ; Though it is undefined, we want xor undef,undef to produce zero.
      7 define <4 x i32> @test1() nounwind {
      8 ; X32-LABEL: test1:
      9 ; X32:       # %bb.0:
     10 ; X32-NEXT:    xorps %xmm0, %xmm0
     11 ; X32-NEXT:    retl
     12 ;
     13 ; X64-LABEL: test1:
     14 ; X64:       # %bb.0:
     15 ; X64-NEXT:    xorps %xmm0, %xmm0
     16 ; X64-NEXT:    retq
     17   %tmp = xor <4 x i32> undef, undef
     18   ret <4 x i32> %tmp
     19 }
     20 
     21 ; Though it is undefined, we want xor undef,undef to produce zero.
     22 define i32 @test2() nounwind{
     23 ; X32-LABEL: test2:
     24 ; X32:       # %bb.0:
     25 ; X32-NEXT:    xorl %eax, %eax
     26 ; X32-NEXT:    retl
     27 ;
     28 ; X64-LABEL: test2:
     29 ; X64:       # %bb.0:
     30 ; X64-NEXT:    xorl %eax, %eax
     31 ; X64-NEXT:    retq
     32   %tmp = xor i32 undef, undef
     33   ret i32 %tmp
     34 }
     35 
     36 define i32 @test3(i32 %a, i32 %b) nounwind  {
     37 ; X32-LABEL: test3:
     38 ; X32:       # %bb.0: # %entry
     39 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
     40 ; X32-NEXT:    notl %eax
     41 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
     42 ; X32-NEXT:    shrl %eax
     43 ; X32-NEXT:    retl
     44 ;
     45 ; X64-LIN-LABEL: test3:
     46 ; X64-LIN:       # %bb.0: # %entry
     47 ; X64-LIN-NEXT:    notl %esi
     48 ; X64-LIN-NEXT:    andl %edi, %esi
     49 ; X64-LIN-NEXT:    shrl %esi
     50 ; X64-LIN-NEXT:    movl %esi, %eax
     51 ; X64-LIN-NEXT:    retq
     52 ;
     53 ; X64-WIN-LABEL: test3:
     54 ; X64-WIN:       # %bb.0: # %entry
     55 ; X64-WIN-NEXT:    notl %edx
     56 ; X64-WIN-NEXT:    andl %ecx, %edx
     57 ; X64-WIN-NEXT:    shrl %edx
     58 ; X64-WIN-NEXT:    movl %edx, %eax
     59 ; X64-WIN-NEXT:    retq
     60 entry:
     61   %tmp1not = xor i32 %b, -2
     62   %tmp3 = and i32 %tmp1not, %a
     63   %tmp4 = lshr i32 %tmp3, 1
     64   ret i32 %tmp4
     65 }
     66 
     67 define i32 @test4(i32 %a, i32 %b) nounwind  {
     68 ; X32-LABEL: test4:
     69 ; X32:       # %bb.0: # %entry
     70 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
     71 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
     72 ; X32-NEXT:    .p2align 4, 0x90
     73 ; X32-NEXT:  .LBB3_1: # %bb
     74 ; X32-NEXT:    # =>This Inner Loop Header: Depth=1
     75 ; X32-NEXT:    xorl %ecx, %eax
     76 ; X32-NEXT:    movl %eax, %edx
     77 ; X32-NEXT:    notl %edx
     78 ; X32-NEXT:    andl %ecx, %edx
     79 ; X32-NEXT:    addl %edx, %edx
     80 ; X32-NEXT:    movl %edx, %ecx
     81 ; X32-NEXT:    jne .LBB3_1
     82 ; X32-NEXT:  # %bb.2: # %bb12
     83 ; X32-NEXT:    retl
     84 ;
     85 ; X64-LIN-LABEL: test4:
     86 ; X64-LIN:       # %bb.0: # %entry
     87 ; X64-LIN-NEXT:    .p2align 4, 0x90
     88 ; X64-LIN-NEXT:  .LBB3_1: # %bb
     89 ; X64-LIN-NEXT:    # =>This Inner Loop Header: Depth=1
     90 ; X64-LIN-NEXT:    xorl %esi, %edi
     91 ; X64-LIN-NEXT:    movl %edi, %eax
     92 ; X64-LIN-NEXT:    notl %eax
     93 ; X64-LIN-NEXT:    andl %esi, %eax
     94 ; X64-LIN-NEXT:    addl %eax, %eax
     95 ; X64-LIN-NEXT:    movl %eax, %esi
     96 ; X64-LIN-NEXT:    jne .LBB3_1
     97 ; X64-LIN-NEXT:  # %bb.2: # %bb12
     98 ; X64-LIN-NEXT:    movl %edi, %eax
     99 ; X64-LIN-NEXT:    retq
    100 ;
    101 ; X64-WIN-LABEL: test4:
    102 ; X64-WIN:       # %bb.0: # %entry
    103 ; X64-WIN-NEXT:    .p2align 4, 0x90
    104 ; X64-WIN-NEXT:  .LBB3_1: # %bb
    105 ; X64-WIN-NEXT:    # =>This Inner Loop Header: Depth=1
    106 ; X64-WIN-NEXT:    xorl %edx, %ecx
    107 ; X64-WIN-NEXT:    movl %ecx, %eax
    108 ; X64-WIN-NEXT:    notl %eax
    109 ; X64-WIN-NEXT:    andl %edx, %eax
    110 ; X64-WIN-NEXT:    addl %eax, %eax
    111 ; X64-WIN-NEXT:    movl %eax, %edx
    112 ; X64-WIN-NEXT:    jne .LBB3_1
    113 ; X64-WIN-NEXT:  # %bb.2: # %bb12
    114 ; X64-WIN-NEXT:    movl %ecx, %eax
    115 ; X64-WIN-NEXT:    retq
    116 entry:
    117   br label %bb
    118 bb:
    119   %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]
    120   %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]
    121   %tmp3 = xor i32 %a_addr.0, %b_addr.0
    122   %tmp4not = xor i32 %tmp3, 2147483647
    123   %tmp6 = and i32 %tmp4not, %b_addr.0
    124   %tmp8 = shl i32 %tmp6, 1
    125   %tmp10 = icmp eq i32 %tmp8, 0
    126   br i1 %tmp10, label %bb12, label %bb
    127 bb12:
    128   ret i32 %tmp3
    129 }
    130 
    131 define i16 @test5(i16 %a, i16 %b) nounwind  {
    132 ; X32-LABEL: test5:
    133 ; X32:       # %bb.0: # %entry
    134 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
    135 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    136 ; X32-NEXT:    .p2align 4, 0x90
    137 ; X32-NEXT:  .LBB4_1: # %bb
    138 ; X32-NEXT:    # =>This Inner Loop Header: Depth=1
    139 ; X32-NEXT:    xorl %ecx, %eax
    140 ; X32-NEXT:    movl %eax, %edx
    141 ; X32-NEXT:    notl %edx
    142 ; X32-NEXT:    andl %ecx, %edx
    143 ; X32-NEXT:    addl %edx, %edx
    144 ; X32-NEXT:    testw %dx, %dx
    145 ; X32-NEXT:    movl %edx, %ecx
    146 ; X32-NEXT:    jne .LBB4_1
    147 ; X32-NEXT:  # %bb.2: # %bb12
    148 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
    149 ; X32-NEXT:    retl
    150 ;
    151 ; X64-LIN-LABEL: test5:
    152 ; X64-LIN:       # %bb.0: # %entry
    153 ; X64-LIN-NEXT:    .p2align 4, 0x90
    154 ; X64-LIN-NEXT:  .LBB4_1: # %bb
    155 ; X64-LIN-NEXT:    # =>This Inner Loop Header: Depth=1
    156 ; X64-LIN-NEXT:    xorl %esi, %edi
    157 ; X64-LIN-NEXT:    movl %edi, %eax
    158 ; X64-LIN-NEXT:    notl %eax
    159 ; X64-LIN-NEXT:    andl %esi, %eax
    160 ; X64-LIN-NEXT:    addl %eax, %eax
    161 ; X64-LIN-NEXT:    testw %ax, %ax
    162 ; X64-LIN-NEXT:    movl %eax, %esi
    163 ; X64-LIN-NEXT:    jne .LBB4_1
    164 ; X64-LIN-NEXT:  # %bb.2: # %bb12
    165 ; X64-LIN-NEXT:    movl %edi, %eax
    166 ; X64-LIN-NEXT:    retq
    167 ;
    168 ; X64-WIN-LABEL: test5:
    169 ; X64-WIN:       # %bb.0: # %entry
    170 ; X64-WIN-NEXT:    # kill: def $dx killed $dx def $edx
    171 ; X64-WIN-NEXT:    # kill: def $cx killed $cx def $ecx
    172 ; X64-WIN-NEXT:    .p2align 4, 0x90
    173 ; X64-WIN-NEXT:  .LBB4_1: # %bb
    174 ; X64-WIN-NEXT:    # =>This Inner Loop Header: Depth=1
    175 ; X64-WIN-NEXT:    xorl %edx, %ecx
    176 ; X64-WIN-NEXT:    movl %ecx, %eax
    177 ; X64-WIN-NEXT:    notl %eax
    178 ; X64-WIN-NEXT:    andl %edx, %eax
    179 ; X64-WIN-NEXT:    addl %eax, %eax
    180 ; X64-WIN-NEXT:    testw %ax, %ax
    181 ; X64-WIN-NEXT:    movl %eax, %edx
    182 ; X64-WIN-NEXT:    jne .LBB4_1
    183 ; X64-WIN-NEXT:  # %bb.2: # %bb12
    184 ; X64-WIN-NEXT:    movl %ecx, %eax
    185 ; X64-WIN-NEXT:    retq
    186 entry:
    187   br label %bb
    188 bb:
    189   %b_addr.0 = phi i16 [ %b, %entry ], [ %tmp8, %bb ]
    190   %a_addr.0 = phi i16 [ %a, %entry ], [ %tmp3, %bb ]
    191   %tmp3 = xor i16 %a_addr.0, %b_addr.0
    192   %tmp4not = xor i16 %tmp3, 32767
    193   %tmp6 = and i16 %tmp4not, %b_addr.0
    194   %tmp8 = shl i16 %tmp6, 1
    195   %tmp10 = icmp eq i16 %tmp8, 0
    196   br i1 %tmp10, label %bb12, label %bb
    197 bb12:
    198   ret i16 %tmp3
    199 }
    200 
    201 define i8 @test6(i8 %a, i8 %b) nounwind  {
    202 ; X32-LABEL: test6:
    203 ; X32:       # %bb.0: # %entry
    204 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
    205 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
    206 ; X32-NEXT:    .p2align 4, 0x90
    207 ; X32-NEXT:  .LBB5_1: # %bb
    208 ; X32-NEXT:    # =>This Inner Loop Header: Depth=1
    209 ; X32-NEXT:    xorb %cl, %al
    210 ; X32-NEXT:    movl %eax, %edx
    211 ; X32-NEXT:    notb %dl
    212 ; X32-NEXT:    andb %cl, %dl
    213 ; X32-NEXT:    addb %dl, %dl
    214 ; X32-NEXT:    movl %edx, %ecx
    215 ; X32-NEXT:    jne .LBB5_1
    216 ; X32-NEXT:  # %bb.2: # %bb12
    217 ; X32-NEXT:    retl
    218 ;
    219 ; X64-LIN-LABEL: test6:
    220 ; X64-LIN:       # %bb.0: # %entry
    221 ; X64-LIN-NEXT:    .p2align 4, 0x90
    222 ; X64-LIN-NEXT:  .LBB5_1: # %bb
    223 ; X64-LIN-NEXT:    # =>This Inner Loop Header: Depth=1
    224 ; X64-LIN-NEXT:    xorb %sil, %dil
    225 ; X64-LIN-NEXT:    movl %edi, %eax
    226 ; X64-LIN-NEXT:    notb %al
    227 ; X64-LIN-NEXT:    andb %sil, %al
    228 ; X64-LIN-NEXT:    addb %al, %al
    229 ; X64-LIN-NEXT:    movl %eax, %esi
    230 ; X64-LIN-NEXT:    jne .LBB5_1
    231 ; X64-LIN-NEXT:  # %bb.2: # %bb12
    232 ; X64-LIN-NEXT:    movl %edi, %eax
    233 ; X64-LIN-NEXT:    retq
    234 ;
    235 ; X64-WIN-LABEL: test6:
    236 ; X64-WIN:       # %bb.0: # %entry
    237 ; X64-WIN-NEXT:    .p2align 4, 0x90
    238 ; X64-WIN-NEXT:  .LBB5_1: # %bb
    239 ; X64-WIN-NEXT:    # =>This Inner Loop Header: Depth=1
    240 ; X64-WIN-NEXT:    xorb %dl, %cl
    241 ; X64-WIN-NEXT:    movl %ecx, %eax
    242 ; X64-WIN-NEXT:    notb %al
    243 ; X64-WIN-NEXT:    andb %dl, %al
    244 ; X64-WIN-NEXT:    addb %al, %al
    245 ; X64-WIN-NEXT:    movl %eax, %edx
    246 ; X64-WIN-NEXT:    jne .LBB5_1
    247 ; X64-WIN-NEXT:  # %bb.2: # %bb12
    248 ; X64-WIN-NEXT:    movl %ecx, %eax
    249 ; X64-WIN-NEXT:    retq
    250 entry:
    251   br label %bb
    252 bb:
    253   %b_addr.0 = phi i8 [ %b, %entry ], [ %tmp8, %bb ]
    254   %a_addr.0 = phi i8 [ %a, %entry ], [ %tmp3, %bb ]
    255   %tmp3 = xor i8 %a_addr.0, %b_addr.0
    256   %tmp4not = xor i8 %tmp3, 127
    257   %tmp6 = and i8 %tmp4not, %b_addr.0
    258   %tmp8 = shl i8 %tmp6, 1
    259   %tmp10 = icmp eq i8 %tmp8, 0
    260   br i1 %tmp10, label %bb12, label %bb
    261 bb12:
    262   ret i8 %tmp3
    263 }
    264 
    265 define i32 @test7(i32 %a, i32 %b) nounwind  {
    266 ; X32-LABEL: test7:
    267 ; X32:       # %bb.0: # %entry
    268 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    269 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
    270 ; X32-NEXT:    .p2align 4, 0x90
    271 ; X32-NEXT:  .LBB6_1: # %bb
    272 ; X32-NEXT:    # =>This Inner Loop Header: Depth=1
    273 ; X32-NEXT:    xorl %ecx, %eax
    274 ; X32-NEXT:    movl %eax, %edx
    275 ; X32-NEXT:    xorl $2147483646, %edx # imm = 0x7FFFFFFE
    276 ; X32-NEXT:    andl %ecx, %edx
    277 ; X32-NEXT:    addl %edx, %edx
    278 ; X32-NEXT:    movl %edx, %ecx
    279 ; X32-NEXT:    jne .LBB6_1
    280 ; X32-NEXT:  # %bb.2: # %bb12
    281 ; X32-NEXT:    retl
    282 ;
    283 ; X64-LIN-LABEL: test7:
    284 ; X64-LIN:       # %bb.0: # %entry
    285 ; X64-LIN-NEXT:    .p2align 4, 0x90
    286 ; X64-LIN-NEXT:  .LBB6_1: # %bb
    287 ; X64-LIN-NEXT:    # =>This Inner Loop Header: Depth=1
    288 ; X64-LIN-NEXT:    xorl %esi, %edi
    289 ; X64-LIN-NEXT:    movl %edi, %eax
    290 ; X64-LIN-NEXT:    xorl $2147483646, %eax # imm = 0x7FFFFFFE
    291 ; X64-LIN-NEXT:    andl %esi, %eax
    292 ; X64-LIN-NEXT:    addl %eax, %eax
    293 ; X64-LIN-NEXT:    movl %eax, %esi
    294 ; X64-LIN-NEXT:    jne .LBB6_1
    295 ; X64-LIN-NEXT:  # %bb.2: # %bb12
    296 ; X64-LIN-NEXT:    movl %edi, %eax
    297 ; X64-LIN-NEXT:    retq
    298 ;
    299 ; X64-WIN-LABEL: test7:
    300 ; X64-WIN:       # %bb.0: # %entry
    301 ; X64-WIN-NEXT:    .p2align 4, 0x90
    302 ; X64-WIN-NEXT:  .LBB6_1: # %bb
    303 ; X64-WIN-NEXT:    # =>This Inner Loop Header: Depth=1
    304 ; X64-WIN-NEXT:    xorl %edx, %ecx
    305 ; X64-WIN-NEXT:    movl %ecx, %eax
    306 ; X64-WIN-NEXT:    xorl $2147483646, %eax # imm = 0x7FFFFFFE
    307 ; X64-WIN-NEXT:    andl %edx, %eax
    308 ; X64-WIN-NEXT:    addl %eax, %eax
    309 ; X64-WIN-NEXT:    movl %eax, %edx
    310 ; X64-WIN-NEXT:    jne .LBB6_1
    311 ; X64-WIN-NEXT:  # %bb.2: # %bb12
    312 ; X64-WIN-NEXT:    movl %ecx, %eax
    313 ; X64-WIN-NEXT:    retq
    314 entry:
    315   br label %bb
    316 bb:
    317   %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]
    318   %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]
    319   %tmp3 = xor i32 %a_addr.0, %b_addr.0
    320   %tmp4not = xor i32 %tmp3, 2147483646
    321   %tmp6 = and i32 %tmp4not, %b_addr.0
    322   %tmp8 = shl i32 %tmp6, 1
    323   %tmp10 = icmp eq i32 %tmp8, 0
    324   br i1 %tmp10, label %bb12, label %bb
    325 bb12:
    326   ret i32 %tmp3
    327 }
    328 
    329 ; rdar://7553032
    330 define i32 @test8(i32 %a) nounwind {
    331 ; X32-LABEL: test8:
    332 ; X32:       # %bb.0: # %entry
    333 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
    334 ; X32-NEXT:    notl %eax
    335 ; X32-NEXT:    retl
    336 ;
    337 ; X64-LIN-LABEL: test8:
    338 ; X64-LIN:       # %bb.0: # %entry
    339 ; X64-LIN-NEXT:    notl %edi
    340 ; X64-LIN-NEXT:    movl %edi, %eax
    341 ; X64-LIN-NEXT:    retq
    342 ;
    343 ; X64-WIN-LABEL: test8:
    344 ; X64-WIN:       # %bb.0: # %entry
    345 ; X64-WIN-NEXT:    notl %ecx
    346 ; X64-WIN-NEXT:    movl %ecx, %eax
    347 ; X64-WIN-NEXT:    retq
    348 entry:
    349   %t1 = sub i32 0, %a
    350   %t2 = add i32 %t1, -1
    351   ret i32 %t2
    352 }
    353 
    354 define i32 @test9(i32 %a) nounwind {
    355 ; X32-LABEL: test9:
    356 ; X32:       # %bb.0:
    357 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
    358 ; X32-NEXT:    notl %eax
    359 ; X32-NEXT:    andl $4096, %eax # imm = 0x1000
    360 ; X32-NEXT:    retl
    361 ;
    362 ; X64-LIN-LABEL: test9:
    363 ; X64-LIN:       # %bb.0:
    364 ; X64-LIN-NEXT:    notl %edi
    365 ; X64-LIN-NEXT:    andl $4096, %edi # imm = 0x1000
    366 ; X64-LIN-NEXT:    movl %edi, %eax
    367 ; X64-LIN-NEXT:    retq
    368 ;
    369 ; X64-WIN-LABEL: test9:
    370 ; X64-WIN:       # %bb.0:
    371 ; X64-WIN-NEXT:    notl %ecx
    372 ; X64-WIN-NEXT:    andl $4096, %ecx # imm = 0x1000
    373 ; X64-WIN-NEXT:    movl %ecx, %eax
    374 ; X64-WIN-NEXT:    retq
    375   %1 = and i32 %a, 4096
    376   %2 = xor i32 %1, 4096
    377   ret i32 %2
    378 }
    379 
    380 ; PR15948
    381 define <4 x i32> @test10(<4 x i32> %a) nounwind {
    382 ; X32-LABEL: test10:
    383 ; X32:       # %bb.0:
    384 ; X32-NEXT:    andnps {{\.LCPI.*}}, %xmm0
    385 ; X32-NEXT:    retl
    386 ;
    387 ; X64-LIN-LABEL: test10:
    388 ; X64-LIN:       # %bb.0:
    389 ; X64-LIN-NEXT:    andnps {{.*}}(%rip), %xmm0
    390 ; X64-LIN-NEXT:    retq
    391 ;
    392 ; X64-WIN-LABEL: test10:
    393 ; X64-WIN:       # %bb.0:
    394 ; X64-WIN-NEXT:    movaps (%rcx), %xmm0
    395 ; X64-WIN-NEXT:    andnps __xmm@{{.*}}(%rip), %xmm0
    396 ; X64-WIN-NEXT:    retq
    397   %1 = and <4 x i32> %a, <i32 4096, i32 4096, i32 4096, i32 4096>
    398   %2 = xor <4 x i32> %1, <i32 4096, i32 4096, i32 4096, i32 4096>
    399   ret <4 x i32> %2
    400 }
    401 
    402 define i32 @PR17487(i1 %tobool) {
    403 ; X32-LABEL: PR17487:
    404 ; X32:       # %bb.0:
    405 ; X32-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
    406 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
    407 ; X32-NEXT:    pandn {{\.LCPI.*}}, %xmm0
    408 ; X32-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
    409 ; X32-NEXT:    movd %xmm1, %ecx
    410 ; X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    411 ; X32-NEXT:    movd %xmm0, %edx
    412 ; X32-NEXT:    xorl $1, %edx
    413 ; X32-NEXT:    xorl %eax, %eax
    414 ; X32-NEXT:    orl %ecx, %edx
    415 ; X32-NEXT:    setne %al
    416 ; X32-NEXT:    retl
    417 ;
    418 ; X64-LIN-LABEL: PR17487:
    419 ; X64-LIN:       # %bb.0:
    420 ; X64-LIN-NEXT:    movd %edi, %xmm0
    421 ; X64-LIN-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
    422 ; X64-LIN-NEXT:    pandn {{.*}}(%rip), %xmm0
    423 ; X64-LIN-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    424 ; X64-LIN-NEXT:    movq %xmm0, %rcx
    425 ; X64-LIN-NEXT:    xorl %eax, %eax
    426 ; X64-LIN-NEXT:    cmpq $1, %rcx
    427 ; X64-LIN-NEXT:    setne %al
    428 ; X64-LIN-NEXT:    retq
    429 ;
    430 ; X64-WIN-LABEL: PR17487:
    431 ; X64-WIN:       # %bb.0:
    432 ; X64-WIN-NEXT:    movzbl %cl, %eax
    433 ; X64-WIN-NEXT:    movd %eax, %xmm0
    434 ; X64-WIN-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
    435 ; X64-WIN-NEXT:    pandn __xmm@{{.*}}(%rip), %xmm0
    436 ; X64-WIN-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    437 ; X64-WIN-NEXT:    movq %xmm0, %rcx
    438 ; X64-WIN-NEXT:    xorl %eax, %eax
    439 ; X64-WIN-NEXT:    cmpq $1, %rcx
    440 ; X64-WIN-NEXT:    setne %al
    441 ; X64-WIN-NEXT:    retq
    442   %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1
    443   %tmp1 = zext <2 x i1> %tmp to <2 x i64>
    444   %tmp2 = xor <2 x i64> %tmp1, <i64 1, i64 1>
    445   %tmp3 = extractelement <2 x i64> %tmp2, i32 1
    446   %add = add nsw i64 0, %tmp3
    447   %cmp6 = icmp ne i64 %add, 1
    448   %conv7 = zext i1 %cmp6 to i32
    449   ret i32 %conv7
    450 }
    451 
    452 define i32 @test11(i32 %b) {
    453 ; X32-LABEL: test11:
    454 ; X32:       # %bb.0:
    455 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
    456 ; X32-NEXT:    movl $-2, %eax
    457 ; X32-NEXT:    roll %cl, %eax
    458 ; X32-NEXT:    retl
    459 ;
    460 ; X64-LIN-LABEL: test11:
    461 ; X64-LIN:       # %bb.0:
    462 ; X64-LIN-NEXT:    movl $-2, %eax
    463 ; X64-LIN-NEXT:    movl %edi, %ecx
    464 ; X64-LIN-NEXT:    roll %cl, %eax
    465 ; X64-LIN-NEXT:    retq
    466 ;
    467 ; X64-WIN-LABEL: test11:
    468 ; X64-WIN:       # %bb.0:
    469 ; X64-WIN-NEXT:    movl $-2, %eax
    470 ; X64-WIN-NEXT:    # kill: def $cl killed $cl killed $ecx
    471 ; X64-WIN-NEXT:    roll %cl, %eax
    472 ; X64-WIN-NEXT:    retq
    473   %shl = shl i32 1, %b
    474   %neg = xor i32 %shl, -1
    475   ret i32 %neg
    476 }
    477 
    478 %struct.ref_s = type { %union.v, i16, i16 }
    479 %union.v = type { i64 }
    480 
    481 define %struct.ref_s* @test12(%struct.ref_s* %op, i64 %osbot, i64 %intval) {
    482 ; X32-LABEL: test12:
    483 ; X32:       # %bb.0:
    484 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
    485 ; X32-NEXT:    notl %eax
    486 ; X32-NEXT:    leal (%eax,%eax,2), %eax
    487 ; X32-NEXT:    shll $2, %eax
    488 ; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
    489 ; X32-NEXT:    retl
    490 ;
    491 ; X64-LIN-LABEL: test12:
    492 ; X64-LIN:       # %bb.0:
    493 ; X64-LIN-NEXT:    xorq $-1, %rdx
    494 ; X64-LIN-NEXT:    shlq $32, %rdx
    495 ; X64-LIN-NEXT:    sarq $28, %rdx
    496 ; X64-LIN-NEXT:    leaq (%rdx,%rdi), %rax
    497 ; X64-LIN-NEXT:    retq
    498 ;
    499 ; X64-WIN-LABEL: test12:
    500 ; X64-WIN:       # %bb.0:
    501 ; X64-WIN-NEXT:    xorq $-1, %r8
    502 ; X64-WIN-NEXT:    shlq $32, %r8
    503 ; X64-WIN-NEXT:    sarq $28, %r8
    504 ; X64-WIN-NEXT:    leaq (%r8,%rcx), %rax
    505 ; X64-WIN-NEXT:    retq
    506   %neg = shl i64 %intval, 32
    507   %sext = xor i64 %neg, -4294967296
    508   %idx.ext = ashr exact i64 %sext, 32
    509   %add.ptr = getelementptr inbounds %struct.ref_s, %struct.ref_s* %op, i64 %idx.ext
    510   ret %struct.ref_s* %add.ptr
    511 }
    512