Skip to content

Commit 9c3c0e3

Browse files
authored
[RISCV] Separate addend from FMA operands to support cascade FMA. NFC. (#70241)
This PR separate addend from FMA operands to support cascade FMA. In some microarchitectures (e.g., ARM cortex-a72 and XiangShan-NanHu), FP multiply-accumulate pipelines support late-forwarding of accumulate operands, which reduces the latency of a sequence of multiply-accumulate instructions. See also #70232.
1 parent 13ea114 commit 9c3c0e3

7 files changed

+13
-3
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def FSD : FPStore_r<0b011, "fsd", FPR64, WriteFST64>;
7878
} // Predicates = [HasStdExtD]
7979

8080
foreach Ext = DExts in {
81-
let SchedRW = [WriteFMA64, ReadFMA64, ReadFMA64, ReadFMA64] in {
81+
let SchedRW = [WriteFMA64, ReadFMA64, ReadFMA64, ReadFMA64Addend] in {
8282
defm FMADD_D : FPFMA_rrr_frm_m<OPC_MADD, 0b01, "fmadd.d", Ext>;
8383
defm FMSUB_D : FPFMA_rrr_frm_m<OPC_MSUB, 0b01, "fmsub.d", Ext>;
8484
defm FNMSUB_D : FPFMA_rrr_frm_m<OPC_NMSUB, 0b01, "fnmsub.d", Ext>;

llvm/lib/Target/RISCV/RISCVInstrInfoF.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ def FSW : FPStore_r<0b010, "fsw", FPR32, WriteFST32>;
302302
} // Predicates = [HasStdExtF]
303303

304304
foreach Ext = FExts in {
305-
let SchedRW = [WriteFMA32, ReadFMA32, ReadFMA32, ReadFMA32] in {
305+
let SchedRW = [WriteFMA32, ReadFMA32, ReadFMA32, ReadFMA32Addend] in {
306306
defm FMADD_S : FPFMA_rrr_frm_m<OPC_MADD, 0b00, "fmadd.s", Ext>;
307307
defm FMSUB_S : FPFMA_rrr_frm_m<OPC_MSUB, 0b00, "fmsub.s", Ext>;
308308
defm FNMSUB_S : FPFMA_rrr_frm_m<OPC_NMSUB, 0b00, "fnmsub.s", Ext>;

llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def FSH : FPStore_r<0b001, "fsh", FPR16, WriteFST16>;
8585
} // Predicates = [HasHalfFPLoadStoreMove]
8686

8787
foreach Ext = ZfhExts in {
88-
let SchedRW = [WriteFMA16, ReadFMA16, ReadFMA16, ReadFMA16] in {
88+
let SchedRW = [WriteFMA16, ReadFMA16, ReadFMA16, ReadFMA16Addend] in {
8989
defm FMADD_H : FPFMA_rrr_frm_m<OPC_MADD, 0b10, "fmadd.h", Ext>;
9090
defm FMSUB_H : FPFMA_rrr_frm_m<OPC_MSUB, 0b10, "fmsub.h", Ext>;
9191
defm FNMSUB_H : FPFMA_rrr_frm_m<OPC_NMSUB, 0b10, "fnmsub.h", Ext>;

llvm/lib/Target/RISCV/RISCVSchedRocket.td

+2
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,9 @@ def : ReadAdvance<ReadFAdd64, 0>;
206206
def : ReadAdvance<ReadFMul32, 0>;
207207
def : ReadAdvance<ReadFMul64, 0>;
208208
def : ReadAdvance<ReadFMA32, 0>;
209+
def : ReadAdvance<ReadFMA32Addend, 0>;
209210
def : ReadAdvance<ReadFMA64, 0>;
211+
def : ReadAdvance<ReadFMA64Addend, 0>;
210212
def : ReadAdvance<ReadFDiv32, 0>;
211213
def : ReadAdvance<ReadFDiv64, 0>;
212214
def : ReadAdvance<ReadFSqrt32, 0>;

llvm/lib/Target/RISCV/RISCVSchedSiFive7.td

+3
Original file line numberDiff line numberDiff line change
@@ -933,10 +933,13 @@ def : ReadAdvance<ReadFAdd32, 0>;
933933
def : ReadAdvance<ReadFAdd64, 0>;
934934
def : ReadAdvance<ReadFMul16, 0>;
935935
def : ReadAdvance<ReadFMA16, 0>;
936+
def : ReadAdvance<ReadFMA16Addend, 0>;
936937
def : ReadAdvance<ReadFMul32, 0>;
937938
def : ReadAdvance<ReadFMul64, 0>;
938939
def : ReadAdvance<ReadFMA32, 0>;
940+
def : ReadAdvance<ReadFMA32Addend, 0>;
939941
def : ReadAdvance<ReadFMA64, 0>;
942+
def : ReadAdvance<ReadFMA64Addend, 0>;
940943
def : ReadAdvance<ReadFDiv16, 0>;
941944
def : ReadAdvance<ReadFDiv32, 0>;
942945
def : ReadAdvance<ReadFDiv64, 0>;

llvm/lib/Target/RISCV/RISCVSchedSyntacoreSCR1.td

+2
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ def : ReadAdvance<ReadFAdd64, 0>;
164164
def : ReadAdvance<ReadFMul32, 0>;
165165
def : ReadAdvance<ReadFMul64, 0>;
166166
def : ReadAdvance<ReadFMA32, 0>;
167+
def : ReadAdvance<ReadFMA32Addend, 0>;
167168
def : ReadAdvance<ReadFMA64, 0>;
169+
def : ReadAdvance<ReadFMA64Addend, 0>;
168170
def : ReadAdvance<ReadFDiv32, 0>;
169171
def : ReadAdvance<ReadFDiv64, 0>;
170172
def : ReadAdvance<ReadFSqrt32, 0>;

llvm/lib/Target/RISCV/RISCVSchedule.td

+3
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,11 @@ def ReadFMul16 : SchedRead; // 16-bit floating point multiply
150150
def ReadFMul32 : SchedRead; // 32-bit floating point multiply
151151
def ReadFMul64 : SchedRead; // 64-bit floating point multiply
152152
def ReadFMA16 : SchedRead; // 16-bit floating point fused multiply-add
153+
def ReadFMA16Addend : SchedRead; // 16-bit floating point fused multiply-add (addend)
153154
def ReadFMA32 : SchedRead; // 32-bit floating point fused multiply-add
155+
def ReadFMA32Addend : SchedRead; // 32-bit floating point fused multiply-add (addend)
154156
def ReadFMA64 : SchedRead; // 64-bit floating point fused multiply-add
157+
def ReadFMA64Addend : SchedRead; // 64-bit floating point fused multiply-add (addend)
155158
def ReadFDiv16 : SchedRead; // 16-bit floating point divide
156159
def ReadFDiv32 : SchedRead; // 32-bit floating point divide
157160
def ReadFDiv64 : SchedRead; // 64-bit floating point divide

0 commit comments

Comments
 (0)