diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-09-20 03:38:48 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-09-20 03:38:48 +0000 | 
| commit | 0ea26ca45b56b2b4cc1839cdbccc13a38b066969 (patch) | |
| tree | 1b18fe4efd28500fe827fd0c649ffd94fd169cc3 /lib/Bytecode/Archive/ArchiveReader.cpp | |
| parent | 571c15e38a68b93ba959de3ddc348ce554bc2484 (diff) | |
Expand 64-bit shifts more optimally if we know that the high bit of the
shift amount is one or zero.  For example, for:
long long foo1(long long X, int C) {
  return X << (C|32);
}
long long foo2(long long X, int C) {
  return X << (C&~32);
}
we get:
_foo1:
        movb $31, %cl
        movl 4(%esp), %edx
        andb 12(%esp), %cl
        shll %cl, %edx
        xorl %eax, %eax
        ret
_foo2:
        movb $223, %cl
        movl 4(%esp), %eax
        movl 8(%esp), %edx
        andb 12(%esp), %cl
        shldl %cl, %eax, %edx
        shll %cl, %eax
        ret
instead of:
_foo1:
        subl $4, %esp
        movl %ebx, (%esp)
        movb $32, %bl
        movl 8(%esp), %eax
        movl 12(%esp), %edx
        movb %bl, %cl
        orb 16(%esp), %cl
        shldl %cl, %eax, %edx
        shll %cl, %eax
        xorl %ecx, %ecx
        testb %bl, %bl
        cmovne %eax, %edx
        cmovne %ecx, %eax
        movl (%esp), %ebx
        addl $4, %esp
        ret
_foo2:
        subl $4, %esp
        movl %ebx, (%esp)
        movb $223, %cl
        movl 8(%esp), %eax
        movl 12(%esp), %edx
        andb 16(%esp), %cl
        shldl %cl, %eax, %edx
        shll %cl, %eax
        xorl %ecx, %ecx
        xorb %bl, %bl
        testb %bl, %bl
        cmovne %eax, %edx
        cmovne %ecx, %eax
        movl (%esp), %ebx
        addl $4, %esp
        ret
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30506 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Archive/ArchiveReader.cpp')
0 files changed, 0 insertions, 0 deletions
