summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp')
-rw-r--r--llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp66
1 files changed, 41 insertions, 25 deletions
diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
index c204683f4e79..055193bcc2c8 100644
--- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
+++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
@@ -287,34 +287,48 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
auto &LoadActions = getActionDefinitionsBuilder(G_LOAD);
auto &StoreActions = getActionDefinitionsBuilder(G_STORE);
+ auto &ExtLoadActions = getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD});
- LoadActions
- .legalForTypesWithMemDesc({{s32, p0, s8, 8},
- {s32, p0, s16, 16},
- {s32, p0, s32, 32},
- {p0, p0, sXLen, XLen}});
- StoreActions
- .legalForTypesWithMemDesc({{s32, p0, s8, 8},
- {s32, p0, s16, 16},
- {s32, p0, s32, 32},
- {p0, p0, sXLen, XLen}});
- auto &ExtLoadActions =
- getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD})
- .legalForTypesWithMemDesc({{s32, p0, s8, 8}, {s32, p0, s16, 16}});
+ // Return the alignment needed for scalar memory ops. If unaligned scalar mem
+ // is supported, we only require byte alignment. Otherwise, we need the memory
+ // op to be natively aligned.
+ auto getScalarMemAlign = [&ST](unsigned Size) {
+ return ST.enableUnalignedScalarMem() ? 8 : Size;
+ };
+
+ LoadActions.legalForTypesWithMemDesc(
+ {{s32, p0, s8, getScalarMemAlign(8)},
+ {s32, p0, s16, getScalarMemAlign(16)},
+ {s32, p0, s32, getScalarMemAlign(32)},
+ {p0, p0, sXLen, getScalarMemAlign(XLen)}});
+ StoreActions.legalForTypesWithMemDesc(
+ {{s32, p0, s8, getScalarMemAlign(8)},
+ {s32, p0, s16, getScalarMemAlign(16)},
+ {s32, p0, s32, getScalarMemAlign(32)},
+ {p0, p0, sXLen, getScalarMemAlign(XLen)}});
+ ExtLoadActions.legalForTypesWithMemDesc(
+ {{s32, p0, s8, getScalarMemAlign(8)},
+ {s32, p0, s16, getScalarMemAlign(16)}});
if (XLen == 64) {
- LoadActions.legalForTypesWithMemDesc({{s64, p0, s8, 8},
- {s64, p0, s16, 16},
- {s64, p0, s32, 32},
- {s64, p0, s64, 64}});
- StoreActions.legalForTypesWithMemDesc({{s64, p0, s8, 8},
- {s64, p0, s16, 16},
- {s64, p0, s32, 32},
- {s64, p0, s64, 64}});
+ LoadActions.legalForTypesWithMemDesc(
+ {{s64, p0, s8, getScalarMemAlign(8)},
+ {s64, p0, s16, getScalarMemAlign(16)},
+ {s64, p0, s32, getScalarMemAlign(32)},
+ {s64, p0, s64, getScalarMemAlign(64)}});
+ StoreActions.legalForTypesWithMemDesc(
+ {{s64, p0, s8, getScalarMemAlign(8)},
+ {s64, p0, s16, getScalarMemAlign(16)},
+ {s64, p0, s32, getScalarMemAlign(32)},
+ {s64, p0, s64, getScalarMemAlign(64)}});
ExtLoadActions.legalForTypesWithMemDesc(
- {{s64, p0, s8, 8}, {s64, p0, s16, 16}, {s64, p0, s32, 32}});
+ {{s64, p0, s8, getScalarMemAlign(8)},
+ {s64, p0, s16, getScalarMemAlign(16)},
+ {s64, p0, s32, getScalarMemAlign(32)}});
} else if (ST.hasStdExtD()) {
- LoadActions.legalForTypesWithMemDesc({{s64, p0, s64, 64}});
- StoreActions.legalForTypesWithMemDesc({{s64, p0, s64, 64}});
+ LoadActions.legalForTypesWithMemDesc(
+ {{s64, p0, s64, getScalarMemAlign(64)}});
+ StoreActions.legalForTypesWithMemDesc(
+ {{s64, p0, s64, getScalarMemAlign(64)}});
}
// Vector loads/stores.
@@ -541,7 +555,9 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
// FIXME: We can do custom inline expansion like SelectionDAG.
// FIXME: Legal with Zfa.
- getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR})
+ getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
+ G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND,
+ G_INTRINSIC_ROUNDEVEN})
.libcallFor({s32, s64});
getActionDefinitionsBuilder(G_VASTART).customFor({p0});