qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

trans_farith.c.inc (4112B)


      1 /* SPDX-License-Identifier: GPL-2.0-or-later */
      2 /*
      3  * Copyright (c) 2021 Loongson Technology Corporation Limited
      4  */
      5 
      6 #ifndef CONFIG_USER_ONLY
      7 #define CHECK_FPE do { \
      8     if ((ctx->base.tb->flags & HW_FLAGS_EUEN_FPE) == 0) { \
      9         generate_exception(ctx, EXCCODE_FPD); \
     10         return true; \
     11     } \
     12 } while (0)
     13 #else
     14 #define CHECK_FPE
     15 #endif
     16 
     17 static bool gen_fff(DisasContext *ctx, arg_fff *a,
     18                     void (*func)(TCGv, TCGv_env, TCGv, TCGv))
     19 {
     20     CHECK_FPE;
     21 
     22     func(cpu_fpr[a->fd], cpu_env, cpu_fpr[a->fj], cpu_fpr[a->fk]);
     23     return true;
     24 }
     25 
     26 static bool gen_ff(DisasContext *ctx, arg_ff *a,
     27                    void (*func)(TCGv, TCGv_env, TCGv))
     28 {
     29     CHECK_FPE;
     30 
     31     func(cpu_fpr[a->fd], cpu_env, cpu_fpr[a->fj]);
     32     return true;
     33 }
     34 
     35 static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
     36                        void (*func)(TCGv, TCGv_env, TCGv, TCGv, TCGv, TCGv_i32),
     37                        int flag)
     38 {
     39     TCGv_i32 tflag = tcg_constant_i32(flag);
     40 
     41     CHECK_FPE;
     42 
     43     func(cpu_fpr[a->fd], cpu_env, cpu_fpr[a->fj],
     44          cpu_fpr[a->fk], cpu_fpr[a->fa], tflag);
     45     return true;
     46 }
     47 
     48 static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
     49 {
     50     CHECK_FPE;
     51 
     52     tcg_gen_deposit_i64(cpu_fpr[a->fd], cpu_fpr[a->fk], cpu_fpr[a->fj], 0, 31);
     53     return true;
     54 }
     55 
     56 static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
     57 {
     58     CHECK_FPE;
     59 
     60     tcg_gen_deposit_i64(cpu_fpr[a->fd], cpu_fpr[a->fk], cpu_fpr[a->fj], 0, 63);
     61     return true;
     62 }
     63 
     64 static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
     65 {
     66     CHECK_FPE;
     67 
     68     tcg_gen_andi_i64(cpu_fpr[a->fd], cpu_fpr[a->fj], MAKE_64BIT_MASK(0, 31));
     69     gen_nanbox_s(cpu_fpr[a->fd], cpu_fpr[a->fd]);
     70     return true;
     71 }
     72 
     73 static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
     74 {
     75     CHECK_FPE;
     76 
     77     tcg_gen_andi_i64(cpu_fpr[a->fd], cpu_fpr[a->fj], MAKE_64BIT_MASK(0, 63));
     78     return true;
     79 }
     80 
     81 static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
     82 {
     83     CHECK_FPE;
     84 
     85     tcg_gen_xori_i64(cpu_fpr[a->fd], cpu_fpr[a->fj], 0x80000000);
     86     gen_nanbox_s(cpu_fpr[a->fd], cpu_fpr[a->fd]);
     87     return true;
     88 }
     89 
     90 static bool trans_fneg_d(DisasContext *ctx, arg_fneg_d *a)
     91 {
     92     CHECK_FPE;
     93 
     94     tcg_gen_xori_i64(cpu_fpr[a->fd], cpu_fpr[a->fj], 0x8000000000000000LL);
     95     return true;
     96 }
     97 
     98 TRANS(fadd_s, gen_fff, gen_helper_fadd_s)
     99 TRANS(fadd_d, gen_fff, gen_helper_fadd_d)
    100 TRANS(fsub_s, gen_fff, gen_helper_fsub_s)
    101 TRANS(fsub_d, gen_fff, gen_helper_fsub_d)
    102 TRANS(fmul_s, gen_fff, gen_helper_fmul_s)
    103 TRANS(fmul_d, gen_fff, gen_helper_fmul_d)
    104 TRANS(fdiv_s, gen_fff, gen_helper_fdiv_s)
    105 TRANS(fdiv_d, gen_fff, gen_helper_fdiv_d)
    106 TRANS(fmax_s, gen_fff, gen_helper_fmax_s)
    107 TRANS(fmax_d, gen_fff, gen_helper_fmax_d)
    108 TRANS(fmin_s, gen_fff, gen_helper_fmin_s)
    109 TRANS(fmin_d, gen_fff, gen_helper_fmin_d)
    110 TRANS(fmaxa_s, gen_fff, gen_helper_fmaxa_s)
    111 TRANS(fmaxa_d, gen_fff, gen_helper_fmaxa_d)
    112 TRANS(fmina_s, gen_fff, gen_helper_fmina_s)
    113 TRANS(fmina_d, gen_fff, gen_helper_fmina_d)
    114 TRANS(fscaleb_s, gen_fff, gen_helper_fscaleb_s)
    115 TRANS(fscaleb_d, gen_fff, gen_helper_fscaleb_d)
    116 TRANS(fsqrt_s, gen_ff, gen_helper_fsqrt_s)
    117 TRANS(fsqrt_d, gen_ff, gen_helper_fsqrt_d)
    118 TRANS(frecip_s, gen_ff, gen_helper_frecip_s)
    119 TRANS(frecip_d, gen_ff, gen_helper_frecip_d)
    120 TRANS(frsqrt_s, gen_ff, gen_helper_frsqrt_s)
    121 TRANS(frsqrt_d, gen_ff, gen_helper_frsqrt_d)
    122 TRANS(flogb_s, gen_ff, gen_helper_flogb_s)
    123 TRANS(flogb_d, gen_ff, gen_helper_flogb_d)
    124 TRANS(fclass_s, gen_ff, gen_helper_fclass_s)
    125 TRANS(fclass_d, gen_ff, gen_helper_fclass_d)
    126 TRANS(fmadd_s, gen_muladd, gen_helper_fmuladd_s, 0)
    127 TRANS(fmadd_d, gen_muladd, gen_helper_fmuladd_d, 0)
    128 TRANS(fmsub_s, gen_muladd, gen_helper_fmuladd_s, float_muladd_negate_c)
    129 TRANS(fmsub_d, gen_muladd, gen_helper_fmuladd_d, float_muladd_negate_c)
    130 TRANS(fnmadd_s, gen_muladd, gen_helper_fmuladd_s, float_muladd_negate_result)
    131 TRANS(fnmadd_d, gen_muladd, gen_helper_fmuladd_d, float_muladd_negate_result)
    132 TRANS(fnmsub_s, gen_muladd, gen_helper_fmuladd_s,
    133       float_muladd_negate_c | float_muladd_negate_result)
    134 TRANS(fnmsub_d, gen_muladd, gen_helper_fmuladd_d,
    135       float_muladd_negate_c | float_muladd_negate_result)