xref: /openbmc/qemu/target/riscv/insn_trans/trans_rvh.c.inc (revision 92ec7805190313c9e628f8fc4eb4f932c15247bd)
1139c1837SPaolo Bonzini/*
2139c1837SPaolo Bonzini * RISC-V translation routines for the RVXI Base Integer Instruction Set.
3139c1837SPaolo Bonzini *
4139c1837SPaolo Bonzini * Copyright (c) 2020 Western Digital
5139c1837SPaolo Bonzini *
6139c1837SPaolo Bonzini * This program is free software; you can redistribute it and/or modify it
7139c1837SPaolo Bonzini * under the terms and conditions of the GNU General Public License,
8139c1837SPaolo Bonzini * version 2 or later, as published by the Free Software Foundation.
9139c1837SPaolo Bonzini *
10139c1837SPaolo Bonzini * This program is distributed in the hope it will be useful, but WITHOUT
11139c1837SPaolo Bonzini * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12139c1837SPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13139c1837SPaolo Bonzini * more details.
14139c1837SPaolo Bonzini *
15139c1837SPaolo Bonzini * You should have received a copy of the GNU General Public License along with
16139c1837SPaolo Bonzini * this program.  If not, see <http://www.gnu.org/licenses/>.
17139c1837SPaolo Bonzini */
18139c1837SPaolo Bonzini
19f33960dfSRichard Henderson#ifdef CONFIG_USER_ONLY
200f58cbbeSRichard Henderson#define do_hlv(ctx, a, func)  false
210f58cbbeSRichard Henderson#define do_hsv(ctx, a, func)  false
22f33960dfSRichard Henderson#else
230f58cbbeSRichard Hendersonstatic void gen_helper_hyp_hlv_b(TCGv r, TCGv_env e, TCGv a)
240f58cbbeSRichard Henderson{
250f58cbbeSRichard Henderson    gen_helper_hyp_hlv_bu(r, e, a);
260f58cbbeSRichard Henderson    tcg_gen_ext8s_tl(r, r);
270f58cbbeSRichard Henderson}
280f58cbbeSRichard Henderson
290f58cbbeSRichard Hendersonstatic void gen_helper_hyp_hlv_h(TCGv r, TCGv_env e, TCGv a)
300f58cbbeSRichard Henderson{
310f58cbbeSRichard Henderson    gen_helper_hyp_hlv_hu(r, e, a);
320f58cbbeSRichard Henderson    tcg_gen_ext16s_tl(r, r);
330f58cbbeSRichard Henderson}
340f58cbbeSRichard Henderson
350f58cbbeSRichard Hendersonstatic void gen_helper_hyp_hlv_w(TCGv r, TCGv_env e, TCGv a)
360f58cbbeSRichard Henderson{
370f58cbbeSRichard Henderson    gen_helper_hyp_hlv_wu(r, e, a);
380f58cbbeSRichard Henderson    tcg_gen_ext32s_tl(r, r);
390f58cbbeSRichard Henderson}
400f58cbbeSRichard Henderson
410f58cbbeSRichard Hendersonstatic bool do_hlv(DisasContext *ctx, arg_r2 *a,
420f58cbbeSRichard Henderson                   void (*func)(TCGv, TCGv_env, TCGv))
430f58cbbeSRichard Henderson{
44f33960dfSRichard Henderson    TCGv dest = dest_gpr(ctx, a->rd);
45f33960dfSRichard Henderson    TCGv addr = get_gpr(ctx, a->rs1, EXT_NONE);
460f58cbbeSRichard Henderson
47*f21b36a0SDeepak Gupta    decode_save_opc(ctx, 0);
48ad75a51eSRichard Henderson    func(dest, tcg_env, addr);
49f33960dfSRichard Henderson    gen_set_gpr(ctx, a->rd, dest);
50f33960dfSRichard Henderson    return true;
51f33960dfSRichard Henderson}
52f33960dfSRichard Henderson
530f58cbbeSRichard Hendersonstatic bool do_hsv(DisasContext *ctx, arg_r2_s *a,
540f58cbbeSRichard Henderson                   void (*func)(TCGv_env, TCGv, TCGv))
550f58cbbeSRichard Henderson{
560f58cbbeSRichard Henderson    TCGv addr = get_gpr(ctx, a->rs1, EXT_NONE);
570f58cbbeSRichard Henderson    TCGv data = get_gpr(ctx, a->rs2, EXT_NONE);
580f58cbbeSRichard Henderson
59*f21b36a0SDeepak Gupta    decode_save_opc(ctx, 0);
60ad75a51eSRichard Henderson    func(tcg_env, addr, data);
610f58cbbeSRichard Henderson    return true;
620f58cbbeSRichard Henderson}
630f58cbbeSRichard Henderson#endif /* CONFIG_USER_ONLY */
640f58cbbeSRichard Henderson
658c5362acSAlistair Francisstatic bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a)
668c5362acSAlistair Francis{
678c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
680f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_b);
698c5362acSAlistair Francis}
708c5362acSAlistair Francis
718c5362acSAlistair Francisstatic bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a)
728c5362acSAlistair Francis{
738c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
740f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_h);
758c5362acSAlistair Francis}
768c5362acSAlistair Francis
778c5362acSAlistair Francisstatic bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a)
788c5362acSAlistair Francis{
798c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
800f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_w);
818c5362acSAlistair Francis}
828c5362acSAlistair Francis
838c5362acSAlistair Francisstatic bool trans_hlv_bu(DisasContext *ctx, arg_hlv_bu *a)
848c5362acSAlistair Francis{
858c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
860f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_bu);
878c5362acSAlistair Francis}
888c5362acSAlistair Francis
898c5362acSAlistair Francisstatic bool trans_hlv_hu(DisasContext *ctx, arg_hlv_hu *a)
908c5362acSAlistair Francis{
918c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
920f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_hu);
938c5362acSAlistair Francis}
948c5362acSAlistair Francis
958c5362acSAlistair Francisstatic bool trans_hsv_b(DisasContext *ctx, arg_hsv_b *a)
968c5362acSAlistair Francis{
978c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
980f58cbbeSRichard Henderson    return do_hsv(ctx, a, gen_helper_hyp_hsv_b);
998c5362acSAlistair Francis}
1008c5362acSAlistair Francis
1018c5362acSAlistair Francisstatic bool trans_hsv_h(DisasContext *ctx, arg_hsv_h *a)
1028c5362acSAlistair Francis{
1038c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1040f58cbbeSRichard Henderson    return do_hsv(ctx, a, gen_helper_hyp_hsv_h);
1058c5362acSAlistair Francis}
1068c5362acSAlistair Francis
1078c5362acSAlistair Francisstatic bool trans_hsv_w(DisasContext *ctx, arg_hsv_w *a)
1088c5362acSAlistair Francis{
1098c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1100f58cbbeSRichard Henderson    return do_hsv(ctx, a, gen_helper_hyp_hsv_w);
1118c5362acSAlistair Francis}
1128c5362acSAlistair Francis
1138c5362acSAlistair Francisstatic bool trans_hlv_wu(DisasContext *ctx, arg_hlv_wu *a)
1148c5362acSAlistair Francis{
115daf866b6SAlistair Francis    REQUIRE_64BIT(ctx);
1168c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1170f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_wu);
1188c5362acSAlistair Francis}
1198c5362acSAlistair Francis
1208c5362acSAlistair Francisstatic bool trans_hlv_d(DisasContext *ctx, arg_hlv_d *a)
1218c5362acSAlistair Francis{
122daf866b6SAlistair Francis    REQUIRE_64BIT(ctx);
1238c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1240f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlv_d);
1258c5362acSAlistair Francis}
1268c5362acSAlistair Francis
1278c5362acSAlistair Francisstatic bool trans_hsv_d(DisasContext *ctx, arg_hsv_d *a)
1288c5362acSAlistair Francis{
129daf866b6SAlistair Francis    REQUIRE_64BIT(ctx);
1308c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1310f58cbbeSRichard Henderson    return do_hsv(ctx, a, gen_helper_hyp_hsv_d);
132f33960dfSRichard Henderson}
133daf866b6SAlistair Francis
1348c5362acSAlistair Francisstatic bool trans_hlvx_hu(DisasContext *ctx, arg_hlvx_hu *a)
1358c5362acSAlistair Francis{
1368c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1370f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlvx_hu);
1388c5362acSAlistair Francis}
1398c5362acSAlistair Francis
1408c5362acSAlistair Francisstatic bool trans_hlvx_wu(DisasContext *ctx, arg_hlvx_wu *a)
1418c5362acSAlistair Francis{
1428c5362acSAlistair Francis    REQUIRE_EXT(ctx, RVH);
1430f58cbbeSRichard Henderson    return do_hlv(ctx, a, gen_helper_hyp_hlvx_wu);
1448c5362acSAlistair Francis}
1458c5362acSAlistair Francis
146139c1837SPaolo Bonzinistatic bool trans_hfence_gvma(DisasContext *ctx, arg_sfence_vma *a)
147139c1837SPaolo Bonzini{
148139c1837SPaolo Bonzini    REQUIRE_EXT(ctx, RVH);
149139c1837SPaolo Bonzini#ifndef CONFIG_USER_ONLY
150*f21b36a0SDeepak Gupta    decode_save_opc(ctx, 0);
151ad75a51eSRichard Henderson    gen_helper_hyp_gvma_tlb_flush(tcg_env);
152139c1837SPaolo Bonzini    return true;
153139c1837SPaolo Bonzini#endif
154139c1837SPaolo Bonzini    return false;
155139c1837SPaolo Bonzini}
156139c1837SPaolo Bonzini
157139c1837SPaolo Bonzinistatic bool trans_hfence_vvma(DisasContext *ctx, arg_sfence_vma *a)
158139c1837SPaolo Bonzini{
159139c1837SPaolo Bonzini    REQUIRE_EXT(ctx, RVH);
160139c1837SPaolo Bonzini#ifndef CONFIG_USER_ONLY
161*f21b36a0SDeepak Gupta    decode_save_opc(ctx, 0);
162ad75a51eSRichard Henderson    gen_helper_hyp_tlb_flush(tcg_env);
163139c1837SPaolo Bonzini    return true;
164139c1837SPaolo Bonzini#endif
165139c1837SPaolo Bonzini    return false;
166139c1837SPaolo Bonzini}
167