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 -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=X64-HSW
      4 ; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=X64-JAG
      5 ; RUN: llc < %s -mtriple=i686-unknown -mul-constant-optimization=false | FileCheck %s --check-prefix=X86-NOOPT
      6 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=HSW-NOOPT
      7 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=JAG-NOOPT
      8 ; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=X64-SLM
      9 ; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=SLM-NOOPT
     10 
     11 define i64 @test_mul_by_1(i64 %x) nounwind {
     12 ; X86-LABEL: test_mul_by_1:
     13 ; X86:       # %bb.0:
     14 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     15 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
     16 ; X86-NEXT:    retl
     17 ;
     18 ; X64-HSW-LABEL: test_mul_by_1:
     19 ; X64-HSW:       # %bb.0:
     20 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
     21 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
     22 ;
     23 ; X64-JAG-LABEL: test_mul_by_1:
     24 ; X64-JAG:       # %bb.0:
     25 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
     26 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
     27 ;
     28 ; X86-NOOPT-LABEL: test_mul_by_1:
     29 ; X86-NOOPT:       # %bb.0:
     30 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
     31 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
     32 ; X86-NOOPT-NEXT:    retl
     33 ;
     34 ; HSW-NOOPT-LABEL: test_mul_by_1:
     35 ; HSW-NOOPT:       # %bb.0:
     36 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
     37 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
     38 ;
     39 ; JAG-NOOPT-LABEL: test_mul_by_1:
     40 ; JAG-NOOPT:       # %bb.0:
     41 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
     42 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
     43 ;
     44 ; X64-SLM-LABEL: test_mul_by_1:
     45 ; X64-SLM:       # %bb.0:
     46 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
     47 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
     48 ;
     49 ; SLM-NOOPT-LABEL: test_mul_by_1:
     50 ; SLM-NOOPT:       # %bb.0:
     51 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
     52 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
     53   %mul = mul nsw i64 %x, 1
     54   ret i64 %mul
     55 }
     56 
     57 define i64 @test_mul_by_2(i64 %x) {
     58 ; X86-LABEL: test_mul_by_2:
     59 ; X86:       # %bb.0:
     60 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
     61 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
     62 ; X86-NEXT:    shldl $1, %eax, %edx
     63 ; X86-NEXT:    addl %eax, %eax
     64 ; X86-NEXT:    retl
     65 ;
     66 ; X64-HSW-LABEL: test_mul_by_2:
     67 ; X64-HSW:       # %bb.0:
     68 ; X64-HSW-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
     69 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
     70 ;
     71 ; X64-JAG-LABEL: test_mul_by_2:
     72 ; X64-JAG:       # %bb.0:
     73 ; X64-JAG-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
     74 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
     75 ;
     76 ; X86-NOOPT-LABEL: test_mul_by_2:
     77 ; X86-NOOPT:       # %bb.0:
     78 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
     79 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
     80 ; X86-NOOPT-NEXT:    shldl $1, %eax, %edx
     81 ; X86-NOOPT-NEXT:    addl %eax, %eax
     82 ; X86-NOOPT-NEXT:    retl
     83 ;
     84 ; HSW-NOOPT-LABEL: test_mul_by_2:
     85 ; HSW-NOOPT:       # %bb.0:
     86 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
     87 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
     88 ;
     89 ; JAG-NOOPT-LABEL: test_mul_by_2:
     90 ; JAG-NOOPT:       # %bb.0:
     91 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:0.50]
     92 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
     93 ;
     94 ; X64-SLM-LABEL: test_mul_by_2:
     95 ; X64-SLM:       # %bb.0:
     96 ; X64-SLM-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:1.00]
     97 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
     98 ;
     99 ; SLM-NOOPT-LABEL: test_mul_by_2:
    100 ; SLM-NOOPT:       # %bb.0:
    101 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi), %rax # sched: [1:1.00]
    102 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    103   %mul = mul nsw i64 %x, 2
    104   ret i64 %mul
    105 }
    106 
    107 define i64 @test_mul_by_3(i64 %x) {
    108 ; X86-LABEL: test_mul_by_3:
    109 ; X86:       # %bb.0:
    110 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    111 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
    112 ; X86-NEXT:    movl $3, %eax
    113 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    114 ; X86-NEXT:    addl %ecx, %edx
    115 ; X86-NEXT:    retl
    116 ;
    117 ; X64-HSW-LABEL: test_mul_by_3:
    118 ; X64-HSW:       # %bb.0:
    119 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    120 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    121 ;
    122 ; X64-JAG-LABEL: test_mul_by_3:
    123 ; X64-JAG:       # %bb.0:
    124 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    125 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    126 ;
    127 ; X86-NOOPT-LABEL: test_mul_by_3:
    128 ; X86-NOOPT:       # %bb.0:
    129 ; X86-NOOPT-NEXT:    movl $3, %eax
    130 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    131 ; X86-NOOPT-NEXT:    imull $3, {{[0-9]+}}(%esp), %ecx
    132 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    133 ; X86-NOOPT-NEXT:    retl
    134 ;
    135 ; HSW-NOOPT-LABEL: test_mul_by_3:
    136 ; HSW-NOOPT:       # %bb.0:
    137 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    138 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    139 ;
    140 ; JAG-NOOPT-LABEL: test_mul_by_3:
    141 ; JAG-NOOPT:       # %bb.0:
    142 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    143 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    144 ;
    145 ; X64-SLM-LABEL: test_mul_by_3:
    146 ; X64-SLM:       # %bb.0:
    147 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    148 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    149 ;
    150 ; SLM-NOOPT-LABEL: test_mul_by_3:
    151 ; SLM-NOOPT:       # %bb.0:
    152 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    153 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    154   %mul = mul nsw i64 %x, 3
    155   ret i64 %mul
    156 }
    157 
    158 define i64 @test_mul_by_4(i64 %x) {
    159 ; X86-LABEL: test_mul_by_4:
    160 ; X86:       # %bb.0:
    161 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    162 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    163 ; X86-NEXT:    shldl $2, %eax, %edx
    164 ; X86-NEXT:    shll $2, %eax
    165 ; X86-NEXT:    retl
    166 ;
    167 ; X64-HSW-LABEL: test_mul_by_4:
    168 ; X64-HSW:       # %bb.0:
    169 ; X64-HSW-NEXT:    leaq (,%rdi,4), %rax # sched: [1:0.50]
    170 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    171 ;
    172 ; X64-JAG-LABEL: test_mul_by_4:
    173 ; X64-JAG:       # %bb.0:
    174 ; X64-JAG-NEXT:    leaq (,%rdi,4), %rax # sched: [2:1.00]
    175 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    176 ;
    177 ; X86-NOOPT-LABEL: test_mul_by_4:
    178 ; X86-NOOPT:       # %bb.0:
    179 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
    180 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
    181 ; X86-NOOPT-NEXT:    shldl $2, %eax, %edx
    182 ; X86-NOOPT-NEXT:    shll $2, %eax
    183 ; X86-NOOPT-NEXT:    retl
    184 ;
    185 ; HSW-NOOPT-LABEL: test_mul_by_4:
    186 ; HSW-NOOPT:       # %bb.0:
    187 ; HSW-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [1:0.50]
    188 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    189 ;
    190 ; JAG-NOOPT-LABEL: test_mul_by_4:
    191 ; JAG-NOOPT:       # %bb.0:
    192 ; JAG-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [2:1.00]
    193 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    194 ;
    195 ; X64-SLM-LABEL: test_mul_by_4:
    196 ; X64-SLM:       # %bb.0:
    197 ; X64-SLM-NEXT:    leaq (,%rdi,4), %rax # sched: [1:1.00]
    198 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    199 ;
    200 ; SLM-NOOPT-LABEL: test_mul_by_4:
    201 ; SLM-NOOPT:       # %bb.0:
    202 ; SLM-NOOPT-NEXT:    leaq (,%rdi,4), %rax # sched: [1:1.00]
    203 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    204   %mul = mul nsw i64 %x, 4
    205   ret i64 %mul
    206 }
    207 
    208 define i64 @test_mul_by_5(i64 %x) {
    209 ; X86-LABEL: test_mul_by_5:
    210 ; X86:       # %bb.0:
    211 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    212 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    213 ; X86-NEXT:    movl $5, %eax
    214 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    215 ; X86-NEXT:    addl %ecx, %edx
    216 ; X86-NEXT:    retl
    217 ;
    218 ; X64-HSW-LABEL: test_mul_by_5:
    219 ; X64-HSW:       # %bb.0:
    220 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
    221 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    222 ;
    223 ; X64-JAG-LABEL: test_mul_by_5:
    224 ; X64-JAG:       # %bb.0:
    225 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
    226 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    227 ;
    228 ; X86-NOOPT-LABEL: test_mul_by_5:
    229 ; X86-NOOPT:       # %bb.0:
    230 ; X86-NOOPT-NEXT:    movl $5, %eax
    231 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    232 ; X86-NOOPT-NEXT:    imull $5, {{[0-9]+}}(%esp), %ecx
    233 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    234 ; X86-NOOPT-NEXT:    retl
    235 ;
    236 ; HSW-NOOPT-LABEL: test_mul_by_5:
    237 ; HSW-NOOPT:       # %bb.0:
    238 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
    239 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    240 ;
    241 ; JAG-NOOPT-LABEL: test_mul_by_5:
    242 ; JAG-NOOPT:       # %bb.0:
    243 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
    244 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    245 ;
    246 ; X64-SLM-LABEL: test_mul_by_5:
    247 ; X64-SLM:       # %bb.0:
    248 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
    249 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    250 ;
    251 ; SLM-NOOPT-LABEL: test_mul_by_5:
    252 ; SLM-NOOPT:       # %bb.0:
    253 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
    254 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    255   %mul = mul nsw i64 %x, 5
    256   ret i64 %mul
    257 }
    258 
    259 define i64 @test_mul_by_6(i64 %x) {
    260 ; X86-LABEL: test_mul_by_6:
    261 ; X86:       # %bb.0:
    262 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    263 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
    264 ; X86-NEXT:    movl $6, %eax
    265 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    266 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
    267 ; X86-NEXT:    retl
    268 ;
    269 ; X64-HSW-LABEL: test_mul_by_6:
    270 ; X64-HSW:       # %bb.0:
    271 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
    272 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    273 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    274 ;
    275 ; X64-JAG-LABEL: test_mul_by_6:
    276 ; X64-JAG:       # %bb.0:
    277 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    278 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    279 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    280 ;
    281 ; X86-NOOPT-LABEL: test_mul_by_6:
    282 ; X86-NOOPT:       # %bb.0:
    283 ; X86-NOOPT-NEXT:    movl $6, %eax
    284 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    285 ; X86-NOOPT-NEXT:    imull $6, {{[0-9]+}}(%esp), %ecx
    286 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    287 ; X86-NOOPT-NEXT:    retl
    288 ;
    289 ; HSW-NOOPT-LABEL: test_mul_by_6:
    290 ; HSW-NOOPT:       # %bb.0:
    291 ; HSW-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [3:1.00]
    292 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    293 ;
    294 ; JAG-NOOPT-LABEL: test_mul_by_6:
    295 ; JAG-NOOPT:       # %bb.0:
    296 ; JAG-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [6:4.00]
    297 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    298 ;
    299 ; X64-SLM-LABEL: test_mul_by_6:
    300 ; X64-SLM:       # %bb.0:
    301 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    302 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    303 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    304 ;
    305 ; SLM-NOOPT-LABEL: test_mul_by_6:
    306 ; SLM-NOOPT:       # %bb.0:
    307 ; SLM-NOOPT-NEXT:    imulq $6, %rdi, %rax # sched: [3:1.00]
    308 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    309   %mul = mul nsw i64 %x, 6
    310   ret i64 %mul
    311 }
    312 
    313 define i64 @test_mul_by_7(i64 %x) {
    314 ; X86-LABEL: test_mul_by_7:
    315 ; X86:       # %bb.0:
    316 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    317 ; X86-NEXT:    leal (,%eax,8), %ecx
    318 ; X86-NEXT:    subl %eax, %ecx
    319 ; X86-NEXT:    movl $7, %eax
    320 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    321 ; X86-NEXT:    addl %ecx, %edx
    322 ; X86-NEXT:    retl
    323 ;
    324 ; X64-HSW-LABEL: test_mul_by_7:
    325 ; X64-HSW:       # %bb.0:
    326 ; X64-HSW-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
    327 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
    328 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    329 ;
    330 ; X64-JAG-LABEL: test_mul_by_7:
    331 ; X64-JAG:       # %bb.0:
    332 ; X64-JAG-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
    333 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    334 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    335 ;
    336 ; X86-NOOPT-LABEL: test_mul_by_7:
    337 ; X86-NOOPT:       # %bb.0:
    338 ; X86-NOOPT-NEXT:    movl $7, %eax
    339 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    340 ; X86-NOOPT-NEXT:    imull $7, {{[0-9]+}}(%esp), %ecx
    341 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    342 ; X86-NOOPT-NEXT:    retl
    343 ;
    344 ; HSW-NOOPT-LABEL: test_mul_by_7:
    345 ; HSW-NOOPT:       # %bb.0:
    346 ; HSW-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [3:1.00]
    347 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    348 ;
    349 ; JAG-NOOPT-LABEL: test_mul_by_7:
    350 ; JAG-NOOPT:       # %bb.0:
    351 ; JAG-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [6:4.00]
    352 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    353 ;
    354 ; X64-SLM-LABEL: test_mul_by_7:
    355 ; X64-SLM:       # %bb.0:
    356 ; X64-SLM-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
    357 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    358 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    359 ;
    360 ; SLM-NOOPT-LABEL: test_mul_by_7:
    361 ; SLM-NOOPT:       # %bb.0:
    362 ; SLM-NOOPT-NEXT:    imulq $7, %rdi, %rax # sched: [3:1.00]
    363 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    364   %mul = mul nsw i64 %x, 7
    365   ret i64 %mul
    366 }
    367 
    368 define i64 @test_mul_by_8(i64 %x) {
    369 ; X86-LABEL: test_mul_by_8:
    370 ; X86:       # %bb.0:
    371 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    372 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    373 ; X86-NEXT:    shldl $3, %eax, %edx
    374 ; X86-NEXT:    shll $3, %eax
    375 ; X86-NEXT:    retl
    376 ;
    377 ; X64-HSW-LABEL: test_mul_by_8:
    378 ; X64-HSW:       # %bb.0:
    379 ; X64-HSW-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
    380 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    381 ;
    382 ; X64-JAG-LABEL: test_mul_by_8:
    383 ; X64-JAG:       # %bb.0:
    384 ; X64-JAG-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
    385 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    386 ;
    387 ; X86-NOOPT-LABEL: test_mul_by_8:
    388 ; X86-NOOPT:       # %bb.0:
    389 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
    390 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
    391 ; X86-NOOPT-NEXT:    shldl $3, %eax, %edx
    392 ; X86-NOOPT-NEXT:    shll $3, %eax
    393 ; X86-NOOPT-NEXT:    retl
    394 ;
    395 ; HSW-NOOPT-LABEL: test_mul_by_8:
    396 ; HSW-NOOPT:       # %bb.0:
    397 ; HSW-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [1:0.50]
    398 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    399 ;
    400 ; JAG-NOOPT-LABEL: test_mul_by_8:
    401 ; JAG-NOOPT:       # %bb.0:
    402 ; JAG-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [2:1.00]
    403 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    404 ;
    405 ; X64-SLM-LABEL: test_mul_by_8:
    406 ; X64-SLM:       # %bb.0:
    407 ; X64-SLM-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
    408 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    409 ;
    410 ; SLM-NOOPT-LABEL: test_mul_by_8:
    411 ; SLM-NOOPT:       # %bb.0:
    412 ; SLM-NOOPT-NEXT:    leaq (,%rdi,8), %rax # sched: [1:1.00]
    413 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    414   %mul = mul nsw i64 %x, 8
    415   ret i64 %mul
    416 }
    417 
    418 define i64 @test_mul_by_9(i64 %x) {
    419 ; X86-LABEL: test_mul_by_9:
    420 ; X86:       # %bb.0:
    421 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    422 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    423 ; X86-NEXT:    movl $9, %eax
    424 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    425 ; X86-NEXT:    addl %ecx, %edx
    426 ; X86-NEXT:    retl
    427 ;
    428 ; X64-HSW-LABEL: test_mul_by_9:
    429 ; X64-HSW:       # %bb.0:
    430 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    431 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    432 ;
    433 ; X64-JAG-LABEL: test_mul_by_9:
    434 ; X64-JAG:       # %bb.0:
    435 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
    436 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    437 ;
    438 ; X86-NOOPT-LABEL: test_mul_by_9:
    439 ; X86-NOOPT:       # %bb.0:
    440 ; X86-NOOPT-NEXT:    movl $9, %eax
    441 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    442 ; X86-NOOPT-NEXT:    imull $9, {{[0-9]+}}(%esp), %ecx
    443 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    444 ; X86-NOOPT-NEXT:    retl
    445 ;
    446 ; HSW-NOOPT-LABEL: test_mul_by_9:
    447 ; HSW-NOOPT:       # %bb.0:
    448 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    449 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    450 ;
    451 ; JAG-NOOPT-LABEL: test_mul_by_9:
    452 ; JAG-NOOPT:       # %bb.0:
    453 ; JAG-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
    454 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    455 ;
    456 ; X64-SLM-LABEL: test_mul_by_9:
    457 ; X64-SLM:       # %bb.0:
    458 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
    459 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    460 ;
    461 ; SLM-NOOPT-LABEL: test_mul_by_9:
    462 ; SLM-NOOPT:       # %bb.0:
    463 ; SLM-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
    464 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    465   %mul = mul nsw i64 %x, 9
    466   ret i64 %mul
    467 }
    468 
    469 define i64 @test_mul_by_10(i64 %x) {
    470 ; X86-LABEL: test_mul_by_10:
    471 ; X86:       # %bb.0:
    472 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    473 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    474 ; X86-NEXT:    movl $10, %eax
    475 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    476 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
    477 ; X86-NEXT:    retl
    478 ;
    479 ; X64-HSW-LABEL: test_mul_by_10:
    480 ; X64-HSW:       # %bb.0:
    481 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
    482 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
    483 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    484 ;
    485 ; X64-JAG-LABEL: test_mul_by_10:
    486 ; X64-JAG:       # %bb.0:
    487 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    488 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
    489 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    490 ;
    491 ; X86-NOOPT-LABEL: test_mul_by_10:
    492 ; X86-NOOPT:       # %bb.0:
    493 ; X86-NOOPT-NEXT:    movl $10, %eax
    494 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    495 ; X86-NOOPT-NEXT:    imull $10, {{[0-9]+}}(%esp), %ecx
    496 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    497 ; X86-NOOPT-NEXT:    retl
    498 ;
    499 ; HSW-NOOPT-LABEL: test_mul_by_10:
    500 ; HSW-NOOPT:       # %bb.0:
    501 ; HSW-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [3:1.00]
    502 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    503 ;
    504 ; JAG-NOOPT-LABEL: test_mul_by_10:
    505 ; JAG-NOOPT:       # %bb.0:
    506 ; JAG-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [6:4.00]
    507 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    508 ;
    509 ; X64-SLM-LABEL: test_mul_by_10:
    510 ; X64-SLM:       # %bb.0:
    511 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    512 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
    513 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    514 ;
    515 ; SLM-NOOPT-LABEL: test_mul_by_10:
    516 ; SLM-NOOPT:       # %bb.0:
    517 ; SLM-NOOPT-NEXT:    imulq $10, %rdi, %rax # sched: [3:1.00]
    518 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    519   %mul = mul nsw i64 %x, 10
    520   ret i64 %mul
    521 }
    522 
    523 define i64 @test_mul_by_11(i64 %x) {
    524 ; X86-LABEL: test_mul_by_11:
    525 ; X86:       # %bb.0:
    526 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    527 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
    528 ; X86-NEXT:    leal (%eax,%ecx,2), %ecx
    529 ; X86-NEXT:    movl $11, %eax
    530 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    531 ; X86-NEXT:    addl %ecx, %edx
    532 ; X86-NEXT:    retl
    533 ;
    534 ; X64-HSW-LABEL: test_mul_by_11:
    535 ; X64-HSW:       # %bb.0:
    536 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
    537 ; X64-HSW-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [1:0.50]
    538 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    539 ;
    540 ; X64-JAG-LABEL: test_mul_by_11:
    541 ; X64-JAG:       # %bb.0:
    542 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
    543 ; X64-JAG-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [2:1.00]
    544 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    545 ;
    546 ; X86-NOOPT-LABEL: test_mul_by_11:
    547 ; X86-NOOPT:       # %bb.0:
    548 ; X86-NOOPT-NEXT:    movl $11, %eax
    549 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    550 ; X86-NOOPT-NEXT:    imull $11, {{[0-9]+}}(%esp), %ecx
    551 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    552 ; X86-NOOPT-NEXT:    retl
    553 ;
    554 ; HSW-NOOPT-LABEL: test_mul_by_11:
    555 ; HSW-NOOPT:       # %bb.0:
    556 ; HSW-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
    557 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    558 ;
    559 ; JAG-NOOPT-LABEL: test_mul_by_11:
    560 ; JAG-NOOPT:       # %bb.0:
    561 ; JAG-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [6:4.00]
    562 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    563 ;
    564 ; X64-SLM-LABEL: test_mul_by_11:
    565 ; X64-SLM:       # %bb.0:
    566 ; X64-SLM-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
    567 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    568 ;
    569 ; SLM-NOOPT-LABEL: test_mul_by_11:
    570 ; SLM-NOOPT:       # %bb.0:
    571 ; SLM-NOOPT-NEXT:    imulq $11, %rdi, %rax # sched: [3:1.00]
    572 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    573   %mul = mul nsw i64 %x, 11
    574   ret i64 %mul
    575 }
    576 
    577 define i64 @test_mul_by_12(i64 %x) {
    578 ; X86-LABEL: test_mul_by_12:
    579 ; X86:       # %bb.0:
    580 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    581 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
    582 ; X86-NEXT:    movl $12, %eax
    583 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    584 ; X86-NEXT:    leal (%edx,%ecx,4), %edx
    585 ; X86-NEXT:    retl
    586 ;
    587 ; X64-HSW-LABEL: test_mul_by_12:
    588 ; X64-HSW:       # %bb.0:
    589 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
    590 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    591 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    592 ;
    593 ; X64-JAG-LABEL: test_mul_by_12:
    594 ; X64-JAG:       # %bb.0:
    595 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
    596 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    597 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    598 ;
    599 ; X86-NOOPT-LABEL: test_mul_by_12:
    600 ; X86-NOOPT:       # %bb.0:
    601 ; X86-NOOPT-NEXT:    movl $12, %eax
    602 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    603 ; X86-NOOPT-NEXT:    imull $12, {{[0-9]+}}(%esp), %ecx
    604 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    605 ; X86-NOOPT-NEXT:    retl
    606 ;
    607 ; HSW-NOOPT-LABEL: test_mul_by_12:
    608 ; HSW-NOOPT:       # %bb.0:
    609 ; HSW-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [3:1.00]
    610 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    611 ;
    612 ; JAG-NOOPT-LABEL: test_mul_by_12:
    613 ; JAG-NOOPT:       # %bb.0:
    614 ; JAG-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [6:4.00]
    615 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    616 ;
    617 ; X64-SLM-LABEL: test_mul_by_12:
    618 ; X64-SLM:       # %bb.0:
    619 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
    620 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    621 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    622 ;
    623 ; SLM-NOOPT-LABEL: test_mul_by_12:
    624 ; SLM-NOOPT:       # %bb.0:
    625 ; SLM-NOOPT-NEXT:    imulq $12, %rdi, %rax # sched: [3:1.00]
    626 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    627   %mul = mul nsw i64 %x, 12
    628   ret i64 %mul
    629 }
    630 
    631 define i64 @test_mul_by_13(i64 %x) {
    632 ; X86-LABEL: test_mul_by_13:
    633 ; X86:       # %bb.0:
    634 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    635 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
    636 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
    637 ; X86-NEXT:    movl $13, %eax
    638 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    639 ; X86-NEXT:    addl %ecx, %edx
    640 ; X86-NEXT:    retl
    641 ;
    642 ; X64-HSW-LABEL: test_mul_by_13:
    643 ; X64-HSW:       # %bb.0:
    644 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    645 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
    646 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    647 ;
    648 ; X64-JAG-LABEL: test_mul_by_13:
    649 ; X64-JAG:       # %bb.0:
    650 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    651 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
    652 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    653 ;
    654 ; X86-NOOPT-LABEL: test_mul_by_13:
    655 ; X86-NOOPT:       # %bb.0:
    656 ; X86-NOOPT-NEXT:    movl $13, %eax
    657 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    658 ; X86-NOOPT-NEXT:    imull $13, {{[0-9]+}}(%esp), %ecx
    659 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    660 ; X86-NOOPT-NEXT:    retl
    661 ;
    662 ; HSW-NOOPT-LABEL: test_mul_by_13:
    663 ; HSW-NOOPT:       # %bb.0:
    664 ; HSW-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
    665 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    666 ;
    667 ; JAG-NOOPT-LABEL: test_mul_by_13:
    668 ; JAG-NOOPT:       # %bb.0:
    669 ; JAG-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [6:4.00]
    670 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    671 ;
    672 ; X64-SLM-LABEL: test_mul_by_13:
    673 ; X64-SLM:       # %bb.0:
    674 ; X64-SLM-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
    675 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    676 ;
    677 ; SLM-NOOPT-LABEL: test_mul_by_13:
    678 ; SLM-NOOPT:       # %bb.0:
    679 ; SLM-NOOPT-NEXT:    imulq $13, %rdi, %rax # sched: [3:1.00]
    680 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    681   %mul = mul nsw i64 %x, 13
    682   ret i64 %mul
    683 }
    684 
    685 define i64 @test_mul_by_14(i64 %x) {
    686 ; X86-LABEL: test_mul_by_14:
    687 ; X86:       # %bb.0:
    688 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    689 ; X86-NEXT:    movl %eax, %ecx
    690 ; X86-NEXT:    shll $4, %ecx
    691 ; X86-NEXT:    subl %eax, %ecx
    692 ; X86-NEXT:    subl %eax, %ecx
    693 ; X86-NEXT:    movl $14, %eax
    694 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    695 ; X86-NEXT:    addl %ecx, %edx
    696 ; X86-NEXT:    retl
    697 ;
    698 ; X64-HSW-LABEL: test_mul_by_14:
    699 ; X64-HSW:       # %bb.0:
    700 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
    701 ; X64-HSW-NEXT:    shlq $4, %rax # sched: [1:0.50]
    702 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
    703 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
    704 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    705 ;
    706 ; X64-JAG-LABEL: test_mul_by_14:
    707 ; X64-JAG:       # %bb.0:
    708 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    709 ; X64-JAG-NEXT:    shlq $4, %rax # sched: [1:0.50]
    710 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    711 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    712 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    713 ;
    714 ; X86-NOOPT-LABEL: test_mul_by_14:
    715 ; X86-NOOPT:       # %bb.0:
    716 ; X86-NOOPT-NEXT:    movl $14, %eax
    717 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    718 ; X86-NOOPT-NEXT:    imull $14, {{[0-9]+}}(%esp), %ecx
    719 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    720 ; X86-NOOPT-NEXT:    retl
    721 ;
    722 ; HSW-NOOPT-LABEL: test_mul_by_14:
    723 ; HSW-NOOPT:       # %bb.0:
    724 ; HSW-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [3:1.00]
    725 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    726 ;
    727 ; JAG-NOOPT-LABEL: test_mul_by_14:
    728 ; JAG-NOOPT:       # %bb.0:
    729 ; JAG-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [6:4.00]
    730 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    731 ;
    732 ; X64-SLM-LABEL: test_mul_by_14:
    733 ; X64-SLM:       # %bb.0:
    734 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    735 ; X64-SLM-NEXT:    shlq $4, %rax # sched: [1:1.00]
    736 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    737 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
    738 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    739 ;
    740 ; SLM-NOOPT-LABEL: test_mul_by_14:
    741 ; SLM-NOOPT:       # %bb.0:
    742 ; SLM-NOOPT-NEXT:    imulq $14, %rdi, %rax # sched: [3:1.00]
    743 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    744   %mul = mul nsw i64 %x, 14
    745   ret i64 %mul
    746 }
    747 
    748 define i64 @test_mul_by_15(i64 %x) {
    749 ; X86-LABEL: test_mul_by_15:
    750 ; X86:       # %bb.0:
    751 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    752 ; X86-NEXT:    movl $15, %eax
    753 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    754 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
    755 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
    756 ; X86-NEXT:    addl %ecx, %edx
    757 ; X86-NEXT:    retl
    758 ;
    759 ; X64-HSW-LABEL: test_mul_by_15:
    760 ; X64-HSW:       # %bb.0:
    761 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
    762 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
    763 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    764 ;
    765 ; X64-JAG-LABEL: test_mul_by_15:
    766 ; X64-JAG:       # %bb.0:
    767 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
    768 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
    769 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    770 ;
    771 ; X86-NOOPT-LABEL: test_mul_by_15:
    772 ; X86-NOOPT:       # %bb.0:
    773 ; X86-NOOPT-NEXT:    movl $15, %eax
    774 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    775 ; X86-NOOPT-NEXT:    imull $15, {{[0-9]+}}(%esp), %ecx
    776 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    777 ; X86-NOOPT-NEXT:    retl
    778 ;
    779 ; HSW-NOOPT-LABEL: test_mul_by_15:
    780 ; HSW-NOOPT:       # %bb.0:
    781 ; HSW-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [3:1.00]
    782 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    783 ;
    784 ; JAG-NOOPT-LABEL: test_mul_by_15:
    785 ; JAG-NOOPT:       # %bb.0:
    786 ; JAG-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [6:4.00]
    787 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    788 ;
    789 ; X64-SLM-LABEL: test_mul_by_15:
    790 ; X64-SLM:       # %bb.0:
    791 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
    792 ; X64-SLM-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:1.00]
    793 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    794 ;
    795 ; SLM-NOOPT-LABEL: test_mul_by_15:
    796 ; SLM-NOOPT:       # %bb.0:
    797 ; SLM-NOOPT-NEXT:    imulq $15, %rdi, %rax # sched: [3:1.00]
    798 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    799   %mul = mul nsw i64 %x, 15
    800   ret i64 %mul
    801 }
    802 
    803 define i64 @test_mul_by_16(i64 %x) {
    804 ; X86-LABEL: test_mul_by_16:
    805 ; X86:       # %bb.0:
    806 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    807 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    808 ; X86-NEXT:    shldl $4, %eax, %edx
    809 ; X86-NEXT:    shll $4, %eax
    810 ; X86-NEXT:    retl
    811 ;
    812 ; X64-HSW-LABEL: test_mul_by_16:
    813 ; X64-HSW:       # %bb.0:
    814 ; X64-HSW-NEXT:    shlq $4, %rdi # sched: [1:0.50]
    815 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
    816 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    817 ;
    818 ; X64-JAG-LABEL: test_mul_by_16:
    819 ; X64-JAG:       # %bb.0:
    820 ; X64-JAG-NEXT:    shlq $4, %rdi # sched: [1:0.50]
    821 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    822 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    823 ;
    824 ; X86-NOOPT-LABEL: test_mul_by_16:
    825 ; X86-NOOPT:       # %bb.0:
    826 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
    827 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
    828 ; X86-NOOPT-NEXT:    shldl $4, %eax, %edx
    829 ; X86-NOOPT-NEXT:    shll $4, %eax
    830 ; X86-NOOPT-NEXT:    retl
    831 ;
    832 ; HSW-NOOPT-LABEL: test_mul_by_16:
    833 ; HSW-NOOPT:       # %bb.0:
    834 ; HSW-NOOPT-NEXT:    shlq $4, %rdi # sched: [1:0.50]
    835 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
    836 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    837 ;
    838 ; JAG-NOOPT-LABEL: test_mul_by_16:
    839 ; JAG-NOOPT:       # %bb.0:
    840 ; JAG-NOOPT-NEXT:    shlq $4, %rdi # sched: [1:0.50]
    841 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    842 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    843 ;
    844 ; X64-SLM-LABEL: test_mul_by_16:
    845 ; X64-SLM:       # %bb.0:
    846 ; X64-SLM-NEXT:    shlq $4, %rdi # sched: [1:1.00]
    847 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    848 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    849 ;
    850 ; SLM-NOOPT-LABEL: test_mul_by_16:
    851 ; SLM-NOOPT:       # %bb.0:
    852 ; SLM-NOOPT-NEXT:    shlq $4, %rdi # sched: [1:1.00]
    853 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    854 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    855   %mul = mul nsw i64 %x, 16
    856   ret i64 %mul
    857 }
    858 
    859 define i64 @test_mul_by_17(i64 %x) {
    860 ; X86-LABEL: test_mul_by_17:
    861 ; X86:       # %bb.0:
    862 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    863 ; X86-NEXT:    movl %eax, %ecx
    864 ; X86-NEXT:    shll $4, %ecx
    865 ; X86-NEXT:    addl %eax, %ecx
    866 ; X86-NEXT:    movl $17, %eax
    867 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    868 ; X86-NEXT:    addl %ecx, %edx
    869 ; X86-NEXT:    retl
    870 ;
    871 ; X64-HSW-LABEL: test_mul_by_17:
    872 ; X64-HSW:       # %bb.0:
    873 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
    874 ; X64-HSW-NEXT:    shlq $4, %rax # sched: [1:0.50]
    875 ; X64-HSW-NEXT:    leaq (%rax,%rdi), %rax # sched: [1:0.50]
    876 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    877 ;
    878 ; X64-JAG-LABEL: test_mul_by_17:
    879 ; X64-JAG:       # %bb.0:
    880 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    881 ; X64-JAG-NEXT:    shlq $4, %rax # sched: [1:0.50]
    882 ; X64-JAG-NEXT:    leaq (%rax,%rdi), %rax # sched: [1:0.50]
    883 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    884 ;
    885 ; X86-NOOPT-LABEL: test_mul_by_17:
    886 ; X86-NOOPT:       # %bb.0:
    887 ; X86-NOOPT-NEXT:    movl $17, %eax
    888 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    889 ; X86-NOOPT-NEXT:    imull $17, {{[0-9]+}}(%esp), %ecx
    890 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    891 ; X86-NOOPT-NEXT:    retl
    892 ;
    893 ; HSW-NOOPT-LABEL: test_mul_by_17:
    894 ; HSW-NOOPT:       # %bb.0:
    895 ; HSW-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [3:1.00]
    896 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    897 ;
    898 ; JAG-NOOPT-LABEL: test_mul_by_17:
    899 ; JAG-NOOPT:       # %bb.0:
    900 ; JAG-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [6:4.00]
    901 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    902 ;
    903 ; X64-SLM-LABEL: test_mul_by_17:
    904 ; X64-SLM:       # %bb.0:
    905 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
    906 ; X64-SLM-NEXT:    shlq $4, %rax # sched: [1:1.00]
    907 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
    908 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    909 ;
    910 ; SLM-NOOPT-LABEL: test_mul_by_17:
    911 ; SLM-NOOPT:       # %bb.0:
    912 ; SLM-NOOPT-NEXT:    imulq $17, %rdi, %rax # sched: [3:1.00]
    913 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    914   %mul = mul nsw i64 %x, 17
    915   ret i64 %mul
    916 }
    917 
    918 define i64 @test_mul_by_18(i64 %x) {
    919 ; X86-LABEL: test_mul_by_18:
    920 ; X86:       # %bb.0:
    921 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    922 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    923 ; X86-NEXT:    movl $18, %eax
    924 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    925 ; X86-NEXT:    leal (%edx,%ecx,2), %edx
    926 ; X86-NEXT:    retl
    927 ;
    928 ; X64-HSW-LABEL: test_mul_by_18:
    929 ; X64-HSW:       # %bb.0:
    930 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
    931 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    932 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    933 ;
    934 ; X64-JAG-LABEL: test_mul_by_18:
    935 ; X64-JAG:       # %bb.0:
    936 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    937 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
    938 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    939 ;
    940 ; X86-NOOPT-LABEL: test_mul_by_18:
    941 ; X86-NOOPT:       # %bb.0:
    942 ; X86-NOOPT-NEXT:    movl $18, %eax
    943 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    944 ; X86-NOOPT-NEXT:    imull $18, {{[0-9]+}}(%esp), %ecx
    945 ; X86-NOOPT-NEXT:    addl %ecx, %edx
    946 ; X86-NOOPT-NEXT:    retl
    947 ;
    948 ; HSW-NOOPT-LABEL: test_mul_by_18:
    949 ; HSW-NOOPT:       # %bb.0:
    950 ; HSW-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [3:1.00]
    951 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
    952 ;
    953 ; JAG-NOOPT-LABEL: test_mul_by_18:
    954 ; JAG-NOOPT:       # %bb.0:
    955 ; JAG-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [6:4.00]
    956 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
    957 ;
    958 ; X64-SLM-LABEL: test_mul_by_18:
    959 ; X64-SLM:       # %bb.0:
    960 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
    961 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
    962 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
    963 ;
    964 ; SLM-NOOPT-LABEL: test_mul_by_18:
    965 ; SLM-NOOPT:       # %bb.0:
    966 ; SLM-NOOPT-NEXT:    imulq $18, %rdi, %rax # sched: [3:1.00]
    967 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
    968   %mul = mul nsw i64 %x, 18
    969   ret i64 %mul
    970 }
    971 
    972 define i64 @test_mul_by_19(i64 %x) {
    973 ; X86-LABEL: test_mul_by_19:
    974 ; X86:       # %bb.0:
    975 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    976 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
    977 ; X86-NEXT:    leal (%eax,%ecx,2), %ecx
    978 ; X86-NEXT:    movl $19, %eax
    979 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
    980 ; X86-NEXT:    addl %ecx, %edx
    981 ; X86-NEXT:    retl
    982 ;
    983 ; X64-HSW-LABEL: test_mul_by_19:
    984 ; X64-HSW:       # %bb.0:
    985 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    986 ; X64-HSW-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [1:0.50]
    987 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
    988 ;
    989 ; X64-JAG-LABEL: test_mul_by_19:
    990 ; X64-JAG:       # %bb.0:
    991 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
    992 ; X64-JAG-NEXT:    leaq (%rdi,%rax,2), %rax # sched: [2:1.00]
    993 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
    994 ;
    995 ; X86-NOOPT-LABEL: test_mul_by_19:
    996 ; X86-NOOPT:       # %bb.0:
    997 ; X86-NOOPT-NEXT:    movl $19, %eax
    998 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
    999 ; X86-NOOPT-NEXT:    imull $19, {{[0-9]+}}(%esp), %ecx
   1000 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1001 ; X86-NOOPT-NEXT:    retl
   1002 ;
   1003 ; HSW-NOOPT-LABEL: test_mul_by_19:
   1004 ; HSW-NOOPT:       # %bb.0:
   1005 ; HSW-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
   1006 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1007 ;
   1008 ; JAG-NOOPT-LABEL: test_mul_by_19:
   1009 ; JAG-NOOPT:       # %bb.0:
   1010 ; JAG-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [6:4.00]
   1011 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1012 ;
   1013 ; X64-SLM-LABEL: test_mul_by_19:
   1014 ; X64-SLM:       # %bb.0:
   1015 ; X64-SLM-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
   1016 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1017 ;
   1018 ; SLM-NOOPT-LABEL: test_mul_by_19:
   1019 ; SLM-NOOPT:       # %bb.0:
   1020 ; SLM-NOOPT-NEXT:    imulq $19, %rdi, %rax # sched: [3:1.00]
   1021 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1022   %mul = mul nsw i64 %x, 19
   1023   ret i64 %mul
   1024 }
   1025 
   1026 define i64 @test_mul_by_20(i64 %x) {
   1027 ; X86-LABEL: test_mul_by_20:
   1028 ; X86:       # %bb.0:
   1029 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1030 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
   1031 ; X86-NEXT:    movl $20, %eax
   1032 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1033 ; X86-NEXT:    leal (%edx,%ecx,4), %edx
   1034 ; X86-NEXT:    retl
   1035 ;
   1036 ; X64-HSW-LABEL: test_mul_by_20:
   1037 ; X64-HSW:       # %bb.0:
   1038 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
   1039 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1040 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1041 ;
   1042 ; X64-JAG-LABEL: test_mul_by_20:
   1043 ; X64-JAG:       # %bb.0:
   1044 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
   1045 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1046 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1047 ;
   1048 ; X86-NOOPT-LABEL: test_mul_by_20:
   1049 ; X86-NOOPT:       # %bb.0:
   1050 ; X86-NOOPT-NEXT:    movl $20, %eax
   1051 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1052 ; X86-NOOPT-NEXT:    imull $20, {{[0-9]+}}(%esp), %ecx
   1053 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1054 ; X86-NOOPT-NEXT:    retl
   1055 ;
   1056 ; HSW-NOOPT-LABEL: test_mul_by_20:
   1057 ; HSW-NOOPT:       # %bb.0:
   1058 ; HSW-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [3:1.00]
   1059 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1060 ;
   1061 ; JAG-NOOPT-LABEL: test_mul_by_20:
   1062 ; JAG-NOOPT:       # %bb.0:
   1063 ; JAG-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [6:4.00]
   1064 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1065 ;
   1066 ; X64-SLM-LABEL: test_mul_by_20:
   1067 ; X64-SLM:       # %bb.0:
   1068 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
   1069 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
   1070 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1071 ;
   1072 ; SLM-NOOPT-LABEL: test_mul_by_20:
   1073 ; SLM-NOOPT:       # %bb.0:
   1074 ; SLM-NOOPT-NEXT:    imulq $20, %rdi, %rax # sched: [3:1.00]
   1075 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1076   %mul = mul nsw i64 %x, 20
   1077   ret i64 %mul
   1078 }
   1079 
   1080 define i64 @test_mul_by_21(i64 %x) {
   1081 ; X86-LABEL: test_mul_by_21:
   1082 ; X86:       # %bb.0:
   1083 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1084 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
   1085 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
   1086 ; X86-NEXT:    movl $21, %eax
   1087 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1088 ; X86-NEXT:    addl %ecx, %edx
   1089 ; X86-NEXT:    retl
   1090 ;
   1091 ; X64-HSW-LABEL: test_mul_by_21:
   1092 ; X64-HSW:       # %bb.0:
   1093 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1094 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
   1095 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1096 ;
   1097 ; X64-JAG-LABEL: test_mul_by_21:
   1098 ; X64-JAG:       # %bb.0:
   1099 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1100 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
   1101 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1102 ;
   1103 ; X86-NOOPT-LABEL: test_mul_by_21:
   1104 ; X86-NOOPT:       # %bb.0:
   1105 ; X86-NOOPT-NEXT:    movl $21, %eax
   1106 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1107 ; X86-NOOPT-NEXT:    imull $21, {{[0-9]+}}(%esp), %ecx
   1108 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1109 ; X86-NOOPT-NEXT:    retl
   1110 ;
   1111 ; HSW-NOOPT-LABEL: test_mul_by_21:
   1112 ; HSW-NOOPT:       # %bb.0:
   1113 ; HSW-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
   1114 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1115 ;
   1116 ; JAG-NOOPT-LABEL: test_mul_by_21:
   1117 ; JAG-NOOPT:       # %bb.0:
   1118 ; JAG-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [6:4.00]
   1119 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1120 ;
   1121 ; X64-SLM-LABEL: test_mul_by_21:
   1122 ; X64-SLM:       # %bb.0:
   1123 ; X64-SLM-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
   1124 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1125 ;
   1126 ; SLM-NOOPT-LABEL: test_mul_by_21:
   1127 ; SLM-NOOPT:       # %bb.0:
   1128 ; SLM-NOOPT-NEXT:    imulq $21, %rdi, %rax # sched: [3:1.00]
   1129 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1130   %mul = mul nsw i64 %x, 21
   1131   ret i64 %mul
   1132 }
   1133 
   1134 define i64 @test_mul_by_22(i64 %x) {
   1135 ; X86-LABEL: test_mul_by_22:
   1136 ; X86:       # %bb.0:
   1137 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1138 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
   1139 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
   1140 ; X86-NEXT:    addl %eax, %ecx
   1141 ; X86-NEXT:    movl $22, %eax
   1142 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1143 ; X86-NEXT:    addl %ecx, %edx
   1144 ; X86-NEXT:    retl
   1145 ;
   1146 ; X64-HSW-LABEL: test_mul_by_22:
   1147 ; X64-HSW:       # %bb.0:
   1148 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1149 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
   1150 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
   1151 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1152 ;
   1153 ; X64-JAG-LABEL: test_mul_by_22:
   1154 ; X64-JAG:       # %bb.0:
   1155 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1156 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
   1157 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1158 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1159 ;
   1160 ; X86-NOOPT-LABEL: test_mul_by_22:
   1161 ; X86-NOOPT:       # %bb.0:
   1162 ; X86-NOOPT-NEXT:    movl $22, %eax
   1163 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1164 ; X86-NOOPT-NEXT:    imull $22, {{[0-9]+}}(%esp), %ecx
   1165 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1166 ; X86-NOOPT-NEXT:    retl
   1167 ;
   1168 ; HSW-NOOPT-LABEL: test_mul_by_22:
   1169 ; HSW-NOOPT:       # %bb.0:
   1170 ; HSW-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
   1171 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1172 ;
   1173 ; JAG-NOOPT-LABEL: test_mul_by_22:
   1174 ; JAG-NOOPT:       # %bb.0:
   1175 ; JAG-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [6:4.00]
   1176 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1177 ;
   1178 ; X64-SLM-LABEL: test_mul_by_22:
   1179 ; X64-SLM:       # %bb.0:
   1180 ; X64-SLM-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
   1181 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1182 ;
   1183 ; SLM-NOOPT-LABEL: test_mul_by_22:
   1184 ; SLM-NOOPT:       # %bb.0:
   1185 ; SLM-NOOPT-NEXT:    imulq $22, %rdi, %rax # sched: [3:1.00]
   1186 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1187   %mul = mul nsw i64 %x, 22
   1188   ret i64 %mul
   1189 }
   1190 
   1191 define i64 @test_mul_by_23(i64 %x) {
   1192 ; X86-LABEL: test_mul_by_23:
   1193 ; X86:       # %bb.0:
   1194 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1195 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
   1196 ; X86-NEXT:    shll $3, %ecx
   1197 ; X86-NEXT:    subl %eax, %ecx
   1198 ; X86-NEXT:    movl $23, %eax
   1199 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1200 ; X86-NEXT:    addl %ecx, %edx
   1201 ; X86-NEXT:    retl
   1202 ;
   1203 ; X64-HSW-LABEL: test_mul_by_23:
   1204 ; X64-HSW:       # %bb.0:
   1205 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
   1206 ; X64-HSW-NEXT:    shlq $3, %rax # sched: [1:0.50]
   1207 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1208 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1209 ;
   1210 ; X64-JAG-LABEL: test_mul_by_23:
   1211 ; X64-JAG:       # %bb.0:
   1212 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
   1213 ; X64-JAG-NEXT:    shlq $3, %rax # sched: [1:0.50]
   1214 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1215 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1216 ;
   1217 ; X86-NOOPT-LABEL: test_mul_by_23:
   1218 ; X86-NOOPT:       # %bb.0:
   1219 ; X86-NOOPT-NEXT:    movl $23, %eax
   1220 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1221 ; X86-NOOPT-NEXT:    imull $23, {{[0-9]+}}(%esp), %ecx
   1222 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1223 ; X86-NOOPT-NEXT:    retl
   1224 ;
   1225 ; HSW-NOOPT-LABEL: test_mul_by_23:
   1226 ; HSW-NOOPT:       # %bb.0:
   1227 ; HSW-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
   1228 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1229 ;
   1230 ; JAG-NOOPT-LABEL: test_mul_by_23:
   1231 ; JAG-NOOPT:       # %bb.0:
   1232 ; JAG-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [6:4.00]
   1233 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1234 ;
   1235 ; X64-SLM-LABEL: test_mul_by_23:
   1236 ; X64-SLM:       # %bb.0:
   1237 ; X64-SLM-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
   1238 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1239 ;
   1240 ; SLM-NOOPT-LABEL: test_mul_by_23:
   1241 ; SLM-NOOPT:       # %bb.0:
   1242 ; SLM-NOOPT-NEXT:    imulq $23, %rdi, %rax # sched: [3:1.00]
   1243 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1244   %mul = mul nsw i64 %x, 23
   1245   ret i64 %mul
   1246 }
   1247 
   1248 define i64 @test_mul_by_24(i64 %x) {
   1249 ; X86-LABEL: test_mul_by_24:
   1250 ; X86:       # %bb.0:
   1251 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1252 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
   1253 ; X86-NEXT:    movl $24, %eax
   1254 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1255 ; X86-NEXT:    leal (%edx,%ecx,8), %edx
   1256 ; X86-NEXT:    retl
   1257 ;
   1258 ; X64-HSW-LABEL: test_mul_by_24:
   1259 ; X64-HSW:       # %bb.0:
   1260 ; X64-HSW-NEXT:    shlq $3, %rdi # sched: [1:0.50]
   1261 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
   1262 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1263 ;
   1264 ; X64-JAG-LABEL: test_mul_by_24:
   1265 ; X64-JAG:       # %bb.0:
   1266 ; X64-JAG-NEXT:    shlq $3, %rdi # sched: [1:0.50]
   1267 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
   1268 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1269 ;
   1270 ; X86-NOOPT-LABEL: test_mul_by_24:
   1271 ; X86-NOOPT:       # %bb.0:
   1272 ; X86-NOOPT-NEXT:    movl $24, %eax
   1273 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1274 ; X86-NOOPT-NEXT:    imull $24, {{[0-9]+}}(%esp), %ecx
   1275 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1276 ; X86-NOOPT-NEXT:    retl
   1277 ;
   1278 ; HSW-NOOPT-LABEL: test_mul_by_24:
   1279 ; HSW-NOOPT:       # %bb.0:
   1280 ; HSW-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [3:1.00]
   1281 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1282 ;
   1283 ; JAG-NOOPT-LABEL: test_mul_by_24:
   1284 ; JAG-NOOPT:       # %bb.0:
   1285 ; JAG-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [6:4.00]
   1286 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1287 ;
   1288 ; X64-SLM-LABEL: test_mul_by_24:
   1289 ; X64-SLM:       # %bb.0:
   1290 ; X64-SLM-NEXT:    shlq $3, %rdi # sched: [1:1.00]
   1291 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
   1292 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1293 ;
   1294 ; SLM-NOOPT-LABEL: test_mul_by_24:
   1295 ; SLM-NOOPT:       # %bb.0:
   1296 ; SLM-NOOPT-NEXT:    imulq $24, %rdi, %rax # sched: [3:1.00]
   1297 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1298   %mul = mul nsw i64 %x, 24
   1299   ret i64 %mul
   1300 }
   1301 
   1302 define i64 @test_mul_by_25(i64 %x) {
   1303 ; X86-LABEL: test_mul_by_25:
   1304 ; X86:       # %bb.0:
   1305 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   1306 ; X86-NEXT:    movl $25, %eax
   1307 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1308 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
   1309 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
   1310 ; X86-NEXT:    addl %ecx, %edx
   1311 ; X86-NEXT:    retl
   1312 ;
   1313 ; X64-HSW-LABEL: test_mul_by_25:
   1314 ; X64-HSW:       # %bb.0:
   1315 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1316 ; X64-HSW-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:0.50]
   1317 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1318 ;
   1319 ; X64-JAG-LABEL: test_mul_by_25:
   1320 ; X64-JAG:       # %bb.0:
   1321 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1322 ; X64-JAG-NEXT:    leaq (%rax,%rax,4), %rax # sched: [2:1.00]
   1323 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1324 ;
   1325 ; X86-NOOPT-LABEL: test_mul_by_25:
   1326 ; X86-NOOPT:       # %bb.0:
   1327 ; X86-NOOPT-NEXT:    movl $25, %eax
   1328 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1329 ; X86-NOOPT-NEXT:    imull $25, {{[0-9]+}}(%esp), %ecx
   1330 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1331 ; X86-NOOPT-NEXT:    retl
   1332 ;
   1333 ; HSW-NOOPT-LABEL: test_mul_by_25:
   1334 ; HSW-NOOPT:       # %bb.0:
   1335 ; HSW-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [3:1.00]
   1336 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1337 ;
   1338 ; JAG-NOOPT-LABEL: test_mul_by_25:
   1339 ; JAG-NOOPT:       # %bb.0:
   1340 ; JAG-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [6:4.00]
   1341 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1342 ;
   1343 ; X64-SLM-LABEL: test_mul_by_25:
   1344 ; X64-SLM:       # %bb.0:
   1345 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
   1346 ; X64-SLM-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:1.00]
   1347 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1348 ;
   1349 ; SLM-NOOPT-LABEL: test_mul_by_25:
   1350 ; SLM-NOOPT:       # %bb.0:
   1351 ; SLM-NOOPT-NEXT:    imulq $25, %rdi, %rax # sched: [3:1.00]
   1352 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1353   %mul = mul nsw i64 %x, 25
   1354   ret i64 %mul
   1355 }
   1356 
   1357 define i64 @test_mul_by_26(i64 %x) {
   1358 ; X86-LABEL: test_mul_by_26:
   1359 ; X86:       # %bb.0:
   1360 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1361 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
   1362 ; X86-NEXT:    leal (%ecx,%ecx,4), %ecx
   1363 ; X86-NEXT:    addl %eax, %ecx
   1364 ; X86-NEXT:    movl $26, %eax
   1365 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1366 ; X86-NEXT:    addl %ecx, %edx
   1367 ; X86-NEXT:    retl
   1368 ;
   1369 ; X64-HSW-LABEL: test_mul_by_26:
   1370 ; X64-HSW:       # %bb.0:
   1371 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1372 ; X64-HSW-NEXT:    leaq (%rax,%rax,4), %rax # sched: [1:0.50]
   1373 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
   1374 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1375 ;
   1376 ; X64-JAG-LABEL: test_mul_by_26:
   1377 ; X64-JAG:       # %bb.0:
   1378 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1379 ; X64-JAG-NEXT:    leaq (%rax,%rax,4), %rax # sched: [2:1.00]
   1380 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1381 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1382 ;
   1383 ; X86-NOOPT-LABEL: test_mul_by_26:
   1384 ; X86-NOOPT:       # %bb.0:
   1385 ; X86-NOOPT-NEXT:    movl $26, %eax
   1386 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1387 ; X86-NOOPT-NEXT:    imull $26, {{[0-9]+}}(%esp), %ecx
   1388 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1389 ; X86-NOOPT-NEXT:    retl
   1390 ;
   1391 ; HSW-NOOPT-LABEL: test_mul_by_26:
   1392 ; HSW-NOOPT:       # %bb.0:
   1393 ; HSW-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
   1394 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1395 ;
   1396 ; JAG-NOOPT-LABEL: test_mul_by_26:
   1397 ; JAG-NOOPT:       # %bb.0:
   1398 ; JAG-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [6:4.00]
   1399 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1400 ;
   1401 ; X64-SLM-LABEL: test_mul_by_26:
   1402 ; X64-SLM:       # %bb.0:
   1403 ; X64-SLM-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
   1404 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1405 ;
   1406 ; SLM-NOOPT-LABEL: test_mul_by_26:
   1407 ; SLM-NOOPT:       # %bb.0:
   1408 ; SLM-NOOPT-NEXT:    imulq $26, %rdi, %rax # sched: [3:1.00]
   1409 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1410   %mul = mul nsw i64 %x, 26
   1411   ret i64 %mul
   1412 }
   1413 
   1414 define i64 @test_mul_by_27(i64 %x) {
   1415 ; X86-LABEL: test_mul_by_27:
   1416 ; X86:       # %bb.0:
   1417 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   1418 ; X86-NEXT:    movl $27, %eax
   1419 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1420 ; X86-NEXT:    leal (%ecx,%ecx,8), %ecx
   1421 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
   1422 ; X86-NEXT:    addl %ecx, %edx
   1423 ; X86-NEXT:    retl
   1424 ;
   1425 ; X64-HSW-LABEL: test_mul_by_27:
   1426 ; X64-HSW:       # %bb.0:
   1427 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   1428 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
   1429 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1430 ;
   1431 ; X64-JAG-LABEL: test_mul_by_27:
   1432 ; X64-JAG:       # %bb.0:
   1433 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   1434 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
   1435 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1436 ;
   1437 ; X86-NOOPT-LABEL: test_mul_by_27:
   1438 ; X86-NOOPT:       # %bb.0:
   1439 ; X86-NOOPT-NEXT:    movl $27, %eax
   1440 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1441 ; X86-NOOPT-NEXT:    imull $27, {{[0-9]+}}(%esp), %ecx
   1442 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1443 ; X86-NOOPT-NEXT:    retl
   1444 ;
   1445 ; HSW-NOOPT-LABEL: test_mul_by_27:
   1446 ; HSW-NOOPT:       # %bb.0:
   1447 ; HSW-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [3:1.00]
   1448 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1449 ;
   1450 ; JAG-NOOPT-LABEL: test_mul_by_27:
   1451 ; JAG-NOOPT:       # %bb.0:
   1452 ; JAG-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [6:4.00]
   1453 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1454 ;
   1455 ; X64-SLM-LABEL: test_mul_by_27:
   1456 ; X64-SLM:       # %bb.0:
   1457 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
   1458 ; X64-SLM-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:1.00]
   1459 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1460 ;
   1461 ; SLM-NOOPT-LABEL: test_mul_by_27:
   1462 ; SLM-NOOPT:       # %bb.0:
   1463 ; SLM-NOOPT-NEXT:    imulq $27, %rdi, %rax # sched: [3:1.00]
   1464 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1465   %mul = mul nsw i64 %x, 27
   1466   ret i64 %mul
   1467 }
   1468 
   1469 define i64 @test_mul_by_28(i64 %x) {
   1470 ; X86-LABEL: test_mul_by_28:
   1471 ; X86:       # %bb.0:
   1472 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1473 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
   1474 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
   1475 ; X86-NEXT:    addl %eax, %ecx
   1476 ; X86-NEXT:    movl $28, %eax
   1477 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1478 ; X86-NEXT:    addl %ecx, %edx
   1479 ; X86-NEXT:    retl
   1480 ;
   1481 ; X64-HSW-LABEL: test_mul_by_28:
   1482 ; X64-HSW:       # %bb.0:
   1483 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   1484 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
   1485 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
   1486 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1487 ;
   1488 ; X64-JAG-LABEL: test_mul_by_28:
   1489 ; X64-JAG:       # %bb.0:
   1490 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   1491 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
   1492 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1493 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1494 ;
   1495 ; X86-NOOPT-LABEL: test_mul_by_28:
   1496 ; X86-NOOPT:       # %bb.0:
   1497 ; X86-NOOPT-NEXT:    movl $28, %eax
   1498 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1499 ; X86-NOOPT-NEXT:    imull $28, {{[0-9]+}}(%esp), %ecx
   1500 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1501 ; X86-NOOPT-NEXT:    retl
   1502 ;
   1503 ; HSW-NOOPT-LABEL: test_mul_by_28:
   1504 ; HSW-NOOPT:       # %bb.0:
   1505 ; HSW-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
   1506 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1507 ;
   1508 ; JAG-NOOPT-LABEL: test_mul_by_28:
   1509 ; JAG-NOOPT:       # %bb.0:
   1510 ; JAG-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [6:4.00]
   1511 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1512 ;
   1513 ; X64-SLM-LABEL: test_mul_by_28:
   1514 ; X64-SLM:       # %bb.0:
   1515 ; X64-SLM-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
   1516 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1517 ;
   1518 ; SLM-NOOPT-LABEL: test_mul_by_28:
   1519 ; SLM-NOOPT:       # %bb.0:
   1520 ; SLM-NOOPT-NEXT:    imulq $28, %rdi, %rax # sched: [3:1.00]
   1521 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1522   %mul = mul nsw i64 %x, 28
   1523   ret i64 %mul
   1524 }
   1525 
   1526 define i64 @test_mul_by_29(i64 %x) {
   1527 ; X86-LABEL: test_mul_by_29:
   1528 ; X86:       # %bb.0:
   1529 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1530 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
   1531 ; X86-NEXT:    leal (%ecx,%ecx,2), %ecx
   1532 ; X86-NEXT:    addl %eax, %ecx
   1533 ; X86-NEXT:    addl %eax, %ecx
   1534 ; X86-NEXT:    movl $29, %eax
   1535 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1536 ; X86-NEXT:    addl %ecx, %edx
   1537 ; X86-NEXT:    retl
   1538 ;
   1539 ; X64-HSW-LABEL: test_mul_by_29:
   1540 ; X64-HSW:       # %bb.0:
   1541 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   1542 ; X64-HSW-NEXT:    leaq (%rax,%rax,2), %rax # sched: [1:0.50]
   1543 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
   1544 ; X64-HSW-NEXT:    addq %rdi, %rax # sched: [1:0.25]
   1545 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1546 ;
   1547 ; X64-JAG-LABEL: test_mul_by_29:
   1548 ; X64-JAG:       # %bb.0:
   1549 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   1550 ; X64-JAG-NEXT:    leaq (%rax,%rax,2), %rax # sched: [2:1.00]
   1551 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1552 ; X64-JAG-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1553 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1554 ;
   1555 ; X86-NOOPT-LABEL: test_mul_by_29:
   1556 ; X86-NOOPT:       # %bb.0:
   1557 ; X86-NOOPT-NEXT:    movl $29, %eax
   1558 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1559 ; X86-NOOPT-NEXT:    imull $29, {{[0-9]+}}(%esp), %ecx
   1560 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1561 ; X86-NOOPT-NEXT:    retl
   1562 ;
   1563 ; HSW-NOOPT-LABEL: test_mul_by_29:
   1564 ; HSW-NOOPT:       # %bb.0:
   1565 ; HSW-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
   1566 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1567 ;
   1568 ; JAG-NOOPT-LABEL: test_mul_by_29:
   1569 ; JAG-NOOPT:       # %bb.0:
   1570 ; JAG-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [6:4.00]
   1571 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1572 ;
   1573 ; X64-SLM-LABEL: test_mul_by_29:
   1574 ; X64-SLM:       # %bb.0:
   1575 ; X64-SLM-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
   1576 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1577 ;
   1578 ; SLM-NOOPT-LABEL: test_mul_by_29:
   1579 ; SLM-NOOPT:       # %bb.0:
   1580 ; SLM-NOOPT-NEXT:    imulq $29, %rdi, %rax # sched: [3:1.00]
   1581 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1582   %mul = mul nsw i64 %x, 29
   1583   ret i64 %mul
   1584 }
   1585 
   1586 define i64 @test_mul_by_30(i64 %x) {
   1587 ; X86-LABEL: test_mul_by_30:
   1588 ; X86:       # %bb.0:
   1589 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1590 ; X86-NEXT:    movl %eax, %ecx
   1591 ; X86-NEXT:    shll $5, %ecx
   1592 ; X86-NEXT:    subl %eax, %ecx
   1593 ; X86-NEXT:    subl %eax, %ecx
   1594 ; X86-NEXT:    movl $30, %eax
   1595 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1596 ; X86-NEXT:    addl %ecx, %edx
   1597 ; X86-NEXT:    retl
   1598 ;
   1599 ; X64-HSW-LABEL: test_mul_by_30:
   1600 ; X64-HSW:       # %bb.0:
   1601 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1602 ; X64-HSW-NEXT:    shlq $5, %rax # sched: [1:0.50]
   1603 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1604 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1605 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1606 ;
   1607 ; X64-JAG-LABEL: test_mul_by_30:
   1608 ; X64-JAG:       # %bb.0:
   1609 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1610 ; X64-JAG-NEXT:    shlq $5, %rax # sched: [1:0.50]
   1611 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1612 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1613 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1614 ;
   1615 ; X86-NOOPT-LABEL: test_mul_by_30:
   1616 ; X86-NOOPT:       # %bb.0:
   1617 ; X86-NOOPT-NEXT:    movl $30, %eax
   1618 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1619 ; X86-NOOPT-NEXT:    imull $30, {{[0-9]+}}(%esp), %ecx
   1620 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1621 ; X86-NOOPT-NEXT:    retl
   1622 ;
   1623 ; HSW-NOOPT-LABEL: test_mul_by_30:
   1624 ; HSW-NOOPT:       # %bb.0:
   1625 ; HSW-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [3:1.00]
   1626 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1627 ;
   1628 ; JAG-NOOPT-LABEL: test_mul_by_30:
   1629 ; JAG-NOOPT:       # %bb.0:
   1630 ; JAG-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [6:4.00]
   1631 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1632 ;
   1633 ; X64-SLM-LABEL: test_mul_by_30:
   1634 ; X64-SLM:       # %bb.0:
   1635 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1636 ; X64-SLM-NEXT:    shlq $5, %rax # sched: [1:1.00]
   1637 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1638 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1639 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1640 ;
   1641 ; SLM-NOOPT-LABEL: test_mul_by_30:
   1642 ; SLM-NOOPT:       # %bb.0:
   1643 ; SLM-NOOPT-NEXT:    imulq $30, %rdi, %rax # sched: [3:1.00]
   1644 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1645   %mul = mul nsw i64 %x, 30
   1646   ret i64 %mul
   1647 }
   1648 
   1649 define i64 @test_mul_by_31(i64 %x) {
   1650 ; X86-LABEL: test_mul_by_31:
   1651 ; X86:       # %bb.0:
   1652 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1653 ; X86-NEXT:    movl %eax, %ecx
   1654 ; X86-NEXT:    shll $5, %ecx
   1655 ; X86-NEXT:    subl %eax, %ecx
   1656 ; X86-NEXT:    movl $31, %eax
   1657 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1658 ; X86-NEXT:    addl %ecx, %edx
   1659 ; X86-NEXT:    retl
   1660 ;
   1661 ; X64-HSW-LABEL: test_mul_by_31:
   1662 ; X64-HSW:       # %bb.0:
   1663 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1664 ; X64-HSW-NEXT:    shlq $5, %rax # sched: [1:0.50]
   1665 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1666 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1667 ;
   1668 ; X64-JAG-LABEL: test_mul_by_31:
   1669 ; X64-JAG:       # %bb.0:
   1670 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1671 ; X64-JAG-NEXT:    shlq $5, %rax # sched: [1:0.50]
   1672 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1673 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1674 ;
   1675 ; X86-NOOPT-LABEL: test_mul_by_31:
   1676 ; X86-NOOPT:       # %bb.0:
   1677 ; X86-NOOPT-NEXT:    movl $31, %eax
   1678 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1679 ; X86-NOOPT-NEXT:    imull $31, {{[0-9]+}}(%esp), %ecx
   1680 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1681 ; X86-NOOPT-NEXT:    retl
   1682 ;
   1683 ; HSW-NOOPT-LABEL: test_mul_by_31:
   1684 ; HSW-NOOPT:       # %bb.0:
   1685 ; HSW-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [3:1.00]
   1686 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1687 ;
   1688 ; JAG-NOOPT-LABEL: test_mul_by_31:
   1689 ; JAG-NOOPT:       # %bb.0:
   1690 ; JAG-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [6:4.00]
   1691 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1692 ;
   1693 ; X64-SLM-LABEL: test_mul_by_31:
   1694 ; X64-SLM:       # %bb.0:
   1695 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1696 ; X64-SLM-NEXT:    shlq $5, %rax # sched: [1:1.00]
   1697 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1698 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1699 ;
   1700 ; SLM-NOOPT-LABEL: test_mul_by_31:
   1701 ; SLM-NOOPT:       # %bb.0:
   1702 ; SLM-NOOPT-NEXT:    imulq $31, %rdi, %rax # sched: [3:1.00]
   1703 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1704   %mul = mul nsw i64 %x, 31
   1705   ret i64 %mul
   1706 }
   1707 
   1708 define i64 @test_mul_by_32(i64 %x) {
   1709 ; X86-LABEL: test_mul_by_32:
   1710 ; X86:       # %bb.0:
   1711 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1712 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
   1713 ; X86-NEXT:    shldl $5, %eax, %edx
   1714 ; X86-NEXT:    shll $5, %eax
   1715 ; X86-NEXT:    retl
   1716 ;
   1717 ; X64-HSW-LABEL: test_mul_by_32:
   1718 ; X64-HSW:       # %bb.0:
   1719 ; X64-HSW-NEXT:    shlq $5, %rdi # sched: [1:0.50]
   1720 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1721 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1722 ;
   1723 ; X64-JAG-LABEL: test_mul_by_32:
   1724 ; X64-JAG:       # %bb.0:
   1725 ; X64-JAG-NEXT:    shlq $5, %rdi # sched: [1:0.50]
   1726 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1727 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1728 ;
   1729 ; X86-NOOPT-LABEL: test_mul_by_32:
   1730 ; X86-NOOPT:       # %bb.0:
   1731 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1732 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edx
   1733 ; X86-NOOPT-NEXT:    shldl $5, %eax, %edx
   1734 ; X86-NOOPT-NEXT:    shll $5, %eax
   1735 ; X86-NOOPT-NEXT:    retl
   1736 ;
   1737 ; HSW-NOOPT-LABEL: test_mul_by_32:
   1738 ; HSW-NOOPT:       # %bb.0:
   1739 ; HSW-NOOPT-NEXT:    shlq $5, %rdi # sched: [1:0.50]
   1740 ; HSW-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1741 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1742 ;
   1743 ; JAG-NOOPT-LABEL: test_mul_by_32:
   1744 ; JAG-NOOPT:       # %bb.0:
   1745 ; JAG-NOOPT-NEXT:    shlq $5, %rdi # sched: [1:0.50]
   1746 ; JAG-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1747 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1748 ;
   1749 ; X64-SLM-LABEL: test_mul_by_32:
   1750 ; X64-SLM:       # %bb.0:
   1751 ; X64-SLM-NEXT:    shlq $5, %rdi # sched: [1:1.00]
   1752 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1753 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1754 ;
   1755 ; SLM-NOOPT-LABEL: test_mul_by_32:
   1756 ; SLM-NOOPT:       # %bb.0:
   1757 ; SLM-NOOPT-NEXT:    shlq $5, %rdi # sched: [1:1.00]
   1758 ; SLM-NOOPT-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1759 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1760   %mul = mul nsw i64 %x, 32
   1761   ret i64 %mul
   1762 }
   1763 
   1764 define i64 @test_mul_by_37(i64 %x) {
   1765 ; X86-LABEL: test_mul_by_37:
   1766 ; X86:       # %bb.0:
   1767 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1768 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
   1769 ; X86-NEXT:    leal (%eax,%ecx,4), %ecx
   1770 ; X86-NEXT:    movl $37, %eax
   1771 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1772 ; X86-NEXT:    addl %ecx, %edx
   1773 ; X86-NEXT:    retl
   1774 ;
   1775 ; X64-HSW-LABEL: test_mul_by_37:
   1776 ; X64-HSW:       # %bb.0:
   1777 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   1778 ; X64-HSW-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [1:0.50]
   1779 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1780 ;
   1781 ; X64-JAG-LABEL: test_mul_by_37:
   1782 ; X64-JAG:       # %bb.0:
   1783 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   1784 ; X64-JAG-NEXT:    leaq (%rdi,%rax,4), %rax # sched: [2:1.00]
   1785 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1786 ;
   1787 ; X86-NOOPT-LABEL: test_mul_by_37:
   1788 ; X86-NOOPT:       # %bb.0:
   1789 ; X86-NOOPT-NEXT:    movl $37, %eax
   1790 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1791 ; X86-NOOPT-NEXT:    imull $37, {{[0-9]+}}(%esp), %ecx
   1792 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1793 ; X86-NOOPT-NEXT:    retl
   1794 ;
   1795 ; HSW-NOOPT-LABEL: test_mul_by_37:
   1796 ; HSW-NOOPT:       # %bb.0:
   1797 ; HSW-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
   1798 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1799 ;
   1800 ; JAG-NOOPT-LABEL: test_mul_by_37:
   1801 ; JAG-NOOPT:       # %bb.0:
   1802 ; JAG-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [6:4.00]
   1803 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1804 ;
   1805 ; X64-SLM-LABEL: test_mul_by_37:
   1806 ; X64-SLM:       # %bb.0:
   1807 ; X64-SLM-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
   1808 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1809 ;
   1810 ; SLM-NOOPT-LABEL: test_mul_by_37:
   1811 ; SLM-NOOPT:       # %bb.0:
   1812 ; SLM-NOOPT-NEXT:    imulq $37, %rdi, %rax # sched: [3:1.00]
   1813 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1814   %mul = mul nsw i64 %x, 37
   1815   ret i64 %mul
   1816 }
   1817 
   1818 define i64 @test_mul_by_41(i64 %x) {
   1819 ; X86-LABEL: test_mul_by_41:
   1820 ; X86:       # %bb.0:
   1821 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1822 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
   1823 ; X86-NEXT:    leal (%eax,%ecx,8), %ecx
   1824 ; X86-NEXT:    movl $41, %eax
   1825 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1826 ; X86-NEXT:    addl %ecx, %edx
   1827 ; X86-NEXT:    retl
   1828 ;
   1829 ; X64-HSW-LABEL: test_mul_by_41:
   1830 ; X64-HSW:       # %bb.0:
   1831 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   1832 ; X64-HSW-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [1:0.50]
   1833 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1834 ;
   1835 ; X64-JAG-LABEL: test_mul_by_41:
   1836 ; X64-JAG:       # %bb.0:
   1837 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   1838 ; X64-JAG-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [2:1.00]
   1839 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1840 ;
   1841 ; X86-NOOPT-LABEL: test_mul_by_41:
   1842 ; X86-NOOPT:       # %bb.0:
   1843 ; X86-NOOPT-NEXT:    movl $41, %eax
   1844 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1845 ; X86-NOOPT-NEXT:    imull $41, {{[0-9]+}}(%esp), %ecx
   1846 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1847 ; X86-NOOPT-NEXT:    retl
   1848 ;
   1849 ; HSW-NOOPT-LABEL: test_mul_by_41:
   1850 ; HSW-NOOPT:       # %bb.0:
   1851 ; HSW-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
   1852 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1853 ;
   1854 ; JAG-NOOPT-LABEL: test_mul_by_41:
   1855 ; JAG-NOOPT:       # %bb.0:
   1856 ; JAG-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [6:4.00]
   1857 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1858 ;
   1859 ; X64-SLM-LABEL: test_mul_by_41:
   1860 ; X64-SLM:       # %bb.0:
   1861 ; X64-SLM-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
   1862 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1863 ;
   1864 ; SLM-NOOPT-LABEL: test_mul_by_41:
   1865 ; SLM-NOOPT:       # %bb.0:
   1866 ; SLM-NOOPT-NEXT:    imulq $41, %rdi, %rax # sched: [3:1.00]
   1867 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1868   %mul = mul nsw i64 %x, 41
   1869   ret i64 %mul
   1870 }
   1871 
   1872 define i64 @test_mul_by_62(i64 %x) {
   1873 ; X86-LABEL: test_mul_by_62:
   1874 ; X86:       # %bb.0:
   1875 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1876 ; X86-NEXT:    movl %eax, %ecx
   1877 ; X86-NEXT:    shll $6, %ecx
   1878 ; X86-NEXT:    subl %eax, %ecx
   1879 ; X86-NEXT:    subl %eax, %ecx
   1880 ; X86-NEXT:    movl $62, %eax
   1881 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1882 ; X86-NEXT:    addl %ecx, %edx
   1883 ; X86-NEXT:    retl
   1884 ;
   1885 ; X64-HSW-LABEL: test_mul_by_62:
   1886 ; X64-HSW:       # %bb.0:
   1887 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1888 ; X64-HSW-NEXT:    shlq $6, %rax # sched: [1:0.50]
   1889 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1890 ; X64-HSW-NEXT:    subq %rdi, %rax # sched: [1:0.25]
   1891 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1892 ;
   1893 ; X64-JAG-LABEL: test_mul_by_62:
   1894 ; X64-JAG:       # %bb.0:
   1895 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1896 ; X64-JAG-NEXT:    shlq $6, %rax # sched: [1:0.50]
   1897 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1898 ; X64-JAG-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1899 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1900 ;
   1901 ; X86-NOOPT-LABEL: test_mul_by_62:
   1902 ; X86-NOOPT:       # %bb.0:
   1903 ; X86-NOOPT-NEXT:    movl $62, %eax
   1904 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1905 ; X86-NOOPT-NEXT:    imull $62, {{[0-9]+}}(%esp), %ecx
   1906 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1907 ; X86-NOOPT-NEXT:    retl
   1908 ;
   1909 ; HSW-NOOPT-LABEL: test_mul_by_62:
   1910 ; HSW-NOOPT:       # %bb.0:
   1911 ; HSW-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [3:1.00]
   1912 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1913 ;
   1914 ; JAG-NOOPT-LABEL: test_mul_by_62:
   1915 ; JAG-NOOPT:       # %bb.0:
   1916 ; JAG-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [6:4.00]
   1917 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1918 ;
   1919 ; X64-SLM-LABEL: test_mul_by_62:
   1920 ; X64-SLM:       # %bb.0:
   1921 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1922 ; X64-SLM-NEXT:    shlq $6, %rax # sched: [1:1.00]
   1923 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1924 ; X64-SLM-NEXT:    subq %rdi, %rax # sched: [1:0.50]
   1925 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1926 ;
   1927 ; SLM-NOOPT-LABEL: test_mul_by_62:
   1928 ; SLM-NOOPT:       # %bb.0:
   1929 ; SLM-NOOPT-NEXT:    imulq $62, %rdi, %rax # sched: [3:1.00]
   1930 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1931   %mul = mul nsw i64 %x, 62
   1932   ret i64 %mul
   1933 }
   1934 
   1935 define i64 @test_mul_by_66(i64 %x) {
   1936 ; X86-LABEL: test_mul_by_66:
   1937 ; X86:       # %bb.0:
   1938 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1939 ; X86-NEXT:    movl %eax, %ecx
   1940 ; X86-NEXT:    shll $6, %ecx
   1941 ; X86-NEXT:    leal (%ecx,%eax,2), %ecx
   1942 ; X86-NEXT:    movl $66, %eax
   1943 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   1944 ; X86-NEXT:    addl %ecx, %edx
   1945 ; X86-NEXT:    retl
   1946 ;
   1947 ; X64-HSW-LABEL: test_mul_by_66:
   1948 ; X64-HSW:       # %bb.0:
   1949 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   1950 ; X64-HSW-NEXT:    shlq $6, %rax # sched: [1:0.50]
   1951 ; X64-HSW-NEXT:    leaq (%rax,%rdi,2), %rax # sched: [1:0.50]
   1952 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   1953 ;
   1954 ; X64-JAG-LABEL: test_mul_by_66:
   1955 ; X64-JAG:       # %bb.0:
   1956 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1957 ; X64-JAG-NEXT:    shlq $6, %rax # sched: [1:0.50]
   1958 ; X64-JAG-NEXT:    leaq (%rax,%rdi,2), %rax # sched: [2:1.00]
   1959 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   1960 ;
   1961 ; X86-NOOPT-LABEL: test_mul_by_66:
   1962 ; X86-NOOPT:       # %bb.0:
   1963 ; X86-NOOPT-NEXT:    movl $66, %eax
   1964 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   1965 ; X86-NOOPT-NEXT:    imull $66, {{[0-9]+}}(%esp), %ecx
   1966 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   1967 ; X86-NOOPT-NEXT:    retl
   1968 ;
   1969 ; HSW-NOOPT-LABEL: test_mul_by_66:
   1970 ; HSW-NOOPT:       # %bb.0:
   1971 ; HSW-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [3:1.00]
   1972 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   1973 ;
   1974 ; JAG-NOOPT-LABEL: test_mul_by_66:
   1975 ; JAG-NOOPT:       # %bb.0:
   1976 ; JAG-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [6:4.00]
   1977 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   1978 ;
   1979 ; X64-SLM-LABEL: test_mul_by_66:
   1980 ; X64-SLM:       # %bb.0:
   1981 ; X64-SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   1982 ; X64-SLM-NEXT:    shlq $6, %rax # sched: [1:1.00]
   1983 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1984 ; X64-SLM-NEXT:    addq %rdi, %rax # sched: [1:0.50]
   1985 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   1986 ;
   1987 ; SLM-NOOPT-LABEL: test_mul_by_66:
   1988 ; SLM-NOOPT:       # %bb.0:
   1989 ; SLM-NOOPT-NEXT:    imulq $66, %rdi, %rax # sched: [3:1.00]
   1990 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   1991   %mul = mul nsw i64 %x, 66
   1992   ret i64 %mul
   1993 }
   1994 
   1995 define i64 @test_mul_by_73(i64 %x) {
   1996 ; X86-LABEL: test_mul_by_73:
   1997 ; X86:       # %bb.0:
   1998 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   1999 ; X86-NEXT:    leal (%eax,%eax,8), %ecx
   2000 ; X86-NEXT:    leal (%eax,%ecx,8), %ecx
   2001 ; X86-NEXT:    movl $73, %eax
   2002 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   2003 ; X86-NEXT:    addl %ecx, %edx
   2004 ; X86-NEXT:    retl
   2005 ;
   2006 ; X64-HSW-LABEL: test_mul_by_73:
   2007 ; X64-HSW:       # %bb.0:
   2008 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   2009 ; X64-HSW-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [1:0.50]
   2010 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   2011 ;
   2012 ; X64-JAG-LABEL: test_mul_by_73:
   2013 ; X64-JAG:       # %bb.0:
   2014 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   2015 ; X64-JAG-NEXT:    leaq (%rdi,%rax,8), %rax # sched: [2:1.00]
   2016 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   2017 ;
   2018 ; X86-NOOPT-LABEL: test_mul_by_73:
   2019 ; X86-NOOPT:       # %bb.0:
   2020 ; X86-NOOPT-NEXT:    movl $73, %eax
   2021 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   2022 ; X86-NOOPT-NEXT:    imull $73, {{[0-9]+}}(%esp), %ecx
   2023 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   2024 ; X86-NOOPT-NEXT:    retl
   2025 ;
   2026 ; HSW-NOOPT-LABEL: test_mul_by_73:
   2027 ; HSW-NOOPT:       # %bb.0:
   2028 ; HSW-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
   2029 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   2030 ;
   2031 ; JAG-NOOPT-LABEL: test_mul_by_73:
   2032 ; JAG-NOOPT:       # %bb.0:
   2033 ; JAG-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [6:4.00]
   2034 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   2035 ;
   2036 ; X64-SLM-LABEL: test_mul_by_73:
   2037 ; X64-SLM:       # %bb.0:
   2038 ; X64-SLM-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
   2039 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   2040 ;
   2041 ; SLM-NOOPT-LABEL: test_mul_by_73:
   2042 ; SLM-NOOPT:       # %bb.0:
   2043 ; SLM-NOOPT-NEXT:    imulq $73, %rdi, %rax # sched: [3:1.00]
   2044 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   2045   %mul = mul nsw i64 %x, 73
   2046   ret i64 %mul
   2047 }
   2048 
   2049 define i64 @test_mul_by_520(i64 %x) {
   2050 ; X86-LABEL: test_mul_by_520:
   2051 ; X86:       # %bb.0:
   2052 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
   2053 ; X86-NEXT:    movl %eax, %ecx
   2054 ; X86-NEXT:    shll $9, %ecx
   2055 ; X86-NEXT:    leal (%ecx,%eax,8), %ecx
   2056 ; X86-NEXT:    movl $520, %eax # imm = 0x208
   2057 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
   2058 ; X86-NEXT:    addl %ecx, %edx
   2059 ; X86-NEXT:    retl
   2060 ;
   2061 ; X64-HSW-LABEL: test_mul_by_520:
   2062 ; X64-HSW:       # %bb.0:
   2063 ; X64-HSW-NEXT:    movq %rdi, %rax # sched: [1:0.25]
   2064 ; X64-HSW-NEXT:    shlq $9, %rax # sched: [1:0.50]
   2065 ; X64-HSW-NEXT:    leaq (%rax,%rdi,8), %rax # sched: [1:0.50]
   2066 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   2067 ;
   2068 ; X64-JAG-LABEL: test_mul_by_520:
   2069 ; X64-JAG:       # %bb.0:
   2070 ; X64-JAG-NEXT:    movq %rdi, %rax # sched: [1:0.50]
   2071 ; X64-JAG-NEXT:    shlq $9, %rax # sched: [1:0.50]
   2072 ; X64-JAG-NEXT:    leaq (%rax,%rdi,8), %rax # sched: [2:1.00]
   2073 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   2074 ;
   2075 ; X86-NOOPT-LABEL: test_mul_by_520:
   2076 ; X86-NOOPT:       # %bb.0:
   2077 ; X86-NOOPT-NEXT:    movl $520, %eax # imm = 0x208
   2078 ; X86-NOOPT-NEXT:    mull {{[0-9]+}}(%esp)
   2079 ; X86-NOOPT-NEXT:    imull $520, {{[0-9]+}}(%esp), %ecx # imm = 0x208
   2080 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   2081 ; X86-NOOPT-NEXT:    retl
   2082 ;
   2083 ; HSW-NOOPT-LABEL: test_mul_by_520:
   2084 ; HSW-NOOPT:       # %bb.0:
   2085 ; HSW-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
   2086 ; HSW-NOOPT-NEXT:    # sched: [3:1.00]
   2087 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   2088 ;
   2089 ; JAG-NOOPT-LABEL: test_mul_by_520:
   2090 ; JAG-NOOPT:       # %bb.0:
   2091 ; JAG-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
   2092 ; JAG-NOOPT-NEXT:    # sched: [6:4.00]
   2093 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   2094 ;
   2095 ; X64-SLM-LABEL: test_mul_by_520:
   2096 ; X64-SLM:       # %bb.0:
   2097 ; X64-SLM-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
   2098 ; X64-SLM-NEXT:    # sched: [3:1.00]
   2099 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   2100 ;
   2101 ; SLM-NOOPT-LABEL: test_mul_by_520:
   2102 ; SLM-NOOPT:       # %bb.0:
   2103 ; SLM-NOOPT-NEXT:    imulq $520, %rdi, %rax # imm = 0x208
   2104 ; SLM-NOOPT-NEXT:    # sched: [3:1.00]
   2105 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   2106   %mul = mul nsw i64 %x, 520
   2107   ret i64 %mul
   2108 }
   2109 
   2110 define i64 @test_mul_by_neg10(i64 %x) {
   2111 ; X86-LABEL: test_mul_by_neg10:
   2112 ; X86:       # %bb.0:
   2113 ; X86-NEXT:    pushl %esi
   2114 ; X86-NEXT:    .cfi_def_cfa_offset 8
   2115 ; X86-NEXT:    .cfi_offset %esi, -8
   2116 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2117 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
   2118 ; X86-NEXT:    movl $-10, %edx
   2119 ; X86-NEXT:    movl %ecx, %eax
   2120 ; X86-NEXT:    mull %edx
   2121 ; X86-NEXT:    subl %ecx, %edx
   2122 ; X86-NEXT:    leal (%esi,%esi,4), %ecx
   2123 ; X86-NEXT:    addl %ecx, %ecx
   2124 ; X86-NEXT:    subl %ecx, %edx
   2125 ; X86-NEXT:    popl %esi
   2126 ; X86-NEXT:    .cfi_def_cfa_offset 4
   2127 ; X86-NEXT:    retl
   2128 ;
   2129 ; X64-HSW-LABEL: test_mul_by_neg10:
   2130 ; X64-HSW:       # %bb.0:
   2131 ; X64-HSW-NEXT:    addq %rdi, %rdi # sched: [1:0.25]
   2132 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   2133 ; X64-HSW-NEXT:    negq %rax # sched: [1:0.25]
   2134 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   2135 ;
   2136 ; X64-JAG-LABEL: test_mul_by_neg10:
   2137 ; X64-JAG:       # %bb.0:
   2138 ; X64-JAG-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
   2139 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
   2140 ; X64-JAG-NEXT:    negq %rax # sched: [1:0.50]
   2141 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   2142 ;
   2143 ; X86-NOOPT-LABEL: test_mul_by_neg10:
   2144 ; X86-NOOPT:       # %bb.0:
   2145 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2146 ; X86-NOOPT-NEXT:    movl $-10, %edx
   2147 ; X86-NOOPT-NEXT:    movl %ecx, %eax
   2148 ; X86-NOOPT-NEXT:    mull %edx
   2149 ; X86-NOOPT-NEXT:    subl %ecx, %edx
   2150 ; X86-NOOPT-NEXT:    imull $-10, {{[0-9]+}}(%esp), %ecx
   2151 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   2152 ; X86-NOOPT-NEXT:    retl
   2153 ;
   2154 ; HSW-NOOPT-LABEL: test_mul_by_neg10:
   2155 ; HSW-NOOPT:       # %bb.0:
   2156 ; HSW-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [3:1.00]
   2157 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   2158 ;
   2159 ; JAG-NOOPT-LABEL: test_mul_by_neg10:
   2160 ; JAG-NOOPT:       # %bb.0:
   2161 ; JAG-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [6:4.00]
   2162 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   2163 ;
   2164 ; X64-SLM-LABEL: test_mul_by_neg10:
   2165 ; X64-SLM:       # %bb.0:
   2166 ; X64-SLM-NEXT:    addq %rdi, %rdi # sched: [1:0.50]
   2167 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:1.00]
   2168 ; X64-SLM-NEXT:    negq %rax # sched: [1:0.50]
   2169 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   2170 ;
   2171 ; SLM-NOOPT-LABEL: test_mul_by_neg10:
   2172 ; SLM-NOOPT:       # %bb.0:
   2173 ; SLM-NOOPT-NEXT:    imulq $-10, %rdi, %rax # sched: [3:1.00]
   2174 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   2175   %mul = mul nsw i64 %x, -10
   2176   ret i64 %mul
   2177 }
   2178 
   2179 define i64 @test_mul_by_neg36(i64 %x) {
   2180 ; X86-LABEL: test_mul_by_neg36:
   2181 ; X86:       # %bb.0:
   2182 ; X86-NEXT:    pushl %esi
   2183 ; X86-NEXT:    .cfi_def_cfa_offset 8
   2184 ; X86-NEXT:    .cfi_offset %esi, -8
   2185 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2186 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
   2187 ; X86-NEXT:    movl $-36, %edx
   2188 ; X86-NEXT:    movl %ecx, %eax
   2189 ; X86-NEXT:    mull %edx
   2190 ; X86-NEXT:    subl %ecx, %edx
   2191 ; X86-NEXT:    leal (%esi,%esi,8), %ecx
   2192 ; X86-NEXT:    shll $2, %ecx
   2193 ; X86-NEXT:    subl %ecx, %edx
   2194 ; X86-NEXT:    popl %esi
   2195 ; X86-NEXT:    .cfi_def_cfa_offset 4
   2196 ; X86-NEXT:    retl
   2197 ;
   2198 ; X64-HSW-LABEL: test_mul_by_neg36:
   2199 ; X64-HSW:       # %bb.0:
   2200 ; X64-HSW-NEXT:    shlq $2, %rdi # sched: [1:0.50]
   2201 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
   2202 ; X64-HSW-NEXT:    negq %rax # sched: [1:0.25]
   2203 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   2204 ;
   2205 ; X64-JAG-LABEL: test_mul_by_neg36:
   2206 ; X64-JAG:       # %bb.0:
   2207 ; X64-JAG-NEXT:    shlq $2, %rdi # sched: [1:0.50]
   2208 ; X64-JAG-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
   2209 ; X64-JAG-NEXT:    negq %rax # sched: [1:0.50]
   2210 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   2211 ;
   2212 ; X86-NOOPT-LABEL: test_mul_by_neg36:
   2213 ; X86-NOOPT:       # %bb.0:
   2214 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2215 ; X86-NOOPT-NEXT:    movl $-36, %edx
   2216 ; X86-NOOPT-NEXT:    movl %ecx, %eax
   2217 ; X86-NOOPT-NEXT:    mull %edx
   2218 ; X86-NOOPT-NEXT:    subl %ecx, %edx
   2219 ; X86-NOOPT-NEXT:    imull $-36, {{[0-9]+}}(%esp), %ecx
   2220 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   2221 ; X86-NOOPT-NEXT:    retl
   2222 ;
   2223 ; HSW-NOOPT-LABEL: test_mul_by_neg36:
   2224 ; HSW-NOOPT:       # %bb.0:
   2225 ; HSW-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [3:1.00]
   2226 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   2227 ;
   2228 ; JAG-NOOPT-LABEL: test_mul_by_neg36:
   2229 ; JAG-NOOPT:       # %bb.0:
   2230 ; JAG-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [6:4.00]
   2231 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   2232 ;
   2233 ; X64-SLM-LABEL: test_mul_by_neg36:
   2234 ; X64-SLM:       # %bb.0:
   2235 ; X64-SLM-NEXT:    shlq $2, %rdi # sched: [1:1.00]
   2236 ; X64-SLM-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:1.00]
   2237 ; X64-SLM-NEXT:    negq %rax # sched: [1:0.50]
   2238 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   2239 ;
   2240 ; SLM-NOOPT-LABEL: test_mul_by_neg36:
   2241 ; SLM-NOOPT:       # %bb.0:
   2242 ; SLM-NOOPT-NEXT:    imulq $-36, %rdi, %rax # sched: [3:1.00]
   2243 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   2244   %mul = mul nsw i64 %x, -36
   2245   ret i64 %mul
   2246 }
   2247 
   2248 ; (x*9+42)*(x*5+2)
   2249 define i64 @test_mul_spec(i64 %x) nounwind {
   2250 ; X86-LABEL: test_mul_spec:
   2251 ; X86:       # %bb.0:
   2252 ; X86-NEXT:    pushl %ebx
   2253 ; X86-NEXT:    pushl %edi
   2254 ; X86-NEXT:    pushl %esi
   2255 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2256 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
   2257 ; X86-NEXT:    movl $9, %edx
   2258 ; X86-NEXT:    movl %ecx, %eax
   2259 ; X86-NEXT:    mull %edx
   2260 ; X86-NEXT:    movl %eax, %esi
   2261 ; X86-NEXT:    leal (%edi,%edi,8), %ebx
   2262 ; X86-NEXT:    addl $42, %esi
   2263 ; X86-NEXT:    adcl %edx, %ebx
   2264 ; X86-NEXT:    movl $5, %edx
   2265 ; X86-NEXT:    movl %ecx, %eax
   2266 ; X86-NEXT:    mull %edx
   2267 ; X86-NEXT:    movl %eax, %ecx
   2268 ; X86-NEXT:    leal (%edi,%edi,4), %edi
   2269 ; X86-NEXT:    addl $2, %ecx
   2270 ; X86-NEXT:    adcl %edx, %edi
   2271 ; X86-NEXT:    movl %esi, %eax
   2272 ; X86-NEXT:    mull %ecx
   2273 ; X86-NEXT:    imull %esi, %edi
   2274 ; X86-NEXT:    addl %edi, %edx
   2275 ; X86-NEXT:    imull %ebx, %ecx
   2276 ; X86-NEXT:    addl %ecx, %edx
   2277 ; X86-NEXT:    popl %esi
   2278 ; X86-NEXT:    popl %edi
   2279 ; X86-NEXT:    popl %ebx
   2280 ; X86-NEXT:    retl
   2281 ;
   2282 ; X64-HSW-LABEL: test_mul_spec:
   2283 ; X64-HSW:       # %bb.0:
   2284 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,8), %rcx # sched: [1:0.50]
   2285 ; X64-HSW-NEXT:    addq $42, %rcx # sched: [1:0.25]
   2286 ; X64-HSW-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   2287 ; X64-HSW-NEXT:    addq $2, %rax # sched: [1:0.25]
   2288 ; X64-HSW-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
   2289 ; X64-HSW-NEXT:    retq # sched: [7:1.00]
   2290 ;
   2291 ; X64-JAG-LABEL: test_mul_spec:
   2292 ; X64-JAG:       # %bb.0:
   2293 ; X64-JAG-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00]
   2294 ; X64-JAG-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00]
   2295 ; X64-JAG-NEXT:    imulq %rcx, %rax # sched: [6:4.00]
   2296 ; X64-JAG-NEXT:    retq # sched: [4:1.00]
   2297 ;
   2298 ; X86-NOOPT-LABEL: test_mul_spec:
   2299 ; X86-NOOPT:       # %bb.0:
   2300 ; X86-NOOPT-NEXT:    pushl %ebx
   2301 ; X86-NOOPT-NEXT:    pushl %edi
   2302 ; X86-NOOPT-NEXT:    pushl %esi
   2303 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
   2304 ; X86-NOOPT-NEXT:    movl {{[0-9]+}}(%esp), %edi
   2305 ; X86-NOOPT-NEXT:    movl $9, %edx
   2306 ; X86-NOOPT-NEXT:    movl %ecx, %eax
   2307 ; X86-NOOPT-NEXT:    mull %edx
   2308 ; X86-NOOPT-NEXT:    movl %eax, %esi
   2309 ; X86-NOOPT-NEXT:    leal (%edi,%edi,8), %ebx
   2310 ; X86-NOOPT-NEXT:    addl $42, %esi
   2311 ; X86-NOOPT-NEXT:    adcl %edx, %ebx
   2312 ; X86-NOOPT-NEXT:    movl $5, %edx
   2313 ; X86-NOOPT-NEXT:    movl %ecx, %eax
   2314 ; X86-NOOPT-NEXT:    mull %edx
   2315 ; X86-NOOPT-NEXT:    movl %eax, %ecx
   2316 ; X86-NOOPT-NEXT:    leal (%edi,%edi,4), %edi
   2317 ; X86-NOOPT-NEXT:    addl $2, %ecx
   2318 ; X86-NOOPT-NEXT:    adcl %edx, %edi
   2319 ; X86-NOOPT-NEXT:    movl %esi, %eax
   2320 ; X86-NOOPT-NEXT:    mull %ecx
   2321 ; X86-NOOPT-NEXT:    imull %esi, %edi
   2322 ; X86-NOOPT-NEXT:    addl %edi, %edx
   2323 ; X86-NOOPT-NEXT:    imull %ebx, %ecx
   2324 ; X86-NOOPT-NEXT:    addl %ecx, %edx
   2325 ; X86-NOOPT-NEXT:    popl %esi
   2326 ; X86-NOOPT-NEXT:    popl %edi
   2327 ; X86-NOOPT-NEXT:    popl %ebx
   2328 ; X86-NOOPT-NEXT:    retl
   2329 ;
   2330 ; HSW-NOOPT-LABEL: test_mul_spec:
   2331 ; HSW-NOOPT:       # %bb.0:
   2332 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,8), %rcx # sched: [1:0.50]
   2333 ; HSW-NOOPT-NEXT:    addq $42, %rcx # sched: [1:0.25]
   2334 ; HSW-NOOPT-NEXT:    leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
   2335 ; HSW-NOOPT-NEXT:    addq $2, %rax # sched: [1:0.25]
   2336 ; HSW-NOOPT-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
   2337 ; HSW-NOOPT-NEXT:    retq # sched: [7:1.00]
   2338 ;
   2339 ; JAG-NOOPT-LABEL: test_mul_spec:
   2340 ; JAG-NOOPT:       # %bb.0:
   2341 ; JAG-NOOPT-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [2:1.00]
   2342 ; JAG-NOOPT-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [2:1.00]
   2343 ; JAG-NOOPT-NEXT:    imulq %rcx, %rax # sched: [6:4.00]
   2344 ; JAG-NOOPT-NEXT:    retq # sched: [4:1.00]
   2345 ;
   2346 ; X64-SLM-LABEL: test_mul_spec:
   2347 ; X64-SLM:       # %bb.0:
   2348 ; X64-SLM-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [1:1.00]
   2349 ; X64-SLM-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [1:1.00]
   2350 ; X64-SLM-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
   2351 ; X64-SLM-NEXT:    retq # sched: [4:1.00]
   2352 ;
   2353 ; SLM-NOOPT-LABEL: test_mul_spec:
   2354 ; SLM-NOOPT:       # %bb.0:
   2355 ; SLM-NOOPT-NEXT:    leaq 42(%rdi,%rdi,8), %rcx # sched: [1:1.00]
   2356 ; SLM-NOOPT-NEXT:    leaq 2(%rdi,%rdi,4), %rax # sched: [1:1.00]
   2357 ; SLM-NOOPT-NEXT:    imulq %rcx, %rax # sched: [3:1.00]
   2358 ; SLM-NOOPT-NEXT:    retq # sched: [4:1.00]
   2359   %mul = mul nsw i64 %x, 9
   2360   %add = add nsw i64 %mul, 42
   2361   %mul2 = mul nsw i64 %x, 5
   2362   %add2 = add nsw i64 %mul2, 2
   2363   %mul3 = mul nsw i64 %add, %add2
   2364   ret i64 %mul3
   2365 }
   2366