[Hexagon] Add a target feature for generating new-value stores

llvm-svn: 332290
This commit is contained in:
Krzysztof Parzyszek 2018-05-14 20:41:04 +00:00
parent 5f53f07b66
commit f66f7612bf
3 changed files with 18 additions and 6 deletions

View File

@ -52,6 +52,8 @@ def FeatureMemops: SubtargetFeature<"memops", "UseMemops", "true",
"Use memop instructions">; "Use memop instructions">;
def FeatureNVJ: SubtargetFeature<"nvj", "UseNewValueJumps", "true", def FeatureNVJ: SubtargetFeature<"nvj", "UseNewValueJumps", "true",
"Support for new-value jumps", [FeaturePackets]>; "Support for new-value jumps", [FeaturePackets]>;
def FeatureNVS: SubtargetFeature<"nvs", "UseNewValueStores", "true",
"Support for new-value stores", [FeaturePackets]>;
def FeatureDuplex: SubtargetFeature<"duplex", "EnableDuplex", "true", def FeatureDuplex: SubtargetFeature<"duplex", "EnableDuplex", "true",
"Enable generation of duplex instruction">; "Enable generation of duplex instruction">;
def FeatureReservedR19: SubtargetFeature<"reserved-r19", "ReservedR19", def FeatureReservedR19: SubtargetFeature<"reserved-r19", "ReservedR19",
@ -321,23 +323,28 @@ class Proc<string Name, SchedMachineModel Model,
def : Proc<"hexagonv4", HexagonModelV4, def : Proc<"hexagonv4", HexagonModelV4,
[ArchV4, [ArchV4,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeaturePackets]>; FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets]>;
def : Proc<"hexagonv5", HexagonModelV4, def : Proc<"hexagonv5", HexagonModelV4,
[ArchV4, ArchV5, [ArchV4, ArchV5,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeaturePackets]>; FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets]>;
def : Proc<"hexagonv55", HexagonModelV55, def : Proc<"hexagonv55", HexagonModelV55,
[ArchV4, ArchV5, ArchV55, [ArchV4, ArchV5, ArchV55,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeaturePackets]>; FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets]>;
def : Proc<"hexagonv60", HexagonModelV60, def : Proc<"hexagonv60", HexagonModelV60,
[ArchV4, ArchV5, ArchV55, ArchV60, [ArchV4, ArchV5, ArchV55, ArchV60,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeaturePackets]>; FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets]>;
def : Proc<"hexagonv62", HexagonModelV62, def : Proc<"hexagonv62", HexagonModelV62,
[ArchV4, ArchV5, ArchV55, ArchV60, ArchV62, [ArchV4, ArchV5, ArchV55, ArchV60, ArchV62,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeaturePackets]>; FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets]>;
def : Proc<"hexagonv65", HexagonModelV65, def : Proc<"hexagonv65", HexagonModelV65,
[ArchV4, ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, [ArchV4, ArchV5, ArchV55, ArchV60, ArchV62, ArchV65,
FeatureDuplex, FeatureMemNoShuf, FeatureMemops, FeatureNVJ, FeatureDuplex, FeatureMemNoShuf, FeatureMemops, FeatureNVJ,
FeaturePackets]>; FeatureNVS, FeaturePackets]>;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Declare the target which we are implementing // Declare the target which we are implementing

View File

@ -2983,6 +2983,9 @@ bool HexagonInstrInfo::mayBeCurLoad(const MachineInstr &MI) const {
// Returns true, if a ST insn can be promoted to a new-value store. // Returns true, if a ST insn can be promoted to a new-value store.
bool HexagonInstrInfo::mayBeNewStore(const MachineInstr &MI) const { bool HexagonInstrInfo::mayBeNewStore(const MachineInstr &MI) const {
if (MI.mayStore() && !Subtarget.useNewValueStores())
return false;
const uint64_t F = MI.getDesc().TSFlags; const uint64_t F = MI.getDesc().TSFlags;
return (F >> HexagonII::mayNVStorePos) & HexagonII::mayNVStoreMask; return (F >> HexagonII::mayNVStorePos) & HexagonII::mayNVStoreMask;
} }

View File

@ -54,6 +54,7 @@ class HexagonSubtarget : public HexagonGenSubtargetInfo {
bool UseMemops = false; bool UseMemops = false;
bool UsePackets = false; bool UsePackets = false;
bool UseNewValueJumps = false; bool UseNewValueJumps = false;
bool UseNewValueStores = false;
bool HasMemNoShuf = false; bool HasMemNoShuf = false;
bool EnableDuplex = false; bool EnableDuplex = false;
@ -155,6 +156,7 @@ public:
bool useMemops() const { return UseMemops; } bool useMemops() const { return UseMemops; }
bool usePackets() const { return UsePackets; } bool usePackets() const { return UsePackets; }
bool useNewValueJumps() const { return UseNewValueJumps; } bool useNewValueJumps() const { return UseNewValueJumps; }
bool useNewValueStores() const { return UseNewValueStores; }
bool modeIEEERndNear() const { return ModeIEEERndNear; } bool modeIEEERndNear() const { return ModeIEEERndNear; }
bool useHVXOps() const { return HexagonHVXVersion > Hexagon::ArchEnum::V4; } bool useHVXOps() const { return HexagonHVXVersion > Hexagon::ArchEnum::V4; }