llvm/lib/CodeGen/SelectionDAG
Chris Lattner 26d2990e03 Lower X%C into X/C+stuff. This allows the 'division by a constant' logic to
apply to rems as well as divs.  This fixes PR945 and speeds up ReedSolomon
from 14.57s to 10.90s (which is now faster than gcc).

It compiles CodeGen/X86/rem.ll into:

_test1:
        subl $4, %esp
        movl %esi, (%esp)
        movl $2155905153, %ecx
        movl 8(%esp), %esi
        movl %esi, %eax
        imull %ecx
        addl %esi, %edx
        movl %edx, %eax
        shrl $31, %eax
        sarl $7, %edx
        addl %eax, %edx
        imull $255, %edx, %eax
        subl %eax, %esi
        movl %esi, %eax
        movl (%esp), %esi
        addl $4, %esp
        ret
_test2:
        movl 4(%esp), %eax
        movl %eax, %ecx
        sarl $31, %ecx
        shrl $24, %ecx
        addl %eax, %ecx
        andl $4294967040, %ecx
        subl %ecx, %eax
        ret
_test3:
        subl $4, %esp
        movl %esi, (%esp)
        movl $2155905153, %ecx
        movl 8(%esp), %esi
        movl %esi, %eax
        mull %ecx
        shrl $7, %edx
        imull $255, %edx, %eax
        subl %eax, %esi
        movl %esi, %eax
        movl (%esp), %esi
        addl $4, %esp
        ret

instead of div/idiv instructions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30920 91177308-0d34-0410-b5e6-96231b3b80d8
2006-10-12 20:58:32 +00:00
..
DAGCombiner.cpp Lower X%C into X/C+stuff. This allows the 'division by a constant' logic to 2006-10-12 20:58:32 +00:00
LegalizeDAG.cpp Typo 2006-10-11 17:52:19 +00:00
Makefile For PR780: 2006-07-26 16:18:00 +00:00
ScheduleDAG.cpp Added support for machine specific constantpool values. These are useful for 2006-09-12 21:00:35 +00:00
ScheduleDAGList.cpp s|llvm/Support/Visibility.h|llvm/Support/Compiler.h| 2006-08-27 12:54:02 +00:00
ScheduleDAGRRList.cpp s|llvm/Support/Visibility.h|llvm/Support/Compiler.h| 2006-08-27 12:54:02 +00:00
ScheduleDAGSimple.cpp s|llvm/Support/Visibility.h|llvm/Support/Compiler.h| 2006-08-27 12:54:02 +00:00
SelectionDAG.cpp Add RemoveDeadNode to remove a dead node and its (potentially) dead operands. 2006-10-12 20:34:05 +00:00
SelectionDAGCSEMap.cpp Added support for machine specific constantpool values. These are useful for 2006-09-12 21:00:35 +00:00
SelectionDAGISel.cpp Jimptables working again on alpha. 2006-10-11 04:29:42 +00:00
SelectionDAGPrinter.cpp Naming consistency. 2006-10-11 07:10:22 +00:00
TargetLowering.cpp Naming consistency. 2006-10-11 07:10:22 +00:00