@@ -203,6 +203,29 @@ def to_valid_timm : SDNodeXForm<timm, [{
203
203
return CurDAG->getTargetConstant(CN->getSExtValue(), SDLoc(N), Subtarget->getGRLenVT());
204
204
}]>;
205
205
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
+
206
229
//===----------------------------------------------------------------------===//
207
230
// Instruction class templates
208
231
//===----------------------------------------------------------------------===//
@@ -663,7 +686,9 @@ def VMSKGEZ_B : LSX2R_VV<0x729c5000>;
663
686
664
687
def VMSKNZ_B : LSX2R_VV<0x729c6000>;
665
688
689
+ let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
666
690
def VLDI : LSX1RI13_VI<0x73e00000>;
691
+ }
667
692
668
693
def VAND_V : LSX3R_VVV<0x71260000>;
669
694
def VOR_V : LSX3R_VVV<0x71268000>;
@@ -1910,6 +1935,12 @@ def : Pat<(v2i64 (fp_to_sint v2f64:$vj)), (VFTINTRZ_L_D v2f64:$vj)>;
1910
1935
def : Pat<(v4i32 (fp_to_uint v4f32:$vj)), (VFTINTRZ_WU_S v4f32:$vj)>;
1911
1936
def : Pat<(v2i64 (fp_to_uint v2f64:$vj)), (VFTINTRZ_LU_D v2f64:$vj)>;
1912
1937
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
+
1913
1944
} // Predicates = [HasExtLSX]
1914
1945
1915
1946
/// Intrinsic pattern
0 commit comments