1b8e1f32cSWeiwei Li/* 2b8e1f32cSWeiwei Li * RISC-V translation routines for the Zicond Standard Extension. 3b8e1f32cSWeiwei Li * 4b8e1f32cSWeiwei Li * Copyright (c) 2020-2023 PLCT Lab 5*378e43faSPhilipp Tomsich * Copyright (c) 2022 VRULL GmbH. 6b8e1f32cSWeiwei Li * 7b8e1f32cSWeiwei Li * This program is free software; you can redistribute it and/or modify it 8b8e1f32cSWeiwei Li * under the terms and conditions of the GNU General Public License, 9b8e1f32cSWeiwei Li * version 2 or later, as published by the Free Software Foundation. 10b8e1f32cSWeiwei Li * 11b8e1f32cSWeiwei Li * This program is distributed in the hope it will be useful, but WITHOUT 12b8e1f32cSWeiwei Li * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13b8e1f32cSWeiwei Li * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14b8e1f32cSWeiwei Li * more details. 15b8e1f32cSWeiwei Li * 16b8e1f32cSWeiwei Li * You should have received a copy of the GNU General Public License along with 17b8e1f32cSWeiwei Li * this program. If not, see <http://www.gnu.org/licenses/>. 18b8e1f32cSWeiwei Li */ 19b8e1f32cSWeiwei Li 20b8e1f32cSWeiwei Li#define REQUIRE_ZICOND(ctx) do { \ 21b8e1f32cSWeiwei Li if (!ctx->cfg_ptr->ext_zicond) { \ 22b8e1f32cSWeiwei Li return false; \ 23b8e1f32cSWeiwei Li } \ 24b8e1f32cSWeiwei Li} while (0) 25b8e1f32cSWeiwei Li 26*378e43faSPhilipp Tomsich/* Emits "$rd = ($rs2 <cond> $zero) ? $zero : $rs1" */ 27*378e43faSPhilipp Tomsichstatic void gen_czero(TCGv dest, TCGv src1, TCGv src2, TCGCond cond) 28b8e1f32cSWeiwei Li{ 29*378e43faSPhilipp Tomsich TCGv zero = tcg_constant_tl(0); 30*378e43faSPhilipp Tomsich tcg_gen_movcond_tl(cond, dest, src2, zero, zero, src1); 31b8e1f32cSWeiwei Li} 32b8e1f32cSWeiwei Li 33*378e43faSPhilipp Tomsichstatic void gen_czero_eqz(TCGv dest, TCGv src1, TCGv src2) 34*378e43faSPhilipp Tomsich{ 35*378e43faSPhilipp Tomsich gen_czero(dest, src1, src2, TCG_COND_EQ); 36*378e43faSPhilipp Tomsich} 37*378e43faSPhilipp Tomsich 38*378e43faSPhilipp Tomsichstatic void gen_czero_nez(TCGv dest, TCGv src1, TCGv src2) 39*378e43faSPhilipp Tomsich{ 40*378e43faSPhilipp Tomsich gen_czero(dest, src1, src2, TCG_COND_NE); 41*378e43faSPhilipp Tomsich} 42*378e43faSPhilipp Tomsich 43*378e43faSPhilipp Tomsichstatic bool trans_czero_eqz(DisasContext *ctx, arg_r *a) 44b8e1f32cSWeiwei Li{ 45b8e1f32cSWeiwei Li REQUIRE_ZICOND(ctx); 46b8e1f32cSWeiwei Li 47*378e43faSPhilipp Tomsich return gen_logic(ctx, a, gen_czero_eqz); 48*378e43faSPhilipp Tomsich} 49b8e1f32cSWeiwei Li 50*378e43faSPhilipp Tomsichstatic bool trans_czero_nez(DisasContext *ctx, arg_r *a) 51*378e43faSPhilipp Tomsich{ 52*378e43faSPhilipp Tomsich REQUIRE_ZICOND(ctx); 53*378e43faSPhilipp Tomsich 54*378e43faSPhilipp Tomsich return gen_logic(ctx, a, gen_czero_nez); 55b8e1f32cSWeiwei Li} 56