From: Duncan Sands Date: Mon, 7 Jul 2008 00:08:12 +0000 (+0000) Subject: LegalizeTypes soft-float support for stores of a X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=990f032907ae171cc3d465a694e8e6d2a6545f57;p=oota-llvm.git LegalizeTypes soft-float support for stores of a float value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53165 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index caa077d0036..0831d43f5d6 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -2150,8 +2150,10 @@ public: /// class StoreSDNode : public LSBaseSDNode { virtual void ANCHOR(); // Out-of-line virtual method to give class a home. - - // IsTruncStore - True if the op does a truncation before store. + + // IsTruncStore - True if the op does a truncation before store. For + // integers this is the same as doing a TRUNCATE and storing the result. + // For floats, it is the same as doing an FP_ROUND and storing the result. bool IsTruncStore; protected: friend class SelectionDAG; diff --git a/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp index bfe2ce6d883..4b0d572cd0f 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -331,6 +331,7 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) { case ISD::BR_CC: Res = SoftenFloatOp_BR_CC(N); break; case ISD::SELECT_CC: Res = SoftenFloatOp_SELECT_CC(N); break; case ISD::SETCC: Res = SoftenFloatOp_SETCC(N); break; + case ISD::STORE: Res = SoftenFloatOp_STORE(N, OpNo); break; } } @@ -496,6 +497,24 @@ SDOperand DAGTypeLegalizer::SoftenFloatOp_SETCC(SDNode *N) { DAG.getCondCode(CCCode)); } +SDOperand DAGTypeLegalizer::SoftenFloatOp_STORE(SDNode *N, unsigned OpNo) { + assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!"); + assert(OpNo == 1 && "Can only soften the stored value!"); + StoreSDNode *ST = cast(N); + SDOperand Val = ST->getValue(); + + if (ST->isTruncatingStore()) + // Do an FP_ROUND followed by a non-truncating store. + Val = BitConvertToInteger(DAG.getNode(ISD::FP_ROUND, ST->getMemoryVT(), + Val, DAG.getIntPtrConstant(0))); + else + Val = GetSoftenedFloat(Val); + + return DAG.getStore(ST->getChain(), Val, ST->getBasePtr(), + ST->getSrcValue(), ST->getSrcValueOffset(), + ST->isVolatile(), ST->getAlignment()); +} + //===----------------------------------------------------------------------===// // Float Result Expansion diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 041b2581372..3eba15beb3d 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -344,6 +344,7 @@ private: SDOperand SoftenFloatOp_BR_CC(SDNode *N); SDOperand SoftenFloatOp_SELECT_CC(SDNode *N); SDOperand SoftenFloatOp_SETCC(SDNode *N); + SDOperand SoftenFloatOp_STORE(SDNode *N, unsigned OpNo); void SoftenSetCCOperands(SDOperand &NewLHS, SDOperand &NewRHS, ISD::CondCode &CCCode);