summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-10-13 15:43:12 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-10-13 15:43:12 +0000
commita0f2f7c413daa4ac97cc1443ea0f147c5dd70043 (patch)
treed3f7cf55d85b729551aff69383f6c20db7b68897 /llvm/lib
parent8bc53fd031a31c92afcc821dba83b3e009a5841f (diff)
downloadbcm5719-llvm-a0f2f7c413daa4ac97cc1443ea0f147c5dd70043.tar.gz
bcm5719-llvm-a0f2f7c413daa4ac97cc1443ea0f147c5dd70043.zip
[Hexagon] Add patterns for cmpb/cmph with immediate arguments
Patch by Sumanth Gundapaneni. llvm-svn: 315692
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonPatterns.td46
1 files changed, 46 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonPatterns.td b/llvm/lib/Target/Hexagon/HexagonPatterns.td
index f185c49b85d..72d7569076a 100644
--- a/llvm/lib/Target/Hexagon/HexagonPatterns.td
+++ b/llvm/lib/Target/Hexagon/HexagonPatterns.td
@@ -63,6 +63,11 @@ def IsNPow2_64H : PatLeaf<(i64 imm), [{
return isPowerOf2_64(NV) && Log2_64(NV) >= 32;
}]>;
+class IsUGT<int Width, int Arg>: PatLeaf<(i32 imm),
+ "uint64_t V = N->getZExtValue();" #
+ "return isUInt<" # Width # ">(V) && V > " # Arg # ";"
+>;
+
def SDEC1 : SDNodeXForm<imm, [{
int32_t V = N->getSExtValue();
return CurDAG->getTargetConstant(V-1, SDLoc(N), MVT::i32);
@@ -114,6 +119,47 @@ def : T_CMP_pat <C2_cmpeqi, seteq, s10_0ImmPred>;
def : T_CMP_pat <C2_cmpgti, setgt, s10_0ImmPred>;
def : T_CMP_pat <C2_cmpgtui, setugt, u9_0ImmPred>;
+
+def SDTAssertZext: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisSameAs<0,1>]>;
+def AssertZextSD: SDNode<"ISD::AssertZext", SDTAssertZext>;
+class AssertZext<ValueType T>: PatFrag<(ops node:$A), (AssertZextSD $A, T)>;
+
+multiclass Cmpb_pat<InstHexagon MI, PatFrag Op, PatFrag AssertExt,
+ PatLeaf ImmPred, int Mask> {
+ def: Pat<(i1 (Op (and I32:$Rs, Mask), ImmPred:$I)),
+ (MI I32:$Rs, imm:$I)>;
+ def: Pat<(i1 (Op (AssertExt I32:$Rs), ImmPred:$I)),
+ (MI I32:$Rs, imm:$I)>;
+}
+
+multiclass CmpbN_pat<InstHexagon MI, PatFrag Op, PatFrag AssertExt,
+ PatLeaf ImmPred, int Mask> {
+ def: Pat<(i1 (Op (and I32:$Rs, Mask), ImmPred:$I)),
+ (C2_not (MI I32:$Rs, imm:$I))>;
+ def: Pat<(i1 (Op (AssertExt I32:$Rs), ImmPred:$I)),
+ (C2_not (MI I32:$Rs, imm:$I))>;
+}
+
+multiclass CmpbND_pat<InstHexagon MI, PatFrag Op, PatFrag AssertExt,
+ PatLeaf ImmPred, int Mask> {
+ def: Pat<(i1 (Op (and I32:$Rs, Mask), ImmPred:$I)),
+ (C2_not (MI I32:$Rs, (UDEC1 imm:$I)))>;
+ def: Pat<(i1 (Op (AssertExt I32:$Rs), ImmPred:$I)),
+ (C2_not (MI I32:$Rs, (UDEC1 imm:$I)))>;
+}
+
+let AddedComplexity = 200 in {
+ defm: Cmpb_pat <A4_cmpbeqi, seteq, AssertZext<i8>, IsUGT<8,31>, 255>;
+ defm: CmpbN_pat <A4_cmpbeqi, setne, AssertZext<i8>, IsUGT<8,31>, 255>;
+ defm: Cmpb_pat <A4_cmpbgtui, setugt, AssertZext<i8>, IsUGT<32,31>, 255>;
+ defm: CmpbN_pat <A4_cmpbgtui, setule, AssertZext<i8>, IsUGT<32,31>, 255>;
+ defm: Cmpb_pat <A4_cmphgtui, setugt, AssertZext<i16>, IsUGT<32,31>, 65535>;
+ defm: CmpbN_pat <A4_cmphgtui, setule, AssertZext<i16>, IsUGT<32,31>, 65535>;
+ defm: CmpbND_pat<A4_cmpbgtui, setult, AssertZext<i8>, IsUGT<32,32>, 255>;
+ defm: CmpbND_pat<A4_cmphgtui, setult, AssertZext<i16>, IsUGT<32,32>, 65535>;
+}
+
+
def SDTHexagonI64I32I32 : SDTypeProfile<1, 2,
[SDTCisVT<0, i64>, SDTCisVT<1, i32>, SDTCisSameAs<1, 2>]>;
OpenPOWER on IntegriCloud