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