| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -mtriple=i686-unknown-linux | FileCheck %s --check-prefixes=X86 | |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefixes=X64 | |
| define i64 @rotl64(i64 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotl64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: pushl %ebx | |
| ; X86-NEXT: pushl %edi | |
| ; X86-NEXT: pushl %esi | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi | |
| ; X86-NEXT: movl %esi, %eax | |
| ; X86-NEXT: shll %cl, %eax | |
| ; X86-NEXT: movl %edi, %edx | |
| ; X86-NEXT: shldl %cl, %esi, %edx | |
| ; X86-NEXT: testb $32, %cl | |
| ; X86-NEXT: je .LBB0_2 | |
| ; X86-NEXT: # %bb.1: | |
| ; X86-NEXT: movl %eax, %edx | |
| ; X86-NEXT: xorl %eax, %eax | |
| ; X86-NEXT: .LBB0_2: | |
| ; X86-NEXT: movb $64, %ch | |
| ; X86-NEXT: subb %cl, %ch | |
| ; X86-NEXT: movl %edi, %ebx | |
| ; X86-NEXT: movb %ch, %cl | |
| ; X86-NEXT: shrl %cl, %ebx | |
| ; X86-NEXT: shrdl %cl, %edi, %esi | |
| ; X86-NEXT: testb $32, %ch | |
| ; X86-NEXT: je .LBB0_4 | |
| ; X86-NEXT: # %bb.3: | |
| ; X86-NEXT: movl %ebx, %esi | |
| ; X86-NEXT: xorl %ebx, %ebx | |
| ; X86-NEXT: .LBB0_4: | |
| ; X86-NEXT: orl %ebx, %edx | |
| ; X86-NEXT: orl %esi, %eax | |
| ; X86-NEXT: popl %esi | |
| ; X86-NEXT: popl %edi | |
| ; X86-NEXT: popl %ebx | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rolq %cl, %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.1 = zext i8 %Amt to i64 | |
| %B = shl i64 %A, %shift.upgrd.1 | |
| %Amt2 = sub i8 64, %Amt | |
| %shift.upgrd.2 = zext i8 %Amt2 to i64 | |
| %C = lshr i64 %A, %shift.upgrd.2 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i64 @rotr64(i64 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotr64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: pushl %ebx | |
| ; X86-NEXT: pushl %edi | |
| ; X86-NEXT: pushl %esi | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; X86-NEXT: movl %esi, %edx | |
| ; X86-NEXT: shrl %cl, %edx | |
| ; X86-NEXT: movl %edi, %eax | |
| ; X86-NEXT: shrdl %cl, %esi, %eax | |
| ; X86-NEXT: testb $32, %cl | |
| ; X86-NEXT: je .LBB1_2 | |
| ; X86-NEXT: # %bb.1: | |
| ; X86-NEXT: movl %edx, %eax | |
| ; X86-NEXT: xorl %edx, %edx | |
| ; X86-NEXT: .LBB1_2: | |
| ; X86-NEXT: movb $64, %ch | |
| ; X86-NEXT: subb %cl, %ch | |
| ; X86-NEXT: movl %edi, %ebx | |
| ; X86-NEXT: movb %ch, %cl | |
| ; X86-NEXT: shll %cl, %ebx | |
| ; X86-NEXT: shldl %cl, %edi, %esi | |
| ; X86-NEXT: testb $32, %ch | |
| ; X86-NEXT: je .LBB1_4 | |
| ; X86-NEXT: # %bb.3: | |
| ; X86-NEXT: movl %ebx, %esi | |
| ; X86-NEXT: xorl %ebx, %ebx | |
| ; X86-NEXT: .LBB1_4: | |
| ; X86-NEXT: orl %esi, %edx | |
| ; X86-NEXT: orl %ebx, %eax | |
| ; X86-NEXT: popl %esi | |
| ; X86-NEXT: popl %edi | |
| ; X86-NEXT: popl %ebx | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rorq %cl, %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.3 = zext i8 %Amt to i64 | |
| %B = lshr i64 %A, %shift.upgrd.3 | |
| %Amt2 = sub i8 64, %Amt | |
| %shift.upgrd.4 = zext i8 %Amt2 to i64 | |
| %C = shl i64 %A, %shift.upgrd.4 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i64 @rotli64(i64 %A) nounwind { | |
| ; X86-LABEL: rotli64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl %ecx, %edx | |
| ; X86-NEXT: shldl $5, %eax, %edx | |
| ; X86-NEXT: shldl $5, %ecx, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotli64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolq $5, %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %B = shl i64 %A, 5 | |
| %C = lshr i64 %A, 59 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i64 @rotri64(i64 %A) nounwind { | |
| ; X86-LABEL: rotri64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl %ecx, %eax | |
| ; X86-NEXT: shldl $27, %edx, %eax | |
| ; X86-NEXT: shldl $27, %ecx, %edx | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotri64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolq $59, %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %B = lshr i64 %A, 5 | |
| %C = shl i64 %A, 59 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i64 @rotl1_64(i64 %A) nounwind { | |
| ; X86-LABEL: rotl1_64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl %ecx, %edx | |
| ; X86-NEXT: shldl $1, %eax, %edx | |
| ; X86-NEXT: shldl $1, %ecx, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl1_64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolq %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %B = shl i64 %A, 1 | |
| %C = lshr i64 %A, 63 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i64 @rotr1_64(i64 %A) nounwind { | |
| ; X86-LABEL: rotr1_64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl %ecx, %eax | |
| ; X86-NEXT: shldl $31, %edx, %eax | |
| ; X86-NEXT: shldl $31, %ecx, %edx | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_64: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorq %rdi | |
| ; X64-NEXT: movq %rdi, %rax | |
| ; X64-NEXT: retq | |
| %B = shl i64 %A, 63 | |
| %C = lshr i64 %A, 1 | |
| %D = or i64 %B, %C | |
| ret i64 %D | |
| } | |
| define i32 @rotl32(i32 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotl32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: roll %cl, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: roll %cl, %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.1 = zext i8 %Amt to i32 | |
| %B = shl i32 %A, %shift.upgrd.1 | |
| %Amt2 = sub i8 32, %Amt | |
| %shift.upgrd.2 = zext i8 %Amt2 to i32 | |
| %C = lshr i32 %A, %shift.upgrd.2 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i32 @rotr32(i32 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotr32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorl %cl, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rorl %cl, %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.3 = zext i8 %Amt to i32 | |
| %B = lshr i32 %A, %shift.upgrd.3 | |
| %Amt2 = sub i8 32, %Amt | |
| %shift.upgrd.4 = zext i8 %Amt2 to i32 | |
| %C = shl i32 %A, %shift.upgrd.4 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i32 @rotli32(i32 %A) nounwind { | |
| ; X86-LABEL: rotli32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: roll $5, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotli32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: roll $5, %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i32 %A, 5 | |
| %C = lshr i32 %A, 27 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i32 @rotri32(i32 %A) nounwind { | |
| ; X86-LABEL: rotri32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: roll $27, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotri32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: roll $27, %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i32 %A, 5 | |
| %C = shl i32 %A, 27 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i32 @rotl1_32(i32 %A) nounwind { | |
| ; X86-LABEL: rotl1_32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: roll %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl1_32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: roll %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i32 %A, 1 | |
| %C = lshr i32 %A, 31 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i32 @rotr1_32(i32 %A) nounwind { | |
| ; X86-LABEL: rotr1_32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorl %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_32: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorl %edi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i32 %A, 31 | |
| %C = lshr i32 %A, 1 | |
| %D = or i32 %B, %C | |
| ret i32 %D | |
| } | |
| define i16 @rotl16(i16 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotl16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rolw %cl, %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rolw %cl, %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.5 = zext i8 %Amt to i16 | |
| %B = shl i16 %A, %shift.upgrd.5 | |
| %Amt2 = sub i8 16, %Amt | |
| %shift.upgrd.6 = zext i8 %Amt2 to i16 | |
| %C = lshr i16 %A, %shift.upgrd.6 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i16 @rotr16(i16 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotr16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorw %cl, %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rorw %cl, %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %shift.upgrd.7 = zext i8 %Amt to i16 | |
| %B = lshr i16 %A, %shift.upgrd.7 | |
| %Amt2 = sub i8 16, %Amt | |
| %shift.upgrd.8 = zext i8 %Amt2 to i16 | |
| %C = shl i16 %A, %shift.upgrd.8 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i16 @rotli16(i16 %A) nounwind { | |
| ; X86-LABEL: rotli16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rolw $5, %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotli16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolw $5, %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i16 %A, 5 | |
| %C = lshr i16 %A, 11 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i16 @rotri16(i16 %A) nounwind { | |
| ; X86-LABEL: rotri16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rolw $11, %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotri16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolw $11, %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i16 %A, 5 | |
| %C = shl i16 %A, 11 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i16 @rotl1_16(i16 %A) nounwind { | |
| ; X86-LABEL: rotl1_16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rolw %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl1_16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolw %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i16 %A, 1 | |
| %C = lshr i16 %A, 15 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i16 @rotr1_16(i16 %A) nounwind { | |
| ; X86-LABEL: rotr1_16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorw %ax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_16: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorw %di | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i16 %A, 1 | |
| %C = shl i16 %A, 15 | |
| %D = or i16 %B, %C | |
| ret i16 %D | |
| } | |
| define i8 @rotl8(i8 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotl8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rolb %cl, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rolb %cl, %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i8 %A, %Amt | |
| %Amt2 = sub i8 8, %Amt | |
| %C = lshr i8 %A, %Amt2 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define i8 @rotr8(i8 %A, i8 %Amt) nounwind { | |
| ; X86-LABEL: rotr8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %cl | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rorb %cl, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rorb %cl, %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i8 %A, %Amt | |
| %Amt2 = sub i8 8, %Amt | |
| %C = shl i8 %A, %Amt2 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define i8 @rotli8(i8 %A) nounwind { | |
| ; X86-LABEL: rotli8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rolb $5, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotli8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolb $5, %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i8 %A, 5 | |
| %C = lshr i8 %A, 3 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define i8 @rotri8(i8 %A) nounwind { | |
| ; X86-LABEL: rotri8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rolb $3, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotri8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolb $3, %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i8 %A, 5 | |
| %C = shl i8 %A, 3 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define i8 @rotl1_8(i8 %A) nounwind { | |
| ; X86-LABEL: rotl1_8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rolb %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotl1_8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rolb %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = shl i8 %A, 1 | |
| %C = lshr i8 %A, 7 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define i8 @rotr1_8(i8 %A) nounwind { | |
| ; X86-LABEL: rotr1_8: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movb {{[0-9]+}}(%esp), %al | |
| ; X86-NEXT: rorb %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_8: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorb %dil | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| %B = lshr i8 %A, 1 | |
| %C = shl i8 %A, 7 | |
| %D = or i8 %B, %C | |
| ret i8 %D | |
| } | |
| define void @rotr1_64_mem(i64* %Aptr) nounwind { | |
| ; X86-LABEL: rotr1_64_mem: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: pushl %esi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl (%eax), %ecx | |
| ; X86-NEXT: movl 4(%eax), %edx | |
| ; X86-NEXT: movl %edx, %esi | |
| ; X86-NEXT: shldl $31, %ecx, %esi | |
| ; X86-NEXT: shldl $31, %edx, %ecx | |
| ; X86-NEXT: movl %ecx, 4(%eax) | |
| ; X86-NEXT: movl %esi, (%eax) | |
| ; X86-NEXT: popl %esi | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_64_mem: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorq (%rdi) | |
| ; X64-NEXT: retq | |
| %A = load i64, i64 *%Aptr | |
| %B = shl i64 %A, 63 | |
| %C = lshr i64 %A, 1 | |
| %D = or i64 %B, %C | |
| store i64 %D, i64* %Aptr | |
| ret void | |
| } | |
| define void @rotr1_32_mem(i32* %Aptr) nounwind { | |
| ; X86-LABEL: rotr1_32_mem: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorl (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_32_mem: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorl (%rdi) | |
| ; X64-NEXT: retq | |
| %A = load i32, i32 *%Aptr | |
| %B = shl i32 %A, 31 | |
| %C = lshr i32 %A, 1 | |
| %D = or i32 %B, %C | |
| store i32 %D, i32* %Aptr | |
| ret void | |
| } | |
| define void @rotr1_16_mem(i16* %Aptr) nounwind { | |
| ; X86-LABEL: rotr1_16_mem: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorw (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_16_mem: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorw (%rdi) | |
| ; X64-NEXT: retq | |
| %A = load i16, i16 *%Aptr | |
| %B = shl i16 %A, 15 | |
| %C = lshr i16 %A, 1 | |
| %D = or i16 %B, %C | |
| store i16 %D, i16* %Aptr | |
| ret void | |
| } | |
| define void @rotr1_8_mem(i8* %Aptr) nounwind { | |
| ; X86-LABEL: rotr1_8_mem: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: rorb (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: rotr1_8_mem: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: rorb (%rdi) | |
| ; X64-NEXT: retq | |
| %A = load i8, i8 *%Aptr | |
| %B = shl i8 %A, 7 | |
| %C = lshr i8 %A, 1 | |
| %D = or i8 %B, %C | |
| store i8 %D, i8* %Aptr | |
| ret void | |
| } | |
| define i64 @truncated_rot(i64 %x, i32 %amt) nounwind { | |
| ; X86-LABEL: truncated_rot: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: pushl %ebx | |
| ; X86-NEXT: pushl %edi | |
| ; X86-NEXT: pushl %esi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl %esi, %eax | |
| ; X86-NEXT: shll %cl, %eax | |
| ; X86-NEXT: testb $32, %cl | |
| ; X86-NEXT: movl $0, %ebx | |
| ; X86-NEXT: jne .LBB28_2 | |
| ; X86-NEXT: # %bb.1: # %entry | |
| ; X86-NEXT: movl %eax, %ebx | |
| ; X86-NEXT: .LBB28_2: # %entry | |
| ; X86-NEXT: movl $64, %edx | |
| ; X86-NEXT: subl %ecx, %edx | |
| ; X86-NEXT: movl %edi, %eax | |
| ; X86-NEXT: movl %edx, %ecx | |
| ; X86-NEXT: shrl %cl, %eax | |
| ; X86-NEXT: shrdl %cl, %edi, %esi | |
| ; X86-NEXT: testb $32, %dl | |
| ; X86-NEXT: jne .LBB28_4 | |
| ; X86-NEXT: # %bb.3: # %entry | |
| ; X86-NEXT: movl %esi, %eax | |
| ; X86-NEXT: .LBB28_4: # %entry | |
| ; X86-NEXT: orl %ebx, %eax | |
| ; X86-NEXT: xorl %edx, %edx | |
| ; X86-NEXT: popl %esi | |
| ; X86-NEXT: popl %edi | |
| ; X86-NEXT: popl %ebx | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: truncated_rot: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movl %esi, %ecx | |
| ; X64-NEXT: rolq %cl, %rdi | |
| ; X64-NEXT: movl %edi, %eax | |
| ; X64-NEXT: retq | |
| entry: | |
| %sh_prom = zext i32 %amt to i64 | |
| %shl = shl i64 %x, %sh_prom | |
| %sub = sub nsw i32 64, %amt | |
| %sh_prom1 = zext i32 %sub to i64 | |
| %shr = lshr i64 %x, %sh_prom1 | |
| %or = or i64 %shr, %shl | |
| %and = and i64 %or, 4294967295 | |
| ret i64 %and | |
| } |