diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td | 55 |
2 files changed, 24 insertions, 52 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index b689d6c573d..e26374d3781 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -104,6 +104,7 @@ public: void SelectConstant(SDNode *N); void SelectConstantFP(SDNode *N); void SelectAdd(SDNode *N); + void SelectBitcast(SDNode *N); void SelectBitOp(SDNode *N); // XformMskToBitPosU5Imm - Returns the bit position which @@ -1165,6 +1166,22 @@ void HexagonDAGToDAGISel::SelectFrameIndex(SDNode *N) { } +void HexagonDAGToDAGISel::SelectBitcast(SDNode *N) { + EVT SVT = N->getOperand(0).getValueType(); + EVT DVT = N->getValueType(0); + if (!SVT.isVector() || !DVT.isVector() || + SVT.getVectorElementType() == MVT::i1 || + DVT.getVectorElementType() == MVT::i1 || + SVT.getSizeInBits() != DVT.getSizeInBits()) { + SelectCode(N); + return; + } + + CurDAG->ReplaceAllUsesOfValueWith(SDValue(N,0), N->getOperand(0)); + CurDAG->RemoveDeadNode(N); +} + + void HexagonDAGToDAGISel::Select(SDNode *N) { if (N->isMachineOpcode()) { N->setNodeId(-1); @@ -1188,6 +1205,10 @@ void HexagonDAGToDAGISel::Select(SDNode *N) { SelectAdd(N); return; + case ISD::BITCAST: + SelectBitcast(N); + return; + case ISD::SHL: SelectSHL(N); return; diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td b/llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td index 96dd5315b87..0277d5e3c28 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td @@ -35,61 +35,12 @@ multiclass bitconvert_64<ValueType a, ValueType b> { (a DoubleRegs:$src)>; } -multiclass bitconvert_vec<ValueType a, ValueType b> { - def : Pat <(b (bitconvert (a VectorRegs:$src))), - (b VectorRegs:$src)>; - def : Pat <(a (bitconvert (b VectorRegs:$src))), - (a VectorRegs:$src)>; -} - -multiclass bitconvert_dblvec<ValueType a, ValueType b> { - def : Pat <(b (bitconvert (a VecDblRegs:$src))), - (b VecDblRegs:$src)>; - def : Pat <(a (bitconvert (b VecDblRegs:$src))), - (a VecDblRegs:$src)>; -} - -multiclass bitconvert_predvec<ValueType a, ValueType b> { - def : Pat <(b (bitconvert (a VecPredRegs:$src))), - (b VectorRegs:$src)>; - def : Pat <(a (bitconvert (b VectorRegs:$src))), - (a VecPredRegs:$src)>; -} - -multiclass bitconvert_dblvec128B<ValueType a, ValueType b> { - def : Pat <(b (bitconvert (a VecDblRegs128B:$src))), - (b VecDblRegs128B:$src)>; - def : Pat <(a (bitconvert (b VecDblRegs128B:$src))), - (a VecDblRegs128B:$src)>; -} - -// Bit convert vector types. -defm : bitconvert_32<v4i8, i32>; +// Bit convert vector types to integers. +defm : bitconvert_32<v4i8, i32>; defm : bitconvert_32<v2i16, i32>; -defm : bitconvert_32<v2i16, v4i8>; - -defm : bitconvert_64<v8i8, i64>; +defm : bitconvert_64<v8i8, i64>; defm : bitconvert_64<v4i16, i64>; defm : bitconvert_64<v2i32, i64>; -defm : bitconvert_64<v8i8, v4i16>; -defm : bitconvert_64<v8i8, v2i32>; -defm : bitconvert_64<v4i16, v2i32>; - -defm : bitconvert_vec<v64i8, v16i32>; -defm : bitconvert_vec<v8i64 , v16i32>; -defm : bitconvert_vec<v32i16, v16i32>; - -defm : bitconvert_dblvec<v16i64, v128i8>; -defm : bitconvert_dblvec<v32i32, v128i8>; -defm : bitconvert_dblvec<v64i16, v128i8>; - -defm : bitconvert_dblvec128B<v64i32, v128i16>; -defm : bitconvert_dblvec128B<v256i8, v128i16>; -defm : bitconvert_dblvec128B<v32i64, v128i16>; - -defm : bitconvert_dblvec128B<v64i32, v256i8>; -defm : bitconvert_dblvec128B<v32i64, v256i8>; -defm : bitconvert_dblvec128B<v128i16, v256i8>; // Vector shift support. Vector shifting in Hexagon is rather different // from internal representation of LLVM. |