diff options
| author | Eli Friedman <efriedma@codeaurora.org> | 2017-03-14 18:43:37 +0000 | 
|---|---|---|
| committer | Eli Friedman <efriedma@codeaurora.org> | 2017-03-14 18:43:37 +0000 | 
| commit | caea769f11d937c63fa2741ed834e129171007bd (patch) | |
| tree | 1a8a204fcc2fd914d5f0cb27d247e9fa9f016bca | |
| parent | 118bb4599249fc4e324c2237c091d0a777564906 (diff) | |
| download | bcm5719-llvm-caea769f11d937c63fa2741ed834e129171007bd.tar.gz bcm5719-llvm-caea769f11d937c63fa2741ed834e129171007bd.zip  | |
[ARM] Replace some C++ selection code with TableGen patterns. NFC.
Differential Revision: https://reviews.llvm.org/D30794
llvm-svn: 297768
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp | 57 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 16 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrNEON.td | 11 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrVFP.td | 5 | 
5 files changed, 33 insertions, 64 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp index 96240dd7e42..b07b4e1f5cf 100644 --- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -244,7 +244,6 @@ private:    bool tryInlineAsm(SDNode *N); -  void SelectConcatVector(SDNode *N);    void SelectCMPZ(SDNode *N, bool &SwitchEQNEToPLMI);    void SelectCMP_SWAP(SDNode *N); @@ -2585,15 +2584,6 @@ void ARMDAGToDAGISel::SelectCMP_SWAP(SDNode *N) {    CurDAG->RemoveDeadNode(N);  } -void ARMDAGToDAGISel::SelectConcatVector(SDNode *N) { -  // The only time a CONCAT_VECTORS operation can have legal types is when -  // two 64-bit vectors are concatenated to a 128-bit vector. -  EVT VT = N->getValueType(0); -  if (!VT.is128BitVector() || N->getNumOperands() != 2) -    llvm_unreachable("unexpected CONCAT_VECTORS"); -  ReplaceNode(N, createDRegPairNode(VT, N->getOperand(0), N->getOperand(1))); -} -  static Optional<std::pair<unsigned, unsigned>>  getContiguousRangeOfSetBits(const APInt &A) {    unsigned FirstOne = A.getBitWidth() - A.countLeadingZeros() - 1; @@ -2900,49 +2890,6 @@ void ARMDAGToDAGISel::Select(SDNode *N) {      break;    } -  case ARMISD::VMOVRRD: -    ReplaceNode(N, CurDAG->getMachineNode(ARM::VMOVRRD, dl, MVT::i32, MVT::i32, -                                          N->getOperand(0), getAL(CurDAG, dl), -                                          CurDAG->getRegister(0, MVT::i32))); -    return; -  case ISD::UMUL_LOHI: { -    if (Subtarget->isThumb1Only()) -      break; -    if (Subtarget->isThumb()) { -      SDValue Ops[] = { N->getOperand(0), N->getOperand(1), -                        getAL(CurDAG, dl), CurDAG->getRegister(0, MVT::i32) }; -      ReplaceNode( -          N, CurDAG->getMachineNode(ARM::t2UMULL, dl, MVT::i32, MVT::i32, Ops)); -      return; -    } else { -      SDValue Ops[] = { N->getOperand(0), N->getOperand(1), -                        getAL(CurDAG, dl), CurDAG->getRegister(0, MVT::i32), -                        CurDAG->getRegister(0, MVT::i32) }; -      ReplaceNode(N, CurDAG->getMachineNode( -                         Subtarget->hasV6Ops() ? ARM::UMULL : ARM::UMULLv5, dl, -                         MVT::i32, MVT::i32, Ops)); -      return; -    } -  } -  case ISD::SMUL_LOHI: { -    if (Subtarget->isThumb1Only()) -      break; -    if (Subtarget->isThumb()) { -      SDValue Ops[] = { N->getOperand(0), N->getOperand(1), -                        getAL(CurDAG, dl), CurDAG->getRegister(0, MVT::i32) }; -      ReplaceNode( -          N, CurDAG->getMachineNode(ARM::t2SMULL, dl, MVT::i32, MVT::i32, Ops)); -      return; -    } else { -      SDValue Ops[] = { N->getOperand(0), N->getOperand(1), -                        getAL(CurDAG, dl), CurDAG->getRegister(0, MVT::i32), -                        CurDAG->getRegister(0, MVT::i32) }; -      ReplaceNode(N, CurDAG->getMachineNode( -                         Subtarget->hasV6Ops() ? ARM::SMULL : ARM::SMULLv5, dl, -                         MVT::i32, MVT::i32, Ops)); -      return; -    } -  }    case ARMISD::UMAAL: {      unsigned Opc = Subtarget->isThumb() ? ARM::t2UMAAL : ARM::UMAAL;      SDValue Ops[] = { N->getOperand(0), N->getOperand(1), @@ -3836,10 +3783,6 @@ void ARMDAGToDAGISel::Select(SDNode *N) {      return;    } -  case ISD::CONCAT_VECTORS: -    SelectConcatVector(N); -    return; -    case ISD::ATOMIC_CMP_SWAP:      SelectCMP_SWAP(N);      return; diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 2211f29a3ec..164c895dc61 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -3956,27 +3956,35 @@ let hasSideEffects = 0 in {  let isCommutable = 1 in {  def SMULL : AsMul1I64<0b0000110, (outs GPR:$RdLo, GPR:$RdHi),                                   (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64, -                    "smull", "\t$RdLo, $RdHi, $Rn, $Rm", []>, +                    "smull", "\t$RdLo, $RdHi, $Rn, $Rm", +                    [(set GPR:$RdLo, GPR:$RdHi, +                          (smullohi GPR:$Rn, GPR:$Rm))]>,                      Requires<[IsARM, HasV6]>,             Sched<[WriteMUL64Lo, WriteMUL64Hi, ReadMUL, ReadMUL]>;  def UMULL : AsMul1I64<0b0000100, (outs GPR:$RdLo, GPR:$RdHi),                                   (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64, -                    "umull", "\t$RdLo, $RdHi, $Rn, $Rm", []>, +                    "umull", "\t$RdLo, $RdHi, $Rn, $Rm", +                    [(set GPR:$RdLo, GPR:$RdHi, +                          (umullohi GPR:$Rn, GPR:$Rm))]>,                      Requires<[IsARM, HasV6]>,             Sched<[WriteMAC64Lo, WriteMAC64Hi, ReadMUL, ReadMUL]>;  let Constraints = "@earlyclobber $RdLo,@earlyclobber $RdHi" in {  def SMULLv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),                              (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s), -                            4, IIC_iMUL64, [], +                            4, IIC_iMUL64, +                            [(set GPR:$RdLo, GPR:$RdHi, +                                  (smullohi GPR:$Rn, GPR:$Rm))],            (SMULL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,                             Requires<[IsARM, NoV6]>,                Sched<[WriteMUL64Lo, WriteMUL64Hi, ReadMUL, ReadMUL]>;  def UMULLv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),                              (ins GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s), -                            4, IIC_iMUL64, [], +                            4, IIC_iMUL64, +                            [(set GPR:$RdLo, GPR:$RdHi, +                                  (umullohi GPR:$Rn, GPR:$Rm))],            (UMULL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p, cc_out:$s)>,                             Requires<[IsARM, NoV6]>,               Sched<[WriteMUL64Lo, WriteMUL64Hi, ReadMUL, ReadMUL]>; diff --git a/llvm/lib/Target/ARM/ARMInstrNEON.td b/llvm/lib/Target/ARM/ARMInstrNEON.td index b5fa8e999e2..681e235d78f 100644 --- a/llvm/lib/Target/ARM/ARMInstrNEON.td +++ b/llvm/lib/Target/ARM/ARMInstrNEON.td @@ -7139,6 +7139,17 @@ let Predicates = [IsBE] in {                          (f64 (IMPLICIT_DEF)), (i32 0)))), dsub_0)), dsub_0))>;  } +def : Pat<(v2i64 (concat_vectors DPR:$Dn, DPR:$Dm)), +          (REG_SEQUENCE QPR, DPR:$Dn, dsub_0, DPR:$Dm, dsub_1)>; +def : Pat<(v4i32 (concat_vectors DPR:$Dn, DPR:$Dm)), +          (REG_SEQUENCE QPR, DPR:$Dn, dsub_0, DPR:$Dm, dsub_1)>; +def : Pat<(v8i16 (concat_vectors DPR:$Dn, DPR:$Dm)), +          (REG_SEQUENCE QPR, DPR:$Dn, dsub_0, DPR:$Dm, dsub_1)>; +def : Pat<(v16i8 (concat_vectors DPR:$Dn, DPR:$Dm)), +          (REG_SEQUENCE QPR, DPR:$Dn, dsub_0, DPR:$Dm, dsub_1)>; +def : Pat<(v4f32 (concat_vectors DPR:$Dn, DPR:$Dm)), +          (REG_SEQUENCE QPR, DPR:$Dn, dsub_0, DPR:$Dm, dsub_1)>; +  //===----------------------------------------------------------------------===//  // Assembler aliases  // diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 4059356659b..194505f7586 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -2603,8 +2603,12 @@ def t2MLS: T2FourRegMLA<0b0001, "mls",  // Extra precision multiplies with low / high results  let hasSideEffects = 0 in {  let isCommutable = 1 in { -def t2SMULL : T2MulLong<0b000, 0b0000, "smull", []>; -def t2UMULL : T2MulLong<0b010, 0b0000, "umull", []>; +def t2SMULL : T2MulLong<0b000, 0b0000, "smull", +                        [(set rGPR:$RdLo, rGPR:$RdHi, +                              (smullohi rGPR:$Rn, rGPR:$Rm))]>; +def t2UMULL : T2MulLong<0b010, 0b0000, "umull", +                        [(set rGPR:$RdLo, rGPR:$RdHi, +                              (umullohi rGPR:$Rn, rGPR:$Rm))]>;  } // isCommutable  // Multiply + accumulate diff --git a/llvm/lib/Target/ARM/ARMInstrVFP.td b/llvm/lib/Target/ARM/ARMInstrVFP.td index 6aa5cfffc49..0f225156d4c 100644 --- a/llvm/lib/Target/ARM/ARMInstrVFP.td +++ b/llvm/lib/Target/ARM/ARMInstrVFP.td @@ -14,11 +14,14 @@  def SDT_CMPFP0  : SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisVT<1, i32>]>;  def SDT_VMOVDRR : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>,                                         SDTCisSameAs<1, 2>]>; +def SDT_VMOVRRD : SDTypeProfile<2, 1, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>, +                                       SDTCisVT<2, f64>]>;  def arm_fmstat : SDNode<"ARMISD::FMSTAT",  SDTNone, [SDNPInGlue, SDNPOutGlue]>;  def arm_cmpfp  : SDNode<"ARMISD::CMPFP",   SDT_ARMFCmp, [SDNPOutGlue]>;  def arm_cmpfp0 : SDNode<"ARMISD::CMPFPw0", SDT_CMPFP0, [SDNPOutGlue]>;  def arm_fmdrr  : SDNode<"ARMISD::VMOVDRR", SDT_VMOVDRR>; +def arm_fmrrd  : SDNode<"ARMISD::VMOVRRD", SDT_VMOVRRD>;  //===----------------------------------------------------------------------===//  // Operand Definitions. @@ -1054,7 +1057,7 @@ let hasSideEffects = 0 in {  def VMOVRRD  : AVConv3I<0b11000101, 0b1011,                          (outs GPR:$Rt, GPR:$Rt2), (ins DPR:$Dm),                          IIC_fpMOVDI, "vmov", "\t$Rt, $Rt2, $Dm", -                 [/* FIXME: Can't write pattern for multiple result instr*/]>, +                 [(set GPR:$Rt, GPR:$Rt2, (arm_fmrrd DPR:$Dm))]>,                 Sched<[WriteFPMOV]> {    // Instruction operands.    bits<5> Dm;  | 

