summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-05-16 21:00:24 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-05-16 21:00:24 +0000
commite8a0ae7346793d5a6a3c79e7cb7bcfb3bbfb9e50 (patch)
tree3bf63b3f93ec5210ea5ee59615a852d3ca9ac4e4 /llvm/lib
parent2e0f6c9b2141df80bef932ecbaae182d70c5a844 (diff)
downloadbcm5719-llvm-e8a0ae7346793d5a6a3c79e7cb7bcfb3bbfb9e50.tar.gz
bcm5719-llvm-e8a0ae7346793d5a6a3c79e7cb7bcfb3bbfb9e50.zip
[Hexagon] Mark HVX vector predicate bitwise ops as legal, add patterns
llvm-svn: 332525
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp38
-rw-r--r--llvm/lib/Target/Hexagon/HexagonPatternsHVX.td70
2 files changed, 73 insertions, 35 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
index 281cfcf9f89..b75a7f2bde9 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp
@@ -116,16 +116,6 @@ HexagonTargetLowering::initializeHVXLowering() {
}
for (MVT T : LegalV) {
- MVT BoolV = MVT::getVectorVT(MVT::i1, T.getVectorNumElements());
- setOperationAction(ISD::BUILD_VECTOR, BoolV, Custom);
- setOperationAction(ISD::CONCAT_VECTORS, BoolV, Custom);
- setOperationAction(ISD::INSERT_SUBVECTOR, BoolV, Custom);
- setOperationAction(ISD::INSERT_VECTOR_ELT, BoolV, Custom);
- setOperationAction(ISD::EXTRACT_SUBVECTOR, BoolV, Custom);
- setOperationAction(ISD::EXTRACT_VECTOR_ELT, BoolV, Custom);
- }
-
- for (MVT T : LegalV) {
if (T == ByteV)
continue;
// Promote all shuffles to operate on vectors of bytes.
@@ -174,9 +164,35 @@ HexagonTargetLowering::initializeHVXLowering() {
// Promote all shuffles to operate on vectors of bytes.
setPromoteTo(ISD::VECTOR_SHUFFLE, T, ByteW);
}
+ }
+ // Boolean vectors.
+
+ for (MVT T : LegalW) {
+ // Boolean types for vector pairs will overlap with the boolean
+ // types for single vectors, e.g.
+ // v64i8 -> v64i1 (single)
+ // v64i16 -> v64i1 (pair)
+ // Set these actions first, and allow the single actions to overwrite
+ // any duplicates.
+ MVT BoolW = MVT::getVectorVT(MVT::i1, T.getVectorNumElements());
+ setOperationAction(ISD::SETCC, BoolW, Custom);
+ setOperationAction(ISD::AND, BoolW, Custom);
+ setOperationAction(ISD::OR, BoolW, Custom);
+ setOperationAction(ISD::XOR, BoolW, Custom);
+ }
+
+ for (MVT T : LegalV) {
MVT BoolV = MVT::getVectorVT(MVT::i1, T.getVectorNumElements());
- setOperationAction(ISD::SETCC, BoolV, Custom);
+ setOperationAction(ISD::BUILD_VECTOR, BoolV, Custom);
+ setOperationAction(ISD::CONCAT_VECTORS, BoolV, Custom);
+ setOperationAction(ISD::INSERT_SUBVECTOR, BoolV, Custom);
+ setOperationAction(ISD::INSERT_VECTOR_ELT, BoolV, Custom);
+ setOperationAction(ISD::EXTRACT_SUBVECTOR, BoolV, Custom);
+ setOperationAction(ISD::EXTRACT_VECTOR_ELT, BoolV, Custom);
+ setOperationAction(ISD::AND, BoolV, Legal);
+ setOperationAction(ISD::OR, BoolV, Legal);
+ setOperationAction(ISD::XOR, BoolV, Legal);
}
}
diff --git a/llvm/lib/Target/Hexagon/HexagonPatternsHVX.td b/llvm/lib/Target/Hexagon/HexagonPatternsHVX.td
index 3bde002bc27..9132c77c9a9 100644
--- a/llvm/lib/Target/Hexagon/HexagonPatternsHVX.td
+++ b/llvm/lib/Target/Hexagon/HexagonPatternsHVX.td
@@ -360,6 +360,31 @@ let Predicates = [UseHVX] in {
def: Pat<(srl HVI16:$Vs, HVI16:$Vt), (V6_vlsrhv HvxVR:$Vs, HvxVR:$Vt)>;
def: Pat<(srl HVI32:$Vs, HVI32:$Vt), (V6_vlsrwv HvxVR:$Vs, HvxVR:$Vt)>;
+ def: Pat<(VecI8 (trunc HWI16:$Vss)),
+ (V6_vpackeb (HiVec $Vss), (LoVec $Vss))>;
+ def: Pat<(VecI16 (trunc HWI32:$Vss)),
+ (V6_vpackeh (HiVec $Vss), (LoVec $Vss))>;
+
+ def: Pat<(VecI16 (bswap HVI16:$Vs)),
+ (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x01010101)))>;
+ def: Pat<(VecI32 (bswap HVI32:$Vs)),
+ (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x03030303)))>;
+}
+
+class HvxSel_pat<InstHexagon MI, PatFrag RegPred>
+ : Pat<(select I1:$Pu, RegPred:$Vs, RegPred:$Vt),
+ (MI I1:$Pu, RegPred:$Vs, RegPred:$Vt)>;
+
+let Predicates = [HasV60T,UseHVX] in {
+ def: HvxSel_pat<PS_vselect, HVI8>;
+ def: HvxSel_pat<PS_vselect, HVI16>;
+ def: HvxSel_pat<PS_vselect, HVI32>;
+ def: HvxSel_pat<PS_wselect, HWI8>;
+ def: HvxSel_pat<PS_wselect, HWI16>;
+ def: HvxSel_pat<PS_wselect, HWI32>;
+}
+
+let Predicates = [UseHVX] in {
def: Pat<(VecQ8 (qtrue)), (PS_qtrue)>;
def: Pat<(VecQ16 (qtrue)), (PS_qtrue)>;
def: Pat<(VecQ32 (qtrue)), (PS_qtrue)>;
@@ -374,6 +399,27 @@ let Predicates = [UseHVX] in {
def: Pat<(qnot HQ16:$Qs), (V6_pred_not HvxQR:$Qs)>;
def: Pat<(qnot HQ32:$Qs), (V6_pred_not HvxQR:$Qs)>;
+ def: Pat<(VecQ8 (and HQ8:$Qs, HQ8:$Qt)),
+ (V6_pred_and HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ16 (and HQ16:$Qs, HQ16:$Qt)),
+ (V6_pred_and HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ32 (and HQ32:$Qs, HQ32:$Qt)),
+ (V6_pred_and HvxQR:$Qs, HvxQR:$Qt)>;
+
+ def: Pat<(VecQ8 (or HQ8:$Qs, HQ8:$Qt)),
+ (V6_pred_or HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ16 (or HQ16:$Qs, HQ16:$Qt)),
+ (V6_pred_or HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ32 (or HQ32:$Qs, HQ32:$Qt)),
+ (V6_pred_or HvxQR:$Qs, HvxQR:$Qt)>;
+
+ def: Pat<(VecQ8 (xor HQ8:$Qs, HQ8:$Qt)),
+ (V6_pred_xor HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ16 (xor HQ16:$Qs, HQ16:$Qt)),
+ (V6_pred_xor HvxQR:$Qs, HvxQR:$Qt)>;
+ def: Pat<(VecQ32 (xor HQ32:$Qs, HQ32:$Qt)),
+ (V6_pred_xor HvxQR:$Qs, HvxQR:$Qt)>;
+
def: Pat<(VecQ8 (seteq HVI8:$Vs, HVI8:$Vt)),
(V6_veqb HvxVR:$Vs, HvxVR:$Vt)>;
def: Pat<(VecQ8 (setgt HVI8:$Vs, HVI8:$Vt)),
@@ -392,28 +438,4 @@ let Predicates = [UseHVX] in {
(V6_vgtw HvxVR:$Vs, HvxVR:$Vt)>;
def: Pat<(VecQ32 (setugt HVI32:$Vs, HVI32:$Vt)),
(V6_vgtuw HvxVR:$Vs, HvxVR:$Vt)>;
-
- def: Pat<(VecI8 (trunc HWI16:$Vss)),
- (V6_vpackeb (HiVec $Vss), (LoVec $Vss))>;
- def: Pat<(VecI16 (trunc HWI32:$Vss)),
- (V6_vpackeh (HiVec $Vss), (LoVec $Vss))>;
-
- def: Pat<(VecI16 (bswap HVI16:$Vs)),
- (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x01010101)))>;
- def: Pat<(VecI32 (bswap HVI32:$Vs)),
- (V6_vdelta HvxVR:$Vs, (V6_lvsplatw (A2_tfrsi 0x03030303)))>;
}
-
-class HvxSel_pat<InstHexagon MI, PatFrag RegPred>
- : Pat<(select I1:$Pu, RegPred:$Vs, RegPred:$Vt),
- (MI I1:$Pu, RegPred:$Vs, RegPred:$Vt)>;
-
-let Predicates = [HasV60T,UseHVX] in {
- def: HvxSel_pat<PS_vselect, HVI8>;
- def: HvxSel_pat<PS_vselect, HVI16>;
- def: HvxSel_pat<PS_vselect, HVI32>;
- def: HvxSel_pat<PS_wselect, HWI8>;
- def: HvxSel_pat<PS_wselect, HWI16>;
- def: HvxSel_pat<PS_wselect, HWI32>;
-}
-
OpenPOWER on IntegriCloud