qemu

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

trans_memory.c.inc (5874B)


      1 /* SPDX-License-Identifier: GPL-2.0-or-later */
      2 /*
      3  * Copyright (c) 2021 Loongson Technology Corporation Limited
      4  */
      5 
      6 static bool gen_load(DisasContext *ctx, arg_rr_i *a, MemOp mop)
      7 {
      8     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
      9     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
     10     TCGv temp = NULL;
     11 
     12     if (a->imm) {
     13         temp = tcg_temp_new();
     14         tcg_gen_addi_tl(temp, addr, a->imm);
     15         addr = temp;
     16     }
     17 
     18     tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
     19     gen_set_gpr(a->rd, dest, EXT_NONE);
     20 
     21     if (temp) {
     22         tcg_temp_free(temp);
     23     }
     24 
     25     return true;
     26 }
     27 
     28 static bool gen_store(DisasContext *ctx, arg_rr_i *a, MemOp mop)
     29 {
     30     TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
     31     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
     32     TCGv temp = NULL;
     33 
     34     if (a->imm) {
     35         temp = tcg_temp_new();
     36         tcg_gen_addi_tl(temp, addr, a->imm);
     37         addr = temp;
     38     }
     39 
     40     tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
     41 
     42     if (temp) {
     43         tcg_temp_free(temp);
     44     }
     45 
     46     return true;
     47 }
     48 
     49 static bool gen_loadx(DisasContext *ctx, arg_rrr *a, MemOp mop)
     50 {
     51     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
     52     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     53     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
     54     TCGv addr = tcg_temp_new();
     55 
     56     tcg_gen_add_tl(addr, src1, src2);
     57     tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
     58     gen_set_gpr(a->rd, dest, EXT_NONE);
     59     tcg_temp_free(addr);
     60 
     61     return true;
     62 }
     63 
     64 static bool gen_storex(DisasContext *ctx, arg_rrr *a, MemOp mop)
     65 {
     66     TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
     67     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     68     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
     69     TCGv addr = tcg_temp_new();
     70 
     71     tcg_gen_add_tl(addr, src1, src2);
     72     tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
     73     tcg_temp_free(addr);
     74 
     75     return true;
     76 }
     77 
     78 static bool gen_load_gt(DisasContext *ctx, arg_rrr *a, MemOp mop)
     79 {
     80     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
     81     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     82     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
     83 
     84     gen_helper_asrtgt_d(cpu_env, src1, src2);
     85     tcg_gen_qemu_ld_tl(dest, src1, ctx->mem_idx, mop);
     86     gen_set_gpr(a->rd, dest, EXT_NONE);
     87 
     88     return true;
     89 }
     90 
     91 static bool gen_load_le(DisasContext *ctx, arg_rrr *a, MemOp mop)
     92 {
     93     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
     94     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     95     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
     96 
     97     gen_helper_asrtle_d(cpu_env, src1, src2);
     98     tcg_gen_qemu_ld_tl(dest, src1, ctx->mem_idx, mop);
     99     gen_set_gpr(a->rd, dest, EXT_NONE);
    100 
    101     return true;
    102 }
    103 
    104 static bool gen_store_gt(DisasContext *ctx, arg_rrr *a, MemOp mop)
    105 {
    106     TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
    107     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
    108     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
    109 
    110     gen_helper_asrtgt_d(cpu_env, src1, src2);
    111     tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop);
    112 
    113     return true;
    114 }
    115 
    116 static bool gen_store_le(DisasContext *ctx, arg_rrr *a, MemOp mop)
    117 {
    118     TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
    119     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
    120     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
    121 
    122     gen_helper_asrtle_d(cpu_env, src1, src2);
    123     tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop);
    124 
    125     return true;
    126 }
    127 
    128 static bool trans_preld(DisasContext *ctx, arg_preld *a)
    129 {
    130     return true;
    131 }
    132 
    133 static bool trans_dbar(DisasContext *ctx, arg_dbar * a)
    134 {
    135     tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
    136     return true;
    137 }
    138 
    139 static bool trans_ibar(DisasContext *ctx, arg_ibar *a)
    140 {
    141     ctx->base.is_jmp = DISAS_STOP;
    142     return true;
    143 }
    144 
    145 static bool gen_ldptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
    146 {
    147     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
    148     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
    149     TCGv temp = NULL;
    150 
    151     if (a->imm) {
    152         temp = tcg_temp_new();
    153         tcg_gen_addi_tl(temp, addr, a->imm);
    154         addr = temp;
    155     }
    156 
    157     tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
    158     gen_set_gpr(a->rd, dest, EXT_NONE);
    159 
    160     if (temp) {
    161         tcg_temp_free(temp);
    162     }
    163 
    164     return true;
    165 }
    166 
    167 static bool gen_stptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
    168 {
    169     TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
    170     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
    171     TCGv temp = NULL;
    172 
    173     if (a->imm) {
    174         temp = tcg_temp_new();
    175         tcg_gen_addi_tl(temp, addr, a->imm);
    176         addr = temp;
    177     }
    178 
    179     tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
    180 
    181     if (temp) {
    182         tcg_temp_free(temp);
    183     }
    184 
    185     return true;
    186 }
    187 
    188 TRANS(ld_b, gen_load, MO_SB)
    189 TRANS(ld_h, gen_load, MO_TESW)
    190 TRANS(ld_w, gen_load, MO_TESL)
    191 TRANS(ld_d, gen_load, MO_TEUQ)
    192 TRANS(st_b, gen_store, MO_UB)
    193 TRANS(st_h, gen_store, MO_TEUW)
    194 TRANS(st_w, gen_store, MO_TEUL)
    195 TRANS(st_d, gen_store, MO_TEUQ)
    196 TRANS(ld_bu, gen_load, MO_UB)
    197 TRANS(ld_hu, gen_load, MO_TEUW)
    198 TRANS(ld_wu, gen_load, MO_TEUL)
    199 TRANS(ldx_b, gen_loadx, MO_SB)
    200 TRANS(ldx_h, gen_loadx, MO_TESW)
    201 TRANS(ldx_w, gen_loadx, MO_TESL)
    202 TRANS(ldx_d, gen_loadx, MO_TEUQ)
    203 TRANS(stx_b, gen_storex, MO_UB)
    204 TRANS(stx_h, gen_storex, MO_TEUW)
    205 TRANS(stx_w, gen_storex, MO_TEUL)
    206 TRANS(stx_d, gen_storex, MO_TEUQ)
    207 TRANS(ldx_bu, gen_loadx, MO_UB)
    208 TRANS(ldx_hu, gen_loadx, MO_TEUW)
    209 TRANS(ldx_wu, gen_loadx, MO_TEUL)
    210 TRANS(ldptr_w, gen_ldptr, MO_TESL)
    211 TRANS(stptr_w, gen_stptr, MO_TEUL)
    212 TRANS(ldptr_d, gen_ldptr, MO_TEUQ)
    213 TRANS(stptr_d, gen_stptr, MO_TEUQ)
    214 TRANS(ldgt_b, gen_load_gt, MO_SB)
    215 TRANS(ldgt_h, gen_load_gt, MO_TESW)
    216 TRANS(ldgt_w, gen_load_gt, MO_TESL)
    217 TRANS(ldgt_d, gen_load_gt, MO_TEUQ)
    218 TRANS(ldle_b, gen_load_le, MO_SB)
    219 TRANS(ldle_h, gen_load_le, MO_TESW)
    220 TRANS(ldle_w, gen_load_le, MO_TESL)
    221 TRANS(ldle_d, gen_load_le, MO_TEUQ)
    222 TRANS(stgt_b, gen_store_gt, MO_UB)
    223 TRANS(stgt_h, gen_store_gt, MO_TEUW)
    224 TRANS(stgt_w, gen_store_gt, MO_TEUL)
    225 TRANS(stgt_d, gen_store_gt, MO_TEUQ)
    226 TRANS(stle_b, gen_store_le, MO_UB)
    227 TRANS(stle_h, gen_store_le, MO_TEUW)
    228 TRANS(stle_w, gen_store_le, MO_TEUL)
    229 TRANS(stle_d, gen_store_le, MO_TEUQ)