@@ -345,49 +345,60 @@ defset list<VTypeInfo> AllVectors = {
345345 }
346346 }
347347
348- defset list<VTypeInfo> AllFloatVectors = {
349- defset list<VTypeInfo> NoGroupFloatVectors = {
350- defset list<VTypeInfo> FractionalGroupFloatVectors = {
351- def VF16MF4: VTypeInfo<vfloat16mf4_t, vbool64_t, 16, V_MF4, f16, FPR16>;
352- def VF16MF2: VTypeInfo<vfloat16mf2_t, vbool32_t, 16, V_MF2, f16, FPR16>;
353- def VF32MF2: VTypeInfo<vfloat32mf2_t, vbool64_t, 32, V_MF2, f32, FPR32>;
354- def VBF16MF4: VTypeInfo<vbfloat16mf4_t, vbool64_t, 16, V_MF4, bf16, FPR16>;
355- def VBF16MF2: VTypeInfo<vbfloat16mf2_t, vbool32_t, 16, V_MF2, bf16, FPR16>;
348+ defset list<VTypeInfo> AllFloatAndBFloatVectors = {
349+ defset list<VTypeInfo> AllFloatVectors = {
350+ defset list<VTypeInfo> NoGroupFloatVectors = {
351+ defset list<VTypeInfo> FractionalGroupFloatVectors = {
352+ def VF16MF4: VTypeInfo<vfloat16mf4_t, vbool64_t, 16, V_MF4, f16, FPR16>;
353+ def VF16MF2: VTypeInfo<vfloat16mf2_t, vbool32_t, 16, V_MF2, f16, FPR16>;
354+ def VF32MF2: VTypeInfo<vfloat32mf2_t, vbool64_t, 32, V_MF2, f32, FPR32>;
355+ }
356+ def VF16M1: VTypeInfo<vfloat16m1_t, vbool16_t, 16, V_M1, f16, FPR16>;
357+ def VF32M1: VTypeInfo<vfloat32m1_t, vbool32_t, 32, V_M1, f32, FPR32>;
358+ def VF64M1: VTypeInfo<vfloat64m1_t, vbool64_t, 64, V_M1, f64, FPR64>;
359+ }
360+
361+ defset list<GroupVTypeInfo> GroupFloatVectors = {
362+ def VF16M2: GroupVTypeInfo<vfloat16m2_t, vfloat16m1_t, vbool8_t, 16,
363+ V_M2, f16, FPR16>;
364+ def VF16M4: GroupVTypeInfo<vfloat16m4_t, vfloat16m1_t, vbool4_t, 16,
365+ V_M4, f16, FPR16>;
366+ def VF16M8: GroupVTypeInfo<vfloat16m8_t, vfloat16m1_t, vbool2_t, 16,
367+ V_M8, f16, FPR16>;
368+
369+ def VF32M2: GroupVTypeInfo<vfloat32m2_t, vfloat32m1_t, vbool16_t, 32,
370+ V_M2, f32, FPR32>;
371+ def VF32M4: GroupVTypeInfo<vfloat32m4_t, vfloat32m1_t, vbool8_t, 32,
372+ V_M4, f32, FPR32>;
373+ def VF32M8: GroupVTypeInfo<vfloat32m8_t, vfloat32m1_t, vbool4_t, 32,
374+ V_M8, f32, FPR32>;
375+
376+ def VF64M2: GroupVTypeInfo<vfloat64m2_t, vfloat64m1_t, vbool32_t, 64,
377+ V_M2, f64, FPR64>;
378+ def VF64M4: GroupVTypeInfo<vfloat64m4_t, vfloat64m1_t, vbool16_t, 64,
379+ V_M4, f64, FPR64>;
380+ def VF64M8: GroupVTypeInfo<vfloat64m8_t, vfloat64m1_t, vbool8_t, 64,
381+ V_M8, f64, FPR64>;
356382 }
357- def VF16M1: VTypeInfo<vfloat16m1_t, vbool16_t, 16, V_M1, f16, FPR16>;
358- def VF32M1: VTypeInfo<vfloat32m1_t, vbool32_t, 32, V_M1, f32, FPR32>;
359- def VF64M1: VTypeInfo<vfloat64m1_t, vbool64_t, 64, V_M1, f64, FPR64>;
360- def VBF16M1: VTypeInfo<vbfloat16m1_t, vbool16_t, 16, V_M1, bf16, FPR16>;
361383 }
362384
363- defset list<GroupVTypeInfo> GroupFloatVectors = {
364- def VF16M2: GroupVTypeInfo<vfloat16m2_t, vfloat16m1_t, vbool8_t, 16,
365- V_M2, f16, FPR16>;
366- def VF16M4: GroupVTypeInfo<vfloat16m4_t, vfloat16m1_t, vbool4_t, 16,
367- V_M4, f16, FPR16>;
368- def VF16M8: GroupVTypeInfo<vfloat16m8_t, vfloat16m1_t, vbool2_t, 16,
369- V_M8, f16, FPR16>;
370-
371- def VF32M2: GroupVTypeInfo<vfloat32m2_t, vfloat32m1_t, vbool16_t, 32,
372- V_M2, f32, FPR32>;
373- def VF32M4: GroupVTypeInfo<vfloat32m4_t, vfloat32m1_t, vbool8_t, 32,
374- V_M4, f32, FPR32>;
375- def VF32M8: GroupVTypeInfo<vfloat32m8_t, vfloat32m1_t, vbool4_t, 32,
376- V_M8, f32, FPR32>;
377-
378- def VF64M2: GroupVTypeInfo<vfloat64m2_t, vfloat64m1_t, vbool32_t, 64,
379- V_M2, f64, FPR64>;
380- def VF64M4: GroupVTypeInfo<vfloat64m4_t, vfloat64m1_t, vbool16_t, 64,
381- V_M4, f64, FPR64>;
382- def VF64M8: GroupVTypeInfo<vfloat64m8_t, vfloat64m1_t, vbool8_t, 64,
383- V_M8, f64, FPR64>;
384-
385- def VBF16M2: GroupVTypeInfo<vbfloat16m2_t, vbfloat16m1_t, vbool8_t, 16,
386- V_M2, bf16, FPR16>;
387- def VBF16M4: GroupVTypeInfo<vbfloat16m4_t, vbfloat16m1_t, vbool4_t, 16,
388- V_M4, bf16, FPR16>;
389- def VBF16M8: GroupVTypeInfo<vbfloat16m8_t, vbfloat16m1_t, vbool2_t, 16,
390- V_M8, bf16, FPR16>;
385+ defset list<VTypeInfo> AllBFloatVectors = {
386+ defset list<VTypeInfo> NoGroupBFloatVectors = {
387+ defset list<VTypeInfo> FractionalGroupBFloatVectors = {
388+ def VBF16MF4: VTypeInfo<vbfloat16mf4_t, vbool64_t, 16, V_MF4, bf16, FPR16>;
389+ def VBF16MF2: VTypeInfo<vbfloat16mf2_t, vbool32_t, 16, V_MF2, bf16, FPR16>;
390+ }
391+ def VBF16M1: VTypeInfo<vbfloat16m1_t, vbool16_t, 16, V_M1, bf16, FPR16>;
392+ }
393+
394+ defset list<GroupVTypeInfo> GroupBFloatVectors = {
395+ def VBF16M2: GroupVTypeInfo<vbfloat16m2_t, vbfloat16m1_t, vbool8_t, 16,
396+ V_M2, bf16, FPR16>;
397+ def VBF16M4: GroupVTypeInfo<vbfloat16m4_t, vbfloat16m1_t, vbool4_t, 16,
398+ V_M4, bf16, FPR16>;
399+ def VBF16M8: GroupVTypeInfo<vbfloat16m8_t, vbfloat16m1_t, vbool2_t, 16,
400+ V_M8, bf16, FPR16>;
401+ }
391402 }
392403 }
393404}
@@ -7143,31 +7154,32 @@ defm : VPatConversionVI_VF<"int_riscv_vfclass", "PseudoVFCLASS">;
71437154// We can use vmerge.vvm to support vector-vector vfmerge.
71447155// NOTE: Clang previously used int_riscv_vfmerge for vector-vector, but now uses
71457156// int_riscv_vmerge. Support both for compatibility.
7146- foreach vti = AllFloatVectors in {
7157+ foreach vti = AllFloatAndBFloatVectors in {
71477158 let Predicates = GetVTypeMinimalPredicates<vti>.Predicates in
71487159 defm : VPatBinaryCarryInTAIL<"int_riscv_vmerge", "PseudoVMERGE", "VVM",
71497160 vti.Vector,
71507161 vti.Vector, vti.Vector, vti.Mask,
71517162 vti.Log2SEW, vti.LMul, vti.RegClass,
71527163 vti.RegClass, vti.RegClass>;
7153- let Predicates = GetVTypePredicates<vti>.Predicates in
7154- defm : VPatBinaryCarryInTAIL<"int_riscv_vfmerge", "PseudoVFMERGE",
7155- "V"#vti.ScalarSuffix#"M",
7156- vti.Vector,
7157- vti.Vector, vti.Scalar, vti.Mask,
7158- vti.Log2SEW, vti.LMul, vti.RegClass,
7159- vti.RegClass, vti.ScalarRegClass>;
71607164}
71617165
71627166foreach fvti = AllFloatVectors in {
7163- defvar instr = !cast<Instruction>("PseudoVMERGE_VIM_"#fvti.LMul.MX);
7164- let Predicates = GetVTypePredicates<fvti>.Predicates in
7165- def : Pat<(fvti.Vector (int_riscv_vfmerge (fvti.Vector fvti.RegClass:$passthru),
7166- (fvti.Vector fvti.RegClass:$rs2),
7167- (fvti.Scalar (fpimm0)),
7168- (fvti.Mask VMV0:$vm), VLOpFrag)),
7169- (instr fvti.RegClass:$passthru, fvti.RegClass:$rs2, 0,
7170- (fvti.Mask VMV0:$vm), GPR:$vl, fvti.Log2SEW)>;
7167+ let Predicates = GetVTypePredicates<fvti>.Predicates in {
7168+ defm : VPatBinaryCarryInTAIL<"int_riscv_vfmerge", "PseudoVFMERGE",
7169+ "V"#fvti.ScalarSuffix#"M",
7170+ fvti.Vector,
7171+ fvti.Vector, fvti.Scalar, fvti.Mask,
7172+ fvti.Log2SEW, fvti.LMul, fvti.RegClass,
7173+ fvti.RegClass, fvti.ScalarRegClass>;
7174+
7175+ defvar instr = !cast<Instruction>("PseudoVMERGE_VIM_"#fvti.LMul.MX);
7176+ def : Pat<(fvti.Vector (int_riscv_vfmerge (fvti.Vector fvti.RegClass:$passthru),
7177+ (fvti.Vector fvti.RegClass:$rs2),
7178+ (fvti.Scalar (fpimm0)),
7179+ (fvti.Mask VMV0:$vm), VLOpFrag)),
7180+ (instr fvti.RegClass:$passthru, fvti.RegClass:$rs2, 0,
7181+ (fvti.Mask VMV0:$vm), GPR:$vl, fvti.Log2SEW)>;
7182+ }
71717183}
71727184
71737185//===----------------------------------------------------------------------===//
@@ -7328,33 +7340,27 @@ foreach vti = NoGroupIntegerVectors in {
73287340//===----------------------------------------------------------------------===//
73297341// 16.3. Vector Slide Instructions
73307342//===----------------------------------------------------------------------===//
7331- defm : VPatTernaryV_VX_VI<"int_riscv_vslideup", "PseudoVSLIDEUP", AllIntegerVectors, uimm5>;
7332- defm : VPatTernaryV_VX_VI<"int_riscv_vslidedown", "PseudoVSLIDEDOWN", AllIntegerVectors, uimm5>;
7343+ defm : VPatTernaryV_VX_VI<"int_riscv_vslideup", "PseudoVSLIDEUP", AllVectors, uimm5>;
7344+ defm : VPatTernaryV_VX_VI<"int_riscv_vslidedown", "PseudoVSLIDEDOWN", AllVectors, uimm5>;
7345+
73337346defm : VPatBinaryV_VX<"int_riscv_vslide1up", "PseudoVSLIDE1UP", AllIntegerVectors>;
73347347defm : VPatBinaryV_VX<"int_riscv_vslide1down", "PseudoVSLIDE1DOWN", AllIntegerVectors>;
73357348
7336- defm : VPatTernaryV_VX_VI<"int_riscv_vslideup", "PseudoVSLIDEUP", AllFloatVectors, uimm5>;
7337- defm : VPatTernaryV_VX_VI<"int_riscv_vslidedown", "PseudoVSLIDEDOWN", AllFloatVectors, uimm5>;
73387349defm : VPatBinaryV_VX<"int_riscv_vfslide1up", "PseudoVFSLIDE1UP", AllFloatVectors>;
73397350defm : VPatBinaryV_VX<"int_riscv_vfslide1down", "PseudoVFSLIDE1DOWN", AllFloatVectors>;
73407351
73417352//===----------------------------------------------------------------------===//
73427353// 16.4. Vector Register Gather Instructions
73437354//===----------------------------------------------------------------------===//
73447355defm : VPatBinaryV_VV_VX_VI_INT<"int_riscv_vrgather", "PseudoVRGATHER",
7345- AllIntegerVectors , uimm5>;
7356+ AllVectors , uimm5>;
73467357defm : VPatBinaryV_VV_INT_EEW<"int_riscv_vrgatherei16_vv", "PseudoVRGATHEREI16",
7347- eew=16, vtilist=AllIntegerVectors >;
7358+ eew=16, vtilist=AllVectors >;
73487359
7349- defm : VPatBinaryV_VV_VX_VI_INT<"int_riscv_vrgather", "PseudoVRGATHER",
7350- AllFloatVectors, uimm5>;
7351- defm : VPatBinaryV_VV_INT_EEW<"int_riscv_vrgatherei16_vv", "PseudoVRGATHEREI16",
7352- eew=16, vtilist=AllFloatVectors>;
73537360//===----------------------------------------------------------------------===//
73547361// 16.5. Vector Compress Instruction
73557362//===----------------------------------------------------------------------===//
7356- defm : VPatUnaryV_V_AnyMask<"int_riscv_vcompress", "PseudoVCOMPRESS", AllIntegerVectors>;
7357- defm : VPatUnaryV_V_AnyMask<"int_riscv_vcompress", "PseudoVCOMPRESS", AllFloatVectors>;
7363+ defm : VPatUnaryV_V_AnyMask<"int_riscv_vcompress", "PseudoVCOMPRESS", AllVectors>;
73587364
73597365// Include the non-intrinsic ISel patterns
73607366include "RISCVInstrInfoVVLPatterns.td"
0 commit comments