mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Implement isMaskedValueZeroForTargetNode for the various v8 selectcc nodes,
allowing redundant and's to be eliminated by the dag combiner. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25800 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5c413bc451
commit
4a397e0e94
@ -57,6 +57,14 @@ namespace {
|
||||
public:
|
||||
SparcV8TargetLowering(TargetMachine &TM);
|
||||
virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
|
||||
|
||||
/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
|
||||
/// be zero. Op is expected to be a target specific node. Used by DAG
|
||||
/// combiner.
|
||||
virtual bool isMaskedValueZeroForTargetNode(const SDOperand &Op,
|
||||
uint64_t Mask,
|
||||
MVIZFnPtr MVIZ) const;
|
||||
|
||||
virtual std::vector<SDOperand>
|
||||
LowerArguments(Function &F, SelectionDAG &DAG);
|
||||
virtual std::pair<SDOperand, SDOperand>
|
||||
@ -191,6 +199,24 @@ const char *SparcV8TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
}
|
||||
}
|
||||
|
||||
/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
|
||||
/// be zero. Op is expected to be a target specific node. Used by DAG
|
||||
/// combiner.
|
||||
bool SparcV8TargetLowering::
|
||||
isMaskedValueZeroForTargetNode(const SDOperand &Op, uint64_t Mask,
|
||||
MVIZFnPtr MVIZ) const {
|
||||
switch (Op.getOpcode()) {
|
||||
default: return false;
|
||||
case V8ISD::SELECT_ICC:
|
||||
case V8ISD::SELECT_FCC:
|
||||
assert(MVT::isInteger(Op.getValueType()) && "Not an integer select!");
|
||||
// These operations are masked zero if both the left and the right are zero.
|
||||
return MVIZ(Op.getOperand(0), Mask, *this) &&
|
||||
MVIZ(Op.getOperand(1), Mask, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// LowerArguments - V8 uses a very simple ABI, where all values are passed in
|
||||
/// either one or two GPRs, including FP values. TODO: we should pass FP values
|
||||
/// in FP registers for fastcc functions.
|
||||
|
@ -57,6 +57,14 @@ namespace {
|
||||
public:
|
||||
SparcV8TargetLowering(TargetMachine &TM);
|
||||
virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
|
||||
|
||||
/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
|
||||
/// be zero. Op is expected to be a target specific node. Used by DAG
|
||||
/// combiner.
|
||||
virtual bool isMaskedValueZeroForTargetNode(const SDOperand &Op,
|
||||
uint64_t Mask,
|
||||
MVIZFnPtr MVIZ) const;
|
||||
|
||||
virtual std::vector<SDOperand>
|
||||
LowerArguments(Function &F, SelectionDAG &DAG);
|
||||
virtual std::pair<SDOperand, SDOperand>
|
||||
@ -191,6 +199,24 @@ const char *SparcV8TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
}
|
||||
}
|
||||
|
||||
/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
|
||||
/// be zero. Op is expected to be a target specific node. Used by DAG
|
||||
/// combiner.
|
||||
bool SparcV8TargetLowering::
|
||||
isMaskedValueZeroForTargetNode(const SDOperand &Op, uint64_t Mask,
|
||||
MVIZFnPtr MVIZ) const {
|
||||
switch (Op.getOpcode()) {
|
||||
default: return false;
|
||||
case V8ISD::SELECT_ICC:
|
||||
case V8ISD::SELECT_FCC:
|
||||
assert(MVT::isInteger(Op.getValueType()) && "Not an integer select!");
|
||||
// These operations are masked zero if both the left and the right are zero.
|
||||
return MVIZ(Op.getOperand(0), Mask, *this) &&
|
||||
MVIZ(Op.getOperand(1), Mask, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// LowerArguments - V8 uses a very simple ABI, where all values are passed in
|
||||
/// either one or two GPRs, including FP values. TODO: we should pass FP values
|
||||
/// in FP registers for fastcc functions.
|
||||
|
Loading…
x
Reference in New Issue
Block a user