]> Git Repo - qemu.git/blame - target/loongarch/insn_trans/trans_memory.c.inc
target/loongarch: Add fixed point atomic instruction translation
[qemu.git] / target / loongarch / insn_trans / trans_memory.c.inc
CommitLineData
bb79174d
SG
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Copyright (c) 2021 Loongson Technology Corporation Limited
4 */
5
6static 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
28static 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
49static 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
64static 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
78static 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
91static 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
104static 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
116static 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
128static bool trans_preld(DisasContext *ctx, arg_preld *a)
129{
130 return true;
131}
132
133static bool trans_dbar(DisasContext *ctx, arg_dbar * a)
134{
135 tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
136 return true;
137}
138
139static bool trans_ibar(DisasContext *ctx, arg_ibar *a)
140{
141 ctx->base.is_jmp = DISAS_STOP;
142 return true;
143}
144
145static 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
167static 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();
94b02d57 175 tcg_gen_addi_tl(temp, addr, a->imm);
bb79174d
SG
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
188TRANS(ld_b, gen_load, MO_SB)
189TRANS(ld_h, gen_load, MO_TESW)
190TRANS(ld_w, gen_load, MO_TESL)
191TRANS(ld_d, gen_load, MO_TEUQ)
192TRANS(st_b, gen_store, MO_UB)
193TRANS(st_h, gen_store, MO_TEUW)
194TRANS(st_w, gen_store, MO_TEUL)
195TRANS(st_d, gen_store, MO_TEUQ)
196TRANS(ld_bu, gen_load, MO_UB)
197TRANS(ld_hu, gen_load, MO_TEUW)
198TRANS(ld_wu, gen_load, MO_TEUL)
199TRANS(ldx_b, gen_loadx, MO_SB)
200TRANS(ldx_h, gen_loadx, MO_TESW)
201TRANS(ldx_w, gen_loadx, MO_TESL)
202TRANS(ldx_d, gen_loadx, MO_TEUQ)
203TRANS(stx_b, gen_storex, MO_UB)
204TRANS(stx_h, gen_storex, MO_TEUW)
205TRANS(stx_w, gen_storex, MO_TEUL)
206TRANS(stx_d, gen_storex, MO_TEUQ)
207TRANS(ldx_bu, gen_loadx, MO_UB)
208TRANS(ldx_hu, gen_loadx, MO_TEUW)
209TRANS(ldx_wu, gen_loadx, MO_TEUL)
210TRANS(ldptr_w, gen_ldptr, MO_TESL)
211TRANS(stptr_w, gen_stptr, MO_TEUL)
212TRANS(ldptr_d, gen_ldptr, MO_TEUQ)
213TRANS(stptr_d, gen_stptr, MO_TEUQ)
214TRANS(ldgt_b, gen_load_gt, MO_SB)
215TRANS(ldgt_h, gen_load_gt, MO_TESW)
216TRANS(ldgt_w, gen_load_gt, MO_TESL)
217TRANS(ldgt_d, gen_load_gt, MO_TEUQ)
218TRANS(ldle_b, gen_load_le, MO_SB)
219TRANS(ldle_h, gen_load_le, MO_TESW)
220TRANS(ldle_w, gen_load_le, MO_TESL)
221TRANS(ldle_d, gen_load_le, MO_TEUQ)
222TRANS(stgt_b, gen_store_gt, MO_UB)
223TRANS(stgt_h, gen_store_gt, MO_TEUW)
224TRANS(stgt_w, gen_store_gt, MO_TEUL)
225TRANS(stgt_d, gen_store_gt, MO_TEUQ)
226TRANS(stle_b, gen_store_le, MO_UB)
227TRANS(stle_h, gen_store_le, MO_TEUW)
228TRANS(stle_w, gen_store_le, MO_TEUL)
229TRANS(stle_d, gen_store_le, MO_TEUQ)
This page took 0.044497 seconds and 4 git commands to generate.