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 | FileCheck %s --check-prefix=X86
      3 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
      4 
      5 define i16 @test_mul_by_1(i16 %x) {
      6 ; X86-LABEL: test_mul_by_1:
      7 ; X86:       # %bb.0:
      8 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
      9 ; X86-NEXT:    retl
     10 ;
     11 ; X64-LABEL: test_mul_by_1:
     12 ; X64:       # %bb.0:
     13 ; X64-NEXT:    movl %edi, %eax
     14 ; X64-NEXT:    retq
     15   %mul = mul nsw i16 %x, 1
     16   ret i16 %mul
     17 }
     18 
     19 define i16 @test_mul_by_2(i16 %x) {
     20 ; X86-LABEL: test_mul_by_2:
     21 ; X86:       # %bb.0:
     22 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     23 ; X86-NEXT:    addl %eax, %eax
     24 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
     25 ; X86-NEXT:    retl
     26 ;
     27 ; X64-LABEL: test_mul_by_2:
     28 ; X64:       # %bb.0:
     29 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     30 ; X64-NEXT:    leal (%rdi,%rdi), %eax
     31 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
     32 ; X64-NEXT:    retq
     33   %mul = mul nsw i16 %x, 2
     34   ret i16 %mul
     35 }
     36 
     37 define i16 @test_mul_by_3(i16 %x) {
     38 ; X86-LABEL: test_mul_by_3:
     39 ; X86:       # %bb.0:
     40 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     41 ; X86-NEXT:    leal (%eax,%eax,2), %eax
     42 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
     43 ; X86-NEXT:    retl
     44 ;
     45 ; X64-LABEL: test_mul_by_3:
     46 ; X64:       # %bb.0:
     47 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     48 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
     49 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
     50 ; X64-NEXT:    retq
     51   %mul = mul nsw i16 %x, 3
     52   ret i16 %mul
     53 }
     54 
     55 define i16 @test_mul_by_4(i16 %x) {
     56 ; X86-LABEL: test_mul_by_4:
     57 ; X86:       # %bb.0:
     58 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     59 ; X86-NEXT:    shll $2, %eax
     60 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
     61 ; X86-NEXT:    retl
     62 ;
     63 ; X64-LABEL: test_mul_by_4:
     64 ; X64:       # %bb.0:
     65 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     66 ; X64-NEXT:    leal (,%rdi,4), %eax
     67 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
     68 ; X64-NEXT:    retq
     69   %mul = mul nsw i16 %x, 4
     70   ret i16 %mul
     71 }
     72 
     73 define i16 @test_mul_by_5(i16 %x) {
     74 ; X86-LABEL: test_mul_by_5:
     75 ; X86:       # %bb.0:
     76 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     77 ; X86-NEXT:    leal (%eax,%eax,4), %eax
     78 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
     79 ; X86-NEXT:    retl
     80 ;
     81 ; X64-LABEL: test_mul_by_5:
     82 ; X64:       # %bb.0:
     83 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
     84 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
     85 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
     86 ; X64-NEXT:    retq
     87   %mul = mul nsw i16 %x, 5
     88   ret i16 %mul
     89 }
     90 
     91 define i16 @test_mul_by_6(i16 %x) {
     92 ; X86-LABEL: test_mul_by_6:
     93 ; X86:       # %bb.0:
     94 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     95 ; X86-NEXT:    addl %eax, %eax
     96 ; X86-NEXT:    leal (%eax,%eax,2), %eax
     97 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
     98 ; X86-NEXT:    retl
     99 ;
    100 ; X64-LABEL: test_mul_by_6:
    101 ; X64:       # %bb.0:
    102 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    103 ; X64-NEXT:    addl %edi, %edi
    104 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
    105 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    106 ; X64-NEXT:    retq
    107   %mul = mul nsw i16 %x, 6
    108   ret i16 %mul
    109 }
    110 
    111 define i16 @test_mul_by_7(i16 %x) {
    112 ; X86-LABEL: test_mul_by_7:
    113 ; X86:       # %bb.0:
    114 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    115 ; X86-NEXT:    leal (,%ecx,8), %eax
    116 ; X86-NEXT:    subl %ecx, %eax
    117 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    118 ; X86-NEXT:    retl
    119 ;
    120 ; X64-LABEL: test_mul_by_7:
    121 ; X64:       # %bb.0:
    122 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    123 ; X64-NEXT:    leal (,%rdi,8), %eax
    124 ; X64-NEXT:    subl %edi, %eax
    125 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    126 ; X64-NEXT:    retq
    127   %mul = mul nsw i16 %x, 7
    128   ret i16 %mul
    129 }
    130 
    131 define i16 @test_mul_by_8(i16 %x) {
    132 ; X86-LABEL: test_mul_by_8:
    133 ; X86:       # %bb.0:
    134 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    135 ; X86-NEXT:    shll $3, %eax
    136 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    137 ; X86-NEXT:    retl
    138 ;
    139 ; X64-LABEL: test_mul_by_8:
    140 ; X64:       # %bb.0:
    141 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    142 ; X64-NEXT:    leal (,%rdi,8), %eax
    143 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    144 ; X64-NEXT:    retq
    145   %mul = mul nsw i16 %x, 8
    146   ret i16 %mul
    147 }
    148 
    149 define i16 @test_mul_by_9(i16 %x) {
    150 ; X86-LABEL: test_mul_by_9:
    151 ; X86:       # %bb.0:
    152 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    153 ; X86-NEXT:    leal (%eax,%eax,8), %eax
    154 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    155 ; X86-NEXT:    retl
    156 ;
    157 ; X64-LABEL: test_mul_by_9:
    158 ; X64:       # %bb.0:
    159 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    160 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    161 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    162 ; X64-NEXT:    retq
    163   %mul = mul nsw i16 %x, 9
    164   ret i16 %mul
    165 }
    166 
    167 define i16 @test_mul_by_10(i16 %x) {
    168 ; X86-LABEL: test_mul_by_10:
    169 ; X86:       # %bb.0:
    170 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    171 ; X86-NEXT:    addl %eax, %eax
    172 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    173 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    174 ; X86-NEXT:    retl
    175 ;
    176 ; X64-LABEL: test_mul_by_10:
    177 ; X64:       # %bb.0:
    178 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    179 ; X64-NEXT:    addl %edi, %edi
    180 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    181 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    182 ; X64-NEXT:    retq
    183   %mul = mul nsw i16 %x, 10
    184   ret i16 %mul
    185 }
    186 
    187 define i16 @test_mul_by_11(i16 %x) {
    188 ; X86-LABEL: test_mul_by_11:
    189 ; X86:       # %bb.0:
    190 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    191 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    192 ; X86-NEXT:    leal (%eax,%ecx,2), %eax
    193 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    194 ; X86-NEXT:    retl
    195 ;
    196 ; X64-LABEL: test_mul_by_11:
    197 ; X64:       # %bb.0:
    198 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    199 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    200 ; X64-NEXT:    leal (%rdi,%rax,2), %eax
    201 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    202 ; X64-NEXT:    retq
    203   %mul = mul nsw i16 %x, 11
    204   ret i16 %mul
    205 }
    206 
    207 define i16 @test_mul_by_12(i16 %x) {
    208 ; X86-LABEL: test_mul_by_12:
    209 ; X86:       # %bb.0:
    210 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    211 ; X86-NEXT:    shll $2, %eax
    212 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    213 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    214 ; X86-NEXT:    retl
    215 ;
    216 ; X64-LABEL: test_mul_by_12:
    217 ; X64:       # %bb.0:
    218 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    219 ; X64-NEXT:    shll $2, %edi
    220 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
    221 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    222 ; X64-NEXT:    retq
    223   %mul = mul nsw i16 %x, 12
    224   ret i16 %mul
    225 }
    226 
    227 define i16 @test_mul_by_13(i16 %x) {
    228 ; X86-LABEL: test_mul_by_13:
    229 ; X86:       # %bb.0:
    230 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    231 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
    232 ; X86-NEXT:    leal (%eax,%ecx,4), %eax
    233 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    234 ; X86-NEXT:    retl
    235 ;
    236 ; X64-LABEL: test_mul_by_13:
    237 ; X64:       # %bb.0:
    238 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    239 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
    240 ; X64-NEXT:    leal (%rdi,%rax,4), %eax
    241 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    242 ; X64-NEXT:    retq
    243   %mul = mul nsw i16 %x, 13
    244   ret i16 %mul
    245 }
    246 
    247 define i16 @test_mul_by_14(i16 %x) {
    248 ; X86-LABEL: test_mul_by_14:
    249 ; X86:       # %bb.0:
    250 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    251 ; X86-NEXT:    movl %ecx, %eax
    252 ; X86-NEXT:    shll $4, %eax
    253 ; X86-NEXT:    subl %ecx, %eax
    254 ; X86-NEXT:    subl %ecx, %eax
    255 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    256 ; X86-NEXT:    retl
    257 ;
    258 ; X64-LABEL: test_mul_by_14:
    259 ; X64:       # %bb.0:
    260 ; X64-NEXT:    movl %edi, %eax
    261 ; X64-NEXT:    shll $4, %eax
    262 ; X64-NEXT:    subl %edi, %eax
    263 ; X64-NEXT:    subl %edi, %eax
    264 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    265 ; X64-NEXT:    retq
    266   %mul = mul nsw i16 %x, 14
    267   ret i16 %mul
    268 }
    269 
    270 define i16 @test_mul_by_15(i16 %x) {
    271 ; X86-LABEL: test_mul_by_15:
    272 ; X86:       # %bb.0:
    273 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    274 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    275 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    276 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    277 ; X86-NEXT:    retl
    278 ;
    279 ; X64-LABEL: test_mul_by_15:
    280 ; X64:       # %bb.0:
    281 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    282 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    283 ; X64-NEXT:    leal (%rax,%rax,2), %eax
    284 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    285 ; X64-NEXT:    retq
    286   %mul = mul nsw i16 %x, 15
    287   ret i16 %mul
    288 }
    289 
    290 define i16 @test_mul_by_16(i16 %x) {
    291 ; X86-LABEL: test_mul_by_16:
    292 ; X86:       # %bb.0:
    293 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    294 ; X86-NEXT:    shll $4, %eax
    295 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    296 ; X86-NEXT:    retl
    297 ;
    298 ; X64-LABEL: test_mul_by_16:
    299 ; X64:       # %bb.0:
    300 ; X64-NEXT:    shll $4, %edi
    301 ; X64-NEXT:    movl %edi, %eax
    302 ; X64-NEXT:    retq
    303   %mul = mul nsw i16 %x, 16
    304   ret i16 %mul
    305 }
    306 
    307 define i16 @test_mul_by_17(i16 %x) {
    308 ; X86-LABEL: test_mul_by_17:
    309 ; X86:       # %bb.0:
    310 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    311 ; X86-NEXT:    movl %ecx, %eax
    312 ; X86-NEXT:    shll $4, %eax
    313 ; X86-NEXT:    addl %ecx, %eax
    314 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    315 ; X86-NEXT:    retl
    316 ;
    317 ; X64-LABEL: test_mul_by_17:
    318 ; X64:       # %bb.0:
    319 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    320 ; X64-NEXT:    movl %edi, %eax
    321 ; X64-NEXT:    shll $4, %eax
    322 ; X64-NEXT:    leal (%rax,%rdi), %eax
    323 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    324 ; X64-NEXT:    retq
    325   %mul = mul nsw i16 %x, 17
    326   ret i16 %mul
    327 }
    328 
    329 define i16 @test_mul_by_18(i16 %x) {
    330 ; X86-LABEL: test_mul_by_18:
    331 ; X86:       # %bb.0:
    332 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    333 ; X86-NEXT:    addl %eax, %eax
    334 ; X86-NEXT:    leal (%eax,%eax,8), %eax
    335 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    336 ; X86-NEXT:    retl
    337 ;
    338 ; X64-LABEL: test_mul_by_18:
    339 ; X64:       # %bb.0:
    340 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    341 ; X64-NEXT:    addl %edi, %edi
    342 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    343 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    344 ; X64-NEXT:    retq
    345   %mul = mul nsw i16 %x, 18
    346   ret i16 %mul
    347 }
    348 
    349 define i16 @test_mul_by_19(i16 %x) {
    350 ; X86-LABEL: test_mul_by_19:
    351 ; X86:       # %bb.0:
    352 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    353 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    354 ; X86-NEXT:    leal (%eax,%ecx,2), %eax
    355 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    356 ; X86-NEXT:    retl
    357 ;
    358 ; X64-LABEL: test_mul_by_19:
    359 ; X64:       # %bb.0:
    360 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    361 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    362 ; X64-NEXT:    leal (%rdi,%rax,2), %eax
    363 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    364 ; X64-NEXT:    retq
    365   %mul = mul nsw i16 %x, 19
    366   ret i16 %mul
    367 }
    368 
    369 define i16 @test_mul_by_20(i16 %x) {
    370 ; X86-LABEL: test_mul_by_20:
    371 ; X86:       # %bb.0:
    372 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    373 ; X86-NEXT:    shll $2, %eax
    374 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    375 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    376 ; X86-NEXT:    retl
    377 ;
    378 ; X64-LABEL: test_mul_by_20:
    379 ; X64:       # %bb.0:
    380 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    381 ; X64-NEXT:    shll $2, %edi
    382 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    383 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    384 ; X64-NEXT:    retq
    385   %mul = mul nsw i16 %x, 20
    386   ret i16 %mul
    387 }
    388 
    389 define i16 @test_mul_by_21(i16 %x) {
    390 ; X86-LABEL: test_mul_by_21:
    391 ; X86:       # %bb.0:
    392 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    393 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    394 ; X86-NEXT:    leal (%eax,%ecx,4), %eax
    395 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    396 ; X86-NEXT:    retl
    397 ;
    398 ; X64-LABEL: test_mul_by_21:
    399 ; X64:       # %bb.0:
    400 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    401 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    402 ; X64-NEXT:    leal (%rdi,%rax,4), %eax
    403 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    404 ; X64-NEXT:    retq
    405   %mul = mul nsw i16 %x, 21
    406   ret i16 %mul
    407 }
    408 
    409 define i16 @test_mul_by_22(i16 %x) {
    410 ; X86-LABEL: test_mul_by_22:
    411 ; X86:       # %bb.0:
    412 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    413 ; X86-NEXT:    leal (%ecx,%ecx,4), %eax
    414 ; X86-NEXT:    leal (%ecx,%eax,4), %eax
    415 ; X86-NEXT:    addl %ecx, %eax
    416 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    417 ; X86-NEXT:    retl
    418 ;
    419 ; X64-LABEL: test_mul_by_22:
    420 ; X64:       # %bb.0:
    421 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    422 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    423 ; X64-NEXT:    leal (%rdi,%rax,4), %eax
    424 ; X64-NEXT:    addl %edi, %eax
    425 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    426 ; X64-NEXT:    retq
    427   %mul = mul nsw i16 %x, 22
    428   ret i16 %mul
    429 }
    430 
    431 define i16 @test_mul_by_23(i16 %x) {
    432 ; X86-LABEL: test_mul_by_23:
    433 ; X86:       # %bb.0:
    434 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    435 ; X86-NEXT:    leal (%ecx,%ecx,2), %eax
    436 ; X86-NEXT:    shll $3, %eax
    437 ; X86-NEXT:    subl %ecx, %eax
    438 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    439 ; X86-NEXT:    retl
    440 ;
    441 ; X64-LABEL: test_mul_by_23:
    442 ; X64:       # %bb.0:
    443 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    444 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
    445 ; X64-NEXT:    shll $3, %eax
    446 ; X64-NEXT:    subl %edi, %eax
    447 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    448 ; X64-NEXT:    retq
    449   %mul = mul nsw i16 %x, 23
    450   ret i16 %mul
    451 }
    452 
    453 define i16 @test_mul_by_24(i16 %x) {
    454 ; X86-LABEL: test_mul_by_24:
    455 ; X86:       # %bb.0:
    456 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    457 ; X86-NEXT:    shll $3, %eax
    458 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    459 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    460 ; X86-NEXT:    retl
    461 ;
    462 ; X64-LABEL: test_mul_by_24:
    463 ; X64:       # %bb.0:
    464 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    465 ; X64-NEXT:    shll $3, %edi
    466 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
    467 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    468 ; X64-NEXT:    retq
    469   %mul = mul nsw i16 %x, 24
    470   ret i16 %mul
    471 }
    472 
    473 define i16 @test_mul_by_25(i16 %x) {
    474 ; X86-LABEL: test_mul_by_25:
    475 ; X86:       # %bb.0:
    476 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    477 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    478 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    479 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    480 ; X86-NEXT:    retl
    481 ;
    482 ; X64-LABEL: test_mul_by_25:
    483 ; X64:       # %bb.0:
    484 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    485 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    486 ; X64-NEXT:    leal (%rax,%rax,4), %eax
    487 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    488 ; X64-NEXT:    retq
    489   %mul = mul nsw i16 %x, 25
    490   ret i16 %mul
    491 }
    492 
    493 define i16 @test_mul_by_26(i16 %x) {
    494 ; X86-LABEL: test_mul_by_26:
    495 ; X86:       # %bb.0:
    496 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    497 ; X86-NEXT:    leal (%ecx,%ecx,4), %eax
    498 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    499 ; X86-NEXT:    addl %ecx, %eax
    500 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    501 ; X86-NEXT:    retl
    502 ;
    503 ; X64-LABEL: test_mul_by_26:
    504 ; X64:       # %bb.0:
    505 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    506 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    507 ; X64-NEXT:    leal (%rax,%rax,4), %eax
    508 ; X64-NEXT:    addl %edi, %eax
    509 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    510 ; X64-NEXT:    retq
    511   %mul = mul nsw i16 %x, 26
    512   ret i16 %mul
    513 }
    514 
    515 define i16 @test_mul_by_27(i16 %x) {
    516 ; X86-LABEL: test_mul_by_27:
    517 ; X86:       # %bb.0:
    518 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    519 ; X86-NEXT:    leal (%eax,%eax,8), %eax
    520 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    521 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    522 ; X86-NEXT:    retl
    523 ;
    524 ; X64-LABEL: test_mul_by_27:
    525 ; X64:       # %bb.0:
    526 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    527 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    528 ; X64-NEXT:    leal (%rax,%rax,2), %eax
    529 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    530 ; X64-NEXT:    retq
    531   %mul = mul nsw i16 %x, 27
    532   ret i16 %mul
    533 }
    534 
    535 define i16 @test_mul_by_28(i16 %x) {
    536 ; X86-LABEL: test_mul_by_28:
    537 ; X86:       # %bb.0:
    538 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    539 ; X86-NEXT:    leal (%ecx,%ecx,8), %eax
    540 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    541 ; X86-NEXT:    addl %ecx, %eax
    542 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    543 ; X86-NEXT:    retl
    544 ;
    545 ; X64-LABEL: test_mul_by_28:
    546 ; X64:       # %bb.0:
    547 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    548 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    549 ; X64-NEXT:    leal (%rax,%rax,2), %eax
    550 ; X64-NEXT:    addl %edi, %eax
    551 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    552 ; X64-NEXT:    retq
    553   %mul = mul nsw i16 %x, 28
    554   ret i16 %mul
    555 }
    556 
    557 define i16 @test_mul_by_29(i16 %x) {
    558 ; X86-LABEL: test_mul_by_29:
    559 ; X86:       # %bb.0:
    560 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    561 ; X86-NEXT:    leal (%ecx,%ecx,8), %eax
    562 ; X86-NEXT:    leal (%eax,%eax,2), %eax
    563 ; X86-NEXT:    addl %ecx, %eax
    564 ; X86-NEXT:    addl %ecx, %eax
    565 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    566 ; X86-NEXT:    retl
    567 ;
    568 ; X64-LABEL: test_mul_by_29:
    569 ; X64:       # %bb.0:
    570 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    571 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    572 ; X64-NEXT:    leal (%rax,%rax,2), %eax
    573 ; X64-NEXT:    addl %edi, %eax
    574 ; X64-NEXT:    addl %edi, %eax
    575 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    576 ; X64-NEXT:    retq
    577   %mul = mul nsw i16 %x, 29
    578   ret i16 %mul
    579 }
    580 
    581 define i16 @test_mul_by_30(i16 %x) {
    582 ; X86-LABEL: test_mul_by_30:
    583 ; X86:       # %bb.0:
    584 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    585 ; X86-NEXT:    movl %ecx, %eax
    586 ; X86-NEXT:    shll $5, %eax
    587 ; X86-NEXT:    subl %ecx, %eax
    588 ; X86-NEXT:    subl %ecx, %eax
    589 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    590 ; X86-NEXT:    retl
    591 ;
    592 ; X64-LABEL: test_mul_by_30:
    593 ; X64:       # %bb.0:
    594 ; X64-NEXT:    movl %edi, %eax
    595 ; X64-NEXT:    shll $5, %eax
    596 ; X64-NEXT:    subl %edi, %eax
    597 ; X64-NEXT:    subl %edi, %eax
    598 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    599 ; X64-NEXT:    retq
    600   %mul = mul nsw i16 %x, 30
    601   ret i16 %mul
    602 }
    603 
    604 define i16 @test_mul_by_31(i16 %x) {
    605 ; X86-LABEL: test_mul_by_31:
    606 ; X86:       # %bb.0:
    607 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    608 ; X86-NEXT:    movl %ecx, %eax
    609 ; X86-NEXT:    shll $5, %eax
    610 ; X86-NEXT:    subl %ecx, %eax
    611 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    612 ; X86-NEXT:    retl
    613 ;
    614 ; X64-LABEL: test_mul_by_31:
    615 ; X64:       # %bb.0:
    616 ; X64-NEXT:    movl %edi, %eax
    617 ; X64-NEXT:    shll $5, %eax
    618 ; X64-NEXT:    subl %edi, %eax
    619 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    620 ; X64-NEXT:    retq
    621   %mul = mul nsw i16 %x, 31
    622   ret i16 %mul
    623 }
    624 
    625 define i16 @test_mul_by_32(i16 %x) {
    626 ; X86-LABEL: test_mul_by_32:
    627 ; X86:       # %bb.0:
    628 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    629 ; X86-NEXT:    shll $5, %eax
    630 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    631 ; X86-NEXT:    retl
    632 ;
    633 ; X64-LABEL: test_mul_by_32:
    634 ; X64:       # %bb.0:
    635 ; X64-NEXT:    shll $5, %edi
    636 ; X64-NEXT:    movl %edi, %eax
    637 ; X64-NEXT:    retq
    638   %mul = mul nsw i16 %x, 32
    639   ret i16 %mul
    640 }
    641 
    642 define i16 @test_mul_by_37(i16 %x) {
    643 ; X86-LABEL: test_mul_by_37:
    644 ; X86:       # %bb.0:
    645 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    646 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    647 ; X86-NEXT:    leal (%eax,%ecx,4), %eax
    648 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    649 ; X86-NEXT:    retl
    650 ;
    651 ; X64-LABEL: test_mul_by_37:
    652 ; X64:       # %bb.0:
    653 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    654 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    655 ; X64-NEXT:    leal (%rdi,%rax,4), %eax
    656 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    657 ; X64-NEXT:    retq
    658   %mul = mul nsw i16 %x, 37
    659   ret i16 %mul
    660 }
    661 
    662 define i16 @test_mul_by_41(i16 %x) {
    663 ; X86-LABEL: test_mul_by_41:
    664 ; X86:       # %bb.0:
    665 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    666 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    667 ; X86-NEXT:    leal (%eax,%ecx,8), %eax
    668 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    669 ; X86-NEXT:    retl
    670 ;
    671 ; X64-LABEL: test_mul_by_41:
    672 ; X64:       # %bb.0:
    673 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    674 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    675 ; X64-NEXT:    leal (%rdi,%rax,8), %eax
    676 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    677 ; X64-NEXT:    retq
    678   %mul = mul nsw i16 %x, 41
    679   ret i16 %mul
    680 }
    681 
    682 define i16 @test_mul_by_62(i16 %x) {
    683 ; X86-LABEL: test_mul_by_62:
    684 ; X86:       # %bb.0:
    685 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    686 ; X86-NEXT:    movl %ecx, %eax
    687 ; X86-NEXT:    shll $6, %eax
    688 ; X86-NEXT:    subl %ecx, %eax
    689 ; X86-NEXT:    subl %ecx, %eax
    690 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    691 ; X86-NEXT:    retl
    692 ;
    693 ; X64-LABEL: test_mul_by_62:
    694 ; X64:       # %bb.0:
    695 ; X64-NEXT:    movl %edi, %eax
    696 ; X64-NEXT:    shll $6, %eax
    697 ; X64-NEXT:    subl %edi, %eax
    698 ; X64-NEXT:    subl %edi, %eax
    699 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    700 ; X64-NEXT:    retq
    701   %mul = mul nsw i16 %x, 62
    702   ret i16 %mul
    703 }
    704 
    705 define i16 @test_mul_by_66(i16 %x) {
    706 ; X86-LABEL: test_mul_by_66:
    707 ; X86:       # %bb.0:
    708 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    709 ; X86-NEXT:    movl %eax, %ecx
    710 ; X86-NEXT:    shll $6, %ecx
    711 ; X86-NEXT:    leal (%ecx,%eax,2), %eax
    712 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    713 ; X86-NEXT:    retl
    714 ;
    715 ; X64-LABEL: test_mul_by_66:
    716 ; X64:       # %bb.0:
    717 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    718 ; X64-NEXT:    movl %edi, %eax
    719 ; X64-NEXT:    shll $6, %eax
    720 ; X64-NEXT:    leal (%rax,%rdi,2), %eax
    721 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    722 ; X64-NEXT:    retq
    723   %mul = mul nsw i16 %x, 66
    724   ret i16 %mul
    725 }
    726 
    727 define i16 @test_mul_by_73(i16 %x) {
    728 ; X86-LABEL: test_mul_by_73:
    729 ; X86:       # %bb.0:
    730 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    731 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    732 ; X86-NEXT:    leal (%eax,%ecx,8), %eax
    733 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    734 ; X86-NEXT:    retl
    735 ;
    736 ; X64-LABEL: test_mul_by_73:
    737 ; X64:       # %bb.0:
    738 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    739 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    740 ; X64-NEXT:    leal (%rdi,%rax,8), %eax
    741 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    742 ; X64-NEXT:    retq
    743   %mul = mul nsw i16 %x, 73
    744   ret i16 %mul
    745 }
    746 
    747 define i16 @test_mul_by_520(i16 %x) {
    748 ; X86-LABEL: test_mul_by_520:
    749 ; X86:       # %bb.0:
    750 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    751 ; X86-NEXT:    movl %eax, %ecx
    752 ; X86-NEXT:    shll $9, %ecx
    753 ; X86-NEXT:    leal (%ecx,%eax,8), %eax
    754 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    755 ; X86-NEXT:    retl
    756 ;
    757 ; X64-LABEL: test_mul_by_520:
    758 ; X64:       # %bb.0:
    759 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    760 ; X64-NEXT:    movl %edi, %eax
    761 ; X64-NEXT:    shll $9, %eax
    762 ; X64-NEXT:    leal (%rax,%rdi,8), %eax
    763 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    764 ; X64-NEXT:    retq
    765   %mul = mul nsw i16 %x, 520
    766   ret i16 %mul
    767 }
    768 
    769 define i16 @test_mul_by_neg10(i16 %x) {
    770 ; X86-LABEL: test_mul_by_neg10:
    771 ; X86:       # %bb.0:
    772 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    773 ; X86-NEXT:    addl %eax, %eax
    774 ; X86-NEXT:    leal (%eax,%eax,4), %eax
    775 ; X86-NEXT:    negl %eax
    776 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    777 ; X86-NEXT:    retl
    778 ;
    779 ; X64-LABEL: test_mul_by_neg10:
    780 ; X64:       # %bb.0:
    781 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    782 ; X64-NEXT:    addl %edi, %edi
    783 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
    784 ; X64-NEXT:    negl %eax
    785 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    786 ; X64-NEXT:    retq
    787   %mul = mul nsw i16 %x, -10
    788   ret i16 %mul
    789 }
    790 
    791 define i16 @test_mul_by_neg36(i16 %x) {
    792 ; X86-LABEL: test_mul_by_neg36:
    793 ; X86:       # %bb.0:
    794 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    795 ; X86-NEXT:    shll $2, %eax
    796 ; X86-NEXT:    leal (%eax,%eax,8), %eax
    797 ; X86-NEXT:    negl %eax
    798 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    799 ; X86-NEXT:    retl
    800 ;
    801 ; X64-LABEL: test_mul_by_neg36:
    802 ; X64:       # %bb.0:
    803 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    804 ; X64-NEXT:    shll $2, %edi
    805 ; X64-NEXT:    leal (%rdi,%rdi,8), %eax
    806 ; X64-NEXT:    negl %eax
    807 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    808 ; X64-NEXT:    retq
    809   %mul = mul nsw i16 %x, -36
    810   ret i16 %mul
    811 }
    812 
    813 ; (x*9+42)*(x*5+2)
    814 define i16 @test_mul_spec(i16 %x) nounwind {
    815 ; X86-LABEL: test_mul_spec:
    816 ; X86:       # %bb.0:
    817 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    818 ; X86-NEXT:    leal 42(%eax,%eax,8), %ecx
    819 ; X86-NEXT:    leal 2(%eax,%eax,4), %eax
    820 ; X86-NEXT:    imull %ecx, %eax
    821 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
    822 ; X86-NEXT:    retl
    823 ;
    824 ; X64-LABEL: test_mul_spec:
    825 ; X64:       # %bb.0:
    826 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
    827 ; X64-NEXT:    leal 42(%rdi,%rdi,8), %ecx
    828 ; X64-NEXT:    leal 2(%rdi,%rdi,4), %eax
    829 ; X64-NEXT:    imull %ecx, %eax
    830 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
    831 ; X64-NEXT:    retq
    832   %mul = mul nsw i16 %x, 9
    833   %add = add nsw i16 %mul, 42
    834   %mul2 = mul nsw i16 %x, 5
    835   %add2 = add nsw i16 %mul2, 2
    836   %mul3 = mul nsw i16 %add, %add2
    837   ret i16 %mul3
    838 }
    839