Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 | FileCheck %s
      3 
      4 define i8 @shl_i8(i8 %a, i8 %b) {
      5 ; CHECK-LABEL: shl_i8:
      6 ; CHECK:       ## %bb.0:
      7 ; CHECK-NEXT:    movl %esi, %ecx
      8 ; CHECK-NEXT:    shlb %cl, %dil
      9 ; CHECK-NEXT:    movl %edi, %eax
     10 ; CHECK-NEXT:    retq
     11   %c = shl i8 %a, %b
     12   ret i8 %c
     13 }
     14 
     15 define i16 @shl_i16(i16 %a, i16 %b) {
     16 ; CHECK-LABEL: shl_i16:
     17 ; CHECK:       ## %bb.0:
     18 ; CHECK-NEXT:    movl %esi, %ecx
     19 ; CHECK-NEXT:    ## kill: def $cl killed $cx
     20 ; CHECK-NEXT:    shlw %cl, %di
     21 ; CHECK-NEXT:    movl %edi, %eax
     22 ; CHECK-NEXT:    retq
     23   %c = shl i16 %a, %b
     24   ret i16 %c
     25 }
     26 
     27 define i32 @shl_i32(i32 %a, i32 %b) {
     28 ; CHECK-LABEL: shl_i32:
     29 ; CHECK:       ## %bb.0:
     30 ; CHECK-NEXT:    movl %esi, %ecx
     31 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
     32 ; CHECK-NEXT:    shll %cl, %edi
     33 ; CHECK-NEXT:    movl %edi, %eax
     34 ; CHECK-NEXT:    retq
     35   %c = shl i32 %a, %b
     36   ret i32 %c
     37 }
     38 
     39 define i64 @shl_i64(i64 %a, i64 %b) {
     40 ; CHECK-LABEL: shl_i64:
     41 ; CHECK:       ## %bb.0:
     42 ; CHECK-NEXT:    movq %rsi, %rcx
     43 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
     44 ; CHECK-NEXT:    shlq %cl, %rdi
     45 ; CHECK-NEXT:    movq %rdi, %rax
     46 ; CHECK-NEXT:    retq
     47   %c = shl i64 %a, %b
     48   ret i64 %c
     49 }
     50 
     51 define i8 @lshr_i8(i8 %a, i8 %b) {
     52 ; CHECK-LABEL: lshr_i8:
     53 ; CHECK:       ## %bb.0:
     54 ; CHECK-NEXT:    movl %esi, %ecx
     55 ; CHECK-NEXT:    shrb %cl, %dil
     56 ; CHECK-NEXT:    movl %edi, %eax
     57 ; CHECK-NEXT:    retq
     58   %c = lshr i8 %a, %b
     59   ret i8 %c
     60 }
     61 
     62 define i16 @lshr_i16(i16 %a, i16 %b) {
     63 ; CHECK-LABEL: lshr_i16:
     64 ; CHECK:       ## %bb.0:
     65 ; CHECK-NEXT:    movl %esi, %ecx
     66 ; CHECK-NEXT:    ## kill: def $cl killed $cx
     67 ; CHECK-NEXT:    shrw %cl, %di
     68 ; CHECK-NEXT:    movl %edi, %eax
     69 ; CHECK-NEXT:    retq
     70   %c = lshr i16 %a, %b
     71   ret i16 %c
     72 }
     73 
     74 define i32 @lshr_i32(i32 %a, i32 %b) {
     75 ; CHECK-LABEL: lshr_i32:
     76 ; CHECK:       ## %bb.0:
     77 ; CHECK-NEXT:    movl %esi, %ecx
     78 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
     79 ; CHECK-NEXT:    shrl %cl, %edi
     80 ; CHECK-NEXT:    movl %edi, %eax
     81 ; CHECK-NEXT:    retq
     82   %c = lshr i32 %a, %b
     83   ret i32 %c
     84 }
     85 
     86 define i64 @lshr_i64(i64 %a, i64 %b) {
     87 ; CHECK-LABEL: lshr_i64:
     88 ; CHECK:       ## %bb.0:
     89 ; CHECK-NEXT:    movq %rsi, %rcx
     90 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
     91 ; CHECK-NEXT:    shrq %cl, %rdi
     92 ; CHECK-NEXT:    movq %rdi, %rax
     93 ; CHECK-NEXT:    retq
     94   %c = lshr i64 %a, %b
     95   ret i64 %c
     96 }
     97 
     98 define i8 @ashr_i8(i8 %a, i8 %b) {
     99 ; CHECK-LABEL: ashr_i8:
    100 ; CHECK:       ## %bb.0:
    101 ; CHECK-NEXT:    movl %esi, %ecx
    102 ; CHECK-NEXT:    sarb %cl, %dil
    103 ; CHECK-NEXT:    movl %edi, %eax
    104 ; CHECK-NEXT:    retq
    105   %c = ashr i8 %a, %b
    106   ret i8 %c
    107 }
    108 
    109 define i16 @ashr_i16(i16 %a, i16 %b) {
    110 ; CHECK-LABEL: ashr_i16:
    111 ; CHECK:       ## %bb.0:
    112 ; CHECK-NEXT:    movl %esi, %ecx
    113 ; CHECK-NEXT:    ## kill: def $cl killed $cx
    114 ; CHECK-NEXT:    sarw %cl, %di
    115 ; CHECK-NEXT:    movl %edi, %eax
    116 ; CHECK-NEXT:    retq
    117   %c = ashr i16 %a, %b
    118   ret i16 %c
    119 }
    120 
    121 define i32 @ashr_i32(i32 %a, i32 %b) {
    122 ; CHECK-LABEL: ashr_i32:
    123 ; CHECK:       ## %bb.0:
    124 ; CHECK-NEXT:    movl %esi, %ecx
    125 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
    126 ; CHECK-NEXT:    sarl %cl, %edi
    127 ; CHECK-NEXT:    movl %edi, %eax
    128 ; CHECK-NEXT:    retq
    129   %c = ashr i32 %a, %b
    130   ret i32 %c
    131 }
    132 
    133 define i64 @ashr_i64(i64 %a, i64 %b) {
    134 ; CHECK-LABEL: ashr_i64:
    135 ; CHECK:       ## %bb.0:
    136 ; CHECK-NEXT:    movq %rsi, %rcx
    137 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
    138 ; CHECK-NEXT:    sarq %cl, %rdi
    139 ; CHECK-NEXT:    movq %rdi, %rax
    140 ; CHECK-NEXT:    retq
    141   %c = ashr i64 %a, %b
    142   ret i64 %c
    143 }
    144 
    145 define i8 @shl_imm1_i8(i8 %a) {
    146 ; CHECK-LABEL: shl_imm1_i8:
    147 ; CHECK:       ## %bb.0:
    148 ; CHECK-NEXT:    shlb $1, %dil
    149 ; CHECK-NEXT:    movl %edi, %eax
    150 ; CHECK-NEXT:    retq
    151   %c = shl i8 %a, 1
    152   ret i8 %c
    153 }
    154 
    155 define i16 @shl_imm1_i16(i16 %a) {
    156 ; CHECK-LABEL: shl_imm1_i16:
    157 ; CHECK:       ## %bb.0:
    158 ; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
    159 ; CHECK-NEXT:    leal (,%rdi,2), %eax
    160 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
    161 ; CHECK-NEXT:    retq
    162   %c = shl i16 %a, 1
    163   ret i16 %c
    164 }
    165 
    166 define i32 @shl_imm1_i32(i32 %a) {
    167 ; CHECK-LABEL: shl_imm1_i32:
    168 ; CHECK:       ## %bb.0:
    169 ; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
    170 ; CHECK-NEXT:    leal (,%rdi,2), %eax
    171 ; CHECK-NEXT:    retq
    172   %c = shl i32 %a, 1
    173   ret i32 %c
    174 }
    175 
    176 define i64 @shl_imm1_i64(i64 %a) {
    177 ; CHECK-LABEL: shl_imm1_i64:
    178 ; CHECK:       ## %bb.0:
    179 ; CHECK-NEXT:    leaq (,%rdi,2), %rax
    180 ; CHECK-NEXT:    retq
    181   %c = shl i64 %a, 1
    182   ret i64 %c
    183 }
    184 
    185 define i8 @lshr_imm1_i8(i8 %a) {
    186 ; CHECK-LABEL: lshr_imm1_i8:
    187 ; CHECK:       ## %bb.0:
    188 ; CHECK-NEXT:    shrb $1, %dil
    189 ; CHECK-NEXT:    movl %edi, %eax
    190 ; CHECK-NEXT:    retq
    191   %c = lshr i8 %a, 1
    192   ret i8 %c
    193 }
    194 
    195 define i16 @lshr_imm1_i16(i16 %a) {
    196 ; CHECK-LABEL: lshr_imm1_i16:
    197 ; CHECK:       ## %bb.0:
    198 ; CHECK-NEXT:    shrw $1, %di
    199 ; CHECK-NEXT:    movl %edi, %eax
    200 ; CHECK-NEXT:    retq
    201   %c = lshr i16 %a, 1
    202   ret i16 %c
    203 }
    204 
    205 define i32 @lshr_imm1_i32(i32 %a) {
    206 ; CHECK-LABEL: lshr_imm1_i32:
    207 ; CHECK:       ## %bb.0:
    208 ; CHECK-NEXT:    shrl $1, %edi
    209 ; CHECK-NEXT:    movl %edi, %eax
    210 ; CHECK-NEXT:    retq
    211   %c = lshr i32 %a, 1
    212   ret i32 %c
    213 }
    214 
    215 define i64 @lshr_imm1_i64(i64 %a) {
    216 ; CHECK-LABEL: lshr_imm1_i64:
    217 ; CHECK:       ## %bb.0:
    218 ; CHECK-NEXT:    shrq $1, %rdi
    219 ; CHECK-NEXT:    movq %rdi, %rax
    220 ; CHECK-NEXT:    retq
    221   %c = lshr i64 %a, 1
    222   ret i64 %c
    223 }
    224 
    225 define i8 @ashr_imm1_i8(i8 %a) {
    226 ; CHECK-LABEL: ashr_imm1_i8:
    227 ; CHECK:       ## %bb.0:
    228 ; CHECK-NEXT:    sarb $1, %dil
    229 ; CHECK-NEXT:    movl %edi, %eax
    230 ; CHECK-NEXT:    retq
    231   %c = ashr i8 %a, 1
    232   ret i8 %c
    233 }
    234 
    235 define i16 @ashr_imm1_i16(i16 %a) {
    236 ; CHECK-LABEL: ashr_imm1_i16:
    237 ; CHECK:       ## %bb.0:
    238 ; CHECK-NEXT:    sarw $1, %di
    239 ; CHECK-NEXT:    movl %edi, %eax
    240 ; CHECK-NEXT:    retq
    241   %c = ashr i16 %a, 1
    242   ret i16 %c
    243 }
    244 
    245 define i32 @ashr_imm1_i32(i32 %a) {
    246 ; CHECK-LABEL: ashr_imm1_i32:
    247 ; CHECK:       ## %bb.0:
    248 ; CHECK-NEXT:    sarl $1, %edi
    249 ; CHECK-NEXT:    movl %edi, %eax
    250 ; CHECK-NEXT:    retq
    251   %c = ashr i32 %a, 1
    252   ret i32 %c
    253 }
    254 
    255 define i64 @ashr_imm1_i64(i64 %a) {
    256 ; CHECK-LABEL: ashr_imm1_i64:
    257 ; CHECK:       ## %bb.0:
    258 ; CHECK-NEXT:    sarq $1, %rdi
    259 ; CHECK-NEXT:    movq %rdi, %rax
    260 ; CHECK-NEXT:    retq
    261   %c = ashr i64 %a, 1
    262   ret i64 %c
    263 }
    264 
    265 define i8 @shl_imm4_i8(i8 %a) {
    266 ; CHECK-LABEL: shl_imm4_i8:
    267 ; CHECK:       ## %bb.0:
    268 ; CHECK-NEXT:    shlb $4, %dil
    269 ; CHECK-NEXT:    movl %edi, %eax
    270 ; CHECK-NEXT:    retq
    271   %c = shl i8 %a, 4
    272   ret i8 %c
    273 }
    274 
    275 define i16 @shl_imm4_i16(i16 %a) {
    276 ; CHECK-LABEL: shl_imm4_i16:
    277 ; CHECK:       ## %bb.0:
    278 ; CHECK-NEXT:    shlw $4, %di
    279 ; CHECK-NEXT:    movl %edi, %eax
    280 ; CHECK-NEXT:    retq
    281   %c = shl i16 %a, 4
    282   ret i16 %c
    283 }
    284 
    285 define i32 @shl_imm4_i32(i32 %a) {
    286 ; CHECK-LABEL: shl_imm4_i32:
    287 ; CHECK:       ## %bb.0:
    288 ; CHECK-NEXT:    shll $4, %edi
    289 ; CHECK-NEXT:    movl %edi, %eax
    290 ; CHECK-NEXT:    retq
    291   %c = shl i32 %a, 4
    292   ret i32 %c
    293 }
    294 
    295 define i64 @shl_imm4_i64(i64 %a) {
    296 ; CHECK-LABEL: shl_imm4_i64:
    297 ; CHECK:       ## %bb.0:
    298 ; CHECK-NEXT:    shlq $4, %rdi
    299 ; CHECK-NEXT:    movq %rdi, %rax
    300 ; CHECK-NEXT:    retq
    301   %c = shl i64 %a, 4
    302   ret i64 %c
    303 }
    304 
    305 define i8 @lshr_imm4_i8(i8 %a) {
    306 ; CHECK-LABEL: lshr_imm4_i8:
    307 ; CHECK:       ## %bb.0:
    308 ; CHECK-NEXT:    shrb $4, %dil
    309 ; CHECK-NEXT:    movl %edi, %eax
    310 ; CHECK-NEXT:    retq
    311   %c = lshr i8 %a, 4
    312   ret i8 %c
    313 }
    314 
    315 define i16 @lshr_imm4_i16(i16 %a) {
    316 ; CHECK-LABEL: lshr_imm4_i16:
    317 ; CHECK:       ## %bb.0:
    318 ; CHECK-NEXT:    shrw $4, %di
    319 ; CHECK-NEXT:    movl %edi, %eax
    320 ; CHECK-NEXT:    retq
    321   %c = lshr i16 %a, 4
    322   ret i16 %c
    323 }
    324 
    325 define i32 @lshr_imm4_i32(i32 %a) {
    326 ; CHECK-LABEL: lshr_imm4_i32:
    327 ; CHECK:       ## %bb.0:
    328 ; CHECK-NEXT:    shrl $4, %edi
    329 ; CHECK-NEXT:    movl %edi, %eax
    330 ; CHECK-NEXT:    retq
    331   %c = lshr i32 %a, 4
    332   ret i32 %c
    333 }
    334 
    335 define i64 @lshr_imm4_i64(i64 %a) {
    336 ; CHECK-LABEL: lshr_imm4_i64:
    337 ; CHECK:       ## %bb.0:
    338 ; CHECK-NEXT:    shrq $4, %rdi
    339 ; CHECK-NEXT:    movq %rdi, %rax
    340 ; CHECK-NEXT:    retq
    341   %c = lshr i64 %a, 4
    342   ret i64 %c
    343 }
    344 
    345 define i8 @ashr_imm4_i8(i8 %a) {
    346 ; CHECK-LABEL: ashr_imm4_i8:
    347 ; CHECK:       ## %bb.0:
    348 ; CHECK-NEXT:    sarb $4, %dil
    349 ; CHECK-NEXT:    movl %edi, %eax
    350 ; CHECK-NEXT:    retq
    351   %c = ashr i8 %a, 4
    352   ret i8 %c
    353 }
    354 
    355 define i16 @ashr_imm4_i16(i16 %a) {
    356 ; CHECK-LABEL: ashr_imm4_i16:
    357 ; CHECK:       ## %bb.0:
    358 ; CHECK-NEXT:    sarw $4, %di
    359 ; CHECK-NEXT:    movl %edi, %eax
    360 ; CHECK-NEXT:    retq
    361   %c = ashr i16 %a, 4
    362   ret i16 %c
    363 }
    364 
    365 define i32 @ashr_imm4_i32(i32 %a) {
    366 ; CHECK-LABEL: ashr_imm4_i32:
    367 ; CHECK:       ## %bb.0:
    368 ; CHECK-NEXT:    sarl $4, %edi
    369 ; CHECK-NEXT:    movl %edi, %eax
    370 ; CHECK-NEXT:    retq
    371   %c = ashr i32 %a, 4
    372   ret i32 %c
    373 }
    374 
    375 define i64 @ashr_imm4_i64(i64 %a) {
    376 ; CHECK-LABEL: ashr_imm4_i64:
    377 ; CHECK:       ## %bb.0:
    378 ; CHECK-NEXT:    sarq $4, %rdi
    379 ; CHECK-NEXT:    movq %rdi, %rax
    380 ; CHECK-NEXT:    retq
    381   %c = ashr i64 %a, 4
    382   ret i64 %c
    383 }
    384 
    385 ; Make sure we don't crash on out of bounds i8 shifts.
    386 define i8 @PR36731(i8 %a) {
    387 ; CHECK-LABEL: PR36731:
    388 ; CHECK:       ## %bb.0:
    389 ; CHECK-NEXT:    movb $255, %cl
    390 ; CHECK-NEXT:    shlb %cl, %dil
    391 ; CHECK-NEXT:    movl %edi, %eax
    392 ; CHECK-NEXT:    retq
    393   %b = shl i8 %a, -1
    394   ret i8 %b
    395 }
    396