[PATCH] D11172: LegalizeDAG: Fix and improve FCOPYSIGN/FABS legalization
Matthias Braun
matze at braunis.de
Mon Jul 13 19:12:48 PDT 2015
MatzeB created this revision.
MatzeB added a reviewer: resistor.
MatzeB added a subscriber: llvm-commits.
MatzeB set the repository for this revision to rL LLVM.
Herald added a subscriber: aemerson.
- Factor out code to query and modify the sign bit of a floatingpoint
value as an integer. This also works if none of the targets integer
types is big enough to hold all bits of the floatingpoint value.
- Legalize FABS(x) as FCOPYSIGN(x, 0.0) if FCOPYSIGN is available,
otherwise perform bit manipulation on the sign bit. The previous code
used "x >u 0 ? x : -x" which is incorrect for x being -0.0! It also
takes 34 instructions on ARM Cortex-M4. With this patch we only
require 5:
vldr d0, LCPI0_0
vmov r2, r3, d0
lsrs r2, r3, #31
bfi r1, r2, #31, #1
bx lr
(This could be further improved if the compiler would recognize that
r2, r3 is zero).
- Only lower FCOPYSIGN(x, y) = sign(x) ? -FABS(x) : FABS(x) if FABS is
available otherwise perform bit manipulation on the sign bit.
- Perform the sign(x) test by masking out the sign bit and comparing
with 0 rather than shifting the sign bit to the highest position and
testing for "<s 0". For x86 copysignl (on 80bit values) this gets us:
testl $32768, %eax
rather than:
shlq $48, %rax
sets %al
testb %al, %al
This fixes http://llvm.org/PR24091
Repository:
rL LLVM
http://reviews.llvm.org/D11172
Files:
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
test/CodeGen/Thumb2/float-intrinsics-double.ll
test/CodeGen/X86/pr13577.ll
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11172.29639.patch
Type: text/x-patch
Size: 13187 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150714/cad4a0e0/attachment.bin>
More information about the llvm-commits
mailing list