diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp | 19 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 1 | 
2 files changed, 20 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp index bfe2ce6d883..4b0d572cd0f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/llvm/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<StoreSDNode>(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/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 041b2581372..3eba15beb3d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/llvm/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); | 

