[llvm] [AArch64] Fixup destructive floating-point precision conversions (PR #118788)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 9 06:41:11 PST 2024
================
@@ -9296,33 +9279,18 @@ multiclass sve_float_dot_indexed<bit bf, bits<2> opc, ZPRRegOp src1_ty,
def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, InVT, InVT, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME)>;
}
-class sve_bfloat_convert<bit N, string asm>
-: I<(outs ZPR16:$Zd), (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn),
- asm, "\t$Zd, $Pg/m, $Zn", "", []>, Sched<[]> {
- bits<5> Zd;
- bits<3> Pg;
- bits<5> Zn;
- let Inst{31-25} = 0b0110010;
- let Inst{24} = N;
- let Inst{23-13} = 0b10001010101;
- let Inst{12-10} = Pg;
- let Inst{9-5} = Zn;
- let Inst{4-0} = Zd;
+multiclass sve_bfloat_convert<string asm, SDPatternOperator op, SDPatternOperator ir_op> {
+ def NAME : sve_fp_2op_p_zd<0b1001010, asm, ZPR32, ZPR16, ElementSizeS>;
- let Constraints = "$Zd = $_Zd";
- let DestructiveInstType = DestructiveOther;
- let ElementSize = ElementSizeS;
- let hasSideEffects = 0;
- let mayRaiseFPException = 1;
+ def : SVE_3_Op_Pat<nxv8bf16, op, nxv8bf16, nxv4i1, nxv4f32, !cast<Instruction>(NAME)>;
+ def : SVE_1_Op_Passthru_Round_Pat<nxv4bf16, ir_op, nxv4i1, nxv4f32, !cast<Instruction>(NAME)>;
+ def : SVE_1_Op_Passthru_Round_Pat<nxv2bf16, ir_op, nxv2i1, nxv2f32, !cast<Instruction>(NAME)>;
}
-multiclass sve_bfloat_convert<bit N, string asm, SDPatternOperator op,
- SDPatternOperator ir_op = null_frag> {
- def NAME : sve_bfloat_convert<N, asm>;
+multiclass sve_bfloat_convert_top<string asm, SDPatternOperator op> {
+ def NAME : sve2_fp_convert_precision<0b1010, 0b1, asm, ZPR16, ZPR32>;
def : SVE_3_Op_Pat<nxv8bf16, op, nxv8bf16, nxv4i1, nxv4f32, !cast<Instruction>(NAME)>;
- def : SVE_1_Op_Passthru_Round_Pat<nxv4bf16, ir_op, nxv4i1, nxv4f32, !cast<Instruction>(NAME)>;
----------------
SpencerAbson wrote:
When `bfcvtnt` used `sve_bfloat_convert` it passed `null_frag` to `ir_op`, because this argument was only relevant for `bfcvt`. Since this class is only used for `bfcvtnt`, there was no need to keep things that were only relevant for `bfcvt`.
https://github.com/llvm/llvm-project/pull/118788
More information about the llvm-commits
mailing list