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