diff options
| author | Diana Picus <diana.picus@linaro.org> | 2019-01-28 10:37:30 +0000 |
|---|---|---|
| committer | Diana Picus <diana.picus@linaro.org> | 2019-01-28 10:37:30 +0000 |
| commit | 574e0c5e328b89c598d31a243c5587a7ba5176c1 (patch) | |
| tree | b6195b128ddc889bd6494f3b64497c19313d251f /llvm/lib/Target/ARM/ARMLegalizerInfo.cpp | |
| parent | 059c1d8e7224667e74fe8a1280411732f88f0a70 (diff) | |
| download | bcm5719-llvm-574e0c5e328b89c598d31a243c5587a7ba5176c1.tar.gz bcm5719-llvm-574e0c5e328b89c598d31a243c5587a7ba5176c1.zip | |
[ARM GlobalISel] Support integer division for Thumb2
Support G_SDIV, G_UDIV, G_SREM and G_UREM.
The only significant difference between arm and thumb mode is that we
need to check a different subtarget feature.
llvm-svn: 352346
Diffstat (limited to 'llvm/lib/Target/ARM/ARMLegalizerInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMLegalizerInfo.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp index 9a8da31d7b3..943cabd4f33 100644 --- a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp +++ b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp @@ -92,6 +92,27 @@ ARMLegalizerInfo::ARMLegalizerInfo(const ARMSubtarget &ST) { .legalFor({{s32, s32}}) .clampScalar(1, s32, s32); + bool HasHWDivide = (!ST.isThumb() && ST.hasDivideInARMMode()) || + (ST.isThumb() && ST.hasDivideInThumbMode()); + if (HasHWDivide) + getActionDefinitionsBuilder({G_SDIV, G_UDIV}) + .legalFor({s32}) + .clampScalar(0, s32, s32); + else + getActionDefinitionsBuilder({G_SDIV, G_UDIV}) + .libcallFor({s32}) + .clampScalar(0, s32, s32); + + for (unsigned Op : {G_SREM, G_UREM}) { + setLegalizeScalarToDifferentSizeStrategy(Op, 0, widen_8_16); + if (HasHWDivide) + setAction({Op, s32}, Lower); + else if (AEABI(ST)) + setAction({Op, s32}, Custom); + else + setAction({Op, s32}, Libcall); + } + getActionDefinitionsBuilder(G_INTTOPTR).legalFor({{p0, s32}}); getActionDefinitionsBuilder(G_PTRTOINT).legalFor({{s32, p0}}); @@ -120,25 +141,6 @@ ARMLegalizerInfo::ARMLegalizerInfo(const ARMSubtarget &ST) { getActionDefinitionsBuilder(G_GLOBAL_VALUE).legalFor({p0}); getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0}); - if (ST.hasDivideInARMMode()) - getActionDefinitionsBuilder({G_SDIV, G_UDIV}) - .legalFor({s32}) - .clampScalar(0, s32, s32); - else - getActionDefinitionsBuilder({G_SDIV, G_UDIV}) - .libcallFor({s32}) - .clampScalar(0, s32, s32); - - for (unsigned Op : {G_SREM, G_UREM}) { - setLegalizeScalarToDifferentSizeStrategy(Op, 0, widen_8_16); - if (ST.hasDivideInARMMode()) - setAction({Op, s32}, Lower); - else if (AEABI(ST)) - setAction({Op, s32}, Custom); - else - setAction({Op, s32}, Libcall); - } - if (ST.hasV5TOps()) { getActionDefinitionsBuilder(G_CTLZ) .legalFor({s32}) |

