From 519b3856dd6f4b3d0e1a608cb038225e3a78a866 Mon Sep 17 00:00:00 2001 From: Jyotsna Verma Date: Wed, 28 Nov 2012 20:58:14 +0000 Subject: [PATCH] Define signed const-ext immediate operands and their predicates. llvm-svn: 168810 --- llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp | 11 +++ llvm/lib/Target/Hexagon/HexagonOperands.td | 111 ++++++++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index 5499134..4ff3135 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -94,6 +94,7 @@ public: SDNode *SelectConstant(SDNode *N); SDNode *SelectConstantFP(SDNode *N); SDNode *SelectAdd(SDNode *N); + bool isConstExtProfitable(SDNode *N) const; // Include the pieces autogenerated from the target description. #include "HexagonGenDAGISel.inc" @@ -1507,3 +1508,13 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, OutOps.push_back(Op1); return false; } + +bool HexagonDAGToDAGISel::isConstExtProfitable(SDNode *N) const { + unsigned UseCount = 0; + for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) { + UseCount++; + } + + return (UseCount <= 1); + +} diff --git a/llvm/lib/Target/Hexagon/HexagonOperands.td b/llvm/lib/Target/Hexagon/HexagonOperands.td index 3f43d69..c457d91 100644 --- a/llvm/lib/Target/Hexagon/HexagonOperands.td +++ b/llvm/lib/Target/Hexagon/HexagonOperands.td @@ -465,3 +465,114 @@ def SetClr3ImmPred : PatLeaf<(i32 imm), [{ int8_t v = (int8_t)N->getSExtValue(); return (v >= 0 && v <= 7); }]>; + + +// Extendable immediate operands. + +let PrintMethod = "printExtOperand" in { + def s16Ext : Operand; + def s12Ext : Operand; + def s10Ext : Operand; + def s9Ext : Operand; + def s8Ext : Operand; + def s6Ext : Operand; + def s11_0Ext : Operand; + def s11_1Ext : Operand; + def s11_2Ext : Operand; + def s11_3Ext : Operand; +} + +let PrintMethod = "printImmOperand" in +def u0AlwaysExt : Operand; + +// Predicates for constant extendable operands +def s16ExtPred : PatLeaf<(i32 imm), [{ + int64_t v = (int64_t)N->getSExtValue(); + if (!Subtarget.hasV4TOps()) + // Return true if the immediate can fit in a 16-bit sign extended field. + return isInt<16>(v); + else { + if (isInt<16>(v)) + return true; + + // Return true if extending this immediate is profitable and the value + // can fit in a 32-bit signed field. + if (isConstExtProfitable(Node) && isInt<32>(v)) + return true; + else + return false; + } +}]>; + +def s10ExtPred : PatLeaf<(i32 imm), [{ + int64_t v = (int64_t)N->getSExtValue(); + if (!Subtarget.hasV4TOps()) + // Return true if the immediate can fit in a 10-bit sign extended field. + return isInt<10>(v); + else { + if (isInt<10>(v)) + return true; + + // Return true if extending this immediate is profitable and the value + // can fit in a 32-bit signed field. + if (isConstExtProfitable(Node) && isInt<32>(v)) + return true; + else + return false; + } +}]>; + +def s9ExtPred : PatLeaf<(i32 imm), [{ + int64_t v = (int64_t)N->getSExtValue(); + if (!Subtarget.hasV4TOps()) + // Return true if the immediate can fit in a 9-bit sign extended field. + return isInt<9>(v); + else { + if (isInt<9>(v)) + return true; + + // Return true if extending this immediate is profitable and the value + // can fit in a 32-bit unsigned field. + if (isConstExtProfitable(Node) && isInt<32>(v)) + return true; + else + return false; + } +}]>; + +def s8ExtPred : PatLeaf<(i32 imm), [{ + int64_t v = (int64_t)N->getSExtValue(); + if (!Subtarget.hasV4TOps()) + // Return true if the immediate can fit in a 8-bit sign extended field. + return isInt<8>(v); + else { + if (isInt<8>(v)) + return true; + + // Return true if extending this immediate is profitable and the value + // can fit in a 32-bit signed field. + if (isConstExtProfitable(Node) && isInt<32>(v)) + return true; + else + return false; + } +}]>; + +def s8_16ExtPred : PatLeaf<(i32 imm), [{ + int64_t v = (int64_t)N->getSExtValue(); + if (!Subtarget.hasV4TOps()) + // Return true if the immediate fits in a 8-bit sign extended field. + return isInt<8>(v); + else { + if (isInt<8>(v)) + return true; + + // Return true if extending this immediate is profitable and the value + // can't fit in a 16-bit signed field. This is required to avoid + // unnecessary constant extenders. + if (isConstExtProfitable(Node) && !isInt<16>(v)) + return true; + else + return false; + } +}]>; -- 2.7.4