llvm/lib/Target/X86
Chris Lattner 2483f67914 Codegen signed mod by 2 or -2 more efficiently. Instead of generating:
t:
        mov %EDX, DWORD PTR [%ESP + 4]
        mov %ECX, 2
        mov %EAX, %EDX
        sar %EDX, 31
        idiv %ECX
        mov %EAX, %EDX
        ret

Generate:
t:
        mov %ECX, DWORD PTR [%ESP + 4]
***     mov %EAX, %ECX
        cdq
        and %ECX, 1
        xor %ECX, %EDX
        sub %ECX, %EDX
***     mov %EAX, %ECX
        ret

Note that the two marked moves are redundant, and should be eliminated by the
register allocator, but aren't.

Compare this to GCC, which generates:

t:
        mov     %eax, DWORD PTR [%esp+4]
        mov     %edx, %eax
        shr     %edx, 31
        lea     %ecx, [%edx+%eax]
        and     %ecx, -2
        sub     %eax, %ecx
        ret

or ICC 8.0, which generates:

t:
        movl      4(%esp), %ecx                                 #3.5
        movl      $-2147483647, %eax                            #3.25
        imull     %ecx                                          #3.25
        movl      %ecx, %eax                                    #3.25
        sarl      $31, %eax                                     #3.25
        addl      %ecx, %edx                                    #3.25
        subl      %edx, %eax                                    #3.25
        addl      %eax, %eax                                    #3.25
        negl      %eax                                          #3.25
        subl      %eax, %ecx                                    #3.25
        movl      %ecx, %eax                                    #3.25
        ret                                                     #3.25

We would be in great shape if not for the moves.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16763 91177308-0d34-0410-b5e6-96231b3b80d8
2004-10-06 05:01:07 +00:00
..
.cvsignore Tell CVS to ignore all .inc files 2003-08-03 15:50:17 +00:00
Makefile Add support for the -x86-asm-syntax flag, which can be used to choose between 2004-10-03 20:36:57 +00:00
X86.h Add -sse[,2,3] arguments to LLC 2004-08-24 08:18:44 +00:00
X86.td Add support for the -x86-asm-syntax flag, which can be used to choose between 2004-10-03 20:36:57 +00:00
X86AsmPrinter.cpp * Prune #includes 2004-10-04 07:31:08 +00:00
X86CodeEmitter.cpp Fix filename: Printer.cpp has become X86AsmPrinter.cpp 2004-09-12 21:26:04 +00:00
X86FloatingPoint.cpp Changes For Bug 352 2004-09-01 22:55:40 +00:00
X86InstrBuilder.h Reduce the number of arguments in the instruction builder and make some 2004-08-30 00:13:26 +00:00
X86InstrInfo.cpp Fix a warning 2004-08-01 19:31:30 +00:00
X86InstrInfo.h Remove a bunch of ad-hoc target-specific flags that were only used by the 2004-08-11 07:12:04 +00:00
X86InstrInfo.td Add some new instructions. Fix the asm string for sbb32rr 2004-10-06 04:01:02 +00:00
X86ISelPattern.cpp Disable the pattern isel 2004-08-15 23:02:17 +00:00
X86ISelSimple.cpp Codegen signed mod by 2 or -2 more efficiently. Instead of generating: 2004-10-06 05:01:07 +00:00
X86JITInfo.h Clean up a lot of the code I added yesterday by exposing the IntrinsicLowering 2003-12-28 21:23:38 +00:00
X86PeepholeOpt.cpp Add some new instructions. Fix the asm string for sbb32rr 2004-10-06 04:01:02 +00:00
X86RegisterInfo.cpp Add some new instructions. Fix the asm string for sbb32rr 2004-10-06 04:01:02 +00:00
X86RegisterInfo.h Code insertion methods now return void instead of an int. 2004-08-15 22:15:11 +00:00
X86RegisterInfo.td The real x87 floating point registers should not be allocatable. They 2004-09-21 21:22:11 +00:00
X86TargetMachine.cpp Changes For Bug 352 2004-09-01 22:55:40 +00:00
X86TargetMachine.h Auto-registrate target 2004-07-11 02:48:49 +00:00