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