1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=i686-unknown-linux | FileCheck %s --check-prefixes=X86 3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefixes=X64 4 5 define i64 @rotl64(i64 %A, i8 %Amt) nounwind { 6 ; X86-LABEL: rotl64: 7 ; X86: # %bb.0: 8 ; X86-NEXT: pushl %ebx 9 ; X86-NEXT: pushl %edi 10 ; X86-NEXT: pushl %esi 11 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 12 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 13 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 14 ; X86-NEXT: movl %esi, %eax 15 ; X86-NEXT: shll %cl, %eax 16 ; X86-NEXT: movl %edi, %edx 17 ; X86-NEXT: shldl %cl, %esi, %edx 18 ; X86-NEXT: testb $32, %cl 19 ; X86-NEXT: je .LBB0_2 20 ; X86-NEXT: # %bb.1: 21 ; X86-NEXT: movl %eax, %edx 22 ; X86-NEXT: xorl %eax, %eax 23 ; X86-NEXT: .LBB0_2: 24 ; X86-NEXT: movb $64, %ch 25 ; X86-NEXT: subb %cl, %ch 26 ; X86-NEXT: movl %edi, %ebx 27 ; X86-NEXT: movb %ch, %cl 28 ; X86-NEXT: shrl %cl, %ebx 29 ; X86-NEXT: shrdl %cl, %edi, %esi 30 ; X86-NEXT: testb $32, %ch 31 ; X86-NEXT: je .LBB0_4 32 ; X86-NEXT: # %bb.3: 33 ; X86-NEXT: movl %ebx, %esi 34 ; X86-NEXT: xorl %ebx, %ebx 35 ; X86-NEXT: .LBB0_4: 36 ; X86-NEXT: orl %ebx, %edx 37 ; X86-NEXT: orl %esi, %eax 38 ; X86-NEXT: popl %esi 39 ; X86-NEXT: popl %edi 40 ; X86-NEXT: popl %ebx 41 ; X86-NEXT: retl 42 ; 43 ; X64-LABEL: rotl64: 44 ; X64: # %bb.0: 45 ; X64-NEXT: movl %esi, %ecx 46 ; X64-NEXT: rolq %cl, %rdi 47 ; X64-NEXT: movq %rdi, %rax 48 ; X64-NEXT: retq 49 %shift.upgrd.1 = zext i8 %Amt to i64 50 %B = shl i64 %A, %shift.upgrd.1 51 %Amt2 = sub i8 64, %Amt 52 %shift.upgrd.2 = zext i8 %Amt2 to i64 53 %C = lshr i64 %A, %shift.upgrd.2 54 %D = or i64 %B, %C 55 ret i64 %D 56 } 57 58 define i64 @rotr64(i64 %A, i8 %Amt) nounwind { 59 ; X86-LABEL: rotr64: 60 ; X86: # %bb.0: 61 ; X86-NEXT: pushl %ebx 62 ; X86-NEXT: pushl %edi 63 ; X86-NEXT: pushl %esi 64 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 65 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 66 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 67 ; X86-NEXT: movl %esi, %edx 68 ; X86-NEXT: shrl %cl, %edx 69 ; X86-NEXT: movl %edi, %eax 70 ; X86-NEXT: shrdl %cl, %esi, %eax 71 ; X86-NEXT: testb $32, %cl 72 ; X86-NEXT: je .LBB1_2 73 ; X86-NEXT: # %bb.1: 74 ; X86-NEXT: movl %edx, %eax 75 ; X86-NEXT: xorl %edx, %edx 76 ; X86-NEXT: .LBB1_2: 77 ; X86-NEXT: movb $64, %ch 78 ; X86-NEXT: subb %cl, %ch 79 ; X86-NEXT: movl %edi, %ebx 80 ; X86-NEXT: movb %ch, %cl 81 ; X86-NEXT: shll %cl, %ebx 82 ; X86-NEXT: shldl %cl, %edi, %esi 83 ; X86-NEXT: testb $32, %ch 84 ; X86-NEXT: je .LBB1_4 85 ; X86-NEXT: # %bb.3: 86 ; X86-NEXT: movl %ebx, %esi 87 ; X86-NEXT: xorl %ebx, %ebx 88 ; X86-NEXT: .LBB1_4: 89 ; X86-NEXT: orl %esi, %edx 90 ; X86-NEXT: orl %ebx, %eax 91 ; X86-NEXT: popl %esi 92 ; X86-NEXT: popl %edi 93 ; X86-NEXT: popl %ebx 94 ; X86-NEXT: retl 95 ; 96 ; X64-LABEL: rotr64: 97 ; X64: # %bb.0: 98 ; X64-NEXT: movl %esi, %ecx 99 ; X64-NEXT: rorq %cl, %rdi 100 ; X64-NEXT: movq %rdi, %rax 101 ; X64-NEXT: retq 102 %shift.upgrd.3 = zext i8 %Amt to i64 103 %B = lshr i64 %A, %shift.upgrd.3 104 %Amt2 = sub i8 64, %Amt 105 %shift.upgrd.4 = zext i8 %Amt2 to i64 106 %C = shl i64 %A, %shift.upgrd.4 107 %D = or i64 %B, %C 108 ret i64 %D 109 } 110 111 define i64 @rotli64(i64 %A) nounwind { 112 ; X86-LABEL: rotli64: 113 ; X86: # %bb.0: 114 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 115 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 116 ; X86-NEXT: movl %ecx, %edx 117 ; X86-NEXT: shldl $5, %eax, %edx 118 ; X86-NEXT: shldl $5, %ecx, %eax 119 ; X86-NEXT: retl 120 ; 121 ; X64-LABEL: rotli64: 122 ; X64: # %bb.0: 123 ; X64-NEXT: rolq $5, %rdi 124 ; X64-NEXT: movq %rdi, %rax 125 ; X64-NEXT: retq 126 %B = shl i64 %A, 5 127 %C = lshr i64 %A, 59 128 %D = or i64 %B, %C 129 ret i64 %D 130 } 131 132 define i64 @rotri64(i64 %A) nounwind { 133 ; X86-LABEL: rotri64: 134 ; X86: # %bb.0: 135 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 136 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 137 ; X86-NEXT: movl %ecx, %eax 138 ; X86-NEXT: shldl $27, %edx, %eax 139 ; X86-NEXT: shldl $27, %ecx, %edx 140 ; X86-NEXT: retl 141 ; 142 ; X64-LABEL: rotri64: 143 ; X64: # %bb.0: 144 ; X64-NEXT: rolq $59, %rdi 145 ; X64-NEXT: movq %rdi, %rax 146 ; X64-NEXT: retq 147 %B = lshr i64 %A, 5 148 %C = shl i64 %A, 59 149 %D = or i64 %B, %C 150 ret i64 %D 151 } 152 153 define i64 @rotl1_64(i64 %A) nounwind { 154 ; X86-LABEL: rotl1_64: 155 ; X86: # %bb.0: 156 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 157 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 158 ; X86-NEXT: movl %ecx, %edx 159 ; X86-NEXT: shldl $1, %eax, %edx 160 ; X86-NEXT: shldl $1, %ecx, %eax 161 ; X86-NEXT: retl 162 ; 163 ; X64-LABEL: rotl1_64: 164 ; X64: # %bb.0: 165 ; X64-NEXT: rolq %rdi 166 ; X64-NEXT: movq %rdi, %rax 167 ; X64-NEXT: retq 168 %B = shl i64 %A, 1 169 %C = lshr i64 %A, 63 170 %D = or i64 %B, %C 171 ret i64 %D 172 } 173 174 define i64 @rotr1_64(i64 %A) nounwind { 175 ; X86-LABEL: rotr1_64: 176 ; X86: # %bb.0: 177 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 178 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 179 ; X86-NEXT: movl %ecx, %eax 180 ; X86-NEXT: shldl $31, %edx, %eax 181 ; X86-NEXT: shldl $31, %ecx, %edx 182 ; X86-NEXT: retl 183 ; 184 ; X64-LABEL: rotr1_64: 185 ; X64: # %bb.0: 186 ; X64-NEXT: rorq %rdi 187 ; X64-NEXT: movq %rdi, %rax 188 ; X64-NEXT: retq 189 %B = shl i64 %A, 63 190 %C = lshr i64 %A, 1 191 %D = or i64 %B, %C 192 ret i64 %D 193 } 194 195 define i32 @rotl32(i32 %A, i8 %Amt) nounwind { 196 ; X86-LABEL: rotl32: 197 ; X86: # %bb.0: 198 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 199 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 200 ; X86-NEXT: roll %cl, %eax 201 ; X86-NEXT: retl 202 ; 203 ; X64-LABEL: rotl32: 204 ; X64: # %bb.0: 205 ; X64-NEXT: movl %esi, %ecx 206 ; X64-NEXT: roll %cl, %edi 207 ; X64-NEXT: movl %edi, %eax 208 ; X64-NEXT: retq 209 %shift.upgrd.1 = zext i8 %Amt to i32 210 %B = shl i32 %A, %shift.upgrd.1 211 %Amt2 = sub i8 32, %Amt 212 %shift.upgrd.2 = zext i8 %Amt2 to i32 213 %C = lshr i32 %A, %shift.upgrd.2 214 %D = or i32 %B, %C 215 ret i32 %D 216 } 217 218 define i32 @rotr32(i32 %A, i8 %Amt) nounwind { 219 ; X86-LABEL: rotr32: 220 ; X86: # %bb.0: 221 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 222 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 223 ; X86-NEXT: rorl %cl, %eax 224 ; X86-NEXT: retl 225 ; 226 ; X64-LABEL: rotr32: 227 ; X64: # %bb.0: 228 ; X64-NEXT: movl %esi, %ecx 229 ; X64-NEXT: rorl %cl, %edi 230 ; X64-NEXT: movl %edi, %eax 231 ; X64-NEXT: retq 232 %shift.upgrd.3 = zext i8 %Amt to i32 233 %B = lshr i32 %A, %shift.upgrd.3 234 %Amt2 = sub i8 32, %Amt 235 %shift.upgrd.4 = zext i8 %Amt2 to i32 236 %C = shl i32 %A, %shift.upgrd.4 237 %D = or i32 %B, %C 238 ret i32 %D 239 } 240 241 define i32 @rotli32(i32 %A) nounwind { 242 ; X86-LABEL: rotli32: 243 ; X86: # %bb.0: 244 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 245 ; X86-NEXT: roll $5, %eax 246 ; X86-NEXT: retl 247 ; 248 ; X64-LABEL: rotli32: 249 ; X64: # %bb.0: 250 ; X64-NEXT: roll $5, %edi 251 ; X64-NEXT: movl %edi, %eax 252 ; X64-NEXT: retq 253 %B = shl i32 %A, 5 254 %C = lshr i32 %A, 27 255 %D = or i32 %B, %C 256 ret i32 %D 257 } 258 259 define i32 @rotri32(i32 %A) nounwind { 260 ; X86-LABEL: rotri32: 261 ; X86: # %bb.0: 262 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 263 ; X86-NEXT: roll $27, %eax 264 ; X86-NEXT: retl 265 ; 266 ; X64-LABEL: rotri32: 267 ; X64: # %bb.0: 268 ; X64-NEXT: roll $27, %edi 269 ; X64-NEXT: movl %edi, %eax 270 ; X64-NEXT: retq 271 %B = lshr i32 %A, 5 272 %C = shl i32 %A, 27 273 %D = or i32 %B, %C 274 ret i32 %D 275 } 276 277 define i32 @rotl1_32(i32 %A) nounwind { 278 ; X86-LABEL: rotl1_32: 279 ; X86: # %bb.0: 280 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 281 ; X86-NEXT: roll %eax 282 ; X86-NEXT: retl 283 ; 284 ; X64-LABEL: rotl1_32: 285 ; X64: # %bb.0: 286 ; X64-NEXT: roll %edi 287 ; X64-NEXT: movl %edi, %eax 288 ; X64-NEXT: retq 289 %B = shl i32 %A, 1 290 %C = lshr i32 %A, 31 291 %D = or i32 %B, %C 292 ret i32 %D 293 } 294 295 define i32 @rotr1_32(i32 %A) nounwind { 296 ; X86-LABEL: rotr1_32: 297 ; X86: # %bb.0: 298 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 299 ; X86-NEXT: rorl %eax 300 ; X86-NEXT: retl 301 ; 302 ; X64-LABEL: rotr1_32: 303 ; X64: # %bb.0: 304 ; X64-NEXT: rorl %edi 305 ; X64-NEXT: movl %edi, %eax 306 ; X64-NEXT: retq 307 %B = shl i32 %A, 31 308 %C = lshr i32 %A, 1 309 %D = or i32 %B, %C 310 ret i32 %D 311 } 312 313 define i16 @rotl16(i16 %A, i8 %Amt) nounwind { 314 ; X86-LABEL: rotl16: 315 ; X86: # %bb.0: 316 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 317 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 318 ; X86-NEXT: rolw %cl, %ax 319 ; X86-NEXT: retl 320 ; 321 ; X64-LABEL: rotl16: 322 ; X64: # %bb.0: 323 ; X64-NEXT: movl %esi, %ecx 324 ; X64-NEXT: rolw %cl, %di 325 ; X64-NEXT: movl %edi, %eax 326 ; X64-NEXT: retq 327 %shift.upgrd.5 = zext i8 %Amt to i16 328 %B = shl i16 %A, %shift.upgrd.5 329 %Amt2 = sub i8 16, %Amt 330 %shift.upgrd.6 = zext i8 %Amt2 to i16 331 %C = lshr i16 %A, %shift.upgrd.6 332 %D = or i16 %B, %C 333 ret i16 %D 334 } 335 336 define i16 @rotr16(i16 %A, i8 %Amt) nounwind { 337 ; X86-LABEL: rotr16: 338 ; X86: # %bb.0: 339 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 340 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 341 ; X86-NEXT: rorw %cl, %ax 342 ; X86-NEXT: retl 343 ; 344 ; X64-LABEL: rotr16: 345 ; X64: # %bb.0: 346 ; X64-NEXT: movl %esi, %ecx 347 ; X64-NEXT: rorw %cl, %di 348 ; X64-NEXT: movl %edi, %eax 349 ; X64-NEXT: retq 350 %shift.upgrd.7 = zext i8 %Amt to i16 351 %B = lshr i16 %A, %shift.upgrd.7 352 %Amt2 = sub i8 16, %Amt 353 %shift.upgrd.8 = zext i8 %Amt2 to i16 354 %C = shl i16 %A, %shift.upgrd.8 355 %D = or i16 %B, %C 356 ret i16 %D 357 } 358 359 define i16 @rotli16(i16 %A) nounwind { 360 ; X86-LABEL: rotli16: 361 ; X86: # %bb.0: 362 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 363 ; X86-NEXT: rolw $5, %ax 364 ; X86-NEXT: retl 365 ; 366 ; X64-LABEL: rotli16: 367 ; X64: # %bb.0: 368 ; X64-NEXT: rolw $5, %di 369 ; X64-NEXT: movl %edi, %eax 370 ; X64-NEXT: retq 371 %B = shl i16 %A, 5 372 %C = lshr i16 %A, 11 373 %D = or i16 %B, %C 374 ret i16 %D 375 } 376 377 define i16 @rotri16(i16 %A) nounwind { 378 ; X86-LABEL: rotri16: 379 ; X86: # %bb.0: 380 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 381 ; X86-NEXT: rolw $11, %ax 382 ; X86-NEXT: retl 383 ; 384 ; X64-LABEL: rotri16: 385 ; X64: # %bb.0: 386 ; X64-NEXT: rolw $11, %di 387 ; X64-NEXT: movl %edi, %eax 388 ; X64-NEXT: retq 389 %B = lshr i16 %A, 5 390 %C = shl i16 %A, 11 391 %D = or i16 %B, %C 392 ret i16 %D 393 } 394 395 define i16 @rotl1_16(i16 %A) nounwind { 396 ; X86-LABEL: rotl1_16: 397 ; X86: # %bb.0: 398 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 399 ; X86-NEXT: rolw %ax 400 ; X86-NEXT: retl 401 ; 402 ; X64-LABEL: rotl1_16: 403 ; X64: # %bb.0: 404 ; X64-NEXT: rolw %di 405 ; X64-NEXT: movl %edi, %eax 406 ; X64-NEXT: retq 407 %B = shl i16 %A, 1 408 %C = lshr i16 %A, 15 409 %D = or i16 %B, %C 410 ret i16 %D 411 } 412 413 define i16 @rotr1_16(i16 %A) nounwind { 414 ; X86-LABEL: rotr1_16: 415 ; X86: # %bb.0: 416 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 417 ; X86-NEXT: rorw %ax 418 ; X86-NEXT: retl 419 ; 420 ; X64-LABEL: rotr1_16: 421 ; X64: # %bb.0: 422 ; X64-NEXT: rorw %di 423 ; X64-NEXT: movl %edi, %eax 424 ; X64-NEXT: retq 425 %B = lshr i16 %A, 1 426 %C = shl i16 %A, 15 427 %D = or i16 %B, %C 428 ret i16 %D 429 } 430 431 define i8 @rotl8(i8 %A, i8 %Amt) nounwind { 432 ; X86-LABEL: rotl8: 433 ; X86: # %bb.0: 434 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 435 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 436 ; X86-NEXT: rolb %cl, %al 437 ; X86-NEXT: retl 438 ; 439 ; X64-LABEL: rotl8: 440 ; X64: # %bb.0: 441 ; X64-NEXT: movl %esi, %ecx 442 ; X64-NEXT: rolb %cl, %dil 443 ; X64-NEXT: movl %edi, %eax 444 ; X64-NEXT: retq 445 %B = shl i8 %A, %Amt 446 %Amt2 = sub i8 8, %Amt 447 %C = lshr i8 %A, %Amt2 448 %D = or i8 %B, %C 449 ret i8 %D 450 } 451 452 define i8 @rotr8(i8 %A, i8 %Amt) nounwind { 453 ; X86-LABEL: rotr8: 454 ; X86: # %bb.0: 455 ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 456 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 457 ; X86-NEXT: rorb %cl, %al 458 ; X86-NEXT: retl 459 ; 460 ; X64-LABEL: rotr8: 461 ; X64: # %bb.0: 462 ; X64-NEXT: movl %esi, %ecx 463 ; X64-NEXT: rorb %cl, %dil 464 ; X64-NEXT: movl %edi, %eax 465 ; X64-NEXT: retq 466 %B = lshr i8 %A, %Amt 467 %Amt2 = sub i8 8, %Amt 468 %C = shl i8 %A, %Amt2 469 %D = or i8 %B, %C 470 ret i8 %D 471 } 472 473 define i8 @rotli8(i8 %A) nounwind { 474 ; X86-LABEL: rotli8: 475 ; X86: # %bb.0: 476 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 477 ; X86-NEXT: rolb $5, %al 478 ; X86-NEXT: retl 479 ; 480 ; X64-LABEL: rotli8: 481 ; X64: # %bb.0: 482 ; X64-NEXT: rolb $5, %dil 483 ; X64-NEXT: movl %edi, %eax 484 ; X64-NEXT: retq 485 %B = shl i8 %A, 5 486 %C = lshr i8 %A, 3 487 %D = or i8 %B, %C 488 ret i8 %D 489 } 490 491 define i8 @rotri8(i8 %A) nounwind { 492 ; X86-LABEL: rotri8: 493 ; X86: # %bb.0: 494 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 495 ; X86-NEXT: rolb $3, %al 496 ; X86-NEXT: retl 497 ; 498 ; X64-LABEL: rotri8: 499 ; X64: # %bb.0: 500 ; X64-NEXT: rolb $3, %dil 501 ; X64-NEXT: movl %edi, %eax 502 ; X64-NEXT: retq 503 %B = lshr i8 %A, 5 504 %C = shl i8 %A, 3 505 %D = or i8 %B, %C 506 ret i8 %D 507 } 508 509 define i8 @rotl1_8(i8 %A) nounwind { 510 ; X86-LABEL: rotl1_8: 511 ; X86: # %bb.0: 512 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 513 ; X86-NEXT: rolb %al 514 ; X86-NEXT: retl 515 ; 516 ; X64-LABEL: rotl1_8: 517 ; X64: # %bb.0: 518 ; X64-NEXT: rolb %dil 519 ; X64-NEXT: movl %edi, %eax 520 ; X64-NEXT: retq 521 %B = shl i8 %A, 1 522 %C = lshr i8 %A, 7 523 %D = or i8 %B, %C 524 ret i8 %D 525 } 526 527 define i8 @rotr1_8(i8 %A) nounwind { 528 ; X86-LABEL: rotr1_8: 529 ; X86: # %bb.0: 530 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al 531 ; X86-NEXT: rorb %al 532 ; X86-NEXT: retl 533 ; 534 ; X64-LABEL: rotr1_8: 535 ; X64: # %bb.0: 536 ; X64-NEXT: rorb %dil 537 ; X64-NEXT: movl %edi, %eax 538 ; X64-NEXT: retq 539 %B = lshr i8 %A, 1 540 %C = shl i8 %A, 7 541 %D = or i8 %B, %C 542 ret i8 %D 543 } 544 545 define void @rotr1_64_mem(i64* %Aptr) nounwind { 546 ; X86-LABEL: rotr1_64_mem: 547 ; X86: # %bb.0: 548 ; X86-NEXT: pushl %esi 549 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 550 ; X86-NEXT: movl (%eax), %ecx 551 ; X86-NEXT: movl 4(%eax), %edx 552 ; X86-NEXT: movl %edx, %esi 553 ; X86-NEXT: shldl $31, %ecx, %esi 554 ; X86-NEXT: shldl $31, %edx, %ecx 555 ; X86-NEXT: movl %ecx, 4(%eax) 556 ; X86-NEXT: movl %esi, (%eax) 557 ; X86-NEXT: popl %esi 558 ; X86-NEXT: retl 559 ; 560 ; X64-LABEL: rotr1_64_mem: 561 ; X64: # %bb.0: 562 ; X64-NEXT: rorq (%rdi) 563 ; X64-NEXT: retq 564 565 %A = load i64, i64 *%Aptr 566 %B = shl i64 %A, 63 567 %C = lshr i64 %A, 1 568 %D = or i64 %B, %C 569 store i64 %D, i64* %Aptr 570 ret void 571 } 572 573 define void @rotr1_32_mem(i32* %Aptr) nounwind { 574 ; X86-LABEL: rotr1_32_mem: 575 ; X86: # %bb.0: 576 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 577 ; X86-NEXT: rorl (%eax) 578 ; X86-NEXT: retl 579 ; 580 ; X64-LABEL: rotr1_32_mem: 581 ; X64: # %bb.0: 582 ; X64-NEXT: rorl (%rdi) 583 ; X64-NEXT: retq 584 %A = load i32, i32 *%Aptr 585 %B = shl i32 %A, 31 586 %C = lshr i32 %A, 1 587 %D = or i32 %B, %C 588 store i32 %D, i32* %Aptr 589 ret void 590 } 591 592 define void @rotr1_16_mem(i16* %Aptr) nounwind { 593 ; X86-LABEL: rotr1_16_mem: 594 ; X86: # %bb.0: 595 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 596 ; X86-NEXT: rorw (%eax) 597 ; X86-NEXT: retl 598 ; 599 ; X64-LABEL: rotr1_16_mem: 600 ; X64: # %bb.0: 601 ; X64-NEXT: rorw (%rdi) 602 ; X64-NEXT: retq 603 %A = load i16, i16 *%Aptr 604 %B = shl i16 %A, 15 605 %C = lshr i16 %A, 1 606 %D = or i16 %B, %C 607 store i16 %D, i16* %Aptr 608 ret void 609 } 610 611 define void @rotr1_8_mem(i8* %Aptr) nounwind { 612 ; X86-LABEL: rotr1_8_mem: 613 ; X86: # %bb.0: 614 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 615 ; X86-NEXT: rorb (%eax) 616 ; X86-NEXT: retl 617 ; 618 ; X64-LABEL: rotr1_8_mem: 619 ; X64: # %bb.0: 620 ; X64-NEXT: rorb (%rdi) 621 ; X64-NEXT: retq 622 %A = load i8, i8 *%Aptr 623 %B = shl i8 %A, 7 624 %C = lshr i8 %A, 1 625 %D = or i8 %B, %C 626 store i8 %D, i8* %Aptr 627 ret void 628 } 629 630 define i64 @truncated_rot(i64 %x, i32 %amt) nounwind { 631 ; X86-LABEL: truncated_rot: 632 ; X86: # %bb.0: # %entry 633 ; X86-NEXT: pushl %ebx 634 ; X86-NEXT: pushl %edi 635 ; X86-NEXT: pushl %esi 636 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 637 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 638 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 639 ; X86-NEXT: movl %esi, %eax 640 ; X86-NEXT: shll %cl, %eax 641 ; X86-NEXT: testb $32, %cl 642 ; X86-NEXT: movl $0, %ebx 643 ; X86-NEXT: jne .LBB28_2 644 ; X86-NEXT: # %bb.1: # %entry 645 ; X86-NEXT: movl %eax, %ebx 646 ; X86-NEXT: .LBB28_2: # %entry 647 ; X86-NEXT: movl $64, %edx 648 ; X86-NEXT: subl %ecx, %edx 649 ; X86-NEXT: movl %edi, %eax 650 ; X86-NEXT: movl %edx, %ecx 651 ; X86-NEXT: shrl %cl, %eax 652 ; X86-NEXT: shrdl %cl, %edi, %esi 653 ; X86-NEXT: testb $32, %dl 654 ; X86-NEXT: jne .LBB28_4 655 ; X86-NEXT: # %bb.3: # %entry 656 ; X86-NEXT: movl %esi, %eax 657 ; X86-NEXT: .LBB28_4: # %entry 658 ; X86-NEXT: orl %ebx, %eax 659 ; X86-NEXT: xorl %edx, %edx 660 ; X86-NEXT: popl %esi 661 ; X86-NEXT: popl %edi 662 ; X86-NEXT: popl %ebx 663 ; X86-NEXT: retl 664 ; 665 ; X64-LABEL: truncated_rot: 666 ; X64: # %bb.0: # %entry 667 ; X64-NEXT: movl %esi, %ecx 668 ; X64-NEXT: rolq %cl, %rdi 669 ; X64-NEXT: movl %edi, %eax 670 ; X64-NEXT: retq 671 entry: 672 %sh_prom = zext i32 %amt to i64 673 %shl = shl i64 %x, %sh_prom 674 %sub = sub nsw i32 64, %amt 675 %sh_prom1 = zext i32 %sub to i64 676 %shr = lshr i64 %x, %sh_prom1 677 %or = or i64 %shr, %shl 678 %and = and i64 %or, 4294967295 679 ret i64 %and 680 } 681