diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-12-05 20:18:09 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-12-05 20:18:09 +0000 |
| commit | 13a9cf28a1202aa401aec5e0b90268e52d74c360 (patch) | |
| tree | 881cea7a03a016be9fce8867b309dfecbfe04d1a /llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp | |
| parent | f75d4f329cc45542cac4eaa375bad84e0535f278 (diff) | |
| download | bcm5719-llvm-13a9cf28a1202aa401aec5e0b90268e52d74c360.tar.gz bcm5719-llvm-13a9cf28a1202aa401aec5e0b90268e52d74c360.zip | |
[Hexagon] Foundation of support for Hexagon V66
llvm-svn: 348407
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp')
| -rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp index 59f3caa6af9..f4ee2bbfaaa 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.cpp @@ -138,6 +138,8 @@ void HexagonCVIResource::SetupTUL(TypeUnitsAndLanes *TUL, StringRef CPU) { UnitsAndLanes(CVI_XLANE | CVI_MPY0, 2); (*TUL)[HexagonII::TypeCVI_SCATTER_NEW_ST] = UnitsAndLanes(CVI_XLANE | CVI_SHIFT | CVI_MPY0 | CVI_MPY1, 1); + (*TUL)[HexagonII::TypeCVI_4SLOT_MPY] = UnitsAndLanes(CVI_XLANE, 4); + (*TUL)[HexagonII::TypeCVI_ZW] = UnitsAndLanes(CVI_ZW, 1); } HexagonCVIResource::HexagonCVIResource(TypeUnitsAndLanes *TUL, @@ -300,6 +302,7 @@ bool HexagonShuffler::check() { // Number of memory operations, loads, solo loads, stores, solo stores, single // stores. unsigned memory = 0, loads = 0, load0 = 0, stores = 0, store0 = 0, store1 = 0; + unsigned NonZCVIloads = 0, AllCVIloads = 0, CVIstores = 0; // Number of duplex insns unsigned duplex = 0; unsigned pSlot3Cnt = 0; @@ -331,6 +334,11 @@ bool HexagonShuffler::check() { case HexagonII::TypeCVI_VM_TMP_LD: case HexagonII::TypeCVI_GATHER: case HexagonII::TypeCVI_GATHER_RST: + ++NonZCVIloads; + LLVM_FALLTHROUGH; + case HexagonII::TypeCVI_ZW: + ++AllCVIloads; + LLVM_FALLTHROUGH; case HexagonII::TypeLD: ++loads; ++memory; @@ -348,6 +356,8 @@ bool HexagonShuffler::check() { case HexagonII::TypeCVI_SCATTER_RST: case HexagonII::TypeCVI_SCATTER_NEW_RST: case HexagonII::TypeCVI_SCATTER_NEW_ST: + ++CVIstores; + LLVM_FALLTHROUGH; case HexagonII::TypeST: ++stores; ++memory; @@ -405,7 +415,11 @@ bool HexagonShuffler::check() { applySlotRestrictions(); // Check if the packet is legal. - if ((load0 > 1 || store0 > 1) || (duplex > 1 || (duplex && memory))) { + const unsigned ZCVIloads = AllCVIloads - NonZCVIloads; + const bool ValidHVXMem = + NonZCVIloads <= 1 && ZCVIloads <= 1 && CVIstores <= 1; + if ((load0 > 1 || store0 > 1 || !ValidHVXMem) || + (duplex > 1 || (duplex && memory))) { reportError(llvm::Twine("invalid instruction packet")); return false; } |

