summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/CodeGen/X86/rotate4.ll64
1 files changed, 64 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/rotate4.ll b/llvm/test/CodeGen/X86/rotate4.ll
index 79822999dca..7982b454d1b 100644
--- a/llvm/test/CodeGen/X86/rotate4.ll
+++ b/llvm/test/CodeGen/X86/rotate4.ll
@@ -281,3 +281,67 @@ define void @rotate_right_m16(i16* %p, i32 %amount) {
ret void
}
+define i32 @rotate_demanded_bits(i32, i32) {
+; CHECK-LABEL: rotate_demanded_bits:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: andl $30, %ecx
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: shll %cl, %eax
+; CHECK-NEXT: negl %ecx
+; CHECK-NEXT: andb $30, %cl
+; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
+; CHECK-NEXT: shrl %cl, %edi
+; CHECK-NEXT: orl %eax, %edi
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %3 = and i32 %1, 30
+ %4 = shl i32 %0, %3
+ %5 = sub nsw i32 0, %3
+ %6 = and i32 %5, 30
+ %7 = lshr i32 %0, %6
+ %8 = or i32 %7, %4
+ ret i32 %8
+}
+
+define i32 @rotate_demanded_bits_2(i32, i32) {
+; CHECK-LABEL: rotate_demanded_bits_2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: andb $23, %sil
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: roll %cl, %edi
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %3 = and i32 %1, 23
+ %4 = shl i32 %0, %3
+ %5 = sub nsw i32 0, %3
+ %6 = and i32 %5, 31
+ %7 = lshr i32 %0, %6
+ %8 = or i32 %7, %4
+ ret i32 %8
+}
+
+define i32 @rotate_demanded_bits_3(i32, i32) {
+; CHECK-LABEL: rotate_demanded_bits_3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addl %esi, %esi
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: andb $30, %cl
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: shll %cl, %eax
+; CHECK-NEXT: negl %esi
+; CHECK-NEXT: andb $30, %sil
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: shrl %cl, %edi
+; CHECK-NEXT: orl %eax, %edi
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %3 = shl i32 %1, 1
+ %4 = and i32 %3, 30
+ %5 = shl i32 %0, %4
+ %6 = sub i32 0, %3
+ %7 = and i32 %6, 30
+ %8 = lshr i32 %0, %7
+ %9 = or i32 %5, %8
+ ret i32 %9
+}
OpenPOWER on IntegriCloud