diff options
| author | Jim Grosbach <grosbach@apple.com> | 2009-11-23 20:35:53 +0000 | 
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2009-11-23 20:35:53 +0000 | 
| commit | 04c0e767723c22a8cbc020fe69e16339b514c0dc (patch) | |
| tree | e2817616ec99086912a3f0377904f849b1028d24 | |
| parent | 5ad7416260fb75d2e753f05f59c6eebed43acb36 (diff) | |
| download | bcm5719-llvm-04c0e767723c22a8cbc020fe69e16339b514c0dc.tar.gz bcm5719-llvm-04c0e767723c22a8cbc020fe69e16339b514c0dc.zip  | |
fold immediate of a + Const into the user as a subtract if it can fit as a negated two-part immediate.
llvm-svn: 89694
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 21 | 
2 files changed, 37 insertions, 6 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 7d26b9dd62d..b0f4dedae03 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -284,6 +284,22 @@ def so_imm2part_2 : SDNodeXForm<imm, [{    return CurDAG->getTargetConstant(V, MVT::i32);  }]>; +def so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{ +      return ARM_AM::isSOImmTwoPartVal(-(int)N->getZExtValue()); +    }]> { +  let PrintMethod = "printSOImm2PartOperand"; +} + +def so_neg_imm2part_1 : SDNodeXForm<imm, [{ +  unsigned V = ARM_AM::getSOImmTwoPartFirst(-(int)N->getZExtValue()); +  return CurDAG->getTargetConstant(V, MVT::i32); +}]>; + +def so_neg_imm2part_2 : SDNodeXForm<imm, [{ +  unsigned V = ARM_AM::getSOImmTwoPartSecond(-(int)N->getZExtValue()); +  return CurDAG->getTargetConstant(V, MVT::i32); +}]>; +  /// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].  def imm0_31 : Operand<i32>, PatLeaf<(imm), [{    return (int32_t)N->getZExtValue() < 32; @@ -1618,9 +1634,9 @@ def : ARMPat<(xor GPR:$LHS, so_imm2part:$RHS),  def : ARMPat<(add GPR:$LHS, so_imm2part:$RHS),               (ADDri (ADDri GPR:$LHS, (so_imm2part_1 imm:$RHS)),                      (so_imm2part_2 imm:$RHS))>; -def : ARMPat<(sub GPR:$LHS, so_imm2part:$RHS), -             (SUBri (SUBri GPR:$LHS, (so_imm2part_1 imm:$RHS)), -                    (so_imm2part_2 imm:$RHS))>; +def : ARMPat<(add GPR:$LHS, so_neg_imm2part:$RHS), +             (SUBri (SUBri GPR:$LHS, (so_neg_imm2part_1 imm:$RHS)), +                    (so_neg_imm2part_2 imm:$RHS))>;  // 32-bit immediate using movw + movt.  // This is a single pseudo instruction, the benefit is that it can be remat'd diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 43ecebe7738..c663cd37f13 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -88,6 +88,21 @@ def t2_so_imm2part_2 : SDNodeXForm<imm, [{    return CurDAG->getTargetConstant(V, MVT::i32);  }]>; +def t2_so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{ +      return ARM_AM::isT2SOImmTwoPartVal(-(int)N->getZExtValue()); +    }]> { +} + +def t2_so_neg_imm2part_1 : SDNodeXForm<imm, [{ +  unsigned V = ARM_AM::getT2SOImmTwoPartFirst(-(int)N->getZExtValue()); +  return CurDAG->getTargetConstant(V, MVT::i32); +}]>; + +def t2_so_neg_imm2part_2 : SDNodeXForm<imm, [{ +  unsigned V = ARM_AM::getT2SOImmTwoPartSecond(-(int)N->getZExtValue()); +  return CurDAG->getTargetConstant(V, MVT::i32); +}]>; +  /// imm1_31 predicate - True if the 32-bit immediate is in the range [1,31].  def imm1_31 : PatLeaf<(i32 imm), [{    return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 32; @@ -1162,9 +1177,9 @@ def : T2Pat<(xor GPR:$LHS, t2_so_imm2part:$RHS),  def : T2Pat<(add GPR:$LHS, t2_so_imm2part:$RHS),               (t2ADDri (t2ADDri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)),                      (t2_so_imm2part_2 imm:$RHS))>; -def : T2Pat<(sub GPR:$LHS, t2_so_imm2part:$RHS), -             (t2SUBri (t2SUBri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)), -                    (t2_so_imm2part_2 imm:$RHS))>; +def : T2Pat<(add GPR:$LHS, t2_so_neg_imm2part:$RHS), +             (t2SUBri (t2SUBri GPR:$LHS, (t2_so_neg_imm2part_1 imm:$RHS)), +                    (t2_so_neg_imm2part_2 imm:$RHS))>;  // ConstantPool, GlobalAddress, and JumpTable  def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2LEApcrel tglobaladdr :$dst)>;  | 

