| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: opt -passes=expand-memcmp -mtriple=x86_64-unknown-unknown -S < %s | llc -mtriple=x86_64-unknown-unknown | FileCheck %s | |
| @.str1 = private constant [4 x i8] c"\00\00\00\00", align 1 | |
| @.str2 = private constant [4 x i8] c"\ff\ff\ff\ff", align 1 | |
| declare i32 @memcmp(ptr, ptr, i64) | |
| define i32 @length4_same() nounwind { | |
| ; CHECK-LABEL: length4_same: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: xorl %eax, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str1, i64 4) nounwind | |
| ret i32 %m | |
| } | |
| define i1 @length4_same_lt() nounwind { | |
| ; CHECK-LABEL: length4_same_lt: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: xorl %eax, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str1, i64 4) nounwind | |
| %c = icmp slt i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_same_gt() nounwind { | |
| ; CHECK-LABEL: length4_same_gt: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: xorl %eax, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str1, i64 4) nounwind | |
| %c = icmp sgt i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_same_le() nounwind { | |
| ; CHECK-LABEL: length4_same_le: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movb $1, %al | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str1, i64 4) nounwind | |
| %c = icmp sle i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_same_ge() nounwind { | |
| ; CHECK-LABEL: length4_same_ge: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movb $1, %al | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str1, i64 4) nounwind | |
| %c = icmp sge i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i32 @length4() nounwind { | |
| ; CHECK-LABEL: length4: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movl $-1, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str2, i64 4) nounwind | |
| ret i32 %m | |
| } | |
| define i1 @length4_lt() nounwind { | |
| ; CHECK-LABEL: length4_lt: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movb $1, %al | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str2, i64 4) nounwind | |
| %c = icmp slt i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_gt() nounwind { | |
| ; CHECK-LABEL: length4_gt: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: xorl %eax, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str2, i64 4) nounwind | |
| %c = icmp sgt i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_le() nounwind { | |
| ; CHECK-LABEL: length4_le: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: movb $1, %al | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str2, i64 4) nounwind | |
| %c = icmp sle i32 %m, 0 | |
| ret i1 %c | |
| } | |
| define i1 @length4_ge() nounwind { | |
| ; CHECK-LABEL: length4_ge: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: xorl %eax, %eax | |
| ; CHECK-NEXT: retq | |
| %m = tail call i32 @memcmp(ptr @.str1, ptr @.str2, i64 4) nounwind | |
| %c = icmp sge i32 %m, 0 | |
| ret i1 %c | |
| } | |