gitlab: tweak comments in edk2/opensbi jobs
[qemu.git] / target / loongarch / insn_trans / trans_memory.c.inc
blobd5eb31147c923c885dfb5885a3f0607e01d92c09
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (c) 2021 Loongson Technology Corporation Limited
4  */
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);
10     TCGv temp = NULL;
12     if (a->imm) {
13         temp = tcg_temp_new();
14         tcg_gen_addi_tl(temp, addr, a->imm);
15         addr = temp;
16     }
18     tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
19     gen_set_gpr(a->rd, dest, EXT_NONE);
21     if (temp) {
22         tcg_temp_free(temp);
23     }
25     return true;
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);
32     TCGv temp = NULL;
34     if (a->imm) {
35         temp = tcg_temp_new();
36         tcg_gen_addi_tl(temp, addr, a->imm);
37         addr = temp;
38     }
40     tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
42     if (temp) {
43         tcg_temp_free(temp);
44     }
46     return true;
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);
59     tcg_temp_free(addr);
61     return true;
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);
73     tcg_temp_free(addr);
75     return true;
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);
88     return true;
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);
101     return true;
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);
113     return true;
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);
125     return true;
128 static bool trans_preld(DisasContext *ctx, arg_preld *a)
130     return true;
133 static bool trans_dbar(DisasContext *ctx, arg_dbar * a)
135     tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
136     return true;
139 static bool trans_ibar(DisasContext *ctx, arg_ibar *a)
141     ctx->base.is_jmp = DISAS_STOP;
142     return true;
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);
149     TCGv temp = NULL;
151     if (a->imm) {
152         temp = tcg_temp_new();
153         tcg_gen_addi_tl(temp, addr, a->imm);
154         addr = temp;
155     }
157     tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
158     gen_set_gpr(a->rd, dest, EXT_NONE);
160     if (temp) {
161         tcg_temp_free(temp);
162     }
164     return true;
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);
171     TCGv temp = NULL;
173     if (a->imm) {
174         temp = tcg_temp_new();
175         tcg_gen_addi_tl(temp, addr, a->imm);
176         addr = temp;
177     }
179     tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop);
181     if (temp) {
182         tcg_temp_free(temp);
183     }
185     return true;
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)