Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=x86-64      | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=atom        | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm         | FileCheck %s --check-prefix=CHECK --check-prefix=SLM
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge   | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell     | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
      8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell   | FileCheck %s --check-prefix=CHECK --check-prefix=BROADWELL
      9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake     | FileCheck %s --check-prefix=CHECK --check-prefix=SKYLAKE
     10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=knl         | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
     11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2      | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
     12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1      | FileCheck %s --check-prefix=CHECK --check-prefix=ZNVER1
     13 
     14 define i64 @test_lea_offset(i64) {
     15 ; GENERIC-LABEL: test_lea_offset:
     16 ; GENERIC:       # %bb.0:
     17 ; GENERIC-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     18 ; GENERIC-NEXT:    retq # sched: [1:1.00]
     19 ;
     20 ; ATOM-LABEL: test_lea_offset:
     21 ; ATOM:       # %bb.0:
     22 ; ATOM-NEXT:    leaq -24(%rdi), %rax # sched: [1:1.00]
     23 ; ATOM-NEXT:    nop # sched: [1:0.50]
     24 ; ATOM-NEXT:    nop # sched: [1:0.50]
     25 ; ATOM-NEXT:    nop # sched: [1:0.50]
     26 ; ATOM-NEXT:    nop # sched: [1:0.50]
     27 ; ATOM-NEXT:    nop # sched: [1:0.50]
     28 ; ATOM-NEXT:    nop # sched: [1:0.50]
     29 ; ATOM-NEXT:    retq # sched: [79:39.50]
     30 ;
     31 ; SLM-LABEL: test_lea_offset:
     32 ; SLM:       # %bb.0:
     33 ; SLM-NEXT:    leaq -24(%rdi), %rax # sched: [1:1.00]
     34 ; SLM-NEXT:    retq # sched: [4:1.00]
     35 ;
     36 ; SANDY-LABEL: test_lea_offset:
     37 ; SANDY:       # %bb.0:
     38 ; SANDY-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     39 ; SANDY-NEXT:    retq # sched: [1:1.00]
     40 ;
     41 ; HASWELL-LABEL: test_lea_offset:
     42 ; HASWELL:       # %bb.0:
     43 ; HASWELL-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     44 ; HASWELL-NEXT:    retq # sched: [7:1.00]
     45 ;
     46 ; BROADWELL-LABEL: test_lea_offset:
     47 ; BROADWELL:       # %bb.0:
     48 ; BROADWELL-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     49 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
     50 ;
     51 ; SKYLAKE-LABEL: test_lea_offset:
     52 ; SKYLAKE:       # %bb.0:
     53 ; SKYLAKE-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     54 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
     55 ;
     56 ; BTVER2-LABEL: test_lea_offset:
     57 ; BTVER2:       # %bb.0:
     58 ; BTVER2-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.50]
     59 ; BTVER2-NEXT:    retq # sched: [4:1.00]
     60 ;
     61 ; ZNVER1-LABEL: test_lea_offset:
     62 ; ZNVER1:       # %bb.0:
     63 ; ZNVER1-NEXT:    leaq -24(%rdi), %rax # sched: [1:0.25]
     64 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
     65   %2 = add nsw i64 %0, -24
     66   ret i64 %2
     67 }
     68 
     69 define i64 @test_lea_offset_big(i64) {
     70 ; GENERIC-LABEL: test_lea_offset_big:
     71 ; GENERIC:       # %bb.0:
     72 ; GENERIC-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
     73 ; GENERIC-NEXT:    retq # sched: [1:1.00]
     74 ;
     75 ; ATOM-LABEL: test_lea_offset_big:
     76 ; ATOM:       # %bb.0:
     77 ; ATOM-NEXT:    leaq 1024(%rdi), %rax # sched: [1:1.00]
     78 ; ATOM-NEXT:    nop # sched: [1:0.50]
     79 ; ATOM-NEXT:    nop # sched: [1:0.50]
     80 ; ATOM-NEXT:    nop # sched: [1:0.50]
     81 ; ATOM-NEXT:    nop # sched: [1:0.50]
     82 ; ATOM-NEXT:    nop # sched: [1:0.50]
     83 ; ATOM-NEXT:    nop # sched: [1:0.50]
     84 ; ATOM-NEXT:    retq # sched: [79:39.50]
     85 ;
     86 ; SLM-LABEL: test_lea_offset_big:
     87 ; SLM:       # %bb.0:
     88 ; SLM-NEXT:    leaq 1024(%rdi), %rax # sched: [1:1.00]
     89 ; SLM-NEXT:    retq # sched: [4:1.00]
     90 ;
     91 ; SANDY-LABEL: test_lea_offset_big:
     92 ; SANDY:       # %bb.0:
     93 ; SANDY-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
     94 ; SANDY-NEXT:    retq # sched: [1:1.00]
     95 ;
     96 ; HASWELL-LABEL: test_lea_offset_big:
     97 ; HASWELL:       # %bb.0:
     98 ; HASWELL-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
     99 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    100 ;
    101 ; BROADWELL-LABEL: test_lea_offset_big:
    102 ; BROADWELL:       # %bb.0:
    103 ; BROADWELL-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
    104 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    105 ;
    106 ; SKYLAKE-LABEL: test_lea_offset_big:
    107 ; SKYLAKE:       # %bb.0:
    108 ; SKYLAKE-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
    109 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    110 ;
    111 ; BTVER2-LABEL: test_lea_offset_big:
    112 ; BTVER2:       # %bb.0:
    113 ; BTVER2-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.50]
    114 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    115 ;
    116 ; ZNVER1-LABEL: test_lea_offset_big:
    117 ; ZNVER1:       # %bb.0:
    118 ; ZNVER1-NEXT:    leaq 1024(%rdi), %rax # sched: [1:0.25]
    119 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    120   %2 = add nsw i64 %0, 1024
    121   ret i64 %2
    122 }
    123 
    124 ; Function Attrs: norecurse nounwind readnone uwtable
    125 define i64 @test_lea_add(i64, i64) {
    126 ; GENERIC-LABEL: test_lea_add:
    127 ; GENERIC:       # %bb.0:
    128 ; GENERIC-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    129 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    130 ;
    131 ; ATOM-LABEL: test_lea_add:
    132 ; ATOM:       # %bb.0:
    133 ; ATOM-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:1.00]
    134 ; ATOM-NEXT:    nop # sched: [1:0.50]
    135 ; ATOM-NEXT:    nop # sched: [1:0.50]
    136 ; ATOM-NEXT:    nop # sched: [1:0.50]
    137 ; ATOM-NEXT:    nop # sched: [1:0.50]
    138 ; ATOM-NEXT:    nop # sched: [1:0.50]
    139 ; ATOM-NEXT:    nop # sched: [1:0.50]
    140 ; ATOM-NEXT:    retq # sched: [79:39.50]
    141 ;
    142 ; SLM-LABEL: test_lea_add:
    143 ; SLM:       # %bb.0:
    144 ; SLM-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:1.00]
    145 ; SLM-NEXT:    retq # sched: [4:1.00]
    146 ;
    147 ; SANDY-LABEL: test_lea_add:
    148 ; SANDY:       # %bb.0:
    149 ; SANDY-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    150 ; SANDY-NEXT:    retq # sched: [1:1.00]
    151 ;
    152 ; HASWELL-LABEL: test_lea_add:
    153 ; HASWELL:       # %bb.0:
    154 ; HASWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    155 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    156 ;
    157 ; BROADWELL-LABEL: test_lea_add:
    158 ; BROADWELL:       # %bb.0:
    159 ; BROADWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    160 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    161 ;
    162 ; SKYLAKE-LABEL: test_lea_add:
    163 ; SKYLAKE:       # %bb.0:
    164 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    165 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    166 ;
    167 ; BTVER2-LABEL: test_lea_add:
    168 ; BTVER2:       # %bb.0:
    169 ; BTVER2-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    170 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    171 ;
    172 ; ZNVER1-LABEL: test_lea_add:
    173 ; ZNVER1:       # %bb.0:
    174 ; ZNVER1-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.25]
    175 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    176   %3 = add nsw i64 %1, %0
    177   ret i64 %3
    178 }
    179 
    180 define i64 @test_lea_add_offset(i64, i64) {
    181 ; GENERIC-LABEL: test_lea_add_offset:
    182 ; GENERIC:       # %bb.0:
    183 ; GENERIC-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    184 ; GENERIC-NEXT:    addq $16, %rax # sched: [1:0.33]
    185 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    186 ;
    187 ; ATOM-LABEL: test_lea_add_offset:
    188 ; ATOM:       # %bb.0:
    189 ; ATOM-NEXT:    leaq 16(%rdi,%rsi), %rax # sched: [1:1.00]
    190 ; ATOM-NEXT:    nop # sched: [1:0.50]
    191 ; ATOM-NEXT:    nop # sched: [1:0.50]
    192 ; ATOM-NEXT:    nop # sched: [1:0.50]
    193 ; ATOM-NEXT:    nop # sched: [1:0.50]
    194 ; ATOM-NEXT:    nop # sched: [1:0.50]
    195 ; ATOM-NEXT:    nop # sched: [1:0.50]
    196 ; ATOM-NEXT:    retq # sched: [79:39.50]
    197 ;
    198 ; SLM-LABEL: test_lea_add_offset:
    199 ; SLM:       # %bb.0:
    200 ; SLM-NEXT:    leaq 16(%rdi,%rsi), %rax # sched: [1:1.00]
    201 ; SLM-NEXT:    retq # sched: [4:1.00]
    202 ;
    203 ; SANDY-LABEL: test_lea_add_offset:
    204 ; SANDY:       # %bb.0:
    205 ; SANDY-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    206 ; SANDY-NEXT:    addq $16, %rax # sched: [1:0.33]
    207 ; SANDY-NEXT:    retq # sched: [1:1.00]
    208 ;
    209 ; HASWELL-LABEL: test_lea_add_offset:
    210 ; HASWELL:       # %bb.0:
    211 ; HASWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    212 ; HASWELL-NEXT:    addq $16, %rax # sched: [1:0.25]
    213 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    214 ;
    215 ; BROADWELL-LABEL: test_lea_add_offset:
    216 ; BROADWELL:       # %bb.0:
    217 ; BROADWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    218 ; BROADWELL-NEXT:    addq $16, %rax # sched: [1:0.25]
    219 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    220 ;
    221 ; SKYLAKE-LABEL: test_lea_add_offset:
    222 ; SKYLAKE:       # %bb.0:
    223 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    224 ; SKYLAKE-NEXT:    addq $16, %rax # sched: [1:0.25]
    225 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    226 ;
    227 ; BTVER2-LABEL: test_lea_add_offset:
    228 ; BTVER2:       # %bb.0:
    229 ; BTVER2-NEXT:    leaq 16(%rdi,%rsi), %rax # sched: [2:1.00]
    230 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    231 ;
    232 ; ZNVER1-LABEL: test_lea_add_offset:
    233 ; ZNVER1:       # %bb.0:
    234 ; ZNVER1-NEXT:    leaq 16(%rdi,%rsi), %rax # sched: [1:0.25]
    235 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    236   %3 = add i64 %0, 16
    237   %4 = add i64 %3, %1
    238   ret i64 %4
    239 }
    240 
    241 define i64 @test_lea_add_offset_big(i64, i64) {
    242 ; GENERIC-LABEL: test_lea_add_offset_big:
    243 ; GENERIC:       # %bb.0:
    244 ; GENERIC-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    245 ; GENERIC-NEXT:    addq $-4096, %rax # imm = 0xF000
    246 ; GENERIC-NEXT:    # sched: [1:0.33]
    247 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    248 ;
    249 ; ATOM-LABEL: test_lea_add_offset_big:
    250 ; ATOM:       # %bb.0:
    251 ; ATOM-NEXT:    leaq -4096(%rdi,%rsi), %rax # sched: [1:1.00]
    252 ; ATOM-NEXT:    nop # sched: [1:0.50]
    253 ; ATOM-NEXT:    nop # sched: [1:0.50]
    254 ; ATOM-NEXT:    nop # sched: [1:0.50]
    255 ; ATOM-NEXT:    nop # sched: [1:0.50]
    256 ; ATOM-NEXT:    nop # sched: [1:0.50]
    257 ; ATOM-NEXT:    nop # sched: [1:0.50]
    258 ; ATOM-NEXT:    retq # sched: [79:39.50]
    259 ;
    260 ; SLM-LABEL: test_lea_add_offset_big:
    261 ; SLM:       # %bb.0:
    262 ; SLM-NEXT:    leaq -4096(%rdi,%rsi), %rax # sched: [1:1.00]
    263 ; SLM-NEXT:    retq # sched: [4:1.00]
    264 ;
    265 ; SANDY-LABEL: test_lea_add_offset_big:
    266 ; SANDY:       # %bb.0:
    267 ; SANDY-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    268 ; SANDY-NEXT:    addq $-4096, %rax # imm = 0xF000
    269 ; SANDY-NEXT:    # sched: [1:0.33]
    270 ; SANDY-NEXT:    retq # sched: [1:1.00]
    271 ;
    272 ; HASWELL-LABEL: test_lea_add_offset_big:
    273 ; HASWELL:       # %bb.0:
    274 ; HASWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    275 ; HASWELL-NEXT:    addq $-4096, %rax # imm = 0xF000
    276 ; HASWELL-NEXT:    # sched: [1:0.25]
    277 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    278 ;
    279 ; BROADWELL-LABEL: test_lea_add_offset_big:
    280 ; BROADWELL:       # %bb.0:
    281 ; BROADWELL-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    282 ; BROADWELL-NEXT:    addq $-4096, %rax # imm = 0xF000
    283 ; BROADWELL-NEXT:    # sched: [1:0.25]
    284 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    285 ;
    286 ; SKYLAKE-LABEL: test_lea_add_offset_big:
    287 ; SKYLAKE:       # %bb.0:
    288 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi), %rax # sched: [1:0.50]
    289 ; SKYLAKE-NEXT:    addq $-4096, %rax # imm = 0xF000
    290 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    291 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    292 ;
    293 ; BTVER2-LABEL: test_lea_add_offset_big:
    294 ; BTVER2:       # %bb.0:
    295 ; BTVER2-NEXT:    leaq -4096(%rdi,%rsi), %rax # sched: [2:1.00]
    296 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    297 ;
    298 ; ZNVER1-LABEL: test_lea_add_offset_big:
    299 ; ZNVER1:       # %bb.0:
    300 ; ZNVER1-NEXT:    leaq -4096(%rdi,%rsi), %rax # sched: [1:0.25]
    301 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    302   %3 = add i64 %0, -4096
    303   %4 = add i64 %3, %1
    304   ret i64 %4
    305 }
    306 
    307 define i64 @test_lea_mul(i64) {
    308 ; GENERIC-LABEL: test_lea_mul:
    309 ; GENERIC:       # %bb.0:
    310 ; GENERIC-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    311 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    312 ;
    313 ; ATOM-LABEL: test_lea_mul:
    314 ; ATOM:       # %bb.0:
    315 ; ATOM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    316 ; ATOM-NEXT:    nop # sched: [1:0.50]
    317 ; ATOM-NEXT:    nop # sched: [1:0.50]
    318 ; ATOM-NEXT:    nop # sched: [1:0.50]
    319 ; ATOM-NEXT:    nop # sched: [1:0.50]
    320 ; ATOM-NEXT:    nop # sched: [1:0.50]
    321 ; ATOM-NEXT:    nop # sched: [1:0.50]
    322 ; ATOM-NEXT:    retq # sched: [79:39.50]
    323 ;
    324 ; SLM-LABEL: test_lea_mul:
    325 ; SLM:       # %bb.0:
    326 ; SLM-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:1.00]
    327 ; SLM-NEXT:    retq # sched: [4:1.00]
    328 ;
    329 ; SANDY-LABEL: test_lea_mul:
    330 ; SANDY:       # %bb.0:
    331 ; SANDY-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    332 ; SANDY-NEXT:    retq # sched: [1:1.00]
    333 ;
    334 ; HASWELL-LABEL: test_lea_mul:
    335 ; HASWELL:       # %bb.0:
    336 ; HASWELL-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    337 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    338 ;
    339 ; BROADWELL-LABEL: test_lea_mul:
    340 ; BROADWELL:       # %bb.0:
    341 ; BROADWELL-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    342 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    343 ;
    344 ; SKYLAKE-LABEL: test_lea_mul:
    345 ; SKYLAKE:       # %bb.0:
    346 ; SKYLAKE-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    347 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    348 ;
    349 ; BTVER2-LABEL: test_lea_mul:
    350 ; BTVER2:       # %bb.0:
    351 ; BTVER2-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [2:1.00]
    352 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    353 ;
    354 ; ZNVER1-LABEL: test_lea_mul:
    355 ; ZNVER1:       # %bb.0:
    356 ; ZNVER1-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.25]
    357 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    358   %2 = mul nsw i64 %0, 3
    359   ret i64 %2
    360 }
    361 
    362 define i64 @test_lea_mul_offset(i64) {
    363 ; GENERIC-LABEL: test_lea_mul_offset:
    364 ; GENERIC:       # %bb.0:
    365 ; GENERIC-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    366 ; GENERIC-NEXT:    addq $-32, %rax # sched: [1:0.33]
    367 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    368 ;
    369 ; ATOM-LABEL: test_lea_mul_offset:
    370 ; ATOM:       # %bb.0:
    371 ; ATOM-NEXT:    leaq -32(%rdi,%rdi,2), %rax # sched: [1:1.00]
    372 ; ATOM-NEXT:    nop # sched: [1:0.50]
    373 ; ATOM-NEXT:    nop # sched: [1:0.50]
    374 ; ATOM-NEXT:    nop # sched: [1:0.50]
    375 ; ATOM-NEXT:    nop # sched: [1:0.50]
    376 ; ATOM-NEXT:    nop # sched: [1:0.50]
    377 ; ATOM-NEXT:    nop # sched: [1:0.50]
    378 ; ATOM-NEXT:    retq # sched: [79:39.50]
    379 ;
    380 ; SLM-LABEL: test_lea_mul_offset:
    381 ; SLM:       # %bb.0:
    382 ; SLM-NEXT:    leaq -32(%rdi,%rdi,2), %rax # sched: [1:1.00]
    383 ; SLM-NEXT:    retq # sched: [4:1.00]
    384 ;
    385 ; SANDY-LABEL: test_lea_mul_offset:
    386 ; SANDY:       # %bb.0:
    387 ; SANDY-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    388 ; SANDY-NEXT:    addq $-32, %rax # sched: [1:0.33]
    389 ; SANDY-NEXT:    retq # sched: [1:1.00]
    390 ;
    391 ; HASWELL-LABEL: test_lea_mul_offset:
    392 ; HASWELL:       # %bb.0:
    393 ; HASWELL-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    394 ; HASWELL-NEXT:    addq $-32, %rax # sched: [1:0.25]
    395 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    396 ;
    397 ; BROADWELL-LABEL: test_lea_mul_offset:
    398 ; BROADWELL:       # %bb.0:
    399 ; BROADWELL-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    400 ; BROADWELL-NEXT:    addq $-32, %rax # sched: [1:0.25]
    401 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    402 ;
    403 ; SKYLAKE-LABEL: test_lea_mul_offset:
    404 ; SKYLAKE:       # %bb.0:
    405 ; SKYLAKE-NEXT:    leaq (%rdi,%rdi,2), %rax # sched: [1:0.50]
    406 ; SKYLAKE-NEXT:    addq $-32, %rax # sched: [1:0.25]
    407 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    408 ;
    409 ; BTVER2-LABEL: test_lea_mul_offset:
    410 ; BTVER2:       # %bb.0:
    411 ; BTVER2-NEXT:    leaq -32(%rdi,%rdi,2), %rax # sched: [2:1.00]
    412 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    413 ;
    414 ; ZNVER1-LABEL: test_lea_mul_offset:
    415 ; ZNVER1:       # %bb.0:
    416 ; ZNVER1-NEXT:    leaq -32(%rdi,%rdi,2), %rax # sched: [1:0.25]
    417 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    418   %2 = mul nsw i64 %0, 3
    419   %3 = add nsw i64 %2, -32
    420   ret i64 %3
    421 }
    422 
    423 define i64 @test_lea_mul_offset_big(i64) {
    424 ; GENERIC-LABEL: test_lea_mul_offset_big:
    425 ; GENERIC:       # %bb.0:
    426 ; GENERIC-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    427 ; GENERIC-NEXT:    addq $10000, %rax # imm = 0x2710
    428 ; GENERIC-NEXT:    # sched: [1:0.33]
    429 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    430 ;
    431 ; ATOM-LABEL: test_lea_mul_offset_big:
    432 ; ATOM:       # %bb.0:
    433 ; ATOM-NEXT:    leaq 10000(%rdi,%rdi,8), %rax # sched: [1:1.00]
    434 ; ATOM-NEXT:    nop # sched: [1:0.50]
    435 ; ATOM-NEXT:    nop # sched: [1:0.50]
    436 ; ATOM-NEXT:    nop # sched: [1:0.50]
    437 ; ATOM-NEXT:    nop # sched: [1:0.50]
    438 ; ATOM-NEXT:    nop # sched: [1:0.50]
    439 ; ATOM-NEXT:    nop # sched: [1:0.50]
    440 ; ATOM-NEXT:    retq # sched: [79:39.50]
    441 ;
    442 ; SLM-LABEL: test_lea_mul_offset_big:
    443 ; SLM:       # %bb.0:
    444 ; SLM-NEXT:    leaq 10000(%rdi,%rdi,8), %rax # sched: [1:1.00]
    445 ; SLM-NEXT:    retq # sched: [4:1.00]
    446 ;
    447 ; SANDY-LABEL: test_lea_mul_offset_big:
    448 ; SANDY:       # %bb.0:
    449 ; SANDY-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    450 ; SANDY-NEXT:    addq $10000, %rax # imm = 0x2710
    451 ; SANDY-NEXT:    # sched: [1:0.33]
    452 ; SANDY-NEXT:    retq # sched: [1:1.00]
    453 ;
    454 ; HASWELL-LABEL: test_lea_mul_offset_big:
    455 ; HASWELL:       # %bb.0:
    456 ; HASWELL-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    457 ; HASWELL-NEXT:    addq $10000, %rax # imm = 0x2710
    458 ; HASWELL-NEXT:    # sched: [1:0.25]
    459 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    460 ;
    461 ; BROADWELL-LABEL: test_lea_mul_offset_big:
    462 ; BROADWELL:       # %bb.0:
    463 ; BROADWELL-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    464 ; BROADWELL-NEXT:    addq $10000, %rax # imm = 0x2710
    465 ; BROADWELL-NEXT:    # sched: [1:0.25]
    466 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    467 ;
    468 ; SKYLAKE-LABEL: test_lea_mul_offset_big:
    469 ; SKYLAKE:       # %bb.0:
    470 ; SKYLAKE-NEXT:    leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
    471 ; SKYLAKE-NEXT:    addq $10000, %rax # imm = 0x2710
    472 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    473 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    474 ;
    475 ; BTVER2-LABEL: test_lea_mul_offset_big:
    476 ; BTVER2:       # %bb.0:
    477 ; BTVER2-NEXT:    leaq 10000(%rdi,%rdi,8), %rax # sched: [2:1.00]
    478 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    479 ;
    480 ; ZNVER1-LABEL: test_lea_mul_offset_big:
    481 ; ZNVER1:       # %bb.0:
    482 ; ZNVER1-NEXT:    leaq 10000(%rdi,%rdi,8), %rax # sched: [1:0.25]
    483 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    484   %2 = mul nsw i64 %0, 9
    485   %3 = add nsw i64 %2, 10000
    486   ret i64 %3
    487 }
    488 
    489 define i64 @test_lea_add_scale(i64, i64) {
    490 ; GENERIC-LABEL: test_lea_add_scale:
    491 ; GENERIC:       # %bb.0:
    492 ; GENERIC-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.50]
    493 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    494 ;
    495 ; ATOM-LABEL: test_lea_add_scale:
    496 ; ATOM:       # %bb.0:
    497 ; ATOM-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:1.00]
    498 ; ATOM-NEXT:    nop # sched: [1:0.50]
    499 ; ATOM-NEXT:    nop # sched: [1:0.50]
    500 ; ATOM-NEXT:    nop # sched: [1:0.50]
    501 ; ATOM-NEXT:    nop # sched: [1:0.50]
    502 ; ATOM-NEXT:    nop # sched: [1:0.50]
    503 ; ATOM-NEXT:    nop # sched: [1:0.50]
    504 ; ATOM-NEXT:    retq # sched: [79:39.50]
    505 ;
    506 ; SLM-LABEL: test_lea_add_scale:
    507 ; SLM:       # %bb.0:
    508 ; SLM-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:1.00]
    509 ; SLM-NEXT:    retq # sched: [4:1.00]
    510 ;
    511 ; SANDY-LABEL: test_lea_add_scale:
    512 ; SANDY:       # %bb.0:
    513 ; SANDY-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.50]
    514 ; SANDY-NEXT:    retq # sched: [1:1.00]
    515 ;
    516 ; HASWELL-LABEL: test_lea_add_scale:
    517 ; HASWELL:       # %bb.0:
    518 ; HASWELL-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.50]
    519 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    520 ;
    521 ; BROADWELL-LABEL: test_lea_add_scale:
    522 ; BROADWELL:       # %bb.0:
    523 ; BROADWELL-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.50]
    524 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    525 ;
    526 ; SKYLAKE-LABEL: test_lea_add_scale:
    527 ; SKYLAKE:       # %bb.0:
    528 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.50]
    529 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    530 ;
    531 ; BTVER2-LABEL: test_lea_add_scale:
    532 ; BTVER2:       # %bb.0:
    533 ; BTVER2-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [2:1.00]
    534 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    535 ;
    536 ; ZNVER1-LABEL: test_lea_add_scale:
    537 ; ZNVER1:       # %bb.0:
    538 ; ZNVER1-NEXT:    leaq (%rdi,%rsi,2), %rax # sched: [1:0.25]
    539 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    540   %3 = shl i64 %1, 1
    541   %4 = add nsw i64 %3, %0
    542   ret i64 %4
    543 }
    544 
    545 define i64 @test_lea_add_scale_offset(i64, i64) {
    546 ; GENERIC-LABEL: test_lea_add_scale_offset:
    547 ; GENERIC:       # %bb.0:
    548 ; GENERIC-NEXT:    leaq (%rdi,%rsi,4), %rax # sched: [1:0.50]
    549 ; GENERIC-NEXT:    addq $96, %rax # sched: [1:0.33]
    550 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    551 ;
    552 ; ATOM-LABEL: test_lea_add_scale_offset:
    553 ; ATOM:       # %bb.0:
    554 ; ATOM-NEXT:    leaq 96(%rdi,%rsi,4), %rax # sched: [1:1.00]
    555 ; ATOM-NEXT:    nop # sched: [1:0.50]
    556 ; ATOM-NEXT:    nop # sched: [1:0.50]
    557 ; ATOM-NEXT:    nop # sched: [1:0.50]
    558 ; ATOM-NEXT:    nop # sched: [1:0.50]
    559 ; ATOM-NEXT:    nop # sched: [1:0.50]
    560 ; ATOM-NEXT:    nop # sched: [1:0.50]
    561 ; ATOM-NEXT:    retq # sched: [79:39.50]
    562 ;
    563 ; SLM-LABEL: test_lea_add_scale_offset:
    564 ; SLM:       # %bb.0:
    565 ; SLM-NEXT:    leaq 96(%rdi,%rsi,4), %rax # sched: [1:1.00]
    566 ; SLM-NEXT:    retq # sched: [4:1.00]
    567 ;
    568 ; SANDY-LABEL: test_lea_add_scale_offset:
    569 ; SANDY:       # %bb.0:
    570 ; SANDY-NEXT:    leaq (%rdi,%rsi,4), %rax # sched: [1:0.50]
    571 ; SANDY-NEXT:    addq $96, %rax # sched: [1:0.33]
    572 ; SANDY-NEXT:    retq # sched: [1:1.00]
    573 ;
    574 ; HASWELL-LABEL: test_lea_add_scale_offset:
    575 ; HASWELL:       # %bb.0:
    576 ; HASWELL-NEXT:    leaq (%rdi,%rsi,4), %rax # sched: [1:0.50]
    577 ; HASWELL-NEXT:    addq $96, %rax # sched: [1:0.25]
    578 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    579 ;
    580 ; BROADWELL-LABEL: test_lea_add_scale_offset:
    581 ; BROADWELL:       # %bb.0:
    582 ; BROADWELL-NEXT:    leaq (%rdi,%rsi,4), %rax # sched: [1:0.50]
    583 ; BROADWELL-NEXT:    addq $96, %rax # sched: [1:0.25]
    584 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    585 ;
    586 ; SKYLAKE-LABEL: test_lea_add_scale_offset:
    587 ; SKYLAKE:       # %bb.0:
    588 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi,4), %rax # sched: [1:0.50]
    589 ; SKYLAKE-NEXT:    addq $96, %rax # sched: [1:0.25]
    590 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    591 ;
    592 ; BTVER2-LABEL: test_lea_add_scale_offset:
    593 ; BTVER2:       # %bb.0:
    594 ; BTVER2-NEXT:    leaq 96(%rdi,%rsi,4), %rax # sched: [2:1.00]
    595 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    596 ;
    597 ; ZNVER1-LABEL: test_lea_add_scale_offset:
    598 ; ZNVER1:       # %bb.0:
    599 ; ZNVER1-NEXT:    leaq 96(%rdi,%rsi,4), %rax # sched: [1:0.25]
    600 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    601   %3 = shl i64 %1, 2
    602   %4 = add i64 %0, 96
    603   %5 = add i64 %4, %3
    604   ret i64 %5
    605 }
    606 
    607 define i64 @test_lea_add_scale_offset_big(i64, i64) {
    608 ; GENERIC-LABEL: test_lea_add_scale_offset_big:
    609 ; GENERIC:       # %bb.0:
    610 ; GENERIC-NEXT:    leaq (%rdi,%rsi,8), %rax # sched: [1:0.50]
    611 ; GENERIC-NEXT:    addq $-1200, %rax # imm = 0xFB50
    612 ; GENERIC-NEXT:    # sched: [1:0.33]
    613 ; GENERIC-NEXT:    retq # sched: [1:1.00]
    614 ;
    615 ; ATOM-LABEL: test_lea_add_scale_offset_big:
    616 ; ATOM:       # %bb.0:
    617 ; ATOM-NEXT:    leaq -1200(%rdi,%rsi,8), %rax # sched: [1:1.00]
    618 ; ATOM-NEXT:    nop # sched: [1:0.50]
    619 ; ATOM-NEXT:    nop # sched: [1:0.50]
    620 ; ATOM-NEXT:    nop # sched: [1:0.50]
    621 ; ATOM-NEXT:    nop # sched: [1:0.50]
    622 ; ATOM-NEXT:    nop # sched: [1:0.50]
    623 ; ATOM-NEXT:    nop # sched: [1:0.50]
    624 ; ATOM-NEXT:    retq # sched: [79:39.50]
    625 ;
    626 ; SLM-LABEL: test_lea_add_scale_offset_big:
    627 ; SLM:       # %bb.0:
    628 ; SLM-NEXT:    leaq -1200(%rdi,%rsi,8), %rax # sched: [1:1.00]
    629 ; SLM-NEXT:    retq # sched: [4:1.00]
    630 ;
    631 ; SANDY-LABEL: test_lea_add_scale_offset_big:
    632 ; SANDY:       # %bb.0:
    633 ; SANDY-NEXT:    leaq (%rdi,%rsi,8), %rax # sched: [1:0.50]
    634 ; SANDY-NEXT:    addq $-1200, %rax # imm = 0xFB50
    635 ; SANDY-NEXT:    # sched: [1:0.33]
    636 ; SANDY-NEXT:    retq # sched: [1:1.00]
    637 ;
    638 ; HASWELL-LABEL: test_lea_add_scale_offset_big:
    639 ; HASWELL:       # %bb.0:
    640 ; HASWELL-NEXT:    leaq (%rdi,%rsi,8), %rax # sched: [1:0.50]
    641 ; HASWELL-NEXT:    addq $-1200, %rax # imm = 0xFB50
    642 ; HASWELL-NEXT:    # sched: [1:0.25]
    643 ; HASWELL-NEXT:    retq # sched: [7:1.00]
    644 ;
    645 ; BROADWELL-LABEL: test_lea_add_scale_offset_big:
    646 ; BROADWELL:       # %bb.0:
    647 ; BROADWELL-NEXT:    leaq (%rdi,%rsi,8), %rax # sched: [1:0.50]
    648 ; BROADWELL-NEXT:    addq $-1200, %rax # imm = 0xFB50
    649 ; BROADWELL-NEXT:    # sched: [1:0.25]
    650 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
    651 ;
    652 ; SKYLAKE-LABEL: test_lea_add_scale_offset_big:
    653 ; SKYLAKE:       # %bb.0:
    654 ; SKYLAKE-NEXT:    leaq (%rdi,%rsi,8), %rax # sched: [1:0.50]
    655 ; SKYLAKE-NEXT:    addq $-1200, %rax # imm = 0xFB50
    656 ; SKYLAKE-NEXT:    # sched: [1:0.25]
    657 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
    658 ;
    659 ; BTVER2-LABEL: test_lea_add_scale_offset_big:
    660 ; BTVER2:       # %bb.0:
    661 ; BTVER2-NEXT:    leaq -1200(%rdi,%rsi,8), %rax # sched: [2:1.00]
    662 ; BTVER2-NEXT:    retq # sched: [4:1.00]
    663 ;
    664 ; ZNVER1-LABEL: test_lea_add_scale_offset_big:
    665 ; ZNVER1:       # %bb.0:
    666 ; ZNVER1-NEXT:    leaq -1200(%rdi,%rsi,8), %rax # sched: [1:0.25]
    667 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
    668   %3 = shl i64 %1, 3
    669   %4 = add i64 %0, -1200
    670   %5 = add i64 %4, %3
    671   ret i64 %5
    672 }
    673