[ARM] GlobalISel: Legalize s8 and s16 G_(S|U)DIV
authorDiana Picus <diana.picus@linaro.org>
Mon, 24 Apr 2017 09:12:19 +0000 (09:12 +0000)
committerDiana Picus <diana.picus@linaro.org>
Mon, 24 Apr 2017 09:12:19 +0000 (09:12 +0000)
commitf53865daa41d0c520a2afd2618e9a00fed448528
tree482e73646e0fd8624cbe25ce09b5e209ac733bbc
parente5b8557d5bc58c96f590b7aa400f9e75e0a3b22f
[ARM] GlobalISel: Legalize s8 and s16 G_(S|U)DIV

We have to widen the operands to 32 bits and then we can either use
hardware division if it is available or lower to a libcall otherwise.

At the moment it is not enough to set the Legalizer action to
WidenScalar, since for libcalls it won't know what to do (it won't be
able to find what size to widen to, because it will find Libcall and not
Legal for 32 bits). To hack around this limitation, we request Custom
lowering, and as part of that we widen first and then we run another
legalizeInstrStep on the widened DIV.

llvm-svn: 301166
llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
llvm/lib/Target/ARM/ARMLegalizerInfo.h
llvm/test/CodeGen/ARM/GlobalISel/arm-isel-divmod.ll
llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir