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