diff options
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 91 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrVFP.td | 175 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp | 13 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 6 | 
6 files changed, 173 insertions, 120 deletions
| diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index fdba454..6b06534 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -601,10 +601,20 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,      setOperationAction(ISD::FP_TO_SINT_SAT, MVT::i64, Custom);      setOperationAction(ISD::FP_TO_UINT_SAT, MVT::i64, Custom); -    if (!Subtarget->hasVFP2Base()) +    if (!Subtarget->hasVFP2Base()) {        setAllExpand(MVT::f32); -    if (!Subtarget->hasFP64()) +    } else { +      for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL, +                      ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT}) +        setOperationAction(Op, MVT::f32, Legal); +    } +    if (!Subtarget->hasFP64()) {        setAllExpand(MVT::f64); +    } else { +      for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL, +                      ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT}) +        setOperationAction(Op, MVT::f64, Legal); +    }    }    if (Subtarget->hasFullFP16()) { @@ -1281,12 +1291,16 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,      if (!Subtarget->hasFPARMv8Base() || !Subtarget->hasFP64()) {        setOperationAction(ISD::FP16_TO_FP, MVT::f64, Expand);        setOperationAction(ISD::FP_TO_FP16, MVT::f64, Expand); +      setOperationAction(ISD::STRICT_FP16_TO_FP, MVT::f64, LibCall); +      setOperationAction(ISD::STRICT_FP_TO_FP16, MVT::f64, LibCall);      }      // fp16 is a special v7 extension that adds f16 <-> f32 conversions.      if (!Subtarget->hasFP16()) {        setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);        setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand); +      setOperationAction(ISD::STRICT_FP16_TO_FP, MVT::f32, LibCall); +      setOperationAction(ISD::STRICT_FP_TO_FP16, MVT::f32, LibCall);      }      // Strict floating-point comparisons need custom lowering. @@ -1333,31 +1347,42 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,    }    // FP16 often need to be promoted to call lib functions +  // clang-format off    if (Subtarget->hasFullFP16()) { -    setOperationAction(ISD::FREM, MVT::f16, Promote); -    setOperationAction(ISD::FCOPYSIGN, MVT::f16, Expand); -    setOperationAction(ISD::FSIN, MVT::f16, Promote); -    setOperationAction(ISD::FCOS, MVT::f16, Promote); -    setOperationAction(ISD::FTAN, MVT::f16, Promote); -    setOperationAction(ISD::FSINCOS, MVT::f16, Promote); -    setOperationAction(ISD::FPOWI, MVT::f16, Promote); -    setOperationAction(ISD::FPOW, MVT::f16, Promote); -    setOperationAction(ISD::FEXP, MVT::f16, Promote); -    setOperationAction(ISD::FEXP2, MVT::f16, Promote); -    setOperationAction(ISD::FEXP10, MVT::f16, Promote); -    setOperationAction(ISD::FLOG, MVT::f16, Promote); -    setOperationAction(ISD::FLOG10, MVT::f16, Promote); -    setOperationAction(ISD::FLOG2, MVT::f16, Promote);      setOperationAction(ISD::LRINT, MVT::f16, Expand);      setOperationAction(ISD::LROUND, MVT::f16, Expand); - -    setOperationAction(ISD::FROUND, MVT::f16, Legal); -    setOperationAction(ISD::FROUNDEVEN, MVT::f16, Legal); -    setOperationAction(ISD::FTRUNC, MVT::f16, Legal); -    setOperationAction(ISD::FNEARBYINT, MVT::f16, Legal); -    setOperationAction(ISD::FRINT, MVT::f16, Legal); -    setOperationAction(ISD::FFLOOR, MVT::f16, Legal); -    setOperationAction(ISD::FCEIL, MVT::f16, Legal); +    setOperationAction(ISD::FCOPYSIGN, MVT::f16, Expand); +   +    for (auto Op : {ISD::FREM,          ISD::FPOW,         ISD::FPOWI, +                  ISD::FCOS,          ISD::FSIN,         ISD::FSINCOS, +                  ISD::FSINCOSPI,     ISD::FMODF,        ISD::FACOS, +                  ISD::FASIN,         ISD::FATAN,        ISD::FATAN2, +                  ISD::FCOSH,         ISD::FSINH,        ISD::FTANH, +                  ISD::FTAN,          ISD::FEXP,         ISD::FEXP2, +                  ISD::FEXP10,        ISD::FLOG,         ISD::FLOG2, +                  ISD::FLOG10,        ISD::STRICT_FREM,  ISD::STRICT_FPOW, +                  ISD::STRICT_FPOWI,  ISD::STRICT_FCOS,  ISD::STRICT_FSIN, +                  ISD::STRICT_FACOS,  ISD::STRICT_FASIN, ISD::STRICT_FATAN, +                  ISD::STRICT_FATAN2, ISD::STRICT_FCOSH, ISD::STRICT_FSINH, +                  ISD::STRICT_FTANH,  ISD::STRICT_FEXP,  ISD::STRICT_FEXP2, +                  ISD::STRICT_FLOG,   ISD::STRICT_FLOG2, ISD::STRICT_FLOG10, +                  ISD::STRICT_FTAN}) { +        setOperationAction(Op, MVT::f16, Promote); +    } + +    // Round-to-integer need custom lowering for fp16, as Promote doesn't work +    // because the result type is integer. +    for (auto Op : {ISD::STRICT_LROUND, ISD::STRICT_LLROUND, ISD::STRICT_LRINT, ISD::STRICT_LLRINT}) +      setOperationAction(Op, MVT::f16, Custom); +   +    for (auto Op : {ISD::FROUND,         ISD::FROUNDEVEN,        ISD::FTRUNC, +                    ISD::FNEARBYINT,     ISD::FRINT,             ISD::FFLOOR,  +                    ISD::FCEIL,          ISD::STRICT_FROUND,     ISD::STRICT_FROUNDEVEN, +                    ISD::STRICT_FTRUNC,  ISD::STRICT_FNEARBYINT, ISD::STRICT_FRINT,  +                    ISD::STRICT_FFLOOR,  ISD::STRICT_FCEIL}) { +      setOperationAction(Op, MVT::f16, Legal); +    } +    // clang-format on    }    if (Subtarget->hasNEON()) { @@ -10725,6 +10750,19 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {      return LowerCMP(Op, DAG);    case ISD::ABS:      return LowerABS(Op, DAG); +  case ISD::STRICT_LROUND: +  case ISD::STRICT_LLROUND: +  case ISD::STRICT_LRINT: +  case ISD::STRICT_LLRINT: { +    assert((Op.getOperand(1).getValueType() == MVT::f16 || +            Op.getOperand(1).getValueType() == MVT::bf16) && +           "Expected custom lowering of rounding operations only for f16"); +    SDLoc DL(Op); +    SDValue Ext = DAG.getNode(ISD::STRICT_FP_EXTEND, DL, {MVT::f32, MVT::Other}, +                              {Op.getOperand(0), Op.getOperand(1)}); +    return DAG.getNode(Op.getOpcode(), DL, {Op.getValueType(), MVT::Other}, +                       {Ext.getValue(1), Ext.getValue(0)}); +  }    }  } @@ -22071,6 +22109,11 @@ bool ARMTargetLowering::isComplexDeinterleavingOperationSupported(            ScalarTy->isIntegerTy(32));  } +ArrayRef<MCPhysReg> ARMTargetLowering::getRoundingControlRegisters() const { +  static const MCPhysReg RCRegs[] = {ARM::FPSCR_RM}; +  return RCRegs; +} +  Value *ARMTargetLowering::createComplexDeinterleavingIR(      IRBuilderBase &B, ComplexDeinterleavingOperation OperationType,      ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB, diff --git a/llvm/lib/Target/ARM/ARMISelLowering.h b/llvm/lib/Target/ARM/ARMISelLowering.h index 357d2c5..bf3438b 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.h +++ b/llvm/lib/Target/ARM/ARMISelLowering.h @@ -1009,6 +1009,8 @@ class VectorType;      bool isUnsupportedFloatingType(EVT VT) const; +    ArrayRef<MCPhysReg> getRoundingControlRegisters() const override; +      SDValue getCMOV(const SDLoc &dl, EVT VT, SDValue FalseVal, SDValue TrueVal,                      SDValue ARMcc, SDValue Flags, SelectionDAG &DAG) const;      SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 10d4cd5..f7176a6 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -473,15 +473,15 @@ def xor_su : PatFrag<(ops node:$lhs, node:$rhs), (xor node:$lhs, node:$rhs)>;  // An 'fmul' node with a single use.  let HasOneUse = 1 in -def fmul_su : PatFrag<(ops node:$lhs, node:$rhs), (fmul node:$lhs, node:$rhs)>; +def fmul_su : PatFrag<(ops node:$lhs, node:$rhs), (any_fmul node:$lhs, node:$rhs)>;  // An 'fadd' node which checks for single non-hazardous use. -def fadd_mlx : PatFrag<(ops node:$lhs, node:$rhs),(fadd node:$lhs, node:$rhs),[{ +def fadd_mlx : PatFrag<(ops node:$lhs, node:$rhs),(any_fadd node:$lhs, node:$rhs),[{    return hasNoVMLxHazardUse(N);  }]>;  // An 'fsub' node which checks for single non-hazardous use. -def fsub_mlx : PatFrag<(ops node:$lhs, node:$rhs),(fsub node:$lhs, node:$rhs),[{ +def fsub_mlx : PatFrag<(ops node:$lhs, node:$rhs),(any_fsub node:$lhs, node:$rhs),[{    return hasNoVMLxHazardUse(N);  }]>; diff --git a/llvm/lib/Target/ARM/ARMInstrVFP.td b/llvm/lib/Target/ARM/ARMInstrVFP.td index 6771106..e2cc97b 100644 --- a/llvm/lib/Target/ARM/ARMInstrVFP.td +++ b/llvm/lib/Target/ARM/ARMInstrVFP.td @@ -439,14 +439,14 @@ let TwoOperandAliasConstraint = "$Dn = $Dd", mayRaiseFPException = 1, Uses = [FP  def VADDD  : ADbI<0b11100, 0b11, 0, 0,                    (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),                    IIC_fpALU64, "vadd", ".f64\t$Dd, $Dn, $Dm", -                  [(set DPR:$Dd, (fadd DPR:$Dn, (f64 DPR:$Dm)))]>, +                  [(set DPR:$Dd, (any_fadd DPR:$Dn, (f64 DPR:$Dm)))]>,               Sched<[WriteFPALU64]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VADDS  : ASbIn<0b11100, 0b11, 0, 0,                     (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),                     IIC_fpALU32, "vadd", ".f32\t$Sd, $Sn, $Sm", -                   [(set SPR:$Sd, (fadd SPR:$Sn, SPR:$Sm))]>, +                   [(set SPR:$Sd, (any_fadd SPR:$Sn, SPR:$Sm))]>,               Sched<[WriteFPALU32]> {    // Some single precision VFP instructions may be executed on both NEON and    // VFP pipelines on A8. @@ -457,21 +457,21 @@ let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FP  def VADDH  : AHbI<0b11100, 0b11, 0, 0,                    (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),                    IIC_fpALU16, "vadd", ".f16\t$Sd, $Sn, $Sm", -                  [(set (f16 HPR:$Sd), (fadd (f16 HPR:$Sn), (f16 HPR:$Sm)))]>, +                  [(set (f16 HPR:$Sd), (any_fadd (f16 HPR:$Sn), (f16 HPR:$Sm)))]>,               Sched<[WriteFPALU32]>;  let TwoOperandAliasConstraint = "$Dn = $Dd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VSUBD  : ADbI<0b11100, 0b11, 1, 0,                    (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),                    IIC_fpALU64, "vsub", ".f64\t$Dd, $Dn, $Dm", -                  [(set DPR:$Dd, (fsub DPR:$Dn, (f64 DPR:$Dm)))]>, +                  [(set DPR:$Dd, (any_fsub DPR:$Dn, (f64 DPR:$Dm)))]>,               Sched<[WriteFPALU64]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VSUBS  : ASbIn<0b11100, 0b11, 1, 0,                     (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),                     IIC_fpALU32, "vsub", ".f32\t$Sd, $Sn, $Sm", -                   [(set SPR:$Sd, (fsub SPR:$Sn, SPR:$Sm))]>, +                   [(set SPR:$Sd, (any_fsub SPR:$Sn, SPR:$Sm))]>,               Sched<[WriteFPALU32]>{    // Some single precision VFP instructions may be executed on both NEON and    // VFP pipelines on A8. @@ -482,42 +482,42 @@ let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FP  def VSUBH  : AHbI<0b11100, 0b11, 1, 0,                    (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),                    IIC_fpALU16, "vsub", ".f16\t$Sd, $Sn, $Sm", -                  [(set (f16 HPR:$Sd), (fsub (f16 HPR:$Sn), (f16 HPR:$Sm)))]>, +                  [(set (f16 HPR:$Sd), (any_fsub (f16 HPR:$Sn), (f16 HPR:$Sm)))]>,              Sched<[WriteFPALU32]>;  let TwoOperandAliasConstraint = "$Dn = $Dd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VDIVD  : ADbI<0b11101, 0b00, 0, 0,                    (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),                    IIC_fpDIV64, "vdiv", ".f64\t$Dd, $Dn, $Dm", -                  [(set DPR:$Dd, (fdiv DPR:$Dn, (f64 DPR:$Dm)))]>, +                  [(set DPR:$Dd, (any_fdiv DPR:$Dn, (f64 DPR:$Dm)))]>,               Sched<[WriteFPDIV64]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VDIVS  : ASbI<0b11101, 0b00, 0, 0,                    (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),                    IIC_fpDIV32, "vdiv", ".f32\t$Sd, $Sn, $Sm", -                  [(set SPR:$Sd, (fdiv SPR:$Sn, SPR:$Sm))]>, +                  [(set SPR:$Sd, (any_fdiv SPR:$Sn, SPR:$Sm))]>,               Sched<[WriteFPDIV32]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM]  in  def VDIVH  : AHbI<0b11101, 0b00, 0, 0,                    (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),                    IIC_fpDIV16, "vdiv", ".f16\t$Sd, $Sn, $Sm", -                  [(set (f16 HPR:$Sd), (fdiv (f16 HPR:$Sn), (f16 HPR:$Sm)))]>, +                  [(set (f16 HPR:$Sd), (any_fdiv (f16 HPR:$Sn), (f16 HPR:$Sm)))]>,               Sched<[WriteFPDIV32]>;  let TwoOperandAliasConstraint = "$Dn = $Dd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VMULD  : ADbI<0b11100, 0b10, 0, 0,                    (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),                    IIC_fpMUL64, "vmul", ".f64\t$Dd, $Dn, $Dm", -                  [(set DPR:$Dd, (fmul DPR:$Dn, (f64 DPR:$Dm)))]>, +                  [(set DPR:$Dd, (any_fmul DPR:$Dn, (f64 DPR:$Dm)))]>,               Sched<[WriteFPMUL64, ReadFPMUL, ReadFPMUL]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VMULS  : ASbIn<0b11100, 0b10, 0, 0,                     (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),                     IIC_fpMUL32, "vmul", ".f32\t$Sd, $Sn, $Sm", -                   [(set SPR:$Sd, (fmul SPR:$Sn, SPR:$Sm))]>, +                   [(set SPR:$Sd, (any_fmul SPR:$Sn, SPR:$Sm))]>,              Sched<[WriteFPMUL32, ReadFPMUL, ReadFPMUL]> {    // Some single precision VFP instructions may be executed on both NEON and    // VFP pipelines on A8. @@ -528,21 +528,21 @@ let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FP  def VMULH  : AHbI<0b11100, 0b10, 0, 0,                    (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),                    IIC_fpMUL16, "vmul", ".f16\t$Sd, $Sn, $Sm", -                  [(set (f16 HPR:$Sd), (fmul (f16 HPR:$Sn), (f16 HPR:$Sm)))]>, +                  [(set (f16 HPR:$Sd), (any_fmul (f16 HPR:$Sn), (f16 HPR:$Sm)))]>,               Sched<[WriteFPMUL32, ReadFPMUL, ReadFPMUL]>;  let TwoOperandAliasConstraint = "$Dn = $Dd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VNMULD : ADbI<0b11100, 0b10, 1, 0,                    (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm),                    IIC_fpMUL64, "vnmul", ".f64\t$Dd, $Dn, $Dm", -                  [(set DPR:$Dd, (fneg (fmul DPR:$Dn, (f64 DPR:$Dm))))]>, +                  [(set DPR:$Dd, (fneg (any_fmul DPR:$Dn, (f64 DPR:$Dm))))]>,               Sched<[WriteFPMUL64, ReadFPMUL, ReadFPMUL]>;  let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VNMULS : ASbI<0b11100, 0b10, 1, 0,                    (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm),                    IIC_fpMUL32, "vnmul", ".f32\t$Sd, $Sn, $Sm", -                  [(set SPR:$Sd, (fneg (fmul SPR:$Sn, SPR:$Sm)))]>, +                  [(set SPR:$Sd, (fneg (any_fmul SPR:$Sn, SPR:$Sm)))]>,              Sched<[WriteFPMUL32, ReadFPMUL, ReadFPMUL]> {    // Some single precision VFP instructions may be executed on both NEON and    // VFP pipelines on A8. @@ -553,7 +553,7 @@ let TwoOperandAliasConstraint = "$Sn = $Sd", mayRaiseFPException = 1, Uses = [FP  def VNMULH : AHbI<0b11100, 0b10, 1, 0,                    (outs HPR:$Sd), (ins HPR:$Sn, HPR:$Sm),                    IIC_fpMUL16, "vnmul", ".f16\t$Sd, $Sn, $Sm", -                  [(set (f16 HPR:$Sd), (fneg (fmul (f16 HPR:$Sn), (f16 HPR:$Sm))))]>, +                  [(set (f16 HPR:$Sd), (fneg (any_fmul (f16 HPR:$Sn), (f16 HPR:$Sm))))]>,               Sched<[WriteFPMUL32, ReadFPMUL, ReadFPMUL]>;  multiclass vsel_inst<string op, bits<2> opc, int CC> { @@ -587,7 +587,7 @@ defm VSELGE : vsel_inst<"ge", 0b10, 10>;  defm VSELEQ : vsel_inst<"eq", 0b00, 0>;  defm VSELVS : vsel_inst<"vs", 0b01, 6>; -multiclass vmaxmin_inst<string op, bit opc, SDNode SD> { +multiclass vmaxmin_inst<string op, bit opc, PatFrags SD> {    let DecoderNamespace = "VFPV8", PostEncoderMethod = "",        isUnpredicable = 1, mayRaiseFPException = 1 in {      def H : AHbInp<0b11101, 0b00, opc, @@ -610,8 +610,8 @@ multiclass vmaxmin_inst<string op, bit opc, SDNode SD> {    }  } -defm VFP_VMAXNM : vmaxmin_inst<"vmaxnm", 0, fmaxnum>; -defm VFP_VMINNM : vmaxmin_inst<"vminnm", 1, fminnum>; +defm VFP_VMAXNM : vmaxmin_inst<"vmaxnm", 0, any_fmaxnum>; +defm VFP_VMINNM : vmaxmin_inst<"vminnm", 1, any_fminnum>;  // Match reassociated forms only if not sign dependent rounding.  def : Pat<(fmul (fneg DPR:$a), (f64 DPR:$b)), @@ -746,7 +746,7 @@ let mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VCVTDS  : ASuI<0b11101, 0b11, 0b0111, 0b11, 0,                     (outs DPR:$Dd), (ins SPR:$Sm),                     IIC_fpCVTDS, "vcvt", ".f64.f32\t$Dd, $Sm", "", -                   [(set DPR:$Dd, (fpextend SPR:$Sm))]>, +                   [(set DPR:$Dd, (any_fpextend SPR:$Sm))]>,               Sched<[WriteFPCVT]> {    // Instruction operands.    bits<5> Dd; @@ -766,7 +766,7 @@ def VCVTDS  : ASuI<0b11101, 0b11, 0b0111, 0b11, 0,  let mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VCVTSD  : VFPAI<(outs SPR:$Sd), (ins DPR:$Dm), VFPUnaryFrm,                      IIC_fpCVTSD, "vcvt", ".f32.f64\t$Sd, $Dm", "", -                    [(set SPR:$Sd, (fpround DPR:$Dm))]>, +                    [(set SPR:$Sd, (any_fpround DPR:$Dm))]>,                Sched<[WriteFPCVT]> {    // Instruction operands.    bits<5> Sd; @@ -796,7 +796,7 @@ def VCVTBHS: ASuI<0b11101, 0b11, 0b0010, 0b01, 0, (outs SPR:$Sd), (ins SPR:$Sm),                   Requires<[HasFP16]>,               Sched<[WriteFPCVT]>; -def : FP16Pat<(f32 (fpextend (f16 HPR:$Sm))), +def : FP16Pat<(f32 (any_fpextend (f16 HPR:$Sm))),                (VCVTBHS (COPY_TO_REGCLASS (f16 HPR:$Sm), SPR))>;  def : FP16Pat<(f16_to_fp GPR:$a),                (VCVTBHS (COPY_TO_REGCLASS GPR:$a, SPR))>; @@ -808,16 +808,16 @@ def VCVTBSH: ASuI<0b11101, 0b11, 0b0011, 0b01, 0, (outs SPR:$Sd), (ins SPR:$Sda,                   Requires<[HasFP16]>,               Sched<[WriteFPCVT]>; -def : FP16Pat<(f16 (fpround SPR:$Sm)), +def : FP16Pat<(f16 (any_fpround SPR:$Sm)),                (COPY_TO_REGCLASS (VCVTBSH (IMPLICIT_DEF), SPR:$Sm), HPR)>;  def : FP16Pat<(fp_to_f16 SPR:$a),                (i32 (COPY_TO_REGCLASS (VCVTBSH (IMPLICIT_DEF), SPR:$a), GPR))>; -def : FP16Pat<(insertelt (v8f16 MQPR:$src1), (f16 (fpround (f32 SPR:$src2))), imm_even:$lane), +def : FP16Pat<(insertelt (v8f16 MQPR:$src1), (f16 (any_fpround (f32 SPR:$src2))), imm_even:$lane),                (v8f16 (INSERT_SUBREG (v8f16 MQPR:$src1),                                      (VCVTBSH (EXTRACT_SUBREG (v8f16 MQPR:$src1), (SSubReg_f16_reg imm:$lane)),                                               SPR:$src2),                                      (SSubReg_f16_reg imm:$lane)))>; -def : FP16Pat<(insertelt (v4f16 DPR:$src1), (f16 (fpround (f32 SPR:$src2))), imm_even:$lane), +def : FP16Pat<(insertelt (v4f16 DPR:$src1), (f16 (any_fpround (f32 SPR:$src2))), imm_even:$lane),                (v4f16 (INSERT_SUBREG (v4f16 DPR:$src1),                                      (VCVTBSH (EXTRACT_SUBREG (v4f16 DPR:$src1), (SSubReg_f16_reg imm:$lane)),                                               SPR:$src2), @@ -830,9 +830,9 @@ def VCVTTHS: ASuI<0b11101, 0b11, 0b0010, 0b11, 0, (outs SPR:$Sd), (ins SPR:$Sm),                   Requires<[HasFP16]>,               Sched<[WriteFPCVT]>; -def : FP16Pat<(f32 (fpextend (extractelt (v8f16 MQPR:$src), imm_odd:$lane))), +def : FP16Pat<(f32 (any_fpextend (extractelt (v8f16 MQPR:$src), imm_odd:$lane))),                (VCVTTHS (EXTRACT_SUBREG MQPR:$src, (SSubReg_f16_reg imm_odd:$lane)))>; -def : FP16Pat<(f32 (fpextend (extractelt (v4f16 DPR:$src), imm_odd:$lane))), +def : FP16Pat<(f32 (any_fpextend (extractelt (v4f16 DPR:$src), imm_odd:$lane))),                (VCVTTHS (EXTRACT_SUBREG                  (v2f32 (COPY_TO_REGCLASS (v4f16 DPR:$src), DPR_VFP2)),                  (SSubReg_f16_reg imm_odd:$lane)))>; @@ -844,12 +844,12 @@ def VCVTTSH: ASuI<0b11101, 0b11, 0b0011, 0b11, 0, (outs SPR:$Sd), (ins SPR:$Sda,                   Requires<[HasFP16]>,              Sched<[WriteFPCVT]>; -def : FP16Pat<(insertelt (v8f16 MQPR:$src1), (f16 (fpround (f32 SPR:$src2))), imm_odd:$lane), +def : FP16Pat<(insertelt (v8f16 MQPR:$src1), (f16 (any_fpround (f32 SPR:$src2))), imm_odd:$lane),                (v8f16 (INSERT_SUBREG (v8f16 MQPR:$src1),                                      (VCVTTSH (EXTRACT_SUBREG (v8f16 MQPR:$src1), (SSubReg_f16_reg imm:$lane)),                                               SPR:$src2),                                      (SSubReg_f16_reg imm:$lane)))>; -def : FP16Pat<(insertelt (v4f16 DPR:$src1), (f16 (fpround (f32 SPR:$src2))), imm_odd:$lane), +def : FP16Pat<(insertelt (v4f16 DPR:$src1), (f16 (any_fpround (f32 SPR:$src2))), imm_odd:$lane),                (v4f16 (INSERT_SUBREG (v4f16 DPR:$src1),                                      (VCVTTSH (EXTRACT_SUBREG (v4f16 DPR:$src1), (SSubReg_f16_reg imm:$lane)),                                               SPR:$src2), @@ -872,7 +872,7 @@ def VCVTBHD : ADuI<0b11101, 0b11, 0b0010, 0b01, 0,    let hasSideEffects = 0;  } -def : FullFP16Pat<(f64 (fpextend (f16 HPR:$Sm))), +def : FullFP16Pat<(f64 (any_fpextend (f16 HPR:$Sm))),                    (VCVTBHD (COPY_TO_REGCLASS (f16 HPR:$Sm), SPR))>,                    Requires<[HasFPARMv8, HasDPVFP]>;  def : FP16Pat<(f64 (f16_to_fp GPR:$a)), @@ -898,7 +898,7 @@ def VCVTBDH : ADuI<0b11101, 0b11, 0b0011, 0b01, 0,    let hasSideEffects = 0;  } -def : FullFP16Pat<(f16 (fpround DPR:$Dm)), +def : FullFP16Pat<(f16 (any_fpround DPR:$Dm)),                    (COPY_TO_REGCLASS (VCVTBDH (IMPLICIT_DEF), DPR:$Dm), HPR)>,                    Requires<[HasFPARMv8, HasDPVFP]>;  def : FP16Pat<(fp_to_f16 (f64 DPR:$a)), @@ -1007,41 +1007,41 @@ multiclass vcvt_inst<string opc, bits<2> rm,    let Predicates = [HasFPARMv8] in {      let Predicates = [HasFullFP16] in { -    def : Pat<(i32 (fp_to_sint (node (f16 HPR:$a)))), +    def : Pat<(i32 (any_fp_to_sint (node (f16 HPR:$a)))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"SH") (f16 HPR:$a)),                  GPR)>; -    def : Pat<(i32 (fp_to_uint (node (f16 HPR:$a)))), +    def : Pat<(i32 (any_fp_to_uint (node (f16 HPR:$a)))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"UH") (f16 HPR:$a)),                  GPR)>;      } -    def : Pat<(i32 (fp_to_sint (node SPR:$a))), +    def : Pat<(i32 (any_fp_to_sint (node SPR:$a))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"SS") SPR:$a),                  GPR)>; -    def : Pat<(i32 (fp_to_uint (node SPR:$a))), +    def : Pat<(i32 (any_fp_to_uint (node SPR:$a))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"US") SPR:$a),                  GPR)>;    }    let Predicates = [HasFPARMv8, HasDPVFP] in { -    def : Pat<(i32 (fp_to_sint (node (f64 DPR:$a)))), +    def : Pat<(i32 (any_fp_to_sint (node (f64 DPR:$a)))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"SD") DPR:$a),                  GPR)>; -    def : Pat<(i32 (fp_to_uint (node (f64 DPR:$a)))), +    def : Pat<(i32 (any_fp_to_uint (node (f64 DPR:$a)))),                (COPY_TO_REGCLASS                  (!cast<Instruction>(NAME#"UD") DPR:$a),                  GPR)>;    }  } -defm VCVTA : vcvt_inst<"a", 0b00, fround>; +defm VCVTA : vcvt_inst<"a", 0b00, any_fround>;  defm VCVTN : vcvt_inst<"n", 0b01>; -defm VCVTP : vcvt_inst<"p", 0b10, fceil>; -defm VCVTM : vcvt_inst<"m", 0b11, ffloor>; +defm VCVTP : vcvt_inst<"p", 0b10, any_fceil>; +defm VCVTM : vcvt_inst<"m", 0b11, any_ffloor>;  def VNEGD  : ADuI<0b11101, 0b11, 0b0001, 0b01, 0,                    (outs DPR:$Dd), (ins DPR:$Dm), @@ -1103,9 +1103,9 @@ multiclass vrint_inst_zrx<string opc, bit op, bit op2, SDPatternOperator node,          Requires<[HasFPARMv8,HasDPVFP]>;  } -defm VRINTZ : vrint_inst_zrx<"z", 0, 1, ftrunc, [], 0>; -defm VRINTR : vrint_inst_zrx<"r", 0, 0, fnearbyint, [FPSCR_RM], 0>; -defm VRINTX : vrint_inst_zrx<"x", 1, 0, frint, [FPSCR_RM], 1>; +defm VRINTZ : vrint_inst_zrx<"z", 0, 1, any_ftrunc, [], 0>; +defm VRINTR : vrint_inst_zrx<"r", 0, 0, any_fnearbyint, [FPSCR_RM], 0>; +defm VRINTX : vrint_inst_zrx<"x", 1, 0, any_frint, [FPSCR_RM], 1>;  multiclass vrint_inst_anpm<string opc, bits<2> rm,                             SDPatternOperator node = null_frag> { @@ -1145,30 +1145,31 @@ multiclass vrint_inst_anpm<string opc, bits<2> rm,          Requires<[HasFPARMv8,HasDPVFP]>;  } -defm VRINTA : vrint_inst_anpm<"a", 0b00, fround>; -defm VRINTN : vrint_inst_anpm<"n", 0b01, froundeven>; -defm VRINTP : vrint_inst_anpm<"p", 0b10, fceil>; -defm VRINTM : vrint_inst_anpm<"m", 0b11, ffloor>; +defm VRINTA : vrint_inst_anpm<"a", 0b00, any_fround>; +defm VRINTN : vrint_inst_anpm<"n", 0b01, any_froundeven>; +defm VRINTP : vrint_inst_anpm<"p", 0b10, any_fceil>; +defm VRINTM : vrint_inst_anpm<"m", 0b11, any_ffloor>; +  let mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VSQRTD : ADuI<0b11101, 0b11, 0b0001, 0b11, 0,                    (outs DPR:$Dd), (ins DPR:$Dm),                    IIC_fpSQRT64, "vsqrt", ".f64\t$Dd, $Dm", "", -                  [(set DPR:$Dd, (fsqrt (f64 DPR:$Dm)))]>, +                  [(set DPR:$Dd, (any_fsqrt (f64 DPR:$Dm)))]>,               Sched<[WriteFPSQRT64]>;  let mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VSQRTS : ASuI<0b11101, 0b11, 0b0001, 0b11, 0,                    (outs SPR:$Sd), (ins SPR:$Sm),                    IIC_fpSQRT32, "vsqrt", ".f32\t$Sd, $Sm", "", -                  [(set SPR:$Sd, (fsqrt SPR:$Sm))]>, +                  [(set SPR:$Sd, (any_fsqrt SPR:$Sm))]>,               Sched<[WriteFPSQRT32]>;  let mayRaiseFPException = 1, Uses = [FPSCR_RM] in  def VSQRTH : AHuI<0b11101, 0b11, 0b0001, 0b11, 0,                    (outs HPR:$Sd), (ins HPR:$Sm),                    IIC_fpSQRT16, "vsqrt", ".f16\t$Sd, $Sm", -                  [(set (f16 HPR:$Sd), (fsqrt (f16 HPR:$Sm)))]>; +                  [(set (f16 HPR:$Sd), (any_fsqrt (f16 HPR:$Sm)))]>;  let hasSideEffects = 0 in {  let isMoveReg = 1 in { @@ -1509,10 +1510,10 @@ def VSITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,  }  let Predicates=[HasVFP2, HasDPVFP] in { -  def : VFPPat<(f64 (sint_to_fp GPR:$a)), +  def : VFPPat<(f64 (any_sint_to_fp GPR:$a)),                 (VSITOD (COPY_TO_REGCLASS GPR:$a, SPR))>; -  def : VFPPat<(f64 (sint_to_fp (i32 (alignedload32 addrmode5:$a)))), +  def : VFPPat<(f64 (any_sint_to_fp (i32 (alignedload32 addrmode5:$a)))),                 (VSITOD (VLDRS addrmode5:$a))>;  } @@ -1529,10 +1530,10 @@ def VSITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,    let D = VFPNeonA8Domain;  } -def : VFPNoNEONPat<(f32 (sint_to_fp GPR:$a)), +def : VFPNoNEONPat<(f32 (any_sint_to_fp GPR:$a)),                     (VSITOS (COPY_TO_REGCLASS GPR:$a, SPR))>; -def : VFPNoNEONPat<(f32 (sint_to_fp (i32 (alignedload32 addrmode5:$a)))), +def : VFPNoNEONPat<(f32 (any_sint_to_fp (i32 (alignedload32 addrmode5:$a)))),                     (VSITOS (VLDRS addrmode5:$a))>;  let mayRaiseFPException = 1 in  @@ -1545,7 +1546,7 @@ def VSITOH : AVConv1IHs_Encode<0b11101, 0b11, 0b1000, 0b1001,    let isUnpredicable = 1;  } -def : VFPNoNEONPat<(f16 (sint_to_fp GPR:$a)), +def : VFPNoNEONPat<(f16 (any_sint_to_fp GPR:$a)),                     (VSITOH (COPY_TO_REGCLASS GPR:$a, SPR))>;  let mayRaiseFPException = 1 in  @@ -1558,10 +1559,10 @@ def VUITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011,  }  let Predicates=[HasVFP2, HasDPVFP] in { -  def : VFPPat<(f64 (uint_to_fp GPR:$a)), +  def : VFPPat<(f64 (any_uint_to_fp GPR:$a)),                 (VUITOD (COPY_TO_REGCLASS GPR:$a, SPR))>; -  def : VFPPat<(f64 (uint_to_fp (i32 (alignedload32 addrmode5:$a)))), +  def : VFPPat<(f64 (any_uint_to_fp (i32 (alignedload32 addrmode5:$a)))),                 (VUITOD (VLDRS addrmode5:$a))>;  } @@ -1578,10 +1579,10 @@ def VUITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010,    let D = VFPNeonA8Domain;  } -def : VFPNoNEONPat<(f32 (uint_to_fp GPR:$a)), +def : VFPNoNEONPat<(f32 (any_uint_to_fp GPR:$a)),                     (VUITOS (COPY_TO_REGCLASS GPR:$a, SPR))>; -def : VFPNoNEONPat<(f32 (uint_to_fp (i32 (alignedload32 addrmode5:$a)))), +def : VFPNoNEONPat<(f32 (any_uint_to_fp (i32 (alignedload32 addrmode5:$a)))),                     (VUITOS (VLDRS addrmode5:$a))>;  let mayRaiseFPException = 1 in  @@ -1594,7 +1595,7 @@ def VUITOH : AVConv1IHs_Encode<0b11101, 0b11, 0b1000, 0b1001,    let isUnpredicable = 1;  } -def : VFPNoNEONPat<(f16 (uint_to_fp GPR:$a)), +def : VFPNoNEONPat<(f16 (any_uint_to_fp GPR:$a)),                     (VUITOH (COPY_TO_REGCLASS GPR:$a, SPR))>;  // FP -> Int: @@ -1669,12 +1670,12 @@ def VTOSIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011,  }  let Predicates=[HasVFP2, HasDPVFP] in { -  def : VFPPat<(i32 (fp_to_sint (f64 DPR:$a))), +  def : VFPPat<(i32 (any_fp_to_sint (f64 DPR:$a))),                 (COPY_TO_REGCLASS (VTOSIZD DPR:$a), GPR)>;    def : VFPPat<(i32 (fp_to_sint_sat (f64 DPR:$a), i32)),                 (COPY_TO_REGCLASS (VTOSIZD DPR:$a), GPR)>; -  def : VFPPat<(alignedstore32 (i32 (fp_to_sint (f64 DPR:$a))), addrmode5:$ptr), +  def : VFPPat<(alignedstore32 (i32 (any_fp_to_sint (f64 DPR:$a))), addrmode5:$ptr),                 (VSTRS (VTOSIZD DPR:$a), addrmode5:$ptr)>;    def : VFPPat<(alignedstore32 (i32 (fp_to_sint_sat (f64 DPR:$a), i32)), addrmode5:$ptr),                 (VSTRS (VTOSIZD DPR:$a), addrmode5:$ptr)>; @@ -1693,12 +1694,12 @@ def VTOSIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010,    let D = VFPNeonA8Domain;  } -def : VFPNoNEONPat<(i32 (fp_to_sint SPR:$a)), +def : VFPNoNEONPat<(i32 (any_fp_to_sint SPR:$a)),                     (COPY_TO_REGCLASS (VTOSIZS SPR:$a), GPR)>;  def : VFPPat<(i32 (fp_to_sint_sat SPR:$a, i32)),               (COPY_TO_REGCLASS (VTOSIZS SPR:$a), GPR)>; -def : VFPNoNEONPat<(alignedstore32 (i32 (fp_to_sint (f32 SPR:$a))), +def : VFPNoNEONPat<(alignedstore32 (i32 (any_fp_to_sint (f32 SPR:$a))),                                     addrmode5:$ptr),                     (VSTRS (VTOSIZS SPR:$a), addrmode5:$ptr)>;  def : VFPPat<(alignedstore32 (i32 (fp_to_sint_sat (f32 SPR:$a), i32)), @@ -1715,7 +1716,7 @@ def VTOSIZH : AVConv1IsH_Encode<0b11101, 0b11, 0b1101, 0b1001,    let isUnpredicable = 1;  } -def : VFPNoNEONPat<(i32 (fp_to_sint (f16 HPR:$a))), +def : VFPNoNEONPat<(i32 (any_fp_to_sint (f16 HPR:$a))),                     (COPY_TO_REGCLASS (VTOSIZH (f16 HPR:$a)), GPR)>;  def : VFPPat<(i32 (fp_to_sint_sat (f16 HPR:$a), i32)),               (COPY_TO_REGCLASS (VTOSIZH (f16 HPR:$a)), GPR)>; @@ -1730,12 +1731,12 @@ def VTOUIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011,  }  let Predicates=[HasVFP2, HasDPVFP] in { -  def : VFPPat<(i32 (fp_to_uint (f64 DPR:$a))), +  def : VFPPat<(i32 (any_fp_to_uint (f64 DPR:$a))),                 (COPY_TO_REGCLASS (VTOUIZD DPR:$a), GPR)>;    def : VFPPat<(i32 (fp_to_uint_sat (f64 DPR:$a), i32)),                 (COPY_TO_REGCLASS (VTOUIZD DPR:$a), GPR)>; -  def : VFPPat<(alignedstore32 (i32 (fp_to_uint (f64 DPR:$a))), addrmode5:$ptr), +  def : VFPPat<(alignedstore32 (i32 (any_fp_to_uint (f64 DPR:$a))), addrmode5:$ptr),                 (VSTRS (VTOUIZD DPR:$a), addrmode5:$ptr)>;    def : VFPPat<(alignedstore32 (i32 (fp_to_uint_sat (f64 DPR:$a), i32)), addrmode5:$ptr),                 (VSTRS (VTOUIZD DPR:$a), addrmode5:$ptr)>; @@ -1754,12 +1755,12 @@ def VTOUIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010,    let D = VFPNeonA8Domain;  } -def : VFPNoNEONPat<(i32 (fp_to_uint SPR:$a)), +def : VFPNoNEONPat<(i32 (any_fp_to_uint SPR:$a)),                     (COPY_TO_REGCLASS (VTOUIZS SPR:$a), GPR)>;  def : VFPPat<(i32 (fp_to_uint_sat SPR:$a, i32)),               (COPY_TO_REGCLASS (VTOUIZS SPR:$a), GPR)>; -def : VFPNoNEONPat<(alignedstore32 (i32 (fp_to_uint (f32 SPR:$a))), +def : VFPNoNEONPat<(alignedstore32 (i32 (any_fp_to_uint (f32 SPR:$a))),                                     addrmode5:$ptr),                    (VSTRS (VTOUIZS SPR:$a), addrmode5:$ptr)>;  def : VFPPat<(alignedstore32 (i32 (fp_to_uint_sat (f32 SPR:$a), i32)), @@ -1776,7 +1777,7 @@ def VTOUIZH : AVConv1IsH_Encode<0b11101, 0b11, 0b1100, 0b1001,    let isUnpredicable = 1;  } -def : VFPNoNEONPat<(i32 (fp_to_uint (f16 HPR:$a))), +def : VFPNoNEONPat<(i32 (any_fp_to_uint (f16 HPR:$a))),                     (COPY_TO_REGCLASS (VTOUIZH (f16 HPR:$a)), GPR)>;  def : VFPPat<(i32 (fp_to_uint_sat (f16 HPR:$a), i32)),               (COPY_TO_REGCLASS (VTOUIZH (f16 HPR:$a)), GPR)>; @@ -2320,13 +2321,13 @@ def : Pat<(fadd_mlx HPR:$dstin, (fmul_su (f16 HPR:$a), HPR:$b)),  // Match @llvm.fma.* intrinsics  // (fma x, y, z) -> (vfms z, x, y) -def : Pat<(f64 (fma DPR:$Dn, DPR:$Dm, DPR:$Ddin)), +def : Pat<(f64 (any_fma DPR:$Dn, DPR:$Dm, DPR:$Ddin)),            (VFMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(f32 (fma SPR:$Sn, SPR:$Sm, SPR:$Sdin)), +def : Pat<(f32 (any_fma SPR:$Sn, SPR:$Sm, SPR:$Sdin)),            (VFMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(f16 (fma HPR:$Sn, HPR:$Sm, (f16 HPR:$Sdin))), +def : Pat<(f16 (any_fma HPR:$Sn, HPR:$Sm, (f16 HPR:$Sdin))),            (VFMAH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>; @@ -2375,13 +2376,13 @@ def : Pat<(fsub_mlx HPR:$dstin, (fmul_su (f16 HPR:$a), HPR:$b)),  // Match @llvm.fma.* intrinsics  // (fma (fneg x), y, z) -> (vfms z, x, y) -def : Pat<(f64 (fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin)), +def : Pat<(f64 (any_fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin)),            (VFMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(f32 (fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin)), +def : Pat<(f32 (any_fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin)),            (VFMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(f16 (fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (f16 HPR:$Sdin))), +def : Pat<(f16 (any_fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (f16 HPR:$Sdin))),            (VFMSH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>; @@ -2427,23 +2428,23 @@ def : Pat<(fsub_mlx (fneg (fmul_su SPR:$a, SPR:$b)), SPR:$dstin),  // Match @llvm.fma.* intrinsics  // (fneg (fma x, y, z)) -> (vfnma z, x, y) -def : Pat<(fneg (fma (f64 DPR:$Dn), (f64 DPR:$Dm), (f64 DPR:$Ddin))), +def : Pat<(fneg (any_fma (f64 DPR:$Dn), (f64 DPR:$Dm), (f64 DPR:$Ddin))),            (VFNMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(fneg (fma (f32 SPR:$Sn), (f32 SPR:$Sm), (f32 SPR:$Sdin))), +def : Pat<(fneg (any_fma (f32 SPR:$Sn), (f32 SPR:$Sm), (f32 SPR:$Sdin))),            (VFNMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(fneg (fma (f16 HPR:$Sn), (f16 HPR:$Sm), (f16 (f16 HPR:$Sdin)))), +def : Pat<(fneg (any_fma (f16 HPR:$Sn), (f16 HPR:$Sm), (f16 (f16 HPR:$Sdin)))),            (VFNMAH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>;  // (fma (fneg x), y, (fneg z)) -> (vfnma z, x, y) -def : Pat<(f64 (fma (fneg DPR:$Dn), DPR:$Dm, (fneg DPR:$Ddin))), +def : Pat<(f64 (any_fma (fneg DPR:$Dn), DPR:$Dm, (fneg DPR:$Ddin))),            (VFNMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(f32 (fma (fneg SPR:$Sn), SPR:$Sm, (fneg SPR:$Sdin))), +def : Pat<(f32 (any_fma (fneg SPR:$Sn), SPR:$Sm, (fneg SPR:$Sdin))),            (VFNMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(f16 (fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (fneg (f16 HPR:$Sdin)))), +def : Pat<(f16 (any_fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (fneg (f16 HPR:$Sdin)))),            (VFNMAH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>; @@ -2488,23 +2489,23 @@ def : Pat<(fsub_mlx (fmul_su SPR:$a, SPR:$b), SPR:$dstin),  // Match @llvm.fma.* intrinsics  // (fma x, y, (fneg z)) -> (vfnms z, x, y)) -def : Pat<(f64 (fma DPR:$Dn, DPR:$Dm, (fneg DPR:$Ddin))), +def : Pat<(f64 (any_fma DPR:$Dn, DPR:$Dm, (fneg DPR:$Ddin))),            (VFNMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(f32 (fma SPR:$Sn, SPR:$Sm, (fneg SPR:$Sdin))), +def : Pat<(f32 (any_fma SPR:$Sn, SPR:$Sm, (fneg SPR:$Sdin))),            (VFNMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(f16 (fma (f16 HPR:$Sn), (f16 HPR:$Sm), (fneg (f16 HPR:$Sdin)))), +def : Pat<(f16 (any_fma (f16 HPR:$Sn), (f16 HPR:$Sm), (fneg (f16 HPR:$Sdin)))),            (VFNMSH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>;  // (fneg (fma (fneg x), y, z)) -> (vfnms z, x, y) -def : Pat<(fneg (f64 (fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin))), +def : Pat<(fneg (f64 (any_fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin))),            (VFNMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>,        Requires<[HasVFP4,HasDPVFP]>; -def : Pat<(fneg (f32 (fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin))), +def : Pat<(fneg (f32 (any_fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin))),            (VFNMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>,        Requires<[HasVFP4]>; -def : Pat<(fneg (f16 (fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (f16 HPR:$Sdin)))), +def : Pat<(fneg (f16 (any_fma (fneg (f16 HPR:$Sn)), (f16 HPR:$Sm), (f16 HPR:$Sdin)))),            (VFNMSH (f16 HPR:$Sdin), (f16 HPR:$Sn), (f16 HPR:$Sm))>,        Requires<[HasFullFP16]>; diff --git a/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp b/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp index ebfa593..bf7c962f 100644 --- a/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp +++ b/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp @@ -47,9 +47,7 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(    // Only use a specialized AEABI function if the default version of this    // Libcall is an AEABI function. -  if (std::strncmp(TLI->getLibcallName(LC), "__aeabi", 7) != 0) -    return SDValue(); - +  //    // Translate RTLIB::Libcall to AEABILibcall. We only do this in order to be    // able to translate memset to memclr and use the value to index the function    // name array. @@ -61,12 +59,21 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(    } AEABILibcall;    switch (LC) {    case RTLIB::MEMCPY: +    if (TLI->getLibcallImpl(LC) != RTLIB::impl___aeabi_memcpy) +      return SDValue(); +      AEABILibcall = AEABI_MEMCPY;      break;    case RTLIB::MEMMOVE: +    if (TLI->getLibcallImpl(LC) != RTLIB::impl___aeabi_memmove) +      return SDValue(); +      AEABILibcall = AEABI_MEMMOVE;      break;    case RTLIB::MEMSET: +    if (TLI->getLibcallImpl(LC) != RTLIB::impl___aeabi_memset) +      return SDValue(); +      AEABILibcall = AEABI_MEMSET;      if (isNullConstant(Src))        AEABILibcall = AEABI_MEMCLR; diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index f60660b..1bb670d 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -426,15 +426,15 @@ class ARMAsmParser : public MCTargetAsmParser {        VPTState.CurPosition = ~0U;    } -  void Note(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt) { +  void Note(SMLoc L, const Twine &Msg, SMRange Range = {}) {      return getParser().Note(L, Msg, Range);    } -  bool Warning(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt) { +  bool Warning(SMLoc L, const Twine &Msg, SMRange Range = {}) {      return getParser().Warning(L, Msg, Range);    } -  bool Error(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt) { +  bool Error(SMLoc L, const Twine &Msg, SMRange Range = {}) {      return getParser().Error(L, Msg, Range);    } | 
