diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 8525b5fef599aa..b43cbe4744c1d5 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -224,6 +224,7 @@ class RISCVAsmParser : public MCTargetAsmParser { } std::unique_ptr defaultMaskRegOp() const; + std::unique_ptr defaultFRMArgOp() const; public: enum RISCVMatchResultTy { @@ -2639,6 +2640,11 @@ std::unique_ptr RISCVAsmParser::defaultMaskRegOp() const { llvm::SMLoc(), isRV64()); } +std::unique_ptr RISCVAsmParser::defaultFRMArgOp() const { + return RISCVOperand::createFRMArg(RISCVFPRndMode::RoundingMode::DYN, + llvm::SMLoc()); +} + bool RISCVAsmParser::validateInstruction(MCInst &Inst, OperandVector &Operands) { if (Inst.getOpcode() == RISCV::PseudoVMSGEU_VX_M_T || diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp index a4fbba7ae1e98f..bae812eca595fb 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp @@ -149,7 +149,9 @@ void RISCVInstPrinter::printFRMArg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O) { auto FRMArg = static_cast(MI->getOperand(OpNo).getImm()); - O << RISCVFPRndMode::roundingModeToString(FRMArg); + if (PrintAliases && !NoAliases && FRMArg == RISCVFPRndMode::RoundingMode::DYN) + return; + O << ", " << RISCVFPRndMode::roundingModeToString(FRMArg); } void RISCVInstPrinter::printZeroOffsetMemOp(const MCInst *MI, unsigned OpNo, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td index 7863120dc16e6f..cd6ff9e62b5ea4 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td @@ -108,11 +108,6 @@ defm FNMSUB_D : FPFMA_rrr_frm_m; defm FNMADD_D : FPFMA_rrr_frm_m; } -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; - let SchedRW = [WriteFAdd64, ReadFAdd64, ReadFAdd64] in { defm FADD_D : FPALU_rr_frm_m<0b0000001, "fadd.d", DINX, /*Commutable*/1>; defm FSUB_D : FPALU_rr_frm_m<0b0000101, "fsub.d", DINX>; @@ -123,14 +118,8 @@ defm FMUL_D : FPALU_rr_frm_m<0b0001001, "fmul.d", DINX, /*Commutable*/1>; let SchedRW = [WriteFDiv64, ReadFDiv64, ReadFDiv64] in defm FDIV_D : FPALU_rr_frm_m<0b0001101, "fdiv.d", DINX>; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; - defm FSQRT_D : FPUnaryOp_r_frm_m<0b0101101, 0b00000, DDINX, "fsqrt.d">, Sched<[WriteFSqrt64, ReadFSqrt64]>; -defm : FPUnaryOpDynFrmAlias_m; let SchedRW = [WriteFSGNJ64, ReadFSGNJ64, ReadFSGNJ64], mayRaiseFPException = 0 in { @@ -146,7 +135,6 @@ defm FMAX_D : FPALU_rr_m<0b0010101, 0b001, "fmax.d", DINX, /*Commutable*/1>; defm FCVT_S_D : FPUnaryOp_r_frm_m<0b0100000, 0b00001, FDINX, "fcvt.s.d">, Sched<[WriteFCvtF64ToF32, ReadFCvtF64ToF32]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_D_S : FPUnaryOp_r_m<0b0100001, 0b00000, 0b000, DFINX, "fcvt.d.s">, Sched<[WriteFCvtF32ToF64, ReadFCvtF32ToF64]>; @@ -163,12 +151,10 @@ defm FCLASS_D : FPUnaryOp_r_m<0b1110001, 0b00000, 0b001, XDINX, "fclass.d">, let IsSignExtendingOpW = 1 in defm FCVT_W_D : FPUnaryOp_r_frm_m<0b1100001, 0b00000, XDINX, "fcvt.w.d">, Sched<[WriteFCvtF64ToI32, ReadFCvtF64ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; let IsSignExtendingOpW = 1 in defm FCVT_WU_D : FPUnaryOp_r_frm_m<0b1100001, 0b00001, XDINX, "fcvt.wu.d">, Sched<[WriteFCvtF64ToI32, ReadFCvtF64ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_D_W : FPUnaryOp_r_m<0b1101001, 0b00000, 0b000, DXINX, "fcvt.d.w">, Sched<[WriteFCvtI32ToF64, ReadFCvtI32ToF64]>; @@ -178,11 +164,9 @@ defm FCVT_D_WU : FPUnaryOp_r_m<0b1101001, 0b00001, 0b000, DXINX, "fcvt.d.wu">, defm FCVT_L_D : FPUnaryOp_r_frm_m<0b1100001, 0b00010, XDIN64X, "fcvt.l.d">, Sched<[WriteFCvtF64ToI64, ReadFCvtF64ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_LU_D : FPUnaryOp_r_frm_m<0b1100001, 0b00011, XDIN64X, "fcvt.lu.d">, Sched<[WriteFCvtF64ToI64, ReadFCvtF64ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; let Predicates = [HasStdExtD, IsRV64], mayRaiseFPException = 0 in def FMV_X_D : FPUnaryOp_r<0b1110001, 0b00000, 0b000, GPR, FPR64, "fmv.x.d">, @@ -190,11 +174,9 @@ def FMV_X_D : FPUnaryOp_r<0b1110001, 0b00000, 0b000, GPR, FPR64, "fmv.x.d">, defm FCVT_D_L : FPUnaryOp_r_frm_m<0b1101001, 0b00010, DXIN64X, "fcvt.d.l">, Sched<[WriteFCvtI64ToF64, ReadFCvtI64ToF64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_D_LU : FPUnaryOp_r_frm_m<0b1101001, 0b00011, DXIN64X, "fcvt.d.lu">, Sched<[WriteFCvtI64ToF64, ReadFCvtI64ToF64]>; -defm : FPUnaryOpDynFrmAlias_m; let Predicates = [HasStdExtD, IsRV64], mayRaiseFPException = 0 in def FMV_D_X : FPUnaryOp_r<0b1111001, 0b00000, 0b000, FPR64, GPR, "fmv.d.x">, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td index 344a3ae173a41f..fe0d5a4306734a 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -141,6 +141,8 @@ def FRMArg : AsmOperandClass { let Name = "FRMArg"; let RenderMethod = "addFRMArgOperands"; let ParserMethod = "parseFRMArg"; + let IsOptional = 1; + let DefaultMethod = "defaultFRMArgOp"; } def frmarg : Operand { @@ -175,7 +177,7 @@ class FPFMA_rrr_frm funct2, string opcodestr, DAGOperand rty> : RVInstR4Frm; + opcodestr, "$rd, $rs1, $rs2, $rs3$frm">; multiclass FPFMA_rrr_frm_m funct2, string opcodestr, list Exts> { @@ -184,18 +186,6 @@ multiclass FPFMA_rrr_frm_m funct2, def Ext.Suffix : FPFMA_rrr_frm; } -class FPFMADynFrmAlias - : InstAlias; -multiclass FPFMADynFrmAlias_m Exts> { - foreach Ext = Exts in - let Predicates = Ext.Predicates in - def : FPFMADynFrmAlias(Inst#Ext.Suffix), OpcodeStr, - Ext.Reg>; -} - let hasSideEffects = 0, mayLoad = 0, mayStore = 0, mayRaiseFPException = 1 in class FPALU_rr funct7, bits<3> funct3, string opcodestr, DAGOperand rty, bit Commutable> @@ -216,7 +206,7 @@ class FPALU_rr_frm funct7, string opcodestr, DAGOperand rty, bit Commutable> : RVInstRFrm { + "$rd, $rs1, $rs2$frm"> { let isCommutable = Commutable; } multiclass FPALU_rr_frm_m funct7, string opcodestr, @@ -226,18 +216,6 @@ multiclass FPALU_rr_frm_m funct7, string opcodestr, def Ext.Suffix : FPALU_rr_frm; } -class FPALUDynFrmAlias - : InstAlias; -multiclass FPALUDynFrmAlias_m Exts> { - foreach Ext = Exts in - let Predicates = Ext.Predicates in - def : FPALUDynFrmAlias(Inst#Ext.Suffix), OpcodeStr, - Ext.Reg>; -} - let hasSideEffects = 0, mayLoad = 0, mayStore = 0, mayRaiseFPException = 1 in class FPUnaryOp_r funct7, bits<5> rs2val, bits<3> funct3, DAGOperand rdty, DAGOperand rs1ty, string opcodestr> @@ -259,7 +237,7 @@ class FPUnaryOp_r_frm funct7, bits<5> rs2val, DAGOperand rdty, DAGOperand rs1ty, string opcodestr> : RVInstRFrm { + "$rd, $rs1$frm"> { let rs2 = rs2val; } multiclass FPUnaryOp_r_frm_m funct7, bits<5> rs2val, @@ -270,18 +248,6 @@ multiclass FPUnaryOp_r_frm_m funct7, bits<5> rs2val, opcodestr>; } -class FPUnaryOpDynFrmAlias - : InstAlias; -multiclass FPUnaryOpDynFrmAlias_m Exts> { - foreach Ext = Exts in - let Predicates = Ext.Predicates in - def : FPUnaryOpDynFrmAlias(Inst#Ext.Suffix), - OpcodeStr, Ext.RdTy, Ext.Rs1Ty>; -} - let hasSideEffects = 0, mayLoad = 0, mayStore = 0, mayRaiseFPException = 1, IsSignExtendingOpW = 1 in class FPCmp_rr funct7, bits<3> funct3, string opcodestr, @@ -327,11 +293,6 @@ defm FNMSUB_S : FPFMA_rrr_frm_m; defm FNMADD_S : FPFMA_rrr_frm_m; } -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; - let SchedRW = [WriteFAdd32, ReadFAdd32, ReadFAdd32] in { defm FADD_S : FPALU_rr_frm_m<0b0000000, "fadd.s", FINX, /*Commutable*/1>; defm FSUB_S : FPALU_rr_frm_m<0b0000100, "fsub.s", FINX>; @@ -342,14 +303,8 @@ defm FMUL_S : FPALU_rr_frm_m<0b0001000, "fmul.s", FINX, /*Commutable*/1>; let SchedRW = [WriteFDiv32, ReadFDiv32, ReadFDiv32] in defm FDIV_S : FPALU_rr_frm_m<0b0001100, "fdiv.s", FINX>; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; - defm FSQRT_S : FPUnaryOp_r_frm_m<0b0101100, 0b00000, FFINX, "fsqrt.s">, Sched<[WriteFSqrt32, ReadFSqrt32]>; -defm : FPUnaryOpDynFrmAlias_m; let SchedRW = [WriteFSGNJ32, ReadFSGNJ32, ReadFSGNJ32], mayRaiseFPException = 0 in { @@ -366,12 +321,10 @@ defm FMAX_S : FPALU_rr_m<0b0010100, 0b001, "fmax.s", FINX, /*Commutable*/1>; let IsSignExtendingOpW = 1 in defm FCVT_W_S : FPUnaryOp_r_frm_m<0b1100000, 0b00000, XFINX, "fcvt.w.s">, Sched<[WriteFCvtF32ToI32, ReadFCvtF32ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; let IsSignExtendingOpW = 1 in defm FCVT_WU_S : FPUnaryOp_r_frm_m<0b1100000, 0b00001, XFINX, "fcvt.wu.s">, Sched<[WriteFCvtF32ToI32, ReadFCvtF32ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; let Predicates = [HasStdExtF], mayRaiseFPException = 0, IsSignExtendingOpW = 1 in @@ -390,11 +343,9 @@ defm FCLASS_S : FPUnaryOp_r_m<0b1110000, 0b00000, 0b001, XFINX, "fclass.s">, defm FCVT_S_W : FPUnaryOp_r_frm_m<0b1101000, 0b00000, FXINX, "fcvt.s.w">, Sched<[WriteFCvtI32ToF32, ReadFCvtI32ToF32]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_S_WU : FPUnaryOp_r_frm_m<0b1101000, 0b00001, FXINX, "fcvt.s.wu">, Sched<[WriteFCvtI32ToF32, ReadFCvtI32ToF32]>; -defm : FPUnaryOpDynFrmAlias_m; let Predicates = [HasStdExtF], mayRaiseFPException = 0 in def FMV_W_X : FPUnaryOp_r<0b1111000, 0b00000, 0b000, FPR32, GPR, "fmv.w.x">, @@ -402,19 +353,15 @@ def FMV_W_X : FPUnaryOp_r<0b1111000, 0b00000, 0b000, FPR32, GPR, "fmv.w.x">, defm FCVT_L_S : FPUnaryOp_r_frm_m<0b1100000, 0b00010, XFIN64X, "fcvt.l.s">, Sched<[WriteFCvtF32ToI64, ReadFCvtF32ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_LU_S : FPUnaryOp_r_frm_m<0b1100000, 0b00011, XFIN64X, "fcvt.lu.s">, Sched<[WriteFCvtF32ToI64, ReadFCvtF32ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_S_L : FPUnaryOp_r_frm_m<0b1101000, 0b00010, FXIN64X, "fcvt.s.l">, Sched<[WriteFCvtI64ToF32, ReadFCvtI64ToF32]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_S_LU : FPUnaryOp_r_frm_m<0b1101000, 0b00011, FXIN64X, "fcvt.s.lu">, Sched<[WriteFCvtI64ToF32, ReadFCvtI64ToF32]>; -defm : FPUnaryOpDynFrmAlias_m; //===----------------------------------------------------------------------===// // Assembler Pseudo Instructions (User-Level ISA, Version 2.2, Chapter 20) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td index 914d39c583d785..82c65667db98eb 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td @@ -103,11 +103,6 @@ defm FNMSUB_H : FPFMA_rrr_frm_m; defm FNMADD_H : FPFMA_rrr_frm_m; } -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; -defm : FPFMADynFrmAlias_m; - let SchedRW = [WriteFAdd16, ReadFAdd16, ReadFAdd16] in { defm FADD_H : FPALU_rr_frm_m<0b0000010, "fadd.h", HINX, /*Commutable*/1>; defm FSUB_H : FPALU_rr_frm_m<0b0000110, "fsub.h", HINX>; @@ -118,14 +113,8 @@ defm FMUL_H : FPALU_rr_frm_m<0b0001010, "fmul.h", HINX, /*Commutable*/1>; let SchedRW = [WriteFDiv16, ReadFDiv16, ReadFDiv16] in defm FDIV_H : FPALU_rr_frm_m<0b0001110, "fdiv.h", HINX>; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; -defm : FPALUDynFrmAlias_m; - defm FSQRT_H : FPUnaryOp_r_frm_m<0b0101110, 0b00000, HHINX, "fsqrt.h">, Sched<[WriteFSqrt16, ReadFSqrt16]>; -defm : FPUnaryOpDynFrmAlias_m; let SchedRW = [WriteFSGNJ16, ReadFSGNJ16, ReadFSGNJ16], mayRaiseFPException = 0 in { @@ -142,24 +131,19 @@ defm FMAX_H : FPALU_rr_m<0b0010110, 0b001, "fmax.h", HINX, /*Commutable*/1>; let IsSignExtendingOpW = 1 in defm FCVT_W_H : FPUnaryOp_r_frm_m<0b1100010, 0b00000, XHINX, "fcvt.w.h">, Sched<[WriteFCvtF16ToI32, ReadFCvtF16ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; let IsSignExtendingOpW = 1 in defm FCVT_WU_H : FPUnaryOp_r_frm_m<0b1100010, 0b00001, XHINX, "fcvt.wu.h">, Sched<[WriteFCvtF16ToI32, ReadFCvtF16ToI32]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_W : FPUnaryOp_r_frm_m<0b1101010, 0b00000, HXINX, "fcvt.h.w">, Sched<[WriteFCvtI32ToF16, ReadFCvtI32ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_WU : FPUnaryOp_r_frm_m<0b1101010, 0b00001, HXINX, "fcvt.h.wu">, Sched<[WriteFCvtI32ToF16, ReadFCvtI32ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_S : FPUnaryOp_r_frm_m<0b0100010, 0b00000, HFINXmin, "fcvt.h.s">, Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_S_H : FPUnaryOp_r_m<0b0100000, 0b00010, 0b000, FHINXmin, "fcvt.s.h">, Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]>; @@ -186,23 +170,18 @@ defm FCLASS_H : FPUnaryOp_r_m<0b1110010, 0b00000, 0b001, XHINX, "fclass.h">, defm FCVT_L_H : FPUnaryOp_r_frm_m<0b1100010, 0b00010, XHIN64X, "fcvt.l.h">, Sched<[WriteFCvtF16ToI64, ReadFCvtF16ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_LU_H : FPUnaryOp_r_frm_m<0b1100010, 0b00011, XHIN64X, "fcvt.lu.h">, Sched<[WriteFCvtF16ToI64, ReadFCvtF16ToI64]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_L : FPUnaryOp_r_frm_m<0b1101010, 0b00010, HXIN64X, "fcvt.h.l">, Sched<[WriteFCvtI64ToF16, ReadFCvtI64ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_LU : FPUnaryOp_r_frm_m<0b1101010, 0b00011, HXIN64X, "fcvt.h.lu">, Sched<[WriteFCvtI64ToF16, ReadFCvtI64ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_H_D : FPUnaryOp_r_frm_m<0b0100010, 0b00001, HDINXmin, "fcvt.h.d">, Sched<[WriteFCvtF64ToF16, ReadFCvtF64ToF16]>; -defm : FPUnaryOpDynFrmAlias_m; defm FCVT_D_H : FPUnaryOp_r_m<0b0100001, 0b00010, 0b000, DHINXmin, "fcvt.d.h">, Sched<[WriteFCvtF16ToF64, ReadFCvtF16ToF64]>;