diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td @@ -60,7 +60,7 @@ class FPCmpH_rr funct3, string opcodestr> : RVInstR<0b1010010, funct3, OPC_OP_FP, (outs GPR:$rd), (ins FPR16:$rs1, FPR16:$rs2), opcodestr, "$rd, $rs1, $rs2">, - Sched<[]>; + Sched<[WriteFCmp16, ReadFCmp16, ReadFCmp16]>; //===----------------------------------------------------------------------===// // Instructions @@ -71,7 +71,7 @@ def FLH : RVInstI<0b001, OPC_LOAD_FP, (outs FPR16:$rd), (ins GPR:$rs1, simm12:$imm12), "flh", "$rd, ${imm12}(${rs1})">, - Sched<[]>; + Sched<[WriteFLD16, ReadFMemBase]>; // Operands for stores are in the order srcreg, base, offset rather than // reflecting the order these fields are specified in the instruction @@ -80,94 +80,93 @@ def FSH : RVInstS<0b001, OPC_STORE_FP, (outs), (ins FPR16:$rs2, GPR:$rs1, simm12:$imm12), "fsh", "$rs2, ${imm12}(${rs1})">, - Sched<[]>; + Sched<[WriteFST16, ReadStoreData, ReadFMemBase]>; def FMADD_H : FPFMAH_rrr_frm, - Sched<[]>; + Sched<[WriteFMulAdd16, ReadFMulAdd16, ReadFMulAdd16, ReadFMulAdd16]>; def : FPFMAHDynFrmAlias; def FMSUB_H : FPFMAH_rrr_frm, - Sched<[]>; + Sched<[WriteFMulSub16, ReadFMulSub16, ReadFMulSub16, ReadFMulSub16]>; def : FPFMAHDynFrmAlias; def FNMSUB_H : FPFMAH_rrr_frm, - Sched<[]>; + Sched<[WriteFMulSub16, ReadFMulSub16, ReadFMulSub16, ReadFMulSub16]>; def : FPFMAHDynFrmAlias; def FNMADD_H : FPFMAH_rrr_frm, - Sched<[]>; + Sched<[WriteFMulAdd16, ReadFMulAdd16, ReadFMulAdd16, ReadFMulAdd16]>; def : FPFMAHDynFrmAlias; def FADD_H : FPALUH_rr_frm<0b0000010, "fadd.h">, - Sched<[]>; + Sched<[WriteFALU16, ReadFALU16, ReadFALU16]>; def : FPALUHDynFrmAlias; def FSUB_H : FPALUH_rr_frm<0b0000110, "fsub.h">, - Sched<[]>; + Sched<[WriteFALU16, ReadFALU16, ReadFALU16]>; def : FPALUHDynFrmAlias; def FMUL_H : FPALUH_rr_frm<0b0001010, "fmul.h">, - Sched<[]>; + Sched<[WriteFMul16, ReadFMul16, ReadFMul16]>; def : FPALUHDynFrmAlias; def FDIV_H : FPALUH_rr_frm<0b0001110, "fdiv.h">, - Sched<[]>; + Sched<[WriteFDiv16, ReadFDiv16, ReadFDiv16]>; def : FPALUHDynFrmAlias; def FSQRT_H : FPUnaryOp_r_frm<0b0101110, FPR16, FPR16, "fsqrt.h">, - Sched<[]> { + Sched<[WriteFSqrt16, ReadFSqrt16]> { let rs2 = 0b00000; } def : FPUnaryOpDynFrmAlias; def FSGNJ_H : FPALUH_rr<0b0010010, 0b000, "fsgnj.h">, - Sched<[]>; + Sched<[WriteFSGNJ16, ReadFSGNJ16, ReadFSGNJ16]>; def FSGNJN_H : FPALUH_rr<0b0010010, 0b001, "fsgnjn.h">, - Sched<[]>; + Sched<[WriteFSGNJ16, ReadFSGNJ16, ReadFSGNJ16]>; def FSGNJX_H : FPALUH_rr<0b0010010, 0b010, "fsgnjx.h">, - Sched<[]>; - + Sched<[WriteFSGNJ16, ReadFSGNJ16, ReadFSGNJ16]>; def FMIN_H : FPALUH_rr<0b0010110, 0b000, "fmin.h">, - Sched<[]>; + Sched<[WriteFMinMax16, ReadFMinMax16, ReadFMinMax16]>; def FMAX_H : FPALUH_rr<0b0010110, 0b001, "fmax.h">, - Sched<[]>; + Sched<[WriteFMinMax16, ReadFMinMax16, ReadFMinMax16]>; def FCVT_W_H : FPUnaryOp_r_frm<0b1100010, GPR, FPR16, "fcvt.w.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToI32, ReadFCvtF16ToI32]> { let rs2 = 0b00000; } def : FPUnaryOpDynFrmAlias; def FCVT_WU_H : FPUnaryOp_r_frm<0b1100010, GPR, FPR16, "fcvt.wu.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToI32, ReadFCvtF16ToI32]> { let rs2 = 0b00001; } def : FPUnaryOpDynFrmAlias; def FCVT_H_W : FPUnaryOp_r_frm<0b1101010, FPR16, GPR, "fcvt.h.w">, - Sched<[]> { + Sched<[WriteFCvtI32ToF16, ReadFCvtI32ToF16]> { let rs2 = 0b00000; } def : FPUnaryOpDynFrmAlias; def FCVT_H_WU : FPUnaryOp_r_frm<0b1101010, FPR16, GPR, "fcvt.h.wu">, - Sched<[]> { + Sched<[WriteFCvtI32ToF16, ReadFCvtI32ToF16]> { let rs2 = 0b00001; } def : FPUnaryOpDynFrmAlias; def FCVT_H_S : FPUnaryOp_r_frm<0b0100010, FPR16, FPR32, "fcvt.h.s">, - Sched<[]> { + Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]> { let rs2 = 0b00000; } def : FPUnaryOpDynFrmAlias; def FCVT_S_H : FPUnaryOp_r<0b0100000, 0b000, FPR32, FPR16, "fcvt.s.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]> { let rs2 = 0b00010; } def FMV_X_H : FPUnaryOp_r<0b1110010, 0b000, GPR, FPR16, "fmv.x.h">, - Sched<[]> { + Sched<[WriteFMovF16ToI16, ReadFMovF16ToI16]> { let rs2 = 0b00000; } def FMV_H_X : FPUnaryOp_r<0b1111010, 0b000, FPR16, GPR, "fmv.h.x">, - Sched<[]> { + Sched<[WriteFMovI16ToF16, ReadFMovI16ToF16]> { let rs2 = 0b00000; } @@ -176,32 +175,32 @@ def FLE_H : FPCmpH_rr<0b000, "fle.h">; def FCLASS_H : FPUnaryOp_r<0b1110010, 0b001, GPR, FPR16, "fclass.h">, - Sched<[]> { + Sched<[WriteFClass16, ReadFClass16]> { let rs2 = 0b00000; } } // Predicates = [HasStdExtZfh] let Predicates = [HasStdExtZfh, IsRV64] in { def FCVT_L_H : FPUnaryOp_r_frm<0b1100010, GPR, FPR16, "fcvt.l.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToI64, ReadFCvtF16ToI64]> { let rs2 = 0b00010; } def : FPUnaryOpDynFrmAlias; def FCVT_LU_H : FPUnaryOp_r_frm<0b1100010, GPR, FPR16, "fcvt.lu.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToI64, ReadFCvtF16ToI64]> { let rs2 = 0b00011; } def : FPUnaryOpDynFrmAlias; def FCVT_H_L : FPUnaryOp_r_frm<0b1101010, FPR16, GPR, "fcvt.h.l">, - Sched<[]> { + Sched<[WriteFCvtI64ToF16, ReadFCvtI64ToF16]> { let rs2 = 0b00010; } def : FPUnaryOpDynFrmAlias; def FCVT_H_LU : FPUnaryOp_r_frm<0b1101010, FPR16, GPR, "fcvt.h.lu">, - Sched<[]> { + Sched<[WriteFCvtI64ToF16, ReadFCvtI64ToF16]> { let rs2 = 0b00011; } def : FPUnaryOpDynFrmAlias; @@ -209,13 +208,13 @@ let Predicates = [HasStdExtZfh, HasStdExtD] in { def FCVT_H_D : FPUnaryOp_r_frm<0b0100010, FPR16, FPR64, "fcvt.h.d">, - Sched<[]> { + Sched<[WriteFCvtF64ToF16, ReadFCvtF64ToF16]> { let rs2 = 0b00001; } def : FPUnaryOpDynFrmAlias; def FCVT_D_H : FPUnaryOp_r<0b0100001, 0b000, FPR64, FPR16, "fcvt.d.h">, - Sched<[]> { + Sched<[WriteFCvtF16ToF64, ReadFCvtF16ToF64]> { let rs2 = 0b00010; } } // Predicates = [HasStdExtZfh, HasStdExtD] diff --git a/llvm/lib/Target/RISCV/RISCVSchedRocket.td b/llvm/lib/Target/RISCV/RISCVSchedRocket.td --- a/llvm/lib/Target/RISCV/RISCVSchedRocket.td +++ b/llvm/lib/Target/RISCV/RISCVSchedRocket.td @@ -234,4 +234,51 @@ def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; + +// Zfh is unsupported +let Unsupported = true in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; + +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +} // Unsupported = true } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -223,4 +223,51 @@ def : ReadAdvance; def : ReadAdvance; def : ReadAdvance; + +// Zfh is unsupported +let Unsupported = true in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; + +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +def : ReadAdvance; +} // Unsupported = true } diff --git a/llvm/lib/Target/RISCV/RISCVSchedule.td b/llvm/lib/Target/RISCV/RISCVSchedule.td --- a/llvm/lib/Target/RISCV/RISCVSchedule.td +++ b/llvm/lib/Target/RISCV/RISCVSchedule.td @@ -38,26 +38,36 @@ def WriteAtomicLDD : SchedWrite; // Atomic load double word def WriteAtomicSTW : SchedWrite; // Atomic store word def WriteAtomicSTD : SchedWrite; // Atomic store double word +def WriteFALU16 : SchedWrite; // FP 16-bit computation def WriteFALU32 : SchedWrite; // FP 32-bit computation def WriteFALU64 : SchedWrite; // FP 64-bit computation +def WriteFMul16 : SchedWrite; // 16-bit floating point multiply +def WriteFMulAdd16 : SchedWrite; // 16-bit floating point multiply add +def WriteFMulSub16 : SchedWrite; // 16-bit floating point multiply sub def WriteFMul32 : SchedWrite; // 32-bit floating point multiply def WriteFMulAdd32 : SchedWrite; // 32-bit floating point multiply add def WriteFMulSub32 : SchedWrite; // 32-bit floating point multiply sub def WriteFMul64 : SchedWrite; // 64-bit floating point multiply -def WriteFMulAdd64 : SchedWrite; // 64-bit floating point multiply add +def WriteFMulAdd64 : SchedWrite; // 64-bit floating point multiply add def WriteFMulSub64 : SchedWrite; // 64-bit floating point multiply sub +def WriteFDiv16 : SchedWrite; // 16-bit floating point divide def WriteFDiv32 : SchedWrite; // 32-bit floating point divide def WriteFDiv64 : SchedWrite; // 64-bit floating point divide +def WriteFSqrt16 : SchedWrite; // 16-bit floating point sqrt def WriteFSqrt32 : SchedWrite; // 32-bit floating point sqrt def WriteFSqrt64 : SchedWrite; // 64-bit floating point sqrt // Integer to float conversions +def WriteFCvtI32ToF16 : SchedWrite; def WriteFCvtI32ToF32 : SchedWrite; def WriteFCvtI32ToF64 : SchedWrite; +def WriteFCvtI64ToF16 : SchedWrite; // RV64I only def WriteFCvtI64ToF32 : SchedWrite; // RV64I only def WriteFCvtI64ToF64 : SchedWrite; // RV64I only //Float to integer conversions +def WriteFCvtF16ToI32 : SchedWrite; +def WriteFCvtF16ToI64 : SchedWrite; // RV64I only def WriteFCvtF32ToI32 : SchedWrite; def WriteFCvtF32ToI64 : SchedWrite; // RV64I only def WriteFCvtF64ToI32 : SchedWrite; @@ -66,23 +76,35 @@ // Float to float conversions def WriteFCvtF32ToF64 : SchedWrite; def WriteFCvtF64ToF32 : SchedWrite; +def WriteFCvtF16ToF32 : SchedWrite; +def WriteFCvtF32ToF16 : SchedWrite; +def WriteFCvtF16ToF64 : SchedWrite; +def WriteFCvtF64ToF16 : SchedWrite; +def WriteFClass16 : SchedWrite; // 16-bit floating point classify def WriteFClass32 : SchedWrite; // 32-bit floating point classify def WriteFClass64 : SchedWrite; // 64-bit floating point classify +def WriteFCmp16 : SchedWrite; // 16-bit floating point compare def WriteFCmp32 : SchedWrite; // 32-bit floating point compare def WriteFCmp64 : SchedWrite; // 64-bit floating point compare +def WriteFSGNJ16 : SchedWrite; // 16-bit floating point sign-injection def WriteFSGNJ32 : SchedWrite; // 32-bit floating point sign-injection def WriteFSGNJ64 : SchedWrite; // 64-bit floating point sign-injection +def WriteFMinMax16 : SchedWrite; // 16-bit floating point min or max def WriteFMinMax32 : SchedWrite; // 32-bit floating point min or max def WriteFMinMax64 : SchedWrite; // 64-bit floating point min or max +def WriteFMovF16ToI16 : SchedWrite; +def WriteFMovI16ToF16 : SchedWrite; def WriteFMovF32ToI32 : SchedWrite; def WriteFMovI32ToF32 : SchedWrite; def WriteFMovF64ToI64 : SchedWrite; // RV64I only def WriteFMovI64ToF64 : SchedWrite; // RV64I only +def WriteFLD16 : SchedWrite; // Floating point sp load def WriteFLD32 : SchedWrite; // Floating point sp load def WriteFLD64 : SchedWrite; // Floating point dp load +def WriteFST16 : SchedWrite; // Floating point sp store def WriteFST32 : SchedWrite; // Floating point sp store def WriteFST64 : SchedWrite; // Floating point dp store @@ -111,37 +133,57 @@ def ReadAtomicLDD : SchedRead; // Atomic load double word def ReadAtomicSTW : SchedRead; // Atomic store word def ReadAtomicSTD : SchedRead; // Atomic store double word +def ReadFALU16 : SchedRead; // FP 16-bit computation def ReadFALU32 : SchedRead; // FP 32-bit computation def ReadFALU64 : SchedRead; // FP 64-bit computation +def ReadFMul16 : SchedRead; // 16-bit floating point multiply +def ReadFMulAdd16 : SchedRead; // 16-bit floating point multiply add +def ReadFMulSub16 : SchedRead; // 16-bit floating point multiply sub def ReadFMul32 : SchedRead; // 32-bit floating point multiply def ReadFMulAdd32 : SchedRead; // 32-bit floating point multiply add def ReadFMulSub32 : SchedRead; // 32-bit floating point multiply sub def ReadFMul64 : SchedRead; // 64-bit floating point multiply def ReadFMulAdd64 : SchedRead; // 64-bit floating point multiply add def ReadFMulSub64 : SchedRead; // 64-bit floating point multiply sub +def ReadFDiv16 : SchedRead; // 16-bit floating point divide def ReadFDiv32 : SchedRead; // 32-bit floating point divide def ReadFDiv64 : SchedRead; // 64-bit floating point divide +def ReadFSqrt16 : SchedRead; // 16-bit floating point sqrt def ReadFSqrt32 : SchedRead; // 32-bit floating point sqrt def ReadFSqrt64 : SchedRead; // 64-bit floating point sqrt +def ReadFCmp16 : SchedRead; def ReadFCmp32 : SchedRead; def ReadFCmp64 : SchedRead; +def ReadFSGNJ16 : SchedRead; def ReadFSGNJ32 : SchedRead; def ReadFSGNJ64 : SchedRead; +def ReadFMinMax16 : SchedRead; def ReadFMinMax32 : SchedRead; def ReadFMinMax64 : SchedRead; +def ReadFCvtF16ToI32 : SchedRead; +def ReadFCvtF16ToI64 : SchedRead; def ReadFCvtF32ToI32 : SchedRead; def ReadFCvtF32ToI64 : SchedRead; def ReadFCvtF64ToI32 : SchedRead; def ReadFCvtF64ToI64 : SchedRead; +def ReadFCvtI32ToF16 : SchedRead; def ReadFCvtI32ToF32 : SchedRead; def ReadFCvtI32ToF64 : SchedRead; +def ReadFCvtI64ToF16 : SchedRead; def ReadFCvtI64ToF32 : SchedRead; def ReadFCvtI64ToF64 : SchedRead; +def ReadFMovF16ToI16 : SchedRead; +def ReadFMovI16ToF16 : SchedRead; def ReadFMovF32ToI32 : SchedRead; def ReadFMovI32ToF32 : SchedRead; def ReadFMovF64ToI64 : SchedRead; def ReadFMovI64ToF64 : SchedRead; def ReadFCvtF32ToF64 : SchedRead; def ReadFCvtF64ToF32 : SchedRead; +def ReadFCvtF16ToF32 : SchedRead; +def ReadFCvtF32ToF16 : SchedRead; +def ReadFCvtF16ToF64 : SchedRead; +def ReadFCvtF64ToF16 : SchedRead; +def ReadFClass16 : SchedRead; def ReadFClass32 : SchedRead; def ReadFClass64 : SchedRead;