cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

dfp-impl.c.inc (9610B)


      1/*** Decimal Floating Point ***/
      2
      3static inline TCGv_ptr gen_fprp_ptr(int reg)
      4{
      5    TCGv_ptr r = tcg_temp_new_ptr();
      6    tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, vsr[reg].u64[0]));
      7    return r;
      8}
      9
     10#define GEN_DFP_T_A_B_Rc(name)                   \
     11static void gen_##name(DisasContext *ctx)        \
     12{                                                \
     13    TCGv_ptr rd, ra, rb;                         \
     14    if (unlikely(!ctx->fpu_enabled)) {           \
     15        gen_exception(ctx, POWERPC_EXCP_FPU);    \
     16        return;                                  \
     17    }                                            \
     18    gen_update_nip(ctx, ctx->base.pc_next - 4);  \
     19    rd = gen_fprp_ptr(rD(ctx->opcode));          \
     20    ra = gen_fprp_ptr(rA(ctx->opcode));          \
     21    rb = gen_fprp_ptr(rB(ctx->opcode));          \
     22    gen_helper_##name(cpu_env, rd, ra, rb);      \
     23    if (unlikely(Rc(ctx->opcode) != 0)) {        \
     24        gen_set_cr1_from_fpscr(ctx);             \
     25    }                                            \
     26    tcg_temp_free_ptr(rd);                       \
     27    tcg_temp_free_ptr(ra);                       \
     28    tcg_temp_free_ptr(rb);                       \
     29}
     30
     31#define GEN_DFP_BF_A_B(name)                      \
     32static void gen_##name(DisasContext *ctx)         \
     33{                                                 \
     34    TCGv_ptr ra, rb;                              \
     35    if (unlikely(!ctx->fpu_enabled)) {            \
     36        gen_exception(ctx, POWERPC_EXCP_FPU);     \
     37        return;                                   \
     38    }                                             \
     39    gen_update_nip(ctx, ctx->base.pc_next - 4);            \
     40    ra = gen_fprp_ptr(rA(ctx->opcode));           \
     41    rb = gen_fprp_ptr(rB(ctx->opcode));           \
     42    gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
     43                      cpu_env, ra, rb);           \
     44    tcg_temp_free_ptr(ra);                        \
     45    tcg_temp_free_ptr(rb);                        \
     46}
     47
     48#define GEN_DFP_BF_I_B(name)                      \
     49static void gen_##name(DisasContext *ctx)         \
     50{                                                 \
     51    TCGv_i32 uim;                                 \
     52    TCGv_ptr rb;                                  \
     53    if (unlikely(!ctx->fpu_enabled)) {            \
     54        gen_exception(ctx, POWERPC_EXCP_FPU);     \
     55        return;                                   \
     56    }                                             \
     57    gen_update_nip(ctx, ctx->base.pc_next - 4);            \
     58    uim = tcg_const_i32(UIMM5(ctx->opcode));      \
     59    rb = gen_fprp_ptr(rB(ctx->opcode));           \
     60    gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
     61                      cpu_env, uim, rb);          \
     62    tcg_temp_free_i32(uim);                       \
     63    tcg_temp_free_ptr(rb);                        \
     64}
     65
     66#define GEN_DFP_BF_A_DCM(name)                    \
     67static void gen_##name(DisasContext *ctx)         \
     68{                                                 \
     69    TCGv_ptr ra;                                  \
     70    TCGv_i32 dcm;                                 \
     71    if (unlikely(!ctx->fpu_enabled)) {            \
     72        gen_exception(ctx, POWERPC_EXCP_FPU);     \
     73        return;                                   \
     74    }                                             \
     75    gen_update_nip(ctx, ctx->base.pc_next - 4);   \
     76    ra = gen_fprp_ptr(rA(ctx->opcode));           \
     77    dcm = tcg_const_i32(DCM(ctx->opcode));        \
     78    gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
     79                      cpu_env, ra, dcm);          \
     80    tcg_temp_free_ptr(ra);                        \
     81    tcg_temp_free_i32(dcm);                       \
     82}
     83
     84#define GEN_DFP_T_B_U32_U32_Rc(name, u32f1, u32f2)    \
     85static void gen_##name(DisasContext *ctx)             \
     86{                                                     \
     87    TCGv_ptr rt, rb;                                  \
     88    TCGv_i32 u32_1, u32_2;                            \
     89    if (unlikely(!ctx->fpu_enabled)) {                \
     90        gen_exception(ctx, POWERPC_EXCP_FPU);         \
     91        return;                                       \
     92    }                                                 \
     93    gen_update_nip(ctx, ctx->base.pc_next - 4);       \
     94    rt = gen_fprp_ptr(rD(ctx->opcode));               \
     95    rb = gen_fprp_ptr(rB(ctx->opcode));               \
     96    u32_1 = tcg_const_i32(u32f1(ctx->opcode));        \
     97    u32_2 = tcg_const_i32(u32f2(ctx->opcode));        \
     98    gen_helper_##name(cpu_env, rt, rb, u32_1, u32_2); \
     99    if (unlikely(Rc(ctx->opcode) != 0)) {             \
    100        gen_set_cr1_from_fpscr(ctx);                  \
    101    }                                                 \
    102    tcg_temp_free_ptr(rt);                            \
    103    tcg_temp_free_ptr(rb);                            \
    104    tcg_temp_free_i32(u32_1);                         \
    105    tcg_temp_free_i32(u32_2);                         \
    106}
    107
    108#define GEN_DFP_T_A_B_I32_Rc(name, i32fld)       \
    109static void gen_##name(DisasContext *ctx)        \
    110{                                                \
    111    TCGv_ptr rt, ra, rb;                         \
    112    TCGv_i32 i32;                                \
    113    if (unlikely(!ctx->fpu_enabled)) {           \
    114        gen_exception(ctx, POWERPC_EXCP_FPU);    \
    115        return;                                  \
    116    }                                            \
    117    gen_update_nip(ctx, ctx->base.pc_next - 4);  \
    118    rt = gen_fprp_ptr(rD(ctx->opcode));          \
    119    ra = gen_fprp_ptr(rA(ctx->opcode));          \
    120    rb = gen_fprp_ptr(rB(ctx->opcode));          \
    121    i32 = tcg_const_i32(i32fld(ctx->opcode));    \
    122    gen_helper_##name(cpu_env, rt, ra, rb, i32); \
    123    if (unlikely(Rc(ctx->opcode) != 0)) {        \
    124        gen_set_cr1_from_fpscr(ctx);             \
    125    }                                            \
    126    tcg_temp_free_ptr(rt);                       \
    127    tcg_temp_free_ptr(rb);                       \
    128    tcg_temp_free_ptr(ra);                       \
    129    tcg_temp_free_i32(i32);                      \
    130    }
    131
    132#define GEN_DFP_T_B_Rc(name)                     \
    133static void gen_##name(DisasContext *ctx)        \
    134{                                                \
    135    TCGv_ptr rt, rb;                             \
    136    if (unlikely(!ctx->fpu_enabled)) {           \
    137        gen_exception(ctx, POWERPC_EXCP_FPU);    \
    138        return;                                  \
    139    }                                            \
    140    gen_update_nip(ctx, ctx->base.pc_next - 4);  \
    141    rt = gen_fprp_ptr(rD(ctx->opcode));          \
    142    rb = gen_fprp_ptr(rB(ctx->opcode));          \
    143    gen_helper_##name(cpu_env, rt, rb);          \
    144    if (unlikely(Rc(ctx->opcode) != 0)) {        \
    145        gen_set_cr1_from_fpscr(ctx);             \
    146    }                                            \
    147    tcg_temp_free_ptr(rt);                       \
    148    tcg_temp_free_ptr(rb);                       \
    149    }
    150
    151#define GEN_DFP_T_FPR_I32_Rc(name, fprfld, i32fld) \
    152static void gen_##name(DisasContext *ctx)          \
    153{                                                  \
    154    TCGv_ptr rt, rs;                               \
    155    TCGv_i32 i32;                                  \
    156    if (unlikely(!ctx->fpu_enabled)) {             \
    157        gen_exception(ctx, POWERPC_EXCP_FPU);      \
    158        return;                                    \
    159    }                                              \
    160    gen_update_nip(ctx, ctx->base.pc_next - 4);    \
    161    rt = gen_fprp_ptr(rD(ctx->opcode));            \
    162    rs = gen_fprp_ptr(fprfld(ctx->opcode));        \
    163    i32 = tcg_const_i32(i32fld(ctx->opcode));      \
    164    gen_helper_##name(cpu_env, rt, rs, i32);       \
    165    if (unlikely(Rc(ctx->opcode) != 0)) {          \
    166        gen_set_cr1_from_fpscr(ctx);               \
    167    }                                              \
    168    tcg_temp_free_ptr(rt);                         \
    169    tcg_temp_free_ptr(rs);                         \
    170    tcg_temp_free_i32(i32);                        \
    171}
    172
    173GEN_DFP_T_A_B_Rc(dadd)
    174GEN_DFP_T_A_B_Rc(daddq)
    175GEN_DFP_T_A_B_Rc(dsub)
    176GEN_DFP_T_A_B_Rc(dsubq)
    177GEN_DFP_T_A_B_Rc(dmul)
    178GEN_DFP_T_A_B_Rc(dmulq)
    179GEN_DFP_T_A_B_Rc(ddiv)
    180GEN_DFP_T_A_B_Rc(ddivq)
    181GEN_DFP_BF_A_B(dcmpu)
    182GEN_DFP_BF_A_B(dcmpuq)
    183GEN_DFP_BF_A_B(dcmpo)
    184GEN_DFP_BF_A_B(dcmpoq)
    185GEN_DFP_BF_A_DCM(dtstdc)
    186GEN_DFP_BF_A_DCM(dtstdcq)
    187GEN_DFP_BF_A_DCM(dtstdg)
    188GEN_DFP_BF_A_DCM(dtstdgq)
    189GEN_DFP_BF_A_B(dtstex)
    190GEN_DFP_BF_A_B(dtstexq)
    191GEN_DFP_BF_A_B(dtstsf)
    192GEN_DFP_BF_A_B(dtstsfq)
    193GEN_DFP_BF_I_B(dtstsfi)
    194GEN_DFP_BF_I_B(dtstsfiq)
    195GEN_DFP_T_B_U32_U32_Rc(dquai, SIMM5, RMC)
    196GEN_DFP_T_B_U32_U32_Rc(dquaiq, SIMM5, RMC)
    197GEN_DFP_T_A_B_I32_Rc(dqua, RMC)
    198GEN_DFP_T_A_B_I32_Rc(dquaq, RMC)
    199GEN_DFP_T_A_B_I32_Rc(drrnd, RMC)
    200GEN_DFP_T_A_B_I32_Rc(drrndq, RMC)
    201GEN_DFP_T_B_U32_U32_Rc(drintx, FPW, RMC)
    202GEN_DFP_T_B_U32_U32_Rc(drintxq, FPW, RMC)
    203GEN_DFP_T_B_U32_U32_Rc(drintn, FPW, RMC)
    204GEN_DFP_T_B_U32_U32_Rc(drintnq, FPW, RMC)
    205GEN_DFP_T_B_Rc(dctdp)
    206GEN_DFP_T_B_Rc(dctqpq)
    207GEN_DFP_T_B_Rc(drsp)
    208GEN_DFP_T_B_Rc(drdpq)
    209GEN_DFP_T_B_Rc(dcffix)
    210GEN_DFP_T_B_Rc(dcffixq)
    211GEN_DFP_T_B_Rc(dctfix)
    212GEN_DFP_T_B_Rc(dctfixq)
    213GEN_DFP_T_FPR_I32_Rc(ddedpd, rB, SP)
    214GEN_DFP_T_FPR_I32_Rc(ddedpdq, rB, SP)
    215GEN_DFP_T_FPR_I32_Rc(denbcd, rB, SP)
    216GEN_DFP_T_FPR_I32_Rc(denbcdq, rB, SP)
    217GEN_DFP_T_B_Rc(dxex)
    218GEN_DFP_T_B_Rc(dxexq)
    219GEN_DFP_T_A_B_Rc(diex)
    220GEN_DFP_T_A_B_Rc(diexq)
    221GEN_DFP_T_FPR_I32_Rc(dscli, rA, DCM)
    222GEN_DFP_T_FPR_I32_Rc(dscliq, rA, DCM)
    223GEN_DFP_T_FPR_I32_Rc(dscri, rA, DCM)
    224GEN_DFP_T_FPR_I32_Rc(dscriq, rA, DCM)
    225
    226#undef GEN_DFP_T_A_B_Rc
    227#undef GEN_DFP_BF_A_B
    228#undef GEN_DFP_BF_A_DCM
    229#undef GEN_DFP_T_B_U32_U32_Rc
    230#undef GEN_DFP_T_A_B_I32_Rc
    231#undef GEN_DFP_T_B_Rc
    232#undef GEN_DFP_T_FPR_I32_Rc