summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
diff options
context:
space:
mode:
authorDiana Picus <diana.picus@linaro.org>2019-01-28 10:37:30 +0000
committerDiana Picus <diana.picus@linaro.org>2019-01-28 10:37:30 +0000
commit574e0c5e328b89c598d31a243c5587a7ba5176c1 (patch)
treeb6195b128ddc889bd6494f3b64497c19313d251f /llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
parent059c1d8e7224667e74fe8a1280411732f88f0a70 (diff)
downloadbcm5719-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.cpp40
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})
OpenPOWER on IntegriCloud