diff options
| author | Pete Cooper <peter_cooper@apple.com> | 2012-06-24 00:05:44 +0000 | 
|---|---|---|
| committer | Pete Cooper <peter_cooper@apple.com> | 2012-06-24 00:05:44 +0000 | 
| commit | fe212e762fe004d8dba02c7aaac5d5e5d9b2bb63 (patch) | |
| tree | 292326f0e95dbc9d715b439b703959478f02cdc1 /llvm/lib/CodeGen | |
| parent | a325a6e0dc5596e7885a81a79cf09d06e4706042 (diff) | |
| download | bcm5719-llvm-fe212e762fe004d8dba02c7aaac5d5e5d9b2bb63.tar.gz bcm5719-llvm-fe212e762fe004d8dba02c7aaac5d5e5d9b2bb63.zip | |
DAG legalisation can now handle illegal fma vector types by scalarisation
llvm-svn: 159092
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 30 | 
2 files changed, 32 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 0ae66510759..106b086184a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -511,6 +511,7 @@ private:    void ScalarizeVectorResult(SDNode *N, unsigned OpNo);    SDValue ScalarizeVecRes_MERGE_VALUES(SDNode *N, unsigned ResNo);    SDValue ScalarizeVecRes_BinOp(SDNode *N); +  SDValue ScalarizeVecRes_TernaryOp(SDNode *N);    SDValue ScalarizeVecRes_UnaryOp(SDNode *N);    SDValue ScalarizeVecRes_InregOp(SDNode *N); @@ -555,6 +556,7 @@ private:    // Vector Result Splitting: <128 x ty> -> 2 x <64 x ty>.    void SplitVectorResult(SDNode *N, unsigned OpNo);    void SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi); +  void SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);    void SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);    void SplitVecRes_InregOp(SDNode *N, SDValue &Lo, SDValue &Hi); diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 5f23f01dafb..d09411c42f3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -115,6 +115,9 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {    case ISD::SRL:      R = ScalarizeVecRes_BinOp(N);      break; +  case ISD::FMA: +    R = ScalarizeVecRes_TernaryOp(N); +    break;    }    // If R is null, the sub-method took care of registering the result. @@ -129,6 +132,14 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_BinOp(SDNode *N) {                       LHS.getValueType(), LHS, RHS);  } +SDValue DAGTypeLegalizer::ScalarizeVecRes_TernaryOp(SDNode *N) { +  SDValue Op0 = GetScalarizedVector(N->getOperand(0)); +  SDValue Op1 = GetScalarizedVector(N->getOperand(1)); +  SDValue Op2 = GetScalarizedVector(N->getOperand(2)); +  return DAG.getNode(N->getOpcode(), N->getDebugLoc(), +                     Op0.getValueType(), Op0, Op1, Op2); +} +  SDValue DAGTypeLegalizer::ScalarizeVecRes_MERGE_VALUES(SDNode *N,                                                         unsigned ResNo) {    SDValue Op = DisintegrateMERGE_VALUES(N, ResNo); @@ -529,6 +540,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {    case ISD::FREM:      SplitVecRes_BinOp(N, Lo, Hi);      break; +  case ISD::FMA: +    SplitVecRes_TernaryOp(N, Lo, Hi); +    break;    }    // If Lo/Hi is null, the sub-method took care of registering results etc. @@ -548,6 +562,22 @@ void DAGTypeLegalizer::SplitVecRes_BinOp(SDNode *N, SDValue &Lo,    Hi = DAG.getNode(N->getOpcode(), dl, LHSHi.getValueType(), LHSHi, RHSHi);  } +void DAGTypeLegalizer::SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, +                                             SDValue &Hi) { +  SDValue Op0Lo, Op0Hi; +  GetSplitVector(N->getOperand(0), Op0Lo, Op0Hi); +  SDValue Op1Lo, Op1Hi; +  GetSplitVector(N->getOperand(1), Op1Lo, Op1Hi); +  SDValue Op2Lo, Op2Hi; +  GetSplitVector(N->getOperand(2), Op2Lo, Op2Hi); +  DebugLoc dl = N->getDebugLoc(); + +  Lo = DAG.getNode(N->getOpcode(), dl, Op0Lo.getValueType(), +                   Op0Lo, Op1Lo, Op2Lo); +  Hi = DAG.getNode(N->getOpcode(), dl, Op0Hi.getValueType(), +                   Op0Hi, Op1Hi, Op2Hi); +} +  void DAGTypeLegalizer::SplitVecRes_BITCAST(SDNode *N, SDValue &Lo,                                             SDValue &Hi) {    // We know the result is a vector.  The input may be either a vector or a | 

