diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -4269,10 +4269,6 @@ bool IsDirectConv = IsDirectExtend || IsDirectTrunc; - // For FP_ROUND/FP_EXTEND of scalable vectors, leave it to the pattern. - if (!VT.isFixedLengthVector() && !IsVP && IsDirectConv) - return Op; - // Prepare any fixed-length vector operands. MVT ContainerVT = VT; SDValue Mask, VL; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td @@ -406,137 +406,6 @@ } } -multiclass VPatWidenBinaryFPSDNode_VV_VF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(op (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2))), - (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1)))), - (!cast(instruction_name#"_VV_"#vti.LMul.MX) - vti.RegClass:$rs2, vti.RegClass:$rs1, vti.AVL, vti.Log2SEW)>; - def : Pat<(op (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2))), - (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1))))), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - vti.RegClass:$rs2, vti.ScalarRegClass:$rs1, vti.AVL, vti.Log2SEW)>; - def : Pat<(op (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2))), - (wti.Vector (SplatFPOp (fpext_oneuse vti.ScalarRegClass:$rs1)))), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - vti.RegClass:$rs2, vti.ScalarRegClass:$rs1, vti.AVL, vti.Log2SEW)>; - } -} - -multiclass VPatWidenBinaryFPSDNode_WV_WF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(op (wti.Vector wti.RegClass:$rs2), - (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1)))), - (!cast(instruction_name#"_WV_"#vti.LMul.MX) - wti.RegClass:$rs2, vti.RegClass:$rs1, vti.AVL, vti.Log2SEW)>; - def : Pat<(op (wti.Vector wti.RegClass:$rs2), - (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1))))), - (!cast(instruction_name#"_W"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rs2, vti.ScalarRegClass:$rs1, vti.AVL, vti.Log2SEW)>; - def : Pat<(op (wti.Vector wti.RegClass:$rs2), - (wti.Vector (SplatFPOp (fpext_oneuse vti.ScalarRegClass:$rs1)))), - (!cast(instruction_name#"_W"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rs2, vti.ScalarRegClass:$rs1, vti.AVL, vti.Log2SEW)>; - } -} - -multiclass VPatWidenBinaryFPSDNode_VV_VF_WV_WF { - defm : VPatWidenBinaryFPSDNode_VV_VF; - defm : VPatWidenBinaryFPSDNode_WV_WF; -} - -multiclass VPatWidenFPMulAccSDNode_VV_VF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(fma (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1))), - (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2))), - (wti.Vector wti.RegClass:$rd)), - (!cast(instruction_name#"_VV_"#vti.LMul.MX) - wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)))), - (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2))), - (wti.Vector wti.RegClass:$rd)), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - } -} - -multiclass VPatWidenFPNegMulAccSDNode_VV_VF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(fma (fneg (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1)))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - (fneg wti.RegClass:$rd)), - (!cast(instruction_name#"_VV_"#vti.LMul.MX) - wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1))), - (fneg (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2)))), - (fneg wti.RegClass:$rd)), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (fneg (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1))))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - (fneg wti.RegClass:$rd)), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - } -} - -multiclass VPatWidenFPMulSacSDNode_VV_VF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(fma (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - (fneg wti.RegClass:$rd)), - (!cast(instruction_name#"_VV_"#vti.LMul.MX) - wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - (fneg wti.RegClass:$rd)), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - } -} - -multiclass VPatWidenFPNegMulSacSDNode_VV_VF { - foreach vtiToWti = AllWidenableFloatVectors in { - defvar vti = vtiToWti.Vti; - defvar wti = vtiToWti.Wti; - def : Pat<(fma (fneg (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs1)))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - wti.RegClass:$rd), - (!cast(instruction_name#"_VV_"#vti.LMul.MX) - wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)))), - (fneg (wti.Vector (fpext_oneuse (vti.Vector vti.RegClass:$rs2)))), - wti.RegClass:$rd), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - def : Pat<(fma (fneg (wti.Vector (fpext_oneuse (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1))))), - (fpext_oneuse (vti.Vector vti.RegClass:$rs2)), - wti.RegClass:$rd), - (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) - wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, - vti.AVL, vti.Log2SEW, TAIL_AGNOSTIC)>; - } -} - multiclass VPatMultiplyAddSDNode_VV_VX { foreach vti = AllIntegerVectors in { defvar suffix = vti.LMul.MX; @@ -783,10 +652,6 @@ defm : VPatBinaryFPSDNode_VV_VF; defm : VPatBinaryFPSDNode_R_VF; -// 14.3. Vector Widening Floating-Point Add/Subtract Instructions -defm : VPatWidenBinaryFPSDNode_VV_VF_WV_WF; -defm : VPatWidenBinaryFPSDNode_VV_VF_WV_WF; - // 14.4. Vector Single-Width Floating-Point Multiply/Divide Instructions defm : VPatBinaryFPSDNode_VV_VF; defm : VPatBinaryFPSDNode_VV_VF; @@ -858,12 +723,6 @@ fvti.AVL, fvti.Log2SEW, TAIL_AGNOSTIC)>; } -// 14.7. Vector Widening Floating-Point Fused Multiply-Add Instructions -defm : VPatWidenFPMulAccSDNode_VV_VF<"PseudoVFWMACC">; -defm : VPatWidenFPNegMulAccSDNode_VV_VF<"PseudoVFWNMACC">; -defm : VPatWidenFPMulSacSDNode_VV_VF<"PseudoVFWMSAC">; -defm : VPatWidenFPNegMulSacSDNode_VV_VF<"PseudoVFWNMSAC">; - foreach vti = AllFloatVectors in { // 14.8. Vector Floating-Point Square-Root Instruction def : Pat<(fsqrt (vti.Vector vti.RegClass:$rs2)), @@ -951,13 +810,6 @@ defm : VPatWConvertFP2ISDNode_V; defm : VPatWConvertI2FPSDNode_V; defm : VPatWConvertI2FPSDNode_V; -foreach fvtiToFWti = AllWidenableFloatVectors in { - defvar fvti = fvtiToFWti.Vti; - defvar fwti = fvtiToFWti.Wti; - def : Pat<(fwti.Vector (fpextend (fvti.Vector fvti.RegClass:$rs1))), - (!cast("PseudoVFWCVT_F_F_V_"#fvti.LMul.MX) - fvti.RegClass:$rs1, fvti.AVL, fvti.Log2SEW)>; -} // 14.19. Narrowing Floating-Point/Integer Type-Convert Instructions defm : VPatNConvertFP2ISDNode_V; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td @@ -813,6 +813,185 @@ defm : VPatWidenBinaryFPVL_WV_WF; } +multiclass VPatWidenBinaryFPSDNode_VV_VF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(op (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag))), + (!cast(instruction_name#"_VV_"#vti.LMul.MX) + vti.RegClass:$rs2, vti.RegClass:$rs1, GPR:$vl, vti.Log2SEW)>; + def : Pat<(op (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag))), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + vti.RegClass:$rs2, vti.ScalarRegClass:$rs1, GPR:$vl, vti.Log2SEW)>; + def : Pat<(op (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector (SplatFPOp (fpext_oneuse vti.ScalarRegClass:$rs1)))), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + vti.RegClass:$rs2, vti.ScalarRegClass:$rs1, GPR:$vl, vti.Log2SEW)>; + } +} + +multiclass VPatWidenBinaryFPSDNode_WV_WF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(op (wti.Vector wti.RegClass:$rs2), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag))), + (!cast(instruction_name#"_WV_"#vti.LMul.MX) + wti.RegClass:$rs2, vti.RegClass:$rs1, GPR:$vl, vti.Log2SEW)>; + def : Pat<(op (wti.Vector wti.RegClass:$rs2), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag))), + (!cast(instruction_name#"_W"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rs2, vti.ScalarRegClass:$rs1, GPR:$vl, vti.Log2SEW)>; + def : Pat<(op (wti.Vector wti.RegClass:$rs2), + (wti.Vector (SplatFPOp (fpext_oneuse vti.ScalarRegClass:$rs1)))), + (!cast(instruction_name#"_W"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rs2, vti.ScalarRegClass:$rs1, vti.AVL, vti.Log2SEW)>; + } +} + +multiclass VPatWidenBinaryFPSDNode_VV_VF_WV_WF { + defm : VPatWidenBinaryFPSDNode_VV_VF; + defm : VPatWidenBinaryFPSDNode_WV_WF; +} + +multiclass VPatWidenFPMulAccSDNode_VV_VF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(fma (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector wti.RegClass:$rd)), + (!cast(instruction_name#"_VV_"#vti.LMul.MX) + wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag)), + (wti.Vector wti.RegClass:$rd)), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + } +} + +multiclass VPatWidenFPNegMulAccSDNode_VV_VF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(fma (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag))), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + (fneg wti.RegClass:$rd)), + (!cast(instruction_name#"_VV_"#vti.LMul.MX) + wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag), + (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag))), + (fneg wti.RegClass:$rd)), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag))), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + (fneg wti.RegClass:$rd)), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + } +} + +multiclass VPatWidenFPMulSacSDNode_VV_VF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(fma (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag)), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + (fneg wti.RegClass:$rd)), + (!cast(instruction_name#"_VV_"#vti.LMul.MX) + wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag)), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + (fneg wti.RegClass:$rd)), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + } +} + +multiclass VPatWidenFPNegMulSacSDNode_VV_VF { + foreach vtiToWti = AllWidenableFloatVectors in { + defvar vti = vtiToWti.Vti; + defvar wti = vtiToWti.Wti; + def : Pat<(fma (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs1), + (vti.Mask true_mask), VLOpFrag))), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + wti.RegClass:$rd), + (!cast(instruction_name#"_VV_"#vti.LMul.MX) + wti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag)), + (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag))), + wti.RegClass:$rd), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + def : Pat<(fma (fneg (wti.Vector (riscv_fpextend_vl_oneuse + (vti.Vector (SplatFPOp vti.ScalarRegClass:$rs1)), + (vti.Mask true_mask), VLOpFrag))), + (riscv_fpextend_vl_oneuse (vti.Vector vti.RegClass:$rs2), + (vti.Mask true_mask), VLOpFrag), + wti.RegClass:$rd), + (!cast(instruction_name#"_V"#vti.ScalarSuffix#"_"#vti.LMul.MX) + wti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2, + GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>; + } +} + multiclass VPatNarrowShiftSplatExt_WX { foreach vtiToWti = AllWidenableIntVectors in { defvar vti = vtiToWti.Vti; @@ -1342,6 +1521,9 @@ defm : VPatBinaryFPVL_R_VF; // 14.3. Vector Widening Floating-Point Add/Subtract Instructions +defm : VPatWidenBinaryFPSDNode_VV_VF_WV_WF; +defm : VPatWidenBinaryFPSDNode_VV_VF_WV_WF; + defm : VPatWidenBinaryFPVL_VV_VF_WV_WF; defm : VPatWidenBinaryFPVL_VV_VF_WV_WF; @@ -1570,6 +1752,11 @@ defm : VPatWidenFPMulSacVL_VV_VF<"PseudoVFWMSAC">; defm : VPatWidenFPNegMulSacVL_VV_VF<"PseudoVFWNMSAC">; +defm : VPatWidenFPMulAccSDNode_VV_VF<"PseudoVFWMACC">; +defm : VPatWidenFPNegMulAccSDNode_VV_VF<"PseudoVFWNMACC">; +defm : VPatWidenFPMulSacSDNode_VV_VF<"PseudoVFWMSAC">; +defm : VPatWidenFPNegMulSacSDNode_VV_VF<"PseudoVFWNMSAC">; + // 14.11. Vector Floating-Point MIN/MAX Instructions defm : VPatBinaryFPVL_VV_VF; defm : VPatBinaryFPVL_VV_VF;