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 @@ -149,17 +149,6 @@ } def : FPUnaryOpDynFrmAlias; -def FCVT_H_S : FPUnaryOp_r_frm<0b0100010, FPR16, FPR32, "fcvt.h.s">, - Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]> { - let rs2 = 0b00000; -} -def : FPUnaryOpDynFrmAlias; - -def FCVT_S_H : FPUnaryOp_r<0b0100000, 0b000, FPR32, FPR16, "fcvt.s.h">, - Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]> { - let rs2 = 0b00010; -} - def FMV_X_H : FPUnaryOp_r<0b1110010, 0b000, GPR, FPR16, "fmv.x.h">, Sched<[WriteFMovF16ToI16, ReadFMovF16ToI16]> { let rs2 = 0b00000; @@ -206,6 +195,19 @@ def : FPUnaryOpDynFrmAlias; } // Predicates = [HasStdExtZfh, IsRV64] +let Predicates = [HasStdExtZfh, HasStdExtF] in { +def FCVT_H_S : FPUnaryOp_r_frm<0b0100010, FPR16, FPR32, "fcvt.h.s">, + Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]> { + let rs2 = 0b00000; +} +def : FPUnaryOpDynFrmAlias; + +def FCVT_S_H : FPUnaryOp_r<0b0100000, 0b000, FPR32, FPR16, "fcvt.s.h">, + Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]> { + let rs2 = 0b00010; +} +} // Predicates = [HasStdExtZfh, HasStdExtF] + let Predicates = [HasStdExtZfh, HasStdExtD] in { def FCVT_H_D : FPUnaryOp_r_frm<0b0100010, FPR16, FPR64, "fcvt.h.d">, Sched<[WriteFCvtF64ToF16, ReadFCvtF64ToF16]> { @@ -277,12 +279,6 @@ def : PatFpr16Fpr16; def : Pat<(fcopysign FPR16:$rs1, (fneg FPR16:$rs2)), (FSGNJN_H $rs1, $rs2)>; -def : Pat<(fcopysign FPR16:$rs1, FPR32:$rs2), - (FSGNJ_H $rs1, (FCVT_H_S $rs2, 0b111))>; -def : Pat<(fcopysign FPR16:$rs1, FPR64:$rs2), - (FSGNJ_H $rs1, (FCVT_H_D $rs2, 0b111))>; -def : Pat<(fcopysign FPR32:$rs1, FPR16:$rs2), (FSGNJ_S $rs1, (FCVT_S_H $rs2))>; -def : Pat<(fcopysign FPR64:$rs1, FPR16:$rs2), (FSGNJ_D $rs1, (FCVT_D_H $rs2))>; // fmadd: rs1 * rs2 + rs3 def : Pat<(fma FPR16:$rs1, FPR16:$rs2, FPR16:$rs3), @@ -324,10 +320,6 @@ /// Float conversion operations -// f32 -> f16, f16 -> f32 -def : Pat<(fpround FPR32:$rs1), (FCVT_H_S FPR32:$rs1, 0b111)>; -def : Pat<(fpextend FPR16:$rs1), (FCVT_S_H FPR16:$rs1)>; - // Moves (no conversion) def : Pat<(riscv_fmv_h_x GPR:$src), (FMV_H_X GPR:$src)>; def : Pat<(riscv_fmv_x_anyexth FPR16:$src), (FMV_X_H FPR16:$src)>; @@ -362,9 +354,26 @@ def : Pat<(uint_to_fp (i64 GPR:$rs1)), (FCVT_H_LU $rs1, 0b111)>; } // Predicates = [HasStdExtZfh, IsRV64] +let Predicates = [HasStdExtZfh, HasStdExtF] in { +/// Float conversion operations +// f32 -> f16, f16 -> f32 +def : Pat<(fpround FPR32:$rs1), (FCVT_H_S FPR32:$rs1, 0b111)>; +def : Pat<(fpextend FPR16:$rs1), (FCVT_S_H FPR16:$rs1)>; + +/// Float arithmetic operations +def : Pat<(fcopysign FPR16:$rs1, FPR32:$rs2), + (FSGNJ_H $rs1, (FCVT_H_S $rs2, 0b111))>; +def : Pat<(fcopysign FPR32:$rs1, FPR16:$rs2), (FSGNJ_S $rs1, (FCVT_S_H $rs2))>; +} + let Predicates = [HasStdExtZfh, HasStdExtD] in { /// Float conversion operations // f64 -> f16, f16 -> f64 def : Pat<(fpround FPR64:$rs1), (FCVT_H_D FPR64:$rs1, 0b111)>; def : Pat<(fpextend FPR16:$rs1), (FCVT_D_H FPR16:$rs1)>; + +/// Float arithmetic operations +def : Pat<(fcopysign FPR16:$rs1, FPR64:$rs2), + (FSGNJ_H $rs1, (FCVT_H_D $rs2, 0b111))>; +def : Pat<(fcopysign FPR64:$rs1, FPR16:$rs2), (FSGNJ_D $rs1, (FCVT_D_H $rs2))>; }