|
| 1 | +//=-- LoongArchInstrInfoD.td - Double-Precision Float instr -*- tablegen -*-==// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | +// |
| 9 | +// This file describes the basic double-precision floating-point instructions. |
| 10 | +// |
| 11 | +//===----------------------------------------------------------------------===// |
| 12 | + |
| 13 | +//===----------------------------------------------------------------------===// |
| 14 | +// Instructions |
| 15 | +//===----------------------------------------------------------------------===// |
| 16 | + |
| 17 | +let Predicates = [HasBasicD] in { |
| 18 | + |
| 19 | +// Arithmetic Operation Instructions |
| 20 | +def FADD_D : FP_ALU_3R<0b00000001000000010, "fadd.d", FPR64>; |
| 21 | +def FSUB_D : FP_ALU_3R<0b00000001000000110, "fsub.d", FPR64>; |
| 22 | +def FMUL_D : FP_ALU_3R<0b00000001000001010, "fmul.d", FPR64>; |
| 23 | +def FDIV_D : FP_ALU_3R<0b00000001000001110, "fdiv.d", FPR64>; |
| 24 | +def FMADD_D : FP_ALU_4R<0b000010000010, "fmadd.d", FPR64>; |
| 25 | +def FMSUB_D : FP_ALU_4R<0b000010000110, "fmsub.d", FPR64>; |
| 26 | +def FNMADD_D : FP_ALU_4R<0b000010001010, "fnmadd.d", FPR64>; |
| 27 | +def FNMSUB_D : FP_ALU_4R<0b000010001110, "fnmsub.d", FPR64>; |
| 28 | +def FMAX_D : FP_ALU_3R<0b00000001000010010, "fmax.d", FPR64>; |
| 29 | +def FMIN_D : FP_ALU_3R<0b00000001000010110, "fmin.d", FPR64>; |
| 30 | +def FMAXA_D : FP_ALU_3R<0b00000001000011010, "fmaxa.d", FPR64>; |
| 31 | +def FMINA_D : FP_ALU_3R<0b00000001000011110, "fmina.d", FPR64>; |
| 32 | +def FABS_D : FP_ALU_2R<0b0000000100010100000010, "fabs.d", FPR64>; |
| 33 | +def FNEG_D : FP_ALU_2R<0b0000000100010100000110, "fneg.d", FPR64>; |
| 34 | +def FSQRT_D : FP_ALU_2R<0b0000000100010100010010, "fsqrt.d", FPR64>; |
| 35 | +def FRECIP_D : FP_ALU_2R<0b0000000100010100010110, "frecip.d", FPR64>; |
| 36 | +def FRSQRT_D : FP_ALU_2R<0b0000000100010100011010, "frsqrt.d", FPR64>; |
| 37 | +def FSCALEB_D : FP_ALU_3R<0b00000001000100010, "fscaleb.d", FPR64>; |
| 38 | +def FLOGB_D : FP_ALU_2R<0b0000000100010100001010, "flogb.d", FPR64>; |
| 39 | +def FCOPYSIGN_D : FP_ALU_3R<0b00000001000100110, "fcopysign.d", FPR64>; |
| 40 | +def FCLASS_D : FP_ALU_2R<0b0000000100010100001110, "fclass.d", FPR64>; |
| 41 | + |
| 42 | +// Comparison Instructions |
| 43 | +def FCMP_CAF_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CAF, "fcmp.caf.d", FPR32>; |
| 44 | +def FCMP_CUN_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CUN, "fcmp.cun.d", FPR32>; |
| 45 | +def FCMP_CEQ_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CEQ, "fcmp.ceq.d", FPR32>; |
| 46 | +def FCMP_CUEQ_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CUEQ, "fcmp.cueq.d", FPR32>; |
| 47 | +def FCMP_CLT_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CLT, "fcmp.clt.d", FPR32>; |
| 48 | +def FCMP_CULT_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CULT, "fcmp.cult.d", FPR32>; |
| 49 | +def FCMP_CLE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CLE, "fcmp.cle.d", FPR32>; |
| 50 | +def FCMP_CULE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CULE, "fcmp.cule.d", FPR32>; |
| 51 | +def FCMP_CNE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CNE, "fcmp.cne.d", FPR32>; |
| 52 | +def FCMP_COR_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_COR, "fcmp.cor.d", FPR32>; |
| 53 | +def FCMP_CUNE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_CUNE, "fcmp.cune.d", FPR32>; |
| 54 | +def FCMP_SAF_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SAF, "fcmp.saf.d", FPR32>; |
| 55 | +def FCMP_SUN_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SUN, "fcmp.sun.d", FPR32>; |
| 56 | +def FCMP_SEQ_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SEQ, "fcmp.seq.d", FPR32>; |
| 57 | +def FCMP_SUEQ_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SUEQ, "fcmp.sueq.d", FPR32>; |
| 58 | +def FCMP_SLT_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SLT, "fcmp.slt.d", FPR32>; |
| 59 | +def FCMP_SULT_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SULT, "fcmp.sult.d", FPR32>; |
| 60 | +def FCMP_SLE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SLE, "fcmp.sle.d", FPR32>; |
| 61 | +def FCMP_SULE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SULE, "fcmp.sule.d", FPR32>; |
| 62 | +def FCMP_SNE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SNE, "fcmp.sne.d", FPR32>; |
| 63 | +def FCMP_SOR_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SOR, "fcmp.sor.d", FPR32>; |
| 64 | +def FCMP_SUNE_D : FP_CMP<FPCMP_OPC_D, FPCMP_COND_SUNE, "fcmp.sune.d", FPR32>; |
| 65 | + |
| 66 | +// Conversion Instructions |
| 67 | +def FFINT_S_L : FP_CONV<0b0000000100011101000110, "ffint.s.l", FPR32, FPR64>; |
| 68 | +def FTINT_L_S : FP_CONV<0b0000000100011011001001, "ftint.l.s", FPR64, FPR32>; |
| 69 | +def FTINTRM_L_S : FP_CONV<0b0000000100011010001001, "ftintrm.l.s", FPR64, |
| 70 | + FPR32>; |
| 71 | +def FTINTRP_L_S : FP_CONV<0b0000000100011010011001, "ftintrp.l.s", FPR64, |
| 72 | + FPR32>; |
| 73 | +def FTINTRZ_L_S : FP_CONV<0b0000000100011010101001, "ftintrz.l.s", FPR64, |
| 74 | + FPR32>; |
| 75 | +def FTINTRNE_L_S : FP_CONV<0b0000000100011010111001, "ftintrne.l.s", FPR64, |
| 76 | + FPR32>; |
| 77 | +def FCVT_S_D : FP_CONV<0b0000000100011001000110, "fcvt.s.d", FPR32, FPR64>; |
| 78 | +def FCVT_D_S : FP_CONV<0b0000000100011001001001, "fcvt.d.s", FPR64, FPR32>; |
| 79 | +def FFINT_D_W : FP_CONV<0b0000000100011101001000, "ffint.d.w", FPR64, FPR32>; |
| 80 | +def FFINT_D_L : FP_CONV<0b0000000100011101001010, "ffint.d.l", FPR64, FPR64>; |
| 81 | +def FTINT_W_D : FP_CONV<0b0000000100011011000010, "ftint.w.d", FPR32, FPR64>; |
| 82 | +def FTINT_L_D : FP_CONV<0b0000000100011011001010, "ftint.l.d", FPR64, FPR64>; |
| 83 | +def FTINTRM_W_D : FP_CONV<0b0000000100011010000010, "ftintrm.w.d", FPR32, |
| 84 | + FPR64>; |
| 85 | +def FTINTRM_L_D : FP_CONV<0b0000000100011010001010, "ftintrm.l.d", FPR64, |
| 86 | + FPR64>; |
| 87 | +def FTINTRP_W_D : FP_CONV<0b0000000100011010010010, "ftintrp.w.d", FPR32, |
| 88 | + FPR64>; |
| 89 | +def FTINTRP_L_D : FP_CONV<0b0000000100011010011010, "ftintrp.l.d", FPR64, |
| 90 | + FPR64>; |
| 91 | +def FTINTRZ_W_D : FP_CONV<0b0000000100011010100010, "ftintrz.w.d", FPR32, |
| 92 | + FPR64>; |
| 93 | +def FTINTRZ_L_D : FP_CONV<0b0000000100011010101010, "ftintrz.l.d", FPR64, |
| 94 | + FPR64>; |
| 95 | +def FTINTRNE_W_D : FP_CONV<0b0000000100011010110010, "ftintrne.w.d", FPR32, |
| 96 | + FPR64>; |
| 97 | +def FTINTRNE_L_D : FP_CONV<0b0000000100011010111010, "ftintrne.l.d", FPR64, |
| 98 | + FPR64>; |
| 99 | +def FRINT_D : FP_CONV<0b0000000100011110010010, "frint.d", FPR64, FPR64>; |
| 100 | + |
| 101 | +// Move Instructions |
| 102 | +def FMOV_D : FP_MOV<0b0000000100010100100110, "fmov.d", FPR64, FPR64>; |
| 103 | +def MOVFRH2GR_S : FP_MOV<0b0000000100010100101111, "movfrh2gr.s", GPR, FPR64>; |
| 104 | +let isCodeGenOnly = 1 in { |
| 105 | +def MOVFR2GR_S_64 : FP_MOV<0b0000000100010100101101, "movfr2gr.s", GPR, FPR64>; |
| 106 | +def FSEL_D : FP_SEL<0b00001101000000, "fsel", FPR64>; |
| 107 | +} // isCodeGenOnly = 1 |
| 108 | +let Constraints = "$dst = $out" in { |
| 109 | +def MOVGR2FRH_W : FPFmtMOV<0b0000000100010100101011, (outs FPR64:$out), |
| 110 | + (ins FPR64:$dst, GPR:$src), "movgr2frh.w", |
| 111 | + "$dst, $src">; |
| 112 | +} // Constraints = "$dst = $out" |
| 113 | + |
| 114 | +// Common Memory Access Instructions |
| 115 | +def FLD_D : FP_LOAD_2RI12<0b0010101110, "fld.d", FPR64>; |
| 116 | +def FST_D : FP_STORE_2RI12<0b0010101111, "fst.d", FPR64>; |
| 117 | +def FLDX_D : FP_LOAD_3R<0b00111000001101000, "fldx.d", FPR64>; |
| 118 | +def FSTX_D : FP_STORE_3R<0b00111000001111000, "fstx.d", FPR64>; |
| 119 | + |
| 120 | +// Bound Check Memory Access Instructions |
| 121 | +def FLDGT_D : FP_LOAD_3R<0b00111000011101001, "fldgt.d", FPR64>; |
| 122 | +def FLDLE_D : FP_LOAD_3R<0b00111000011101011, "fldle.d", FPR64>; |
| 123 | +def FSTGT_D : FP_STORE_3R<0b00111000011101101, "fstgt.d", FPR64>; |
| 124 | +def FSTLE_D : FP_STORE_3R<0b00111000011101111, "fstle.d", FPR64>; |
| 125 | + |
| 126 | +} // Predicates = [HasBasicD] |
| 127 | + |
| 128 | +// Instructions only available on LA64 |
| 129 | +let Predicates = [HasBasicD, IsLA64] in { |
| 130 | +def MOVGR2FR_D : FP_MOV<0b0000000100010100101010, "movgr2fr.d", FPR64, GPR>; |
| 131 | +def MOVFR2GR_D : FP_MOV<0b0000000100010100101110, "movfr2gr.d", GPR, FPR64>; |
| 132 | +} // Predicates = [HasBasicD, IsLA64] |
| 133 | + |
0 commit comments