diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrMVE.td | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 3 | 
3 files changed, 6 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 1e02395dea3..1866f794d8c 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -6011,7 +6011,7 @@ static SDValue Expand64BitShift(SDNode *N, SelectionDAG &DAG,      // If the shift amount is greater than 32 or has a greater bitwidth than 64      // then do the default optimisation      if (ShAmt->getValueType(0).getSizeInBits() > 64 || -        (Con && Con->getZExtValue() >= 32)) +        (Con && (Con->getZExtValue() == 0 || Con->getZExtValue() >= 32)))        return SDValue();      // Extract the lower 32 bits of the shift amount if it's not an i32 diff --git a/llvm/lib/Target/ARM/ARMInstrMVE.td b/llvm/lib/Target/ARM/ARMInstrMVE.td index 74de3a4417f..3ba23d9812c 100644 --- a/llvm/lib/Target/ARM/ARMInstrMVE.td +++ b/llvm/lib/Target/ARM/ARMInstrMVE.td @@ -453,16 +453,16 @@ def MVE_ASRLr   : MVE_ScalarShiftDRegReg<"asrl",    0b1,  [(set tGPREven:$RdaLo,                                          tGPROdd:$RdaHi_src, rGPR:$Rm))]>;  def MVE_ASRLi   : MVE_ScalarShiftDRegImm<"asrl",    0b10, ?, [(set tGPREven:$RdaLo, tGPROdd:$RdaHi,                                          (ARMasrl tGPREven:$RdaLo_src, -                                        tGPROdd:$RdaHi_src, (i32 imm:$imm)))]>; +                                        tGPROdd:$RdaHi_src, (i32 long_shift:$imm)))]>;  def MVE_LSLLr   : MVE_ScalarShiftDRegReg<"lsll",    0b0,  [(set tGPREven:$RdaLo, tGPROdd:$RdaHi,                                          (ARMlsll tGPREven:$RdaLo_src,                                          tGPROdd:$RdaHi_src, rGPR:$Rm))]>;  def MVE_LSLLi   : MVE_ScalarShiftDRegImm<"lsll",    0b00, ?, [(set tGPREven:$RdaLo, tGPROdd:$RdaHi,                                          (ARMlsll tGPREven:$RdaLo_src, -                                        tGPROdd:$RdaHi_src, (i32 imm:$imm)))]>; +                                        tGPROdd:$RdaHi_src, (i32 long_shift:$imm)))]>;  def MVE_LSRL    : MVE_ScalarShiftDRegImm<"lsrl",    0b01, ?, [(set tGPREven:$RdaLo, tGPROdd:$RdaHi,                                          (ARMlsrl tGPREven:$RdaLo_src, -                                        tGPROdd:$RdaHi_src, (i32 imm:$imm)))]>; +                                        tGPROdd:$RdaHi_src, (i32 long_shift:$imm)))]>;  def MVE_SQRSHRL : MVE_ScalarShiftDRegRegWithSat<"sqrshrl", 0b1>;  def MVE_SQSHLL  : MVE_ScalarShiftDRegImm<"sqshll",  0b11, 0b1>; diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 98de7382ad9..b165b85a433 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -45,7 +45,8 @@ def mve_shift_imm : AsmOperandClass {    let RenderMethod = "addImmOperands";    let DiagnosticString = "operand must be an immediate in the range [1,32]";  } -def long_shift : Operand<i32> { +def long_shift : Operand<i32>, +                 ImmLeaf<i32, [{ return Imm > 0 && Imm <= 32; }]> {    let ParserMatchClass = mve_shift_imm;    let DecoderMethod = "DecodeLongShiftOperand";  }  | 

