
As per title. This is not a huge deal at the moment, but becomes one when matching node in topological order in the DAGCombiner, and is generally more stable than the existing.
2426 lines
72 KiB
LLVM
2426 lines
72 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefixes=X86,X86-NOSSE
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=X86,X86-SSE1
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE2
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86,X86-SSE41
|
|
|
|
; This tests codegen time inlining/optimization of memcmp
|
|
; rdar://6480398
|
|
|
|
@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
|
|
|
|
declare dso_local i32 @memcmp(ptr, ptr, i32)
|
|
|
|
define i32 @length0(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length0:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length0_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movb $1, %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length0_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length2(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzwl (%ecx), %ecx
|
|
; X86-NEXT: movzwl (%eax), %edx
|
|
; X86-NEXT: rolw $8, %cx
|
|
; X86-NEXT: rolw $8, %dx
|
|
; X86-NEXT: movzwl %cx, %eax
|
|
; X86-NEXT: movzwl %dx, %ecx
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i32 @length2_const(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movzwl (%eax), %eax
|
|
; X86-NEXT: rolw $8, %ax
|
|
; X86-NEXT: movzwl %ax, %eax
|
|
; X86-NEXT: addl $-12594, %eax # imm = 0xCECE
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length2_gt_const(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_gt_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movzwl (%eax), %eax
|
|
; X86-NEXT: rolw $8, %ax
|
|
; X86-NEXT: movzwl %ax, %eax
|
|
; X86-NEXT: addl $-12594, %eax # imm = 0xCECE
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind
|
|
%c = icmp sgt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzwl (%ecx), %ecx
|
|
; X86-NEXT: cmpw (%eax), %cx
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzwl (%ecx), %ecx
|
|
; X86-NEXT: movzwl (%eax), %edx
|
|
; X86-NEXT: rolw $8, %cx
|
|
; X86-NEXT: rolw $8, %dx
|
|
; X86-NEXT: movzwl %cx, %eax
|
|
; X86-NEXT: movzwl %dx, %ecx
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzwl (%ecx), %ecx
|
|
; X86-NEXT: movzwl (%eax), %eax
|
|
; X86-NEXT: rolw $8, %cx
|
|
; X86-NEXT: rolw $8, %ax
|
|
; X86-NEXT: movzwl %cx, %ecx
|
|
; X86-NEXT: movzwl %ax, %eax
|
|
; X86-NEXT: subl %eax, %ecx
|
|
; X86-NEXT: testl %ecx, %ecx
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
|
|
%c = icmp sgt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length2_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length2_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: cmpw $12849, (%eax) # imm = 0x3231
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length2_eq_nobuiltin_attr:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $2
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind nobuiltin
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length3(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length3:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movzwl (%eax), %edx
|
|
; X86-NEXT: movzwl (%ecx), %esi
|
|
; X86-NEXT: rolw $8, %dx
|
|
; X86-NEXT: rolw $8, %si
|
|
; X86-NEXT: cmpw %si, %dx
|
|
; X86-NEXT: jne .LBB11_3
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movzbl 2(%eax), %eax
|
|
; X86-NEXT: movzbl 2(%ecx), %ecx
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB11_3: # %res_block
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: movzbl %al, %eax
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length3_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzwl (%ecx), %edx
|
|
; X86-NEXT: xorw (%eax), %dx
|
|
; X86-NEXT: movzbl 2(%ecx), %ecx
|
|
; X86-NEXT: xorb 2(%eax), %cl
|
|
; X86-NEXT: movzbl %cl, %eax
|
|
; X86-NEXT: orw %dx, %ax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length4(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length4:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %ecx
|
|
; X86-NEXT: movl (%eax), %eax
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %eax
|
|
; X86-NEXT: cmpl %eax, %ecx
|
|
; X86-NEXT: seta %al
|
|
; X86-NEXT: sbbb $0, %al
|
|
; X86-NEXT: movsbl %al, %eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length4_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %ecx
|
|
; X86-NEXT: cmpl (%eax), %ecx
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length4_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %ecx
|
|
; X86-NEXT: movl (%eax), %eax
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %eax
|
|
; X86-NEXT: cmpl %eax, %ecx
|
|
; X86-NEXT: setb %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length4_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %ecx
|
|
; X86-NEXT: movl (%eax), %eax
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %eax
|
|
; X86-NEXT: cmpl %eax, %ecx
|
|
; X86-NEXT: seta %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
|
|
%c = icmp sgt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length4_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length4_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: cmpl $875770417, (%eax) # imm = 0x34333231
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 4) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length5(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length5:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl (%eax), %edx
|
|
; X86-NEXT: movl (%ecx), %esi
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: bswapl %esi
|
|
; X86-NEXT: cmpl %esi, %edx
|
|
; X86-NEXT: jne .LBB18_3
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movzbl 4(%eax), %eax
|
|
; X86-NEXT: movzbl 4(%ecx), %ecx
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB18_3: # %res_block
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: movzbl %al, %eax
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length5_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %edx
|
|
; X86-NEXT: xorl (%eax), %edx
|
|
; X86-NEXT: movzbl 4(%ecx), %ecx
|
|
; X86-NEXT: xorb 4(%eax), %cl
|
|
; X86-NEXT: movzbl %cl, %eax
|
|
; X86-NEXT: orl %edx, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length5_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl (%eax), %edx
|
|
; X86-NEXT: movl (%ecx), %esi
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: bswapl %esi
|
|
; X86-NEXT: cmpl %esi, %edx
|
|
; X86-NEXT: jne .LBB20_3
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movzbl 4(%eax), %eax
|
|
; X86-NEXT: movzbl 4(%ecx), %ecx
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: jmp .LBB20_2
|
|
; X86-NEXT: .LBB20_3: # %res_block
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: movzbl %al, %eax
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: .LBB20_2: # %endblock
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length7(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length7:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; X86-NEXT: movl (%esi), %ecx
|
|
; X86-NEXT: movl (%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: jne .LBB21_2
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movl 3(%esi), %ecx
|
|
; X86-NEXT: movl 3(%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: je .LBB21_3
|
|
; X86-NEXT: .LBB21_2: # %res_block
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: .LBB21_3: # %endblock
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length7_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; X86-NEXT: movl (%esi), %ecx
|
|
; X86-NEXT: movl (%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: jne .LBB22_2
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movl 3(%esi), %ecx
|
|
; X86-NEXT: movl 3(%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: je .LBB22_3
|
|
; X86-NEXT: .LBB22_2: # %res_block
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: .LBB22_3: # %endblock
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length7_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %edx
|
|
; X86-NEXT: movl 3(%ecx), %ecx
|
|
; X86-NEXT: xorl (%eax), %edx
|
|
; X86-NEXT: xorl 3(%eax), %ecx
|
|
; X86-NEXT: orl %edx, %ecx
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length8(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length8:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; X86-NEXT: movl (%esi), %ecx
|
|
; X86-NEXT: movl (%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: jne .LBB24_2
|
|
; X86-NEXT: # %bb.1: # %loadbb1
|
|
; X86-NEXT: movl 4(%esi), %ecx
|
|
; X86-NEXT: movl 4(%eax), %edx
|
|
; X86-NEXT: bswapl %ecx
|
|
; X86-NEXT: bswapl %edx
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: je .LBB24_3
|
|
; X86-NEXT: .LBB24_2: # %res_block
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: cmpl %edx, %ecx
|
|
; X86-NEXT: setae %al
|
|
; X86-NEXT: leal -1(%eax,%eax), %eax
|
|
; X86-NEXT: .LBB24_3: # %endblock
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length8_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl (%ecx), %edx
|
|
; X86-NEXT: movl 4(%ecx), %ecx
|
|
; X86-NEXT: xorl (%eax), %edx
|
|
; X86-NEXT: xorl 4(%eax), %ecx
|
|
; X86-NEXT: orl %edx, %ecx
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length8_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length8_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl $858927408, %ecx # imm = 0x33323130
|
|
; X86-NEXT: xorl (%eax), %ecx
|
|
; X86-NEXT: movl $926299444, %edx # imm = 0x37363534
|
|
; X86-NEXT: xorl 4(%eax), %edx
|
|
; X86-NEXT: orl %ecx, %edx
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 8) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length9_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $9
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length10_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $10
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 10) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length11_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $11
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 11) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length12_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $12
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length12(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length12:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $12
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length13_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $13
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 13) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length14_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $14
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 14) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length15(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length15:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $15
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length15_lt(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length15_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $15
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind
|
|
%c = icmp slt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length15_const(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length15_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $15
|
|
; X86-NEXT: pushl $.L.str+1
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 15) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length15_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $15
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length15_gt_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $15
|
|
; X86-NEXT: pushl $.L.str+1
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 15) nounwind
|
|
%c = icmp sgt i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
|
|
|
|
define i32 @length16(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length16:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $16
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 16) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length16_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-NOSSE-LABEL: length16_eq:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $16
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: setne %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length16_eq:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $16
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: setne %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length16_eq:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
|
|
; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: setne %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length16_eq:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm1
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm1
|
|
; X86-SSE41-NEXT: ptest %xmm1, %xmm1
|
|
; X86-SSE41-NEXT: setne %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length16_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length16_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $16
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length16_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length16_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $16
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length16_eq_const(ptr %X) nounwind {
|
|
; X86-NOSSE-LABEL: length16_eq_const:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $16
|
|
; X86-NOSSE-NEXT: pushl $.L.str
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length16_eq_const:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $16
|
|
; X86-SSE1-NEXT: pushl $.L.str
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length16_eq_const:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length16_eq_const:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 16) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
|
|
|
|
define i32 @length24(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length24:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $24
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 24) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length24_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-NOSSE-LABEL: length24_eq:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $24
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length24_eq:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $24
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length24_eq:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 8(%ecx), %xmm1
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: movdqu 8(%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length24_eq:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 8(%ecx), %xmm1
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE41-NEXT: movdqu 8(%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm2, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length24_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length24_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $24
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length24_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length24_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $24
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length24_eq_const(ptr %X) nounwind {
|
|
; X86-NOSSE-LABEL: length24_eq_const:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $24
|
|
; X86-NOSSE-NEXT: pushl $.L.str
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: setne %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length24_eq_const:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $24
|
|
; X86-SSE1-NEXT: pushl $.L.str
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: setne %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length24_eq_const:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 8(%eax), %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: setne %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length24_eq_const:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 8(%eax), %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: setne %al
|
|
; X86-SSE41-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 24) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length31(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length31:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $31
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 31) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length31_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-NOSSE-LABEL: length31_eq:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $31
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length31_eq:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $31
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length31_eq:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length31_eq:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm2, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length31_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length31_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $31
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length31_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length31_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $31
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
|
|
; X86-NOSSE-LABEL: length31_eq_prefer128:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $31
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length31_eq_prefer128:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $31
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length31_eq_prefer128:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length31_eq_prefer128:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm2, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length31_eq_const(ptr %X) nounwind {
|
|
; X86-NOSSE-LABEL: length31_eq_const:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $31
|
|
; X86-NOSSE-NEXT: pushl $.L.str
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: setne %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length31_eq_const:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $31
|
|
; X86-SSE1-NEXT: pushl $.L.str
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: setne %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length31_eq_const:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 15(%eax), %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: setne %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length31_eq_const:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 15(%eax), %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: setne %al
|
|
; X86-SSE41-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 31) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length32(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length32:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $32
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 32) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
|
|
|
|
define i1 @length32_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-NOSSE-LABEL: length32_eq:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $32
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length32_eq:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $32
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length32_eq:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length32_eq:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm2, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length32_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length32_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $32
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length32_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length32_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $32
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
|
|
; X86-NOSSE-LABEL: length32_eq_prefer128:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $32
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: sete %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length32_eq_prefer128:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $32
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: sete %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length32_eq_prefer128:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: sete %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length32_eq_prefer128:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm2
|
|
; X86-SSE41-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
|
|
; X86-SSE41-NEXT: pxor %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm2, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: sete %al
|
|
; X86-SSE41-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length32_eq_const(ptr %X) nounwind {
|
|
; X86-NOSSE-LABEL: length32_eq_const:
|
|
; X86-NOSSE: # %bb.0:
|
|
; X86-NOSSE-NEXT: pushl $32
|
|
; X86-NOSSE-NEXT: pushl $.L.str
|
|
; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NOSSE-NEXT: calll memcmp
|
|
; X86-NOSSE-NEXT: addl $12, %esp
|
|
; X86-NOSSE-NEXT: testl %eax, %eax
|
|
; X86-NOSSE-NEXT: setne %al
|
|
; X86-NOSSE-NEXT: retl
|
|
;
|
|
; X86-SSE1-LABEL: length32_eq_const:
|
|
; X86-SSE1: # %bb.0:
|
|
; X86-SSE1-NEXT: pushl $32
|
|
; X86-SSE1-NEXT: pushl $.L.str
|
|
; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-SSE1-NEXT: calll memcmp
|
|
; X86-SSE1-NEXT: addl $12, %esp
|
|
; X86-SSE1-NEXT: testl %eax, %eax
|
|
; X86-SSE1-NEXT: setne %al
|
|
; X86-SSE1-NEXT: retl
|
|
;
|
|
; X86-SSE2-LABEL: length32_eq_const:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE2-NEXT: pand %xmm1, %xmm0
|
|
; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
|
|
; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
|
|
; X86-SSE2-NEXT: setne %al
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X86-SSE41-LABEL: length32_eq_const:
|
|
; X86-SSE41: # %bb.0:
|
|
; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE41-NEXT: movdqu (%eax), %xmm0
|
|
; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
|
|
; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
|
|
; X86-SSE41-NEXT: por %xmm1, %xmm0
|
|
; X86-SSE41-NEXT: ptest %xmm0, %xmm0
|
|
; X86-SSE41-NEXT: setne %al
|
|
; X86-SSE41-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 32) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length48(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length48:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 48) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length48_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length48_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length48_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length48_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length48_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length48_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
|
|
; X86-LABEL: length48_eq_prefer128:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
|
|
%cmp = icmp eq i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length48_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length48_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $48
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 48) nounwind
|
|
%c = icmp ne i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length63(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length63:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $63
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 63) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length63_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length63_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $63
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length63_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length63_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $63
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length63_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length63_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $63
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length63_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length63_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $63
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 63) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length64(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length64:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $64
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 64) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length64_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length64_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $64
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length64_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length64_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $64
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length64_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length64_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $64
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length64_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length64_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $64
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 64) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length96(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length96:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $96
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 96) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length96_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length96_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $96
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length96_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length96_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $96
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length96_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length96_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $96
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length96_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length96_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $96
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 96) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length127(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length127:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $127
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 127) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length127_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length127_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $127
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length127_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length127_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $127
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length127_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length127_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $127
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length127_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length127_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $127
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 127) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length128(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length128:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $128
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 128) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length128_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length128_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $128
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length128_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length128_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $128
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length128_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length128_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $128
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length128_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length128_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $128
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 128) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length192(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length192:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $192
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 192) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length192_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length192_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $192
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length192_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length192_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $192
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length192_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length192_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $192
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length192_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length192_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $192
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 192) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length255(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length255:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $255
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 255) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length255_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length255_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $255
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length255_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length255_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $255
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length255_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length255_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $255
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length255_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length255_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $255
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 255) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length256(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length256:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $256 # imm = 0x100
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 256) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length256_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length256_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $256 # imm = 0x100
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length256_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length256_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $256 # imm = 0x100
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length256_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length256_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $256 # imm = 0x100
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length256_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length256_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $256 # imm = 0x100
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 256) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length384(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length384:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $384 # imm = 0x180
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 384) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length384_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length384_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $384 # imm = 0x180
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length384_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length384_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $384 # imm = 0x180
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length384_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length384_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $384 # imm = 0x180
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length384_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length384_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $384 # imm = 0x180
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 384) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length511(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length511:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $511 # imm = 0x1FF
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 511) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length511_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length511_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $511 # imm = 0x1FF
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length511_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length511_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $511 # imm = 0x1FF
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length511_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length511_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $511 # imm = 0x1FF
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length511_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length511_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $511 # imm = 0x1FF
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 511) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
define i32 @length512(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: length512:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $512 # imm = 0x200
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 512) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @length512_eq(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length512_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $512 # imm = 0x200
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setne %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
|
|
%cmp = icmp ne i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length512_lt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length512_lt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $512 # imm = 0x200
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: shrl $31, %eax
|
|
; X86-NEXT: # kill: def $al killed $al killed $eax
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
|
|
%cmp = icmp slt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length512_gt(ptr %x, ptr %y) nounwind {
|
|
; X86-LABEL: length512_gt:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $512 # imm = 0x200
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: setg %al
|
|
; X86-NEXT: retl
|
|
%call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
|
|
%cmp = icmp sgt i32 %call, 0
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @length512_eq_const(ptr %X) nounwind {
|
|
; X86-LABEL: length512_eq_const:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $512 # imm = 0x200
|
|
; X86-NEXT: pushl $.L.str
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 512) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
; This checks that we do not do stupid things with huge sizes.
|
|
define i32 @huge_length(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: huge_length:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $-1
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
|
|
; X86-LABEL: huge_length_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl $-1
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|
|
|
|
; This checks non-constant sizes.
|
|
define i32 @nonconst_length(ptr %X, ptr %Y, i32 %size) nounwind {
|
|
; X86-LABEL: nonconst_length:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: jmp memcmp # TAILCALL
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
|
|
ret i32 %m
|
|
}
|
|
|
|
define i1 @nonconst_length_eq(ptr %X, ptr %Y, i32 %size) nounwind {
|
|
; X86-LABEL: nonconst_length_eq:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: pushl {{[0-9]+}}(%esp)
|
|
; X86-NEXT: calll memcmp
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: testl %eax, %eax
|
|
; X86-NEXT: sete %al
|
|
; X86-NEXT: retl
|
|
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
|
|
%c = icmp eq i32 %m, 0
|
|
ret i1 %c
|
|
}
|