Implement some dag combines that allow doing fneg/fabs/fcopysign in integer
authorChris Lattner <sabre@nondot.org>
Sun, 27 Jan 2008 17:42:27 +0000 (17:42 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 27 Jan 2008 17:42:27 +0000 (17:42 +0000)
commit3bd39d4ca89804e97c93b039f6c2933f514c165c
treecd7a724754e525a6f5dbaebd96905710c907b6fe
parentf6b935d8e696f221eeb0578aa3da7cc143f80049
Implement some dag combines that allow doing fneg/fabs/fcopysign in integer
registers if used by a bitconvert or using a bitconvert.  This allows us to
avoid constant pool loads and use cheaper integer instructions when the
values come from or end up in integer regs anyway.  For example, we now
compile CodeGen/X86/fp-in-intregs.ll to:

_test1:
movl $2147483648, %eax
xorl 4(%esp), %eax
ret
_test2:
movl $1065353216, %eax
orl 4(%esp), %eax
andl $3212836864, %eax
ret

Instead of:
_test1:
movss 4(%esp), %xmm0
xorps LCPI2_0, %xmm0
movd %xmm0, %eax
ret
_test2:
movss 4(%esp), %xmm0
andps LCPI3_0, %xmm0
movss LCPI3_1, %xmm1
andps LCPI3_2, %xmm1
orps %xmm0, %xmm1
movd %xmm1, %eax
ret

bitconverts can happen due to various calling conventions that require
fp values to passed in integer regs in some cases, e.g. when returning
a complex.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46414 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/fp-in-intregs.ll [new file with mode: 0644]