diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -2345,7 +2345,7 @@ multiclass VPseudoVSQR_V { foreach m = MxListF in { defvar mx = m.MX; - defvar sews = SchedSEWSet.val; + defvar sews = SchedSEWSetF.val; let VLMul = m.value in foreach e = sews in { @@ -2700,7 +2700,7 @@ multiclass VPseudoVFDIV_VV_VF { foreach m = MxListF in { defvar mx = m.MX; - defvar sews = SchedSEWSet.val; + defvar sews = SchedSEWSetF.val; foreach e = sews in { defvar WriteVFDivV_MX_E = !cast("WriteVFDivV_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); @@ -2713,7 +2713,7 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar sews = SchedSEWSet.val; + defvar sews = SchedSEWSetF.val; foreach e = sews in { defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); @@ -2730,7 +2730,7 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar sews = SchedSEWSet.val; + defvar sews = SchedSEWSetF.val; foreach e = sews in { defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); diff --git a/llvm/lib/Target/RISCV/RISCVScheduleV.td b/llvm/lib/Target/RISCV/RISCVScheduleV.td --- a/llvm/lib/Target/RISCV/RISCVScheduleV.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleV.td @@ -13,8 +13,10 @@ // Used for widening and narrowing instructions as it doesn't contain M8. defvar SchedMxListW = !listremove(SchedMxList, ["M8"]); defvar SchedMxListFW = !listremove(SchedMxList, ["M8", "MF8"]); +// Used for floating-point as it doesn't contain MF8. +defvar SchedMxListF = !listremove(SchedMxList, ["MF8"]); // Used for widening floating-point Reduction as it doesn't contain MF8. -defvar SchedMxListFWRed = !listremove(SchedMxList, ["MF8"]); +defvar SchedMxListFWRed = SchedMxListF; class SchedSEWSet { list val = !cond(!eq(mx, "M1"): [8, 16, 32, 64], @@ -26,6 +28,16 @@ !eq(mx, "MF8"): [8]); } +// For floating-point instructions, SEW won't be 8. +class SchedSEWSetF { + list val = !cond(!eq(mx, "M1"): [16, 32, 64], + !eq(mx, "M2"): [16, 32, 64], + !eq(mx, "M4"): [16, 32, 64], + !eq(mx, "M8"): [16, 32, 64], + !eq(mx, "MF2"): [16, 32], + !eq(mx, "MF4"): [16]); +} + // Define multiclasses to define SchedWrite, SchedRead, WriteRes, and // ReadAdvance for each (name, LMUL) pair and for each LMUL in each of the // SchedMxList variants above. Each multiclass is responsible for defining @@ -64,32 +76,33 @@ // ReadAdvance for each (name, LMUL, SEW) tuple for each LMUL in each of the // SchedMxList variants above. Each multiclass is responsible for defining // a record that represents the WorseCase behavior for name. -multiclass LMULSEWSchedWritesImpl MxList> { +multiclass LMULSEWSchedWritesImpl MxList, bit isF = 0> { def name # "_WorstCase" : SchedWrite; foreach mx = MxList in { - foreach sew = SchedSEWSet.val in + foreach sew = !if(isF, SchedSEWSetF.val, SchedSEWSet.val) in def name # "_" # mx # "_E" # sew : SchedWrite; } } -multiclass LMULSEWSchedReadsImpl MxList> { +multiclass LMULSEWSchedReadsImpl MxList, bit isF = 0> { def name # "_WorstCase" : SchedRead; foreach mx = MxList in { - foreach sew = SchedSEWSet.val in + foreach sew = !if(isF, SchedSEWSetF.val, SchedSEWSet.val) in def name # "_" # mx # "_E" # sew : SchedRead; } } -multiclass LMULSEWWriteResImpl resources> { +multiclass LMULSEWWriteResImpl resources, + bit isF = 0> { def : WriteRes(name # "_WorstCase"), resources>; - foreach mx = SchedMxList in { - foreach sew = SchedSEWSet.val in - def : WriteRes(name # "_" # mx # "_E" # sew), resources>; + foreach mx = !if(isF, SchedMxListF, SchedMxList) in { + foreach sew = !if(isF, SchedSEWSetF.val, SchedSEWSet.val) in + def : WriteRes(name # "_" # mx # "_E" # sew), resources>; } } -multiclass LMULSEWReadAdvanceImpl writes = []> { +multiclass LMULSEWReadAdvanceImpl writes = [], + bit isF = 0> { def : ReadAdvance(name # "_WorstCase"), val, writes>; - foreach mx = SchedMxList in { - foreach sew = SchedSEWSet.val in + foreach mx = !if(isF, SchedMxListF, SchedMxList) in { + foreach sew = !if(isF, SchedSEWSetF.val, SchedSEWSet.val) in def : ReadAdvance(name # "_" # mx # "_E" # sew), val, writes>; } } @@ -124,6 +137,13 @@ multiclass LMULSEWReadAdvance writes = []> : LMULSEWReadAdvanceImpl; +multiclass LMULSEWSchedWritesF : LMULSEWSchedWritesImpl; +multiclass LMULSEWSchedReadsF : LMULSEWSchedReadsImpl; +multiclass LMULSEWWriteResF resources> + : LMULSEWWriteResImpl; +multiclass LMULSEWReadAdvanceF writes = []> + : LMULSEWReadAdvanceImpl; + multiclass LMULSchedWritesW : LMULSchedWritesImpl; multiclass LMULSchedReadsW : LMULSchedReadsImpl; multiclass LMULWriteResW resources> @@ -296,8 +316,8 @@ // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions defm "" : LMULSchedWrites<"WriteVFMulV">; defm "" : LMULSchedWrites<"WriteVFMulF">; -defm "" : LMULSEWSchedWrites<"WriteVFDivV">; -defm "" : LMULSEWSchedWrites<"WriteVFDivF">; +defm "" : LMULSEWSchedWritesF<"WriteVFDivV">; +defm "" : LMULSEWSchedWritesF<"WriteVFDivF">; // 13.5. Vector Widening Floating-Point Multiply defm "" : LMULSchedWritesFW<"WriteVFWMulV">; defm "" : LMULSchedWritesFW<"WriteVFWMulF">; @@ -308,7 +328,7 @@ defm "" : LMULSchedWritesFW<"WriteVFWMulAddV">; defm "" : LMULSchedWritesFW<"WriteVFWMulAddF">; // 13.8. Vector Floating-Point Square-Root Instruction -defm "" : LMULSEWSchedWrites<"WriteVFSqrtV">; +defm "" : LMULSEWSchedWritesF<"WriteVFSqrtV">; // 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction // 13.10. Vector Floating-Point Reciprocal Estimate Instruction defm "" : LMULSchedWrites<"WriteVFRecpV">; @@ -515,8 +535,8 @@ // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions defm "" : LMULSchedReads<"ReadVFMulV">; defm "" : LMULSchedReads<"ReadVFMulF">; -defm "" : LMULSEWSchedReads<"ReadVFDivV">; -defm "" : LMULSEWSchedReads<"ReadVFDivF">; +defm "" : LMULSEWSchedReadsF<"ReadVFDivV">; +defm "" : LMULSEWSchedReadsF<"ReadVFDivF">; // 13.5. Vector Widening Floating-Point Multiply defm "" : LMULSchedReadsFW<"ReadVFWMulV">; defm "" : LMULSchedReadsFW<"ReadVFWMulF">; @@ -527,7 +547,7 @@ defm "" : LMULSchedReadsFW<"ReadVFWMulAddV">; defm "" : LMULSchedReadsFW<"ReadVFWMulAddF">; // 13.8. Vector Floating-Point Square-Root Instruction -defm "" : LMULSEWSchedReads<"ReadVFSqrtV">; +defm "" : LMULSEWSchedReadsF<"ReadVFSqrtV">; // 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction // 13.10. Vector Floating-Point Reciprocal Estimate Instruction defm "" : LMULSchedReads<"ReadVFRecpV">; @@ -748,15 +768,15 @@ defm "" : LMULWriteResFW<"WriteVFWALUF", []>; defm "" : LMULWriteRes<"WriteVFMulV", []>; defm "" : LMULWriteRes<"WriteVFMulF", []>; -defm "" : LMULSEWWriteRes<"WriteVFDivV", []>; -defm "" : LMULSEWWriteRes<"WriteVFDivF", []>; +defm "" : LMULSEWWriteResF<"WriteVFDivV", []>; +defm "" : LMULSEWWriteResF<"WriteVFDivF", []>; defm "" : LMULWriteResFW<"WriteVFWMulV", []>; defm "" : LMULWriteResFW<"WriteVFWMulF", []>; defm "" : LMULWriteRes<"WriteVFMulAddV", []>; defm "" : LMULWriteRes<"WriteVFMulAddF", []>; defm "" : LMULWriteResFW<"WriteVFWMulAddV", []>; defm "" : LMULWriteResFW<"WriteVFWMulAddF", []>; -defm "" : LMULSEWWriteRes<"WriteVFSqrtV", []>; +defm "" : LMULSEWWriteResF<"WriteVFSqrtV", []>; defm "" : LMULWriteRes<"WriteVFRecpV", []>; defm "" : LMULWriteRes<"WriteVFCmpV", []>; defm "" : LMULWriteRes<"WriteVFCmpF", []>; @@ -898,15 +918,15 @@ defm "" : LMULReadAdvanceFW<"ReadVFWALUF", 0>; defm "" : LMULReadAdvance<"ReadVFMulV", 0>; defm "" : LMULReadAdvance<"ReadVFMulF", 0>; -defm "" : LMULSEWReadAdvance<"ReadVFDivV", 0>; -defm "" : LMULSEWReadAdvance<"ReadVFDivF", 0>; +defm "" : LMULSEWReadAdvanceF<"ReadVFDivV", 0>; +defm "" : LMULSEWReadAdvanceF<"ReadVFDivF", 0>; defm "" : LMULReadAdvanceFW<"ReadVFWMulV", 0>; defm "" : LMULReadAdvanceFW<"ReadVFWMulF", 0>; defm "" : LMULReadAdvance<"ReadVFMulAddV", 0>; defm "" : LMULReadAdvance<"ReadVFMulAddF", 0>; defm "" : LMULReadAdvanceFW<"ReadVFWMulAddV", 0>; defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>; -defm "" : LMULSEWReadAdvance<"ReadVFSqrtV", 0>; +defm "" : LMULSEWReadAdvanceF<"ReadVFSqrtV", 0>; defm "" : LMULReadAdvance<"ReadVFRecpV", 0>; defm "" : LMULReadAdvance<"ReadVFCmpV", 0>; defm "" : LMULReadAdvance<"ReadVFCmpF", 0>;