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