xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
106c3fb27SDimitry Andric// LoongArchFloat64InstrInfo.td - Double-Precision Float instr --*- tablegen -*-
281ad6265SDimitry Andric//
381ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric//
781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
881ad6265SDimitry Andric//
981ad6265SDimitry Andric// This file describes the basic double-precision floating-point instructions.
1081ad6265SDimitry Andric//
1181ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric
1381ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric// Instructions
1581ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1681ad6265SDimitry Andric
1781ad6265SDimitry Andriclet Predicates = [HasBasicD] in {
1881ad6265SDimitry Andric
1981ad6265SDimitry Andric// Arithmetic Operation Instructions
2006c3fb27SDimitry Andricdef FADD_D : FP_ALU_3R<0x01010000, FPR64>;
2106c3fb27SDimitry Andricdef FSUB_D : FP_ALU_3R<0x01030000, FPR64>;
2206c3fb27SDimitry Andricdef FMUL_D : FP_ALU_3R<0x01050000, FPR64>;
2306c3fb27SDimitry Andricdef FDIV_D : FP_ALU_3R<0x01070000, FPR64>;
2406c3fb27SDimitry Andricdef FMADD_D  : FP_ALU_4R<0x08200000, FPR64>;
2506c3fb27SDimitry Andricdef FMSUB_D  : FP_ALU_4R<0x08600000, FPR64>;
2606c3fb27SDimitry Andricdef FNMADD_D : FP_ALU_4R<0x08a00000, FPR64>;
2706c3fb27SDimitry Andricdef FNMSUB_D : FP_ALU_4R<0x08e00000, FPR64>;
2806c3fb27SDimitry Andricdef FMAX_D  : FP_ALU_3R<0x01090000, FPR64>;
2906c3fb27SDimitry Andricdef FMIN_D  : FP_ALU_3R<0x010b0000, FPR64>;
3006c3fb27SDimitry Andricdef FMAXA_D : FP_ALU_3R<0x010d0000, FPR64>;
3106c3fb27SDimitry Andricdef FMINA_D : FP_ALU_3R<0x010f0000, FPR64>;
3206c3fb27SDimitry Andricdef FABS_D   : FP_ALU_2R<0x01140800, FPR64>;
3306c3fb27SDimitry Andricdef FNEG_D   : FP_ALU_2R<0x01141800, FPR64>;
3406c3fb27SDimitry Andricdef FSQRT_D  : FP_ALU_2R<0x01144800, FPR64>;
3506c3fb27SDimitry Andricdef FRECIP_D : FP_ALU_2R<0x01145800, FPR64>;
3606c3fb27SDimitry Andricdef FRSQRT_D : FP_ALU_2R<0x01146800, FPR64>;
37*7a6dacacSDimitry Andricdef FRECIPE_D : FP_ALU_2R<0x01147800, FPR64>;
38*7a6dacacSDimitry Andricdef FRSQRTE_D : FP_ALU_2R<0x01148800, FPR64>;
3906c3fb27SDimitry Andricdef FSCALEB_D : FP_ALU_3R<0x01110000, FPR64>;
4006c3fb27SDimitry Andricdef FLOGB_D   : FP_ALU_2R<0x01142800, FPR64>;
4106c3fb27SDimitry Andricdef FCOPYSIGN_D : FP_ALU_3R<0x01130000, FPR64>;
4206c3fb27SDimitry Andricdef FCLASS_D  : FP_ALU_2R<0x01143800, FPR64>;
4381ad6265SDimitry Andric
4481ad6265SDimitry Andric// Comparison Instructions
4506c3fb27SDimitry Andricdef FCMP_CAF_D  : FP_CMP<0x0c200000, FPR64>;
4606c3fb27SDimitry Andricdef FCMP_CUN_D  : FP_CMP<0x0c240000, FPR64>;
4706c3fb27SDimitry Andricdef FCMP_CEQ_D  : FP_CMP<0x0c220000, FPR64>;
4806c3fb27SDimitry Andricdef FCMP_CUEQ_D : FP_CMP<0x0c260000, FPR64>;
4906c3fb27SDimitry Andricdef FCMP_CLT_D  : FP_CMP<0x0c210000, FPR64>;
5006c3fb27SDimitry Andricdef FCMP_CULT_D : FP_CMP<0x0c250000, FPR64>;
5106c3fb27SDimitry Andricdef FCMP_CLE_D  : FP_CMP<0x0c230000, FPR64>;
5206c3fb27SDimitry Andricdef FCMP_CULE_D : FP_CMP<0x0c270000, FPR64>;
5306c3fb27SDimitry Andricdef FCMP_CNE_D  : FP_CMP<0x0c280000, FPR64>;
5406c3fb27SDimitry Andricdef FCMP_COR_D  : FP_CMP<0x0c2a0000, FPR64>;
5506c3fb27SDimitry Andricdef FCMP_CUNE_D : FP_CMP<0x0c2c0000, FPR64>;
5606c3fb27SDimitry Andricdef FCMP_SAF_D  : FP_CMP<0x0c208000, FPR64>;
5706c3fb27SDimitry Andricdef FCMP_SUN_D  : FP_CMP<0x0c248000, FPR64>;
5806c3fb27SDimitry Andricdef FCMP_SEQ_D  : FP_CMP<0x0c228000, FPR64>;
5906c3fb27SDimitry Andricdef FCMP_SUEQ_D : FP_CMP<0x0c268000, FPR64>;
6006c3fb27SDimitry Andricdef FCMP_SLT_D  : FP_CMP<0x0c218000, FPR64>;
6106c3fb27SDimitry Andricdef FCMP_SULT_D : FP_CMP<0x0c258000, FPR64>;
6206c3fb27SDimitry Andricdef FCMP_SLE_D  : FP_CMP<0x0c238000, FPR64>;
6306c3fb27SDimitry Andricdef FCMP_SULE_D : FP_CMP<0x0c278000, FPR64>;
6406c3fb27SDimitry Andricdef FCMP_SNE_D  : FP_CMP<0x0c288000, FPR64>;
6506c3fb27SDimitry Andricdef FCMP_SOR_D  : FP_CMP<0x0c2a8000, FPR64>;
6606c3fb27SDimitry Andricdef FCMP_SUNE_D : FP_CMP<0x0c2c8000, FPR64>;
6781ad6265SDimitry Andric
6881ad6265SDimitry Andric// Conversion Instructions
6906c3fb27SDimitry Andricdef FFINT_S_L : FP_CONV<0x011d1800, FPR32, FPR64>;
7006c3fb27SDimitry Andricdef FTINT_L_S : FP_CONV<0x011b2400, FPR64, FPR32>;
7106c3fb27SDimitry Andricdef FTINTRM_L_S : FP_CONV<0x011a2400, FPR64, FPR32>;
7206c3fb27SDimitry Andricdef FTINTRP_L_S : FP_CONV<0x011a6400, FPR64, FPR32>;
7306c3fb27SDimitry Andricdef FTINTRZ_L_S : FP_CONV<0x011aa400, FPR64, FPR32>;
7406c3fb27SDimitry Andricdef FTINTRNE_L_S : FP_CONV<0x011ae400, FPR64, FPR32>;
7506c3fb27SDimitry Andricdef FCVT_S_D : FP_CONV<0x01191800, FPR32, FPR64>;
7606c3fb27SDimitry Andricdef FCVT_D_S : FP_CONV<0x01192400, FPR64, FPR32>;
7706c3fb27SDimitry Andricdef FFINT_D_W : FP_CONV<0x011d2000, FPR64, FPR32>;
7806c3fb27SDimitry Andricdef FFINT_D_L : FP_CONV<0x011d2800, FPR64, FPR64>;
7906c3fb27SDimitry Andricdef FTINT_W_D : FP_CONV<0x011b0800, FPR32, FPR64>;
8006c3fb27SDimitry Andricdef FTINT_L_D : FP_CONV<0x011b2800, FPR64, FPR64>;
8106c3fb27SDimitry Andricdef FTINTRM_W_D : FP_CONV<0x011a0800, FPR32, FPR64>;
8206c3fb27SDimitry Andricdef FTINTRM_L_D : FP_CONV<0x011a2800, FPR64, FPR64>;
8306c3fb27SDimitry Andricdef FTINTRP_W_D : FP_CONV<0x011a4800, FPR32, FPR64>;
8406c3fb27SDimitry Andricdef FTINTRP_L_D : FP_CONV<0x011a6800, FPR64, FPR64>;
8506c3fb27SDimitry Andricdef FTINTRZ_W_D : FP_CONV<0x011a8800, FPR32, FPR64>;
8606c3fb27SDimitry Andricdef FTINTRZ_L_D : FP_CONV<0x011aa800, FPR64, FPR64>;
8706c3fb27SDimitry Andricdef FTINTRNE_W_D : FP_CONV<0x011ac800, FPR32, FPR64>;
8806c3fb27SDimitry Andricdef FTINTRNE_L_D : FP_CONV<0x011ae800, FPR64, FPR64>;
8906c3fb27SDimitry Andricdef FRINT_D : FP_CONV<0x011e4800, FPR64, FPR64>;
9081ad6265SDimitry Andric
9181ad6265SDimitry Andric// Move Instructions
9206c3fb27SDimitry Andricdef FMOV_D        : FP_MOV<0x01149800, FPR64, FPR64>;
9306c3fb27SDimitry Andricdef MOVFRH2GR_S   : FP_MOV<0x0114bc00, GPR, FPR64>;
9481ad6265SDimitry Andriclet isCodeGenOnly = 1 in {
9506c3fb27SDimitry Andricdef MOVFR2GR_S_64 : FP_MOV<0x0114b400, GPR, FPR64>;
9606c3fb27SDimitry Andricdef FSEL_xD : FP_SEL<0x0d000000, FPR64>;
9781ad6265SDimitry Andric} // isCodeGenOnly = 1
9806c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 0, Constraints = "$dst = $out" in {
9906c3fb27SDimitry Andricdef MOVGR2FRH_W : FPFmtMOV<0x0114ac00, (outs FPR64:$out),
10006c3fb27SDimitry Andric                           (ins FPR64:$dst, GPR:$src),
10181ad6265SDimitry Andric                           "$dst, $src">;
10206c3fb27SDimitry Andric} // hasSideEffects = 0, mayLoad = 0, mayStore = 0, Constraints = "$dst = $out"
10381ad6265SDimitry Andric
10481ad6265SDimitry Andric// Common Memory Access Instructions
10506c3fb27SDimitry Andricdef FLD_D : FP_LOAD_2RI12<0x2b800000, FPR64>;
10606c3fb27SDimitry Andricdef FST_D : FP_STORE_2RI12<0x2bc00000, FPR64>;
10706c3fb27SDimitry Andricdef FLDX_D : FP_LOAD_3R<0x38340000, FPR64>;
10806c3fb27SDimitry Andricdef FSTX_D : FP_STORE_3R<0x383c0000, FPR64>;
10981ad6265SDimitry Andric
11081ad6265SDimitry Andric// Bound Check Memory Access Instructions
11106c3fb27SDimitry Andricdef FLDGT_D : FP_LOAD_3R<0x38748000, FPR64>;
11206c3fb27SDimitry Andricdef FLDLE_D : FP_LOAD_3R<0x38758000, FPR64>;
11306c3fb27SDimitry Andricdef FSTGT_D : FP_STORE_3R<0x38768000, FPR64>;
11406c3fb27SDimitry Andricdef FSTLE_D : FP_STORE_3R<0x38778000, FPR64>;
11581ad6265SDimitry Andric
11681ad6265SDimitry Andric} // Predicates = [HasBasicD]
11781ad6265SDimitry Andric
11881ad6265SDimitry Andric// Instructions only available on LA64
11981ad6265SDimitry Andriclet Predicates = [HasBasicD, IsLA64] in {
12006c3fb27SDimitry Andricdef MOVGR2FR_D  : FP_MOV<0x0114a800, FPR64, GPR>;
12106c3fb27SDimitry Andricdef MOVFR2GR_D  : FP_MOV<0x0114b800, GPR, FPR64>;
12281ad6265SDimitry Andric} // Predicates = [HasBasicD, IsLA64]
12381ad6265SDimitry Andric
124753f127fSDimitry Andric// Instructions only available on LA32
125753f127fSDimitry Andriclet Predicates = [HasBasicD, IsLA32], isCodeGenOnly = 1 in {
12606c3fb27SDimitry Andricdef MOVGR2FR_W_64 : FP_MOV<0x0114a400, FPR64, GPR>;
127753f127fSDimitry Andric} // Predicates = [HasBasicD, IsLA32], isCodeGenOnly = 1
128753f127fSDimitry Andric
12981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13081ad6265SDimitry Andric// Pseudo-instructions and codegen patterns
13181ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13281ad6265SDimitry Andric
13381ad6265SDimitry Andriclet Predicates = [HasBasicD] in {
13481ad6265SDimitry Andric
13581ad6265SDimitry Andric/// Float arithmetic operations
13681ad6265SDimitry Andric
13781ad6265SDimitry Andricdef : PatFprFpr<fadd, FADD_D, FPR64>;
13881ad6265SDimitry Andricdef : PatFprFpr<fsub, FSUB_D, FPR64>;
13981ad6265SDimitry Andricdef : PatFprFpr<fmul, FMUL_D, FPR64>;
14081ad6265SDimitry Andricdef : PatFprFpr<fdiv, FDIV_D, FPR64>;
141bdd1243dSDimitry Andricdef : PatFprFpr<fcopysign, FCOPYSIGN_D, FPR64>;
142bdd1243dSDimitry Andricdef : PatFprFpr<fmaxnum_ieee, FMAX_D, FPR64>;
143bdd1243dSDimitry Andricdef : PatFprFpr<fminnum_ieee, FMIN_D, FPR64>;
14481ad6265SDimitry Andricdef : PatFpr<fneg, FNEG_D, FPR64>;
145bdd1243dSDimitry Andricdef : PatFpr<fabs, FABS_D, FPR64>;
146bdd1243dSDimitry Andricdef : PatFpr<fsqrt, FSQRT_D, FPR64>;
147bdd1243dSDimitry Andricdef : Pat<(fdiv fpimm1, (fsqrt FPR64:$fj)), (FRSQRT_D FPR64:$fj)>;
148bdd1243dSDimitry Andricdef : Pat<(fcopysign FPR64:$fj, FPR32:$fk),
149bdd1243dSDimitry Andric          (FCOPYSIGN_D FPR64:$fj, (FCVT_D_S FPR32:$fk))>;
150bdd1243dSDimitry Andricdef : Pat<(fcopysign FPR32:$fj, FPR64:$fk),
151bdd1243dSDimitry Andric          (FCOPYSIGN_S FPR32:$fj, (FCVT_S_D FPR64:$fk))>;
152bdd1243dSDimitry Andricdef : Pat<(fcanonicalize FPR64:$fj), (FMAX_D $fj, $fj)>;
1535f757f3fSDimitry Andriclet Predicates = [IsLA32] in {
1545f757f3fSDimitry Andricdef : Pat<(is_fpclass FPR64:$fj, (i32 timm:$mask)),
1555f757f3fSDimitry Andric          (SLTU R0, (ANDI (MOVFR2GR_S_64 (FCLASS_D FPR64:$fj)),
1565f757f3fSDimitry Andric                          (to_fclass_mask timm:$mask)))>;
1575f757f3fSDimitry Andric} // Predicates = [IsLA32]
1585f757f3fSDimitry Andriclet Predicates = [IsLA64] in {
1595f757f3fSDimitry Andricdef : Pat<(is_fpclass FPR64:$fj, (i32 timm:$mask)),
1605f757f3fSDimitry Andric          (SLTU R0, (ANDI (MOVFR2GR_D (FCLASS_D FPR64:$fj)),
1615f757f3fSDimitry Andric                          (to_fclass_mask timm:$mask)))>;
1625f757f3fSDimitry Andric} // Predicates = [IsLA64]
16381ad6265SDimitry Andric
16481ad6265SDimitry Andric/// Setcc
16581ad6265SDimitry Andric
16681ad6265SDimitry Andric// Match non-signaling comparison
16781ad6265SDimitry Andric
168bdd1243dSDimitry Andric// SETOGT/SETOGE/SETUGT/SETUGE/SETGE/SETNE/SETGT will expand into
169bdd1243dSDimitry Andric// SETOLT/SETOLE/SETULT/SETULE/SETLE/SETEQ/SETLT.
17081ad6265SDimitry Andricdef : PatFPSetcc<SETOEQ, FCMP_CEQ_D,  FPR64>;
171bdd1243dSDimitry Andricdef : PatFPSetcc<SETEQ,  FCMP_CEQ_D,  FPR64>;
17281ad6265SDimitry Andricdef : PatFPSetcc<SETOLT, FCMP_CLT_D,  FPR64>;
17381ad6265SDimitry Andricdef : PatFPSetcc<SETOLE, FCMP_CLE_D,  FPR64>;
174bdd1243dSDimitry Andricdef : PatFPSetcc<SETLE,  FCMP_CLE_D,  FPR64>;
17581ad6265SDimitry Andricdef : PatFPSetcc<SETONE, FCMP_CNE_D,  FPR64>;
17681ad6265SDimitry Andricdef : PatFPSetcc<SETO,   FCMP_COR_D,  FPR64>;
17781ad6265SDimitry Andricdef : PatFPSetcc<SETUEQ, FCMP_CUEQ_D, FPR64>;
17881ad6265SDimitry Andricdef : PatFPSetcc<SETULT, FCMP_CULT_D, FPR64>;
17981ad6265SDimitry Andricdef : PatFPSetcc<SETULE, FCMP_CULE_D, FPR64>;
18081ad6265SDimitry Andricdef : PatFPSetcc<SETUNE, FCMP_CUNE_D, FPR64>;
18181ad6265SDimitry Andricdef : PatFPSetcc<SETUO,  FCMP_CUN_D,  FPR64>;
182753f127fSDimitry Andricdef : PatFPSetcc<SETLT,  FCMP_CLT_D,  FPR64>;
18381ad6265SDimitry Andric
184bdd1243dSDimitry Andricdefm : PatFPBrcond<SETOEQ, FCMP_CEQ_D, FPR64>;
185bdd1243dSDimitry Andricdefm : PatFPBrcond<SETOLT, FCMP_CLT_D, FPR64>;
186bdd1243dSDimitry Andricdefm : PatFPBrcond<SETOLE, FCMP_CLE_D, FPR64>;
187bdd1243dSDimitry Andricdefm : PatFPBrcond<SETONE, FCMP_CNE_D, FPR64>;
188bdd1243dSDimitry Andricdefm : PatFPBrcond<SETO,   FCMP_COR_D, FPR64>;
189bdd1243dSDimitry Andricdefm : PatFPBrcond<SETUEQ, FCMP_CUEQ_D, FPR64>;
190bdd1243dSDimitry Andricdefm : PatFPBrcond<SETULT, FCMP_CULT_D, FPR64>;
191bdd1243dSDimitry Andricdefm : PatFPBrcond<SETULE, FCMP_CULE_D, FPR64>;
192bdd1243dSDimitry Andricdefm : PatFPBrcond<SETUNE, FCMP_CUNE_D, FPR64>;
193bdd1243dSDimitry Andricdefm : PatFPBrcond<SETUO,  FCMP_CUN_D, FPR64>;
194bdd1243dSDimitry Andricdefm : PatFPBrcond<SETLT,  FCMP_CLT_D, FPR64>;
195bdd1243dSDimitry Andric
196bdd1243dSDimitry Andric// Match signaling comparison
197bdd1243dSDimitry Andric
198bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETOEQ, FCMP_SEQ_D,  FPR64>;
199bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETOLT, FCMP_SLT_D,  FPR64>;
200bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETOLE, FCMP_SLE_D,  FPR64>;
201bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETONE, FCMP_SNE_D,  FPR64>;
202bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETO,   FCMP_SOR_D,  FPR64>;
203bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETUEQ, FCMP_SUEQ_D, FPR64>;
204bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETULT, FCMP_SULT_D, FPR64>;
205bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETULE, FCMP_SULE_D, FPR64>;
206bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETUNE, FCMP_SUNE_D, FPR64>;
207bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETUO,  FCMP_SUN_D,  FPR64>;
208bdd1243dSDimitry Andricdef : PatStrictFsetccs<SETLT,  FCMP_SLT_D,  FPR64>;
20981ad6265SDimitry Andric
21081ad6265SDimitry Andric/// Select
21181ad6265SDimitry Andric
212bdd1243dSDimitry Andricdef : Pat<(select CFR:$cc, FPR64:$fk, FPR64:$fj),
21306c3fb27SDimitry Andric          (FSEL_xD FPR64:$fj, FPR64:$fk, CFR:$cc)>;
21481ad6265SDimitry Andric
21581ad6265SDimitry Andric/// Selectcc
21681ad6265SDimitry Andric
21706c3fb27SDimitry Andricdef : PatFPSelectcc<SETOEQ, FCMP_CEQ_D,  FSEL_xD, FPR64>;
21806c3fb27SDimitry Andricdef : PatFPSelectcc<SETOLT, FCMP_CLT_D,  FSEL_xD, FPR64>;
21906c3fb27SDimitry Andricdef : PatFPSelectcc<SETOLE, FCMP_CLE_D,  FSEL_xD, FPR64>;
22006c3fb27SDimitry Andricdef : PatFPSelectcc<SETONE, FCMP_CNE_D,  FSEL_xD, FPR64>;
22106c3fb27SDimitry Andricdef : PatFPSelectcc<SETO,   FCMP_COR_D,  FSEL_xD, FPR64>;
22206c3fb27SDimitry Andricdef : PatFPSelectcc<SETUEQ, FCMP_CUEQ_D, FSEL_xD, FPR64>;
22306c3fb27SDimitry Andricdef : PatFPSelectcc<SETULT, FCMP_CULT_D, FSEL_xD, FPR64>;
22406c3fb27SDimitry Andricdef : PatFPSelectcc<SETULE, FCMP_CULE_D, FSEL_xD, FPR64>;
22506c3fb27SDimitry Andricdef : PatFPSelectcc<SETUNE, FCMP_CUNE_D, FSEL_xD, FPR64>;
22606c3fb27SDimitry Andricdef : PatFPSelectcc<SETUO,  FCMP_CUN_D,  FSEL_xD, FPR64>;
22781ad6265SDimitry Andric
228753f127fSDimitry Andric/// Loads
229753f127fSDimitry Andric
230753f127fSDimitry Andricdefm : LdPat<load, FLD_D, f64>;
231bdd1243dSDimitry Andricdef : RegRegLdPat<load, FLDX_D, f64>;
232753f127fSDimitry Andric
233753f127fSDimitry Andric/// Stores
234753f127fSDimitry Andric
235753f127fSDimitry Andricdefm : StPat<store, FST_D, FPR64, f64>;
236bdd1243dSDimitry Andricdef : RegRegStPat<store, FSTX_D, FPR64, f64>;
237753f127fSDimitry Andric
238753f127fSDimitry Andric/// FP conversion operations
239753f127fSDimitry Andric
240753f127fSDimitry Andricdef : Pat<(loongarch_ftint FPR64:$src), (FTINTRZ_W_D FPR64:$src)>;
241753f127fSDimitry Andricdef : Pat<(f64 (loongarch_ftint FPR64:$src)), (FTINTRZ_L_D FPR64:$src)>;
242753f127fSDimitry Andricdef : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_L_S FPR32:$src)>;
243753f127fSDimitry Andric
244753f127fSDimitry Andric// f64 -> f32
245753f127fSDimitry Andricdef : Pat<(f32 (fpround FPR64:$src)), (FCVT_S_D FPR64:$src)>;
246753f127fSDimitry Andric// f32 -> f64
247753f127fSDimitry Andricdef : Pat<(f64 (fpextend FPR32:$src)), (FCVT_D_S FPR32:$src)>;
248bdd1243dSDimitry Andric
249bdd1243dSDimitry Andric// FP reciprocal operation
250bdd1243dSDimitry Andricdef : Pat<(fdiv fpimm1, FPR64:$src), (FRECIP_D $src)>;
251bdd1243dSDimitry Andric
252*7a6dacacSDimitry Andriclet Predicates = [HasFrecipe] in {
253*7a6dacacSDimitry Andric// FP approximate reciprocal operation
254*7a6dacacSDimitry Andricdef : Pat<(int_loongarch_frecipe_d FPR64:$src), (FRECIPE_D FPR64:$src)>;
255*7a6dacacSDimitry Andricdef : Pat<(int_loongarch_frsqrte_d FPR64:$src), (FRSQRTE_D FPR64:$src)>;
256*7a6dacacSDimitry Andric}
257*7a6dacacSDimitry Andric
258bdd1243dSDimitry Andric// fmadd.d: fj * fk + fa
259bdd1243dSDimitry Andricdef : Pat<(fma FPR64:$fj, FPR64:$fk, FPR64:$fa), (FMADD_D $fj, $fk, $fa)>;
260bdd1243dSDimitry Andric
261bdd1243dSDimitry Andric// fmsub.d: fj * fk - fa
262bdd1243dSDimitry Andricdef : Pat<(fma FPR64:$fj, FPR64:$fk, (fneg FPR64:$fa)),
263bdd1243dSDimitry Andric          (FMSUB_D FPR64:$fj, FPR64:$fk, FPR64:$fa)>;
264bdd1243dSDimitry Andric
265bdd1243dSDimitry Andric// fnmadd.d: -(fj * fk + fa)
266bdd1243dSDimitry Andricdef : Pat<(fneg (fma FPR64:$fj, FPR64:$fk, FPR64:$fa)),
267bdd1243dSDimitry Andric          (FNMADD_D FPR64:$fj, FPR64:$fk, FPR64:$fa)>;
268bdd1243dSDimitry Andric
269bdd1243dSDimitry Andric// fnmadd.d: -fj * fk - fa (the nsz flag on the FMA)
270bdd1243dSDimitry Andricdef : Pat<(fma_nsz (fneg FPR64:$fj), FPR64:$fk, (fneg FPR64:$fa)),
271bdd1243dSDimitry Andric          (FNMADD_D FPR64:$fj, FPR64:$fk, FPR64:$fa)>;
272bdd1243dSDimitry Andric
273bdd1243dSDimitry Andric// fnmsub.d: -(fj * fk - fa)
2745f757f3fSDimitry Andricdef : Pat<(fneg (fma FPR64:$fj, FPR64:$fk, (fneg FPR64:$fa))),
2755f757f3fSDimitry Andric          (FNMSUB_D FPR64:$fj, FPR64:$fk, FPR64:$fa)>;
2765f757f3fSDimitry Andric
2775f757f3fSDimitry Andric// fnmsub.d: -fj * fk + fa (the nsz flag on the FMA)
2785f757f3fSDimitry Andricdef : Pat<(fma_nsz (fneg FPR64:$fj), FPR64:$fk, FPR64:$fa),
279bdd1243dSDimitry Andric          (FNMSUB_D FPR64:$fj, FPR64:$fk, FPR64:$fa)>;
28081ad6265SDimitry Andric} // Predicates = [HasBasicD]
281753f127fSDimitry Andric
282753f127fSDimitry Andric/// Floating point constants
283753f127fSDimitry Andric
284753f127fSDimitry Andriclet Predicates = [HasBasicD, IsLA64] in {
285753f127fSDimitry Andricdef : Pat<(f64 fpimm0), (MOVGR2FR_D R0)>;
286753f127fSDimitry Andricdef : Pat<(f64 fpimm0neg), (FNEG_D (MOVGR2FR_D R0))>;
287753f127fSDimitry Andricdef : Pat<(f64 fpimm1), (FFINT_D_L (MOVGR2FR_D (ADDI_D R0, 1)))>;
288753f127fSDimitry Andric} // Predicates = [HasBasicD, IsLA64]
289753f127fSDimitry Andriclet Predicates = [HasBasicD, IsLA32] in {
290753f127fSDimitry Andricdef : Pat<(f64 fpimm0), (MOVGR2FRH_W (MOVGR2FR_W_64 R0), R0)>;
291753f127fSDimitry Andricdef : Pat<(f64 fpimm0neg), (FNEG_D (MOVGR2FRH_W (MOVGR2FR_W_64 R0), R0))>;
292753f127fSDimitry Andricdef : Pat<(f64 fpimm1), (FCVT_D_S (FFINT_S_W (MOVGR2FR_W (ADDI_W R0, 1))))>;
293bdd1243dSDimitry Andric} // Predicates = [HasBasicD, IsLA32]
294753f127fSDimitry Andric
295bdd1243dSDimitry Andric/// Convert int to FP
296bdd1243dSDimitry Andric
297bdd1243dSDimitry Andriclet Predicates = [HasBasicD, IsLA64] in {
298bdd1243dSDimitry Andricdef : Pat<(f32 (sint_to_fp GPR:$src)), (FFINT_S_L (MOVGR2FR_D GPR:$src))>;
299bdd1243dSDimitry Andricdef : Pat<(f64 (sint_to_fp (i64 (sexti32 (i64 GPR:$src))))),
300bdd1243dSDimitry Andric          (FFINT_D_W (MOVGR2FR_W GPR:$src))>;
301bdd1243dSDimitry Andricdef : Pat<(f64 (sint_to_fp GPR:$src)), (FFINT_D_L (MOVGR2FR_D GPR:$src))>;
302bdd1243dSDimitry Andric
303bdd1243dSDimitry Andricdef : Pat<(bitconvert GPR:$src), (MOVGR2FR_D GPR:$src)>;
304bdd1243dSDimitry Andric} // Predicates = [HasBasicD, IsLA64]
305bdd1243dSDimitry Andriclet Predicates = [HasBasicD, IsLA32] in {
306753f127fSDimitry Andricdef : Pat<(f64 (sint_to_fp (i32 GPR:$src))), (FFINT_D_W (MOVGR2FR_W GPR:$src))>;
307753f127fSDimitry Andric} // Predicates = [HasBasicD, IsLA32]
308bdd1243dSDimitry Andric
309bdd1243dSDimitry Andric// Convert FP to int
310bdd1243dSDimitry Andriclet Predicates = [HasBasicD, IsLA64] in {
311bdd1243dSDimitry Andricdef : Pat<(bitconvert FPR64:$src), (MOVFR2GR_D FPR64:$src)>;
312bdd1243dSDimitry Andric} // Predicates = [HasBasicD, IsLA64]
313bdd1243dSDimitry Andric
314bdd1243dSDimitry Andric// FP Rounding
315bdd1243dSDimitry Andriclet Predicates = [HasBasicD, IsLA64] in {
316bdd1243dSDimitry Andricdef : PatFpr<frint, FRINT_D, FPR64>;
317bdd1243dSDimitry Andric} // Predicates = [HasBasicD, IsLA64]
318