[AArch64] Lower sdiv x, pow2 using add + select + shift.
authorChad Rosier <mcrosier@codeaurora.org>
Wed, 23 Jul 2014 14:57:52 +0000 (14:57 +0000)
committerChad Rosier <mcrosier@codeaurora.org>
Wed, 23 Jul 2014 14:57:52 +0000 (14:57 +0000)
commit67c325e9f07f39308bb0e0fb72692676378a2ebd
treef3f00d4322a5f26ee6a5e3d1e7fa011dbef2c079
parent3922da8ae8fab29de6416eeeebf21208b1491557
[AArch64] Lower sdiv x, pow2 using add + select + shift.

The target-independent DAGcombiner will generate:
asr w1, X, #31 w1 = splat sign bit.
add X, X, w1, lsr #28 X = X + 0 or pow2-1
asr w0, X, asr #4 w0 = X/pow2

However, the add + shifts is expensive, so generate:
add w0, X, 15 w0 = X + pow2-1
cmp X, wzr X - 0
csel X, w0, X, lt X = (X < 0) ? X + pow2-1 : X;
asr w0, X, asr 4 w0 = X/pow2

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213758 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/Target/AArch64/AArch64ISelLowering.cpp
lib/Target/AArch64/AArch64ISelLowering.h
test/CodeGen/AArch64/sdivpow2.ll [new file with mode: 0644]