1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Copyright (c) 2021 Loongson Technology Corporation Limited
6 static bool gen_load(DisasContext *ctx, arg_rr_i *a, MemOp mop)
8 TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
9 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
13 temp = tcg_temp_new();
14 tcg_gen_addi_tl(temp, addr, a->imm);
18 tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
19 gen_set_gpr(a->rd, dest, EXT_NONE);
28 static bool gen_store(DisasContext *ctx, arg_rr_i *a, MemOp mop)
30 TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
31 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
35 temp = tcg_temp_new();
36 tcg_gen_addi_tl(temp, addr, a->imm);
40 tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
49 static bool gen_loadx(DisasContext *ctx, arg_rrr *a, MemOp mop)
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();
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);
64 static bool gen_storex(DisasContext *ctx, arg_rrr *a, MemOp mop)
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();
71 tcg_gen_add_tl(addr, src1, src2);
72 tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
78 static bool gen_load_gt(DisasContext *ctx, arg_rrr *a, MemOp mop)
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);
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);
91 static bool gen_load_le(DisasContext *ctx, arg_rrr *a, MemOp mop)
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);
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);
104 static bool gen_store_gt(DisasContext *ctx, arg_rrr *a, MemOp mop)
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);
110 gen_helper_asrtgt_d(cpu_env, src1, src2);
111 tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop);
116 static bool gen_store_le(DisasContext *ctx, arg_rrr *a, MemOp mop)
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);
122 gen_helper_asrtle_d(cpu_env, src1, src2);
123 tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop);
128 static bool trans_preld(DisasContext *ctx, arg_preld *a)
133 static bool trans_dbar(DisasContext *ctx, arg_dbar * a)
135 tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
139 static bool trans_ibar(DisasContext *ctx, arg_ibar *a)
141 ctx->base.is_jmp = DISAS_STOP;
145 static bool gen_ldptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
147 TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
148 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
152 temp = tcg_temp_new();
153 tcg_gen_addi_tl(temp, addr, a->imm);
157 tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
158 gen_set_gpr(a->rd, dest, EXT_NONE);
167 static bool gen_stptr(DisasContext *ctx, arg_rr_i *a, MemOp mop)
169 TCGv data = gpr_src(ctx, a->rd, EXT_NONE);
170 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
174 temp = tcg_temp_new();
175 tcg_gen_addi_tl(temp, addr, a->im);
179 tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
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)