1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (c) 2021 Loongson Technology Corporation Limited 4 */ 5 6/* bit0(signaling/quiet) bit1(lt) bit2(eq) bit3(un) bit4(neq) */ 7static uint32_t get_fcmp_flags(DisasContext *ctx, int cond) 8{ 9 uint32_t flags = 0; 10 11 /*check cond , cond =[0-8,10,12] */ 12 if ((cond > 8) &&(cond != 10) && (cond != 12)) { 13 return -1; 14 } 15 16 if (cond & 0x1) { 17 flags |= FCMP_LT; 18 } 19 if (cond & 0x2) { 20 flags |= FCMP_EQ; 21 } 22 if (cond & 0x4) { 23 flags |= FCMP_UN; 24 } 25 if (cond & 0x8) { 26 flags |= FCMP_GT | FCMP_LT; 27 } 28 return flags; 29} 30 31static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a) 32{ 33 TCGv var, src1, src2; 34 uint32_t flags = get_fcmp_flags(ctx, a->fcond >>1); 35 void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32); 36 37 if (flags == -1) { 38 generate_exception(ctx, EXCCODE_INE); 39 return true; 40 } 41 42 if (!avail_FP_SP(ctx)) { 43 return false; 44 } 45 46 CHECK_FPE; 47 48 var = tcg_temp_new(); 49 src1 = get_fpr(ctx, a->fj); 50 src2 = get_fpr(ctx, a->fk); 51 fn = (a->fcond & 1 ? gen_helper_fcmp_s_s : gen_helper_fcmp_c_s); 52 fn(var, tcg_env, src1, src2, tcg_constant_i32(flags)); 53 54 tcg_gen_st8_tl(var, tcg_env, offsetof(CPULoongArchState, cf[a->cd])); 55 return true; 56} 57 58static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a) 59{ 60 TCGv var, src1, src2; 61 uint32_t flags = get_fcmp_flags(ctx, a->fcond >> 1); 62 void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32); 63 64 if (flags == -1) { 65 generate_exception(ctx, EXCCODE_INE); 66 return true; 67 } 68 69 if (!avail_FP_DP(ctx)) { 70 return false; 71 } 72 73 CHECK_FPE; 74 75 var = tcg_temp_new(); 76 src1 = get_fpr(ctx, a->fj); 77 src2 = get_fpr(ctx, a->fk); 78 fn = (a->fcond & 1 ? gen_helper_fcmp_s_d : gen_helper_fcmp_c_d); 79 fn(var, tcg_env, src1, src2, tcg_constant_i32(flags)); 80 81 tcg_gen_st8_tl(var, tcg_env, offsetof(CPULoongArchState, cf[a->cd])); 82 return true; 83} 84