@@ -203,6 +203,29 @@ def to_valid_timm : SDNodeXForm<timm, [{
203203 return CurDAG->getTargetConstant(CN->getSExtValue(), SDLoc(N), Subtarget->getGRLenVT());
204204}]>;
205205
206+ // FP immediate of VLDI patterns.
207+ def f32imm_vldi : PatLeaf<(fpimm), [{
208+ const auto &TLI =
209+ *static_cast<const LoongArchTargetLowering*>(getTargetLowering());
210+ return TLI.isFPImmVLDILegal(N->getValueAPF(), MVT::f32);
211+ }]>;
212+ def f64imm_vldi : PatLeaf<(fpimm), [{
213+ const auto &TLI =
214+ *static_cast<const LoongArchTargetLowering*>(getTargetLowering());
215+ return TLI.isFPImmVLDILegal(N->getValueAPF(), MVT::f64);
216+ }]>;
217+
218+ def to_f32imm_vldi : SDNodeXForm<fpimm, [{
219+ uint64_t x = N->getValueAPF().bitcastToAPInt().getZExtValue();
220+ x = (0b11011 << 8) | (((x >> 24) & 0xc0) ^ 0x40) | ((x >> 19) & 0x3f);
221+ return CurDAG->getTargetConstant(SignExtend32<13>(x), SDLoc(N), MVT::i32);
222+ }]>;
223+ def to_f64imm_vldi : SDNodeXForm<fpimm, [{
224+ uint64_t x = N->getValueAPF().bitcastToAPInt().getZExtValue();
225+ x = (0b11100 << 8) | (((x >> 56) & 0xc0) ^ 0x40) | ((x >> 48) & 0x3f);
226+ return CurDAG->getTargetConstant(SignExtend32<13>(x), SDLoc(N), MVT::i32);
227+ }]>;
228+
206229//===----------------------------------------------------------------------===//
207230// Instruction class templates
208231//===----------------------------------------------------------------------===//
@@ -663,7 +686,9 @@ def VMSKGEZ_B : LSX2R_VV<0x729c5000>;
663686
664687def VMSKNZ_B : LSX2R_VV<0x729c6000>;
665688
689+ let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
666690def VLDI : LSX1RI13_VI<0x73e00000>;
691+ }
667692
668693def VAND_V : LSX3R_VVV<0x71260000>;
669694def VOR_V : LSX3R_VVV<0x71268000>;
@@ -1910,6 +1935,12 @@ def : Pat<(v2i64 (fp_to_sint v2f64:$vj)), (VFTINTRZ_L_D v2f64:$vj)>;
19101935def : Pat<(v4i32 (fp_to_uint v4f32:$vj)), (VFTINTRZ_WU_S v4f32:$vj)>;
19111936def : Pat<(v2i64 (fp_to_uint v2f64:$vj)), (VFTINTRZ_LU_D v2f64:$vj)>;
19121937
1938+ // Vector loads floating-point constants
1939+ def : Pat<(f32 f32imm_vldi:$in),
1940+ (f32 (EXTRACT_SUBREG (VLDI (to_f32imm_vldi f32imm_vldi:$in)), sub_32))>;
1941+ def : Pat<(f64 f64imm_vldi:$in),
1942+ (f64 (EXTRACT_SUBREG (VLDI (to_f64imm_vldi f64imm_vldi:$in)), sub_64))>;
1943+
19131944} // Predicates = [HasExtLSX]
19141945
19151946/// Intrinsic pattern
0 commit comments