aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/DynamicLinker.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-11-29 05:55:24 +0000
committerChris Lattner <sabre@nondot.org>2004-11-29 05:55:24 +0000
commit928b47ae2e022b9c9cb1b16aa6986d74c7bd2da5 (patch)
treeb55f5e1194d29c5e6a1ee0d4c4af7a978faca758 /lib/Support/DynamicLinker.cpp
parentfbbf307b1586ba7a677b8cd4dc3dd2560e6c557b (diff)
Revamp long/ulong comparisons to use a much more efficient sequence (thanks
to Brian and the Sun compiler for pointing out that the obvious works :) This also enables folding all long comparisons into setcc and branch instructions: before we could only do == and != For example, for: void test(unsigned long long A, unsigned long long B) { if (A < B) foo(); } We now generate: test: subl $4, %esp movl %esi, (%esp) movl 8(%esp), %eax movl 12(%esp), %ecx movl 16(%esp), %edx movl 20(%esp), %esi subl %edx, %eax sbbl %esi, %ecx jae .LBBtest_2 # UnifiedReturnBlock .LBBtest_1: # then call foo movl (%esp), %esi addl $4, %esp ret .LBBtest_2: # UnifiedReturnBlock movl (%esp), %esi addl $4, %esp ret Instead of: test: subl $12, %esp movl %esi, 8(%esp) movl %ebx, 4(%esp) movl 16(%esp), %eax movl 20(%esp), %ecx movl 24(%esp), %edx movl 28(%esp), %esi cmpl %edx, %eax setb %al cmpl %esi, %ecx setb %bl cmove %ax, %bx testb %bl, %bl je .LBBtest_2 # UnifiedReturnBlock .LBBtest_1: # then call foo movl 4(%esp), %ebx movl 8(%esp), %esi addl $12, %esp ret .LBBtest_2: # UnifiedReturnBlock movl 4(%esp), %ebx movl 8(%esp), %esi addl $12, %esp ret git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18330 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/DynamicLinker.cpp')
0 files changed, 0 insertions, 0 deletions