2 * RISC-V translation routines for the RVXI Base Integer Instruction Set.
4 * Copyright (c) 2020 Western Digital
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2 or later, as published by the Free Software Foundation.
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program. If not, see <http://www.gnu.org/licenses/>.
19 static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a)
21 REQUIRE_EXT(ctx, RVH);
22 #ifndef CONFIG_USER_ONLY
23 TCGv t0 = tcg_temp_new();
24 TCGv t1 = tcg_temp_new();
25 TCGv mem_idx = tcg_temp_new();
26 TCGv memop = tcg_temp_new();
28 gen_get_gpr(t0, a->rs1);
29 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
30 tcg_gen_movi_tl(memop, MO_SB);
32 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
33 gen_set_gpr(a->rd, t1);
37 tcg_temp_free(mem_idx);
45 static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a)
47 REQUIRE_EXT(ctx, RVH);
48 #ifndef CONFIG_USER_ONLY
49 TCGv t0 = tcg_temp_new();
50 TCGv t1 = tcg_temp_new();
51 TCGv mem_idx = tcg_temp_new();
52 TCGv memop = tcg_temp_new();
54 gen_get_gpr(t0, a->rs1);
55 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
56 tcg_gen_movi_tl(memop, MO_TESW);
58 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
59 gen_set_gpr(a->rd, t1);
63 tcg_temp_free(mem_idx);
71 static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a)
73 REQUIRE_EXT(ctx, RVH);
74 #ifndef CONFIG_USER_ONLY
75 TCGv t0 = tcg_temp_new();
76 TCGv t1 = tcg_temp_new();
77 TCGv mem_idx = tcg_temp_new();
78 TCGv memop = tcg_temp_new();
80 gen_get_gpr(t0, a->rs1);
81 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
82 tcg_gen_movi_tl(memop, MO_TESL);
84 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
85 gen_set_gpr(a->rd, t1);
89 tcg_temp_free(mem_idx);
97 static bool trans_hlv_bu(DisasContext *ctx, arg_hlv_bu *a)
99 REQUIRE_EXT(ctx, RVH);
100 #ifndef CONFIG_USER_ONLY
101 TCGv t0 = tcg_temp_new();
102 TCGv t1 = tcg_temp_new();
103 TCGv mem_idx = tcg_temp_new();
104 TCGv memop = tcg_temp_new();
106 gen_get_gpr(t0, a->rs1);
107 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
108 tcg_gen_movi_tl(memop, MO_UB);
110 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
111 gen_set_gpr(a->rd, t1);
115 tcg_temp_free(mem_idx);
116 tcg_temp_free(memop);
123 static bool trans_hlv_hu(DisasContext *ctx, arg_hlv_hu *a)
125 REQUIRE_EXT(ctx, RVH);
126 #ifndef CONFIG_USER_ONLY
127 TCGv t0 = tcg_temp_new();
128 TCGv t1 = tcg_temp_new();
129 TCGv mem_idx = tcg_temp_new();
130 TCGv memop = tcg_temp_new();
132 gen_get_gpr(t0, a->rs1);
133 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
134 tcg_gen_movi_tl(memop, MO_TEUW);
136 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
137 gen_set_gpr(a->rd, t1);
141 tcg_temp_free(mem_idx);
142 tcg_temp_free(memop);
149 static bool trans_hsv_b(DisasContext *ctx, arg_hsv_b *a)
151 REQUIRE_EXT(ctx, RVH);
152 #ifndef CONFIG_USER_ONLY
153 TCGv t0 = tcg_temp_new();
154 TCGv dat = tcg_temp_new();
155 TCGv mem_idx = tcg_temp_new();
156 TCGv memop = tcg_temp_new();
158 gen_get_gpr(t0, a->rs1);
159 gen_get_gpr(dat, a->rs2);
160 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
161 tcg_gen_movi_tl(memop, MO_SB);
163 gen_helper_hyp_store(cpu_env, t0, dat, mem_idx, memop);
167 tcg_temp_free(mem_idx);
168 tcg_temp_free(memop);
175 static bool trans_hsv_h(DisasContext *ctx, arg_hsv_h *a)
177 REQUIRE_EXT(ctx, RVH);
178 #ifndef CONFIG_USER_ONLY
179 TCGv t0 = tcg_temp_new();
180 TCGv dat = tcg_temp_new();
181 TCGv mem_idx = tcg_temp_new();
182 TCGv memop = tcg_temp_new();
184 gen_get_gpr(t0, a->rs1);
185 gen_get_gpr(dat, a->rs2);
186 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
187 tcg_gen_movi_tl(memop, MO_TESW);
189 gen_helper_hyp_store(cpu_env, t0, dat, mem_idx, memop);
193 tcg_temp_free(mem_idx);
194 tcg_temp_free(memop);
201 static bool trans_hsv_w(DisasContext *ctx, arg_hsv_w *a)
203 REQUIRE_EXT(ctx, RVH);
204 #ifndef CONFIG_USER_ONLY
205 TCGv t0 = tcg_temp_new();
206 TCGv dat = tcg_temp_new();
207 TCGv mem_idx = tcg_temp_new();
208 TCGv memop = tcg_temp_new();
210 gen_get_gpr(t0, a->rs1);
211 gen_get_gpr(dat, a->rs2);
212 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
213 tcg_gen_movi_tl(memop, MO_TESL);
215 gen_helper_hyp_store(cpu_env, t0, dat, mem_idx, memop);
219 tcg_temp_free(mem_idx);
220 tcg_temp_free(memop);
227 #ifdef TARGET_RISCV64
228 static bool trans_hlv_wu(DisasContext *ctx, arg_hlv_wu *a)
230 REQUIRE_EXT(ctx, RVH);
231 #ifndef CONFIG_USER_ONLY
232 TCGv t0 = tcg_temp_new();
233 TCGv t1 = tcg_temp_new();
234 TCGv mem_idx = tcg_temp_new();
235 TCGv memop = tcg_temp_new();
237 gen_get_gpr(t0, a->rs1);
238 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
239 tcg_gen_movi_tl(memop, MO_TEUL);
241 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
242 gen_set_gpr(a->rd, t1);
246 tcg_temp_free(mem_idx);
247 tcg_temp_free(memop);
254 static bool trans_hlv_d(DisasContext *ctx, arg_hlv_d *a)
256 REQUIRE_EXT(ctx, RVH);
257 #ifndef CONFIG_USER_ONLY
258 TCGv t0 = tcg_temp_new();
259 TCGv t1 = tcg_temp_new();
260 TCGv mem_idx = tcg_temp_new();
261 TCGv memop = tcg_temp_new();
263 gen_get_gpr(t0, a->rs1);
264 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
265 tcg_gen_movi_tl(memop, MO_TEQ);
267 gen_helper_hyp_load(t1, cpu_env, t0, mem_idx, memop);
268 gen_set_gpr(a->rd, t1);
272 tcg_temp_free(mem_idx);
273 tcg_temp_free(memop);
280 static bool trans_hsv_d(DisasContext *ctx, arg_hsv_d *a)
282 REQUIRE_EXT(ctx, RVH);
283 #ifndef CONFIG_USER_ONLY
284 TCGv t0 = tcg_temp_new();
285 TCGv dat = tcg_temp_new();
286 TCGv mem_idx = tcg_temp_new();
287 TCGv memop = tcg_temp_new();
289 gen_get_gpr(t0, a->rs1);
290 gen_get_gpr(dat, a->rs2);
291 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
292 tcg_gen_movi_tl(memop, MO_TEQ);
294 gen_helper_hyp_store(cpu_env, t0, dat, mem_idx, memop);
298 tcg_temp_free(mem_idx);
299 tcg_temp_free(memop);
307 static bool trans_hlvx_hu(DisasContext *ctx, arg_hlvx_hu *a)
309 REQUIRE_EXT(ctx, RVH);
310 #ifndef CONFIG_USER_ONLY
311 TCGv t0 = tcg_temp_new();
312 TCGv t1 = tcg_temp_new();
313 TCGv mem_idx = tcg_temp_new();
314 TCGv memop = tcg_temp_new();
316 gen_get_gpr(t0, a->rs1);
317 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
318 tcg_gen_movi_tl(memop, MO_TEUW);
320 gen_helper_hyp_x_load(t1, cpu_env, t0, mem_idx, memop);
321 gen_set_gpr(a->rd, t1);
325 tcg_temp_free(mem_idx);
326 tcg_temp_free(memop);
333 static bool trans_hlvx_wu(DisasContext *ctx, arg_hlvx_wu *a)
335 REQUIRE_EXT(ctx, RVH);
336 #ifndef CONFIG_USER_ONLY
337 TCGv t0 = tcg_temp_new();
338 TCGv t1 = tcg_temp_new();
339 TCGv mem_idx = tcg_temp_new();
340 TCGv memop = tcg_temp_new();
342 gen_get_gpr(t0, a->rs1);
343 tcg_gen_movi_tl(mem_idx, ctx->mem_idx);
344 tcg_gen_movi_tl(memop, MO_TEUL);
346 gen_helper_hyp_x_load(t1, cpu_env, t0, mem_idx, memop);
347 gen_set_gpr(a->rd, t1);
351 tcg_temp_free(mem_idx);
352 tcg_temp_free(memop);
359 static bool trans_hfence_gvma(DisasContext *ctx, arg_sfence_vma *a)
361 REQUIRE_EXT(ctx, RVH);
362 #ifndef CONFIG_USER_ONLY
363 gen_helper_hyp_gvma_tlb_flush(cpu_env);
369 static bool trans_hfence_vvma(DisasContext *ctx, arg_sfence_vma *a)
371 REQUIRE_EXT(ctx, RVH);
372 #ifndef CONFIG_USER_ONLY
373 gen_helper_hyp_tlb_flush(cpu_env);