mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-16 06:49:58 +00:00
Define signed const-ext immediate operands and their predicates.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168810 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
350c00843b
commit
61c654ce5c
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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<i32>;
|
||||
def s12Ext : Operand<i32>;
|
||||
def s10Ext : Operand<i32>;
|
||||
def s9Ext : Operand<i32>;
|
||||
def s8Ext : Operand<i32>;
|
||||
def s6Ext : Operand<i32>;
|
||||
def s11_0Ext : Operand<i32>;
|
||||
def s11_1Ext : Operand<i32>;
|
||||
def s11_2Ext : Operand<i32>;
|
||||
def s11_3Ext : Operand<i32>;
|
||||
}
|
||||
|
||||
let PrintMethod = "printImmOperand" in
|
||||
def u0AlwaysExt : Operand<i32>;
|
||||
|
||||
// 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;
|
||||
}
|
||||
}]>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user