target/arm: Update REV, PUNPK for pred_desc
[qemu/ar7.git] / target / riscv / insn_trans / trans_rvh.c.inc
blobce7ed5affb4aad53f282079a00342a057ea4533c
1 /*
2  * RISC-V translation routines for the RVXI Base Integer Instruction Set.
3  *
4  * Copyright (c) 2020 Western Digital
5  *
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.
9  *
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
13  * more details.
14  *
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/>.
17  */
19 #ifndef CONFIG_USER_ONLY
20 static void check_access(DisasContext *ctx) {
21     if (!ctx->hlsx) {
22         if (ctx->virt_enabled) {
23             generate_exception(ctx, RISCV_EXCP_VIRT_INSTRUCTION_FAULT);
24         } else {
25             generate_exception(ctx, RISCV_EXCP_ILLEGAL_INST);
26         }
27     }
29 #endif
31 static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a)
33     REQUIRE_EXT(ctx, RVH);
34 #ifndef CONFIG_USER_ONLY
35     TCGv t0 = tcg_temp_new();
36     TCGv t1 = tcg_temp_new();
38     check_access(ctx);
40     gen_get_gpr(t0, a->rs1);
42     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB);
43     gen_set_gpr(a->rd, t1);
45     tcg_temp_free(t0);
46     tcg_temp_free(t1);
47     return true;
48 #else
49     return false;
50 #endif
53 static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a)
55     REQUIRE_EXT(ctx, RVH);
56 #ifndef CONFIG_USER_ONLY
57     TCGv t0 = tcg_temp_new();
58     TCGv t1 = tcg_temp_new();
60     check_access(ctx);
62     gen_get_gpr(t0, a->rs1);
64     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW);
65     gen_set_gpr(a->rd, t1);
67     tcg_temp_free(t0);
68     tcg_temp_free(t1);
69     return true;
70 #else
71     return false;
72 #endif
75 static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a)
77     REQUIRE_EXT(ctx, RVH);
78 #ifndef CONFIG_USER_ONLY
79     TCGv t0 = tcg_temp_new();
80     TCGv t1 = tcg_temp_new();
82     check_access(ctx);
84     gen_get_gpr(t0, a->rs1);
86     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL);
87     gen_set_gpr(a->rd, t1);
89     tcg_temp_free(t0);
90     tcg_temp_free(t1);
91     return true;
92 #else
93     return false;
94 #endif
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();
104     check_access(ctx);
106     gen_get_gpr(t0, a->rs1);
108     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_UB);
109     gen_set_gpr(a->rd, t1);
111     tcg_temp_free(t0);
112     tcg_temp_free(t1);
113     return true;
114 #else
115     return false;
116 #endif
119 static bool trans_hlv_hu(DisasContext *ctx, arg_hlv_hu *a)
121     REQUIRE_EXT(ctx, RVH);
122 #ifndef CONFIG_USER_ONLY
123     TCGv t0 = tcg_temp_new();
124     TCGv t1 = tcg_temp_new();
126     check_access(ctx);
128     gen_get_gpr(t0, a->rs1);
129     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUW);
130     gen_set_gpr(a->rd, t1);
132     tcg_temp_free(t0);
133     tcg_temp_free(t1);
134     return true;
135 #else
136     return false;
137 #endif
140 static bool trans_hsv_b(DisasContext *ctx, arg_hsv_b *a)
142     REQUIRE_EXT(ctx, RVH);
143 #ifndef CONFIG_USER_ONLY
144     TCGv t0 = tcg_temp_new();
145     TCGv dat = tcg_temp_new();
147     check_access(ctx);
149     gen_get_gpr(t0, a->rs1);
150     gen_get_gpr(dat, a->rs2);
152     tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB);
154     tcg_temp_free(t0);
155     tcg_temp_free(dat);
156     return true;
157 #else
158     return false;
159 #endif
162 static bool trans_hsv_h(DisasContext *ctx, arg_hsv_h *a)
164     REQUIRE_EXT(ctx, RVH);
165 #ifndef CONFIG_USER_ONLY
166     TCGv t0 = tcg_temp_new();
167     TCGv dat = tcg_temp_new();
169     check_access(ctx);
171     gen_get_gpr(t0, a->rs1);
172     gen_get_gpr(dat, a->rs2);
174     tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW);
176     tcg_temp_free(t0);
177     tcg_temp_free(dat);
178     return true;
179 #else
180     return false;
181 #endif
184 static bool trans_hsv_w(DisasContext *ctx, arg_hsv_w *a)
186     REQUIRE_EXT(ctx, RVH);
187 #ifndef CONFIG_USER_ONLY
188     TCGv t0 = tcg_temp_new();
189     TCGv dat = tcg_temp_new();
191     check_access(ctx);
193     gen_get_gpr(t0, a->rs1);
194     gen_get_gpr(dat, a->rs2);
196     tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL);
198     tcg_temp_free(t0);
199     tcg_temp_free(dat);
200     return true;
201 #else
202     return false;
203 #endif
206 #ifdef TARGET_RISCV64
207 static bool trans_hlv_wu(DisasContext *ctx, arg_hlv_wu *a)
209     REQUIRE_EXT(ctx, RVH);
210 #ifndef CONFIG_USER_ONLY
211     TCGv t0 = tcg_temp_new();
212     TCGv t1 = tcg_temp_new();
214     check_access(ctx);
216     gen_get_gpr(t0, a->rs1);
218     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUL);
219     gen_set_gpr(a->rd, t1);
221     tcg_temp_free(t0);
222     tcg_temp_free(t1);
223     return true;
224 #else
225     return false;
226 #endif
229 static bool trans_hlv_d(DisasContext *ctx, arg_hlv_d *a)
231     REQUIRE_EXT(ctx, RVH);
232 #ifndef CONFIG_USER_ONLY
233     TCGv t0 = tcg_temp_new();
234     TCGv t1 = tcg_temp_new();
236     check_access(ctx);
238     gen_get_gpr(t0, a->rs1);
240     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ);
241     gen_set_gpr(a->rd, t1);
243     tcg_temp_free(t0);
244     tcg_temp_free(t1);
245     return true;
246 #else
247     return false;
248 #endif
251 static bool trans_hsv_d(DisasContext *ctx, arg_hsv_d *a)
253     REQUIRE_EXT(ctx, RVH);
254 #ifndef CONFIG_USER_ONLY
255     TCGv t0 = tcg_temp_new();
256     TCGv dat = tcg_temp_new();
258     check_access(ctx);
260     gen_get_gpr(t0, a->rs1);
261     gen_get_gpr(dat, a->rs2);
263     tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ);
265     tcg_temp_free(t0);
266     tcg_temp_free(dat);
267     return true;
268 #else
269     return false;
270 #endif
272 #endif
274 static bool trans_hlvx_hu(DisasContext *ctx, arg_hlvx_hu *a)
276     REQUIRE_EXT(ctx, RVH);
277 #ifndef CONFIG_USER_ONLY
278     TCGv t0 = tcg_temp_new();
279     TCGv t1 = tcg_temp_new();
281     check_access(ctx);
283     gen_get_gpr(t0, a->rs1);
285     gen_helper_hyp_hlvx_hu(t1, cpu_env, t0);
286     gen_set_gpr(a->rd, t1);
288     tcg_temp_free(t0);
289     tcg_temp_free(t1);
290     return true;
291 #else
292     return false;
293 #endif
296 static bool trans_hlvx_wu(DisasContext *ctx, arg_hlvx_wu *a)
298     REQUIRE_EXT(ctx, RVH);
299 #ifndef CONFIG_USER_ONLY
300     TCGv t0 = tcg_temp_new();
301     TCGv t1 = tcg_temp_new();
303     check_access(ctx);
305     gen_get_gpr(t0, a->rs1);
307     gen_helper_hyp_hlvx_wu(t1, cpu_env, t0);
308     gen_set_gpr(a->rd, t1);
310     tcg_temp_free(t0);
311     tcg_temp_free(t1);
312     return true;
313 #else
314     return false;
315 #endif
318 static bool trans_hfence_gvma(DisasContext *ctx, arg_sfence_vma *a)
320     REQUIRE_EXT(ctx, RVH);
321 #ifndef CONFIG_USER_ONLY
322     gen_helper_hyp_gvma_tlb_flush(cpu_env);
323     return true;
324 #endif
325     return false;
328 static bool trans_hfence_vvma(DisasContext *ctx, arg_sfence_vma *a)
330     REQUIRE_EXT(ctx, RVH);
331 #ifndef CONFIG_USER_ONLY
332     gen_helper_hyp_tlb_flush(cpu_env);
333     return true;
334 #endif
335     return false;