[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)
commit17020f96c79a0b28275681e16569c81dc369d77b
tree1f6dadbf7ab978ce7e3a87bac0ded8699d0833c9
parent74acbb77678f702c84ad56f444abe259058f6bdc
[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

llvm-svn: 213758
llvm/include/llvm/Target/TargetLowering.h
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
llvm/test/CodeGen/AArch64/sdivpow2.ll [new file with mode: 0644]