1f798f1e2SMichael Clark /* 2f798f1e2SMichael Clark * RISC-V FPU Emulation Helpers for QEMU. 3f798f1e2SMichael Clark * 4f798f1e2SMichael Clark * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5f798f1e2SMichael Clark * 6f798f1e2SMichael Clark * This program is free software; you can redistribute it and/or modify it 7f798f1e2SMichael Clark * under the terms and conditions of the GNU General Public License, 8f798f1e2SMichael Clark * version 2 or later, as published by the Free Software Foundation. 9f798f1e2SMichael Clark * 10f798f1e2SMichael Clark * This program is distributed in the hope it will be useful, but WITHOUT 11f798f1e2SMichael Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12f798f1e2SMichael Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13f798f1e2SMichael Clark * more details. 14f798f1e2SMichael Clark * 15f798f1e2SMichael Clark * You should have received a copy of the GNU General Public License along with 16f798f1e2SMichael Clark * this program. If not, see <http://www.gnu.org/licenses/>. 17f798f1e2SMichael Clark */ 18f798f1e2SMichael Clark 19f798f1e2SMichael Clark #include "qemu/osdep.h" 20f798f1e2SMichael Clark #include "cpu.h" 21f798f1e2SMichael Clark #include "qemu/host-utils.h" 22f798f1e2SMichael Clark #include "exec/exec-all.h" 23f798f1e2SMichael Clark #include "exec/helper-proto.h" 24135b03cbSAlex Bennée #include "fpu/softfloat.h" 25121ddbb3SLIU Zhiwei #include "internals.h" 26f798f1e2SMichael Clark 27fb738839SMichael Clark target_ulong riscv_cpu_get_fflags(CPURISCVState *env) 28f798f1e2SMichael Clark { 29f798f1e2SMichael Clark int soft = get_float_exception_flags(&env->fp_status); 30f798f1e2SMichael Clark target_ulong hard = 0; 31f798f1e2SMichael Clark 32f798f1e2SMichael Clark hard |= (soft & float_flag_inexact) ? FPEXC_NX : 0; 33f798f1e2SMichael Clark hard |= (soft & float_flag_underflow) ? FPEXC_UF : 0; 34f798f1e2SMichael Clark hard |= (soft & float_flag_overflow) ? FPEXC_OF : 0; 35f798f1e2SMichael Clark hard |= (soft & float_flag_divbyzero) ? FPEXC_DZ : 0; 36f798f1e2SMichael Clark hard |= (soft & float_flag_invalid) ? FPEXC_NV : 0; 37f798f1e2SMichael Clark 38f798f1e2SMichael Clark return hard; 39f798f1e2SMichael Clark } 40f798f1e2SMichael Clark 41fb738839SMichael Clark void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong hard) 42f798f1e2SMichael Clark { 43f798f1e2SMichael Clark int soft = 0; 44f798f1e2SMichael Clark 45f798f1e2SMichael Clark soft |= (hard & FPEXC_NX) ? float_flag_inexact : 0; 46f798f1e2SMichael Clark soft |= (hard & FPEXC_UF) ? float_flag_underflow : 0; 47f798f1e2SMichael Clark soft |= (hard & FPEXC_OF) ? float_flag_overflow : 0; 48f798f1e2SMichael Clark soft |= (hard & FPEXC_DZ) ? float_flag_divbyzero : 0; 49f798f1e2SMichael Clark soft |= (hard & FPEXC_NV) ? float_flag_invalid : 0; 50f798f1e2SMichael Clark 51f798f1e2SMichael Clark set_float_exception_flags(soft, &env->fp_status); 52f798f1e2SMichael Clark } 53f798f1e2SMichael Clark 54f798f1e2SMichael Clark void helper_set_rounding_mode(CPURISCVState *env, uint32_t rm) 55f798f1e2SMichael Clark { 56f798f1e2SMichael Clark int softrm; 57f798f1e2SMichael Clark 58986c895dSFrank Chang if (rm == RISCV_FRM_DYN) { 59f798f1e2SMichael Clark rm = env->frm; 60f798f1e2SMichael Clark } 61f798f1e2SMichael Clark switch (rm) { 62986c895dSFrank Chang case RISCV_FRM_RNE: 63f798f1e2SMichael Clark softrm = float_round_nearest_even; 64f798f1e2SMichael Clark break; 65986c895dSFrank Chang case RISCV_FRM_RTZ: 66f798f1e2SMichael Clark softrm = float_round_to_zero; 67f798f1e2SMichael Clark break; 68986c895dSFrank Chang case RISCV_FRM_RDN: 69f798f1e2SMichael Clark softrm = float_round_down; 70f798f1e2SMichael Clark break; 71986c895dSFrank Chang case RISCV_FRM_RUP: 72f798f1e2SMichael Clark softrm = float_round_up; 73f798f1e2SMichael Clark break; 74986c895dSFrank Chang case RISCV_FRM_RMM: 75f798f1e2SMichael Clark softrm = float_round_ties_away; 76f798f1e2SMichael Clark break; 77f798f1e2SMichael Clark default: 78fb738839SMichael Clark riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC()); 79f798f1e2SMichael Clark } 80f798f1e2SMichael Clark 81f798f1e2SMichael Clark set_float_rounding_mode(softrm, &env->fp_status); 82f798f1e2SMichael Clark } 83f798f1e2SMichael Clark 8475804f71SFrank Chang void helper_set_rod_rounding_mode(CPURISCVState *env) 8575804f71SFrank Chang { 8675804f71SFrank Chang set_float_rounding_mode(float_round_to_odd, &env->fp_status); 8775804f71SFrank Chang } 8875804f71SFrank Chang 8900c1899fSKito Cheng static uint64_t do_fmadd_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2, 9000c1899fSKito Cheng uint64_t rs3, int flags) 9100c1899fSKito Cheng { 92*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 93*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 94*a2464a4cSWeiwei Li float16 frs3 = check_nanbox_h(env, rs3); 95*a2464a4cSWeiwei Li return nanbox_h(env, float16_muladd(frs1, frs2, frs3, flags, 96*a2464a4cSWeiwei Li &env->fp_status)); 9700c1899fSKito Cheng } 9800c1899fSKito Cheng 9900e925c5SRichard Henderson static uint64_t do_fmadd_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2, 10000e925c5SRichard Henderson uint64_t rs3, int flags) 1019921e3d3SRichard Henderson { 102e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 103e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 104e1a29bbdSWeiwei Li float32 frs3 = check_nanbox_s(env, rs3); 105e1a29bbdSWeiwei Li return nanbox_s(env, float32_muladd(frs1, frs2, frs3, flags, 106e1a29bbdSWeiwei Li &env->fp_status)); 1079921e3d3SRichard Henderson } 1089921e3d3SRichard Henderson 109f798f1e2SMichael Clark uint64_t helper_fmadd_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 110f798f1e2SMichael Clark uint64_t frs3) 111f798f1e2SMichael Clark { 1129921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, 0); 113f798f1e2SMichael Clark } 114f798f1e2SMichael Clark 115f798f1e2SMichael Clark uint64_t helper_fmadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 116f798f1e2SMichael Clark uint64_t frs3) 117f798f1e2SMichael Clark { 118f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, 0, &env->fp_status); 119f798f1e2SMichael Clark } 120f798f1e2SMichael Clark 12100c1899fSKito Cheng uint64_t helper_fmadd_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 12200c1899fSKito Cheng uint64_t frs3) 12300c1899fSKito Cheng { 12400c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, 0); 12500c1899fSKito Cheng } 12600c1899fSKito Cheng 127f798f1e2SMichael Clark uint64_t helper_fmsub_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 128f798f1e2SMichael Clark uint64_t frs3) 129f798f1e2SMichael Clark { 1309921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, float_muladd_negate_c); 131f798f1e2SMichael Clark } 132f798f1e2SMichael Clark 133f798f1e2SMichael Clark uint64_t helper_fmsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 134f798f1e2SMichael Clark uint64_t frs3) 135f798f1e2SMichael Clark { 136f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_c, 137f798f1e2SMichael Clark &env->fp_status); 138f798f1e2SMichael Clark } 139f798f1e2SMichael Clark 14000c1899fSKito Cheng uint64_t helper_fmsub_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 14100c1899fSKito Cheng uint64_t frs3) 14200c1899fSKito Cheng { 14300c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, float_muladd_negate_c); 14400c1899fSKito Cheng } 14500c1899fSKito Cheng 146f798f1e2SMichael Clark uint64_t helper_fnmsub_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 147f798f1e2SMichael Clark uint64_t frs3) 148f798f1e2SMichael Clark { 1499921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, float_muladd_negate_product); 150f798f1e2SMichael Clark } 151f798f1e2SMichael Clark 152f798f1e2SMichael Clark uint64_t helper_fnmsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 153f798f1e2SMichael Clark uint64_t frs3) 154f798f1e2SMichael Clark { 155f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_product, 156f798f1e2SMichael Clark &env->fp_status); 157f798f1e2SMichael Clark } 158f798f1e2SMichael Clark 15900c1899fSKito Cheng uint64_t helper_fnmsub_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 16000c1899fSKito Cheng uint64_t frs3) 16100c1899fSKito Cheng { 16200c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, float_muladd_negate_product); 16300c1899fSKito Cheng } 16400c1899fSKito Cheng 165f798f1e2SMichael Clark uint64_t helper_fnmadd_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 166f798f1e2SMichael Clark uint64_t frs3) 167f798f1e2SMichael Clark { 1689921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, 1699921e3d3SRichard Henderson float_muladd_negate_c | float_muladd_negate_product); 170f798f1e2SMichael Clark } 171f798f1e2SMichael Clark 172f798f1e2SMichael Clark uint64_t helper_fnmadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 173f798f1e2SMichael Clark uint64_t frs3) 174f798f1e2SMichael Clark { 175f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_c | 176f798f1e2SMichael Clark float_muladd_negate_product, &env->fp_status); 177f798f1e2SMichael Clark } 178f798f1e2SMichael Clark 17900c1899fSKito Cheng uint64_t helper_fnmadd_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2, 18000c1899fSKito Cheng uint64_t frs3) 18100c1899fSKito Cheng { 18200c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, 18300c1899fSKito Cheng float_muladd_negate_c | float_muladd_negate_product); 18400c1899fSKito Cheng } 18500c1899fSKito Cheng 18600e925c5SRichard Henderson uint64_t helper_fadd_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 187f798f1e2SMichael Clark { 188e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 189e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 190e1a29bbdSWeiwei Li return nanbox_s(env, float32_add(frs1, frs2, &env->fp_status)); 191f798f1e2SMichael Clark } 192f798f1e2SMichael Clark 19300e925c5SRichard Henderson uint64_t helper_fsub_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 194f798f1e2SMichael Clark { 195e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 196e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 197e1a29bbdSWeiwei Li return nanbox_s(env, float32_sub(frs1, frs2, &env->fp_status)); 198f798f1e2SMichael Clark } 199f798f1e2SMichael Clark 20000e925c5SRichard Henderson uint64_t helper_fmul_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 201f798f1e2SMichael Clark { 202e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 203e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 204e1a29bbdSWeiwei Li return nanbox_s(env, float32_mul(frs1, frs2, &env->fp_status)); 205f798f1e2SMichael Clark } 206f798f1e2SMichael Clark 20700e925c5SRichard Henderson uint64_t helper_fdiv_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 208f798f1e2SMichael Clark { 209e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 210e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 211e1a29bbdSWeiwei Li return nanbox_s(env, float32_div(frs1, frs2, &env->fp_status)); 212f798f1e2SMichael Clark } 213f798f1e2SMichael Clark 21400e925c5SRichard Henderson uint64_t helper_fmin_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 215f798f1e2SMichael Clark { 216e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 217e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 218e1a29bbdSWeiwei Li return nanbox_s(env, env->priv_ver < PRIV_VERSION_1_11_0 ? 21915161e42SChih-Min Chao float32_minnum(frs1, frs2, &env->fp_status) : 22015161e42SChih-Min Chao float32_minimum_number(frs1, frs2, &env->fp_status)); 221f798f1e2SMichael Clark } 222f798f1e2SMichael Clark 22300e925c5SRichard Henderson uint64_t helper_fmax_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 224f798f1e2SMichael Clark { 225e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 226e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 227e1a29bbdSWeiwei Li return nanbox_s(env, env->priv_ver < PRIV_VERSION_1_11_0 ? 22815161e42SChih-Min Chao float32_maxnum(frs1, frs2, &env->fp_status) : 22915161e42SChih-Min Chao float32_maximum_number(frs1, frs2, &env->fp_status)); 230f798f1e2SMichael Clark } 231f798f1e2SMichael Clark 23200e925c5SRichard Henderson uint64_t helper_fsqrt_s(CPURISCVState *env, uint64_t rs1) 233f798f1e2SMichael Clark { 234e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 235e1a29bbdSWeiwei Li return nanbox_s(env, float32_sqrt(frs1, &env->fp_status)); 236f798f1e2SMichael Clark } 237f798f1e2SMichael Clark 23800e925c5SRichard Henderson target_ulong helper_fle_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 239f798f1e2SMichael Clark { 240e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 241e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 242f798f1e2SMichael Clark return float32_le(frs1, frs2, &env->fp_status); 243f798f1e2SMichael Clark } 244f798f1e2SMichael Clark 24500e925c5SRichard Henderson target_ulong helper_flt_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 246f798f1e2SMichael Clark { 247e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 248e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 249f798f1e2SMichael Clark return float32_lt(frs1, frs2, &env->fp_status); 250f798f1e2SMichael Clark } 251f798f1e2SMichael Clark 25200e925c5SRichard Henderson target_ulong helper_feq_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 253f798f1e2SMichael Clark { 254e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 255e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2); 256f798f1e2SMichael Clark return float32_eq_quiet(frs1, frs2, &env->fp_status); 257f798f1e2SMichael Clark } 258f798f1e2SMichael Clark 25900e925c5SRichard Henderson target_ulong helper_fcvt_w_s(CPURISCVState *env, uint64_t rs1) 260f798f1e2SMichael Clark { 261e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 262f798f1e2SMichael Clark return float32_to_int32(frs1, &env->fp_status); 263f798f1e2SMichael Clark } 264f798f1e2SMichael Clark 26500e925c5SRichard Henderson target_ulong helper_fcvt_wu_s(CPURISCVState *env, uint64_t rs1) 266f798f1e2SMichael Clark { 267e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 268f798f1e2SMichael Clark return (int32_t)float32_to_uint32(frs1, &env->fp_status); 269f798f1e2SMichael Clark } 270f798f1e2SMichael Clark 271daf866b6SAlistair Francis target_ulong helper_fcvt_l_s(CPURISCVState *env, uint64_t rs1) 272f798f1e2SMichael Clark { 273e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 274f798f1e2SMichael Clark return float32_to_int64(frs1, &env->fp_status); 275f798f1e2SMichael Clark } 276f798f1e2SMichael Clark 277daf866b6SAlistair Francis target_ulong helper_fcvt_lu_s(CPURISCVState *env, uint64_t rs1) 278f798f1e2SMichael Clark { 279e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 280f798f1e2SMichael Clark return float32_to_uint64(frs1, &env->fp_status); 281f798f1e2SMichael Clark } 282f798f1e2SMichael Clark 283f798f1e2SMichael Clark uint64_t helper_fcvt_s_w(CPURISCVState *env, target_ulong rs1) 284f798f1e2SMichael Clark { 285e1a29bbdSWeiwei Li return nanbox_s(env, int32_to_float32((int32_t)rs1, &env->fp_status)); 286f798f1e2SMichael Clark } 287f798f1e2SMichael Clark 288f798f1e2SMichael Clark uint64_t helper_fcvt_s_wu(CPURISCVState *env, target_ulong rs1) 289f798f1e2SMichael Clark { 290e1a29bbdSWeiwei Li return nanbox_s(env, uint32_to_float32((uint32_t)rs1, &env->fp_status)); 291f798f1e2SMichael Clark } 292f798f1e2SMichael Clark 293daf866b6SAlistair Francis uint64_t helper_fcvt_s_l(CPURISCVState *env, target_ulong rs1) 294f798f1e2SMichael Clark { 295e1a29bbdSWeiwei Li return nanbox_s(env, int64_to_float32(rs1, &env->fp_status)); 296f798f1e2SMichael Clark } 297f798f1e2SMichael Clark 298daf866b6SAlistair Francis uint64_t helper_fcvt_s_lu(CPURISCVState *env, target_ulong rs1) 299f798f1e2SMichael Clark { 300e1a29bbdSWeiwei Li return nanbox_s(env, uint64_to_float32(rs1, &env->fp_status)); 301f798f1e2SMichael Clark } 302f798f1e2SMichael Clark 303e1a29bbdSWeiwei Li target_ulong helper_fclass_s(CPURISCVState *env, uint64_t rs1) 304f798f1e2SMichael Clark { 305e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 306121ddbb3SLIU Zhiwei return fclass_s(frs1); 307f798f1e2SMichael Clark } 308f798f1e2SMichael Clark 309f798f1e2SMichael Clark uint64_t helper_fadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 310f798f1e2SMichael Clark { 311f798f1e2SMichael Clark return float64_add(frs1, frs2, &env->fp_status); 312f798f1e2SMichael Clark } 313f798f1e2SMichael Clark 314f798f1e2SMichael Clark uint64_t helper_fsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 315f798f1e2SMichael Clark { 316f798f1e2SMichael Clark return float64_sub(frs1, frs2, &env->fp_status); 317f798f1e2SMichael Clark } 318f798f1e2SMichael Clark 319f798f1e2SMichael Clark uint64_t helper_fmul_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 320f798f1e2SMichael Clark { 321f798f1e2SMichael Clark return float64_mul(frs1, frs2, &env->fp_status); 322f798f1e2SMichael Clark } 323f798f1e2SMichael Clark 324f798f1e2SMichael Clark uint64_t helper_fdiv_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 325f798f1e2SMichael Clark { 326f798f1e2SMichael Clark return float64_div(frs1, frs2, &env->fp_status); 327f798f1e2SMichael Clark } 328f798f1e2SMichael Clark 329f798f1e2SMichael Clark uint64_t helper_fmin_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 330f798f1e2SMichael Clark { 33115161e42SChih-Min Chao return env->priv_ver < PRIV_VERSION_1_11_0 ? 33215161e42SChih-Min Chao float64_minnum(frs1, frs2, &env->fp_status) : 33315161e42SChih-Min Chao float64_minimum_number(frs1, frs2, &env->fp_status); 334f798f1e2SMichael Clark } 335f798f1e2SMichael Clark 336f798f1e2SMichael Clark uint64_t helper_fmax_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 337f798f1e2SMichael Clark { 33815161e42SChih-Min Chao return env->priv_ver < PRIV_VERSION_1_11_0 ? 33915161e42SChih-Min Chao float64_maxnum(frs1, frs2, &env->fp_status) : 34015161e42SChih-Min Chao float64_maximum_number(frs1, frs2, &env->fp_status); 341f798f1e2SMichael Clark } 342f798f1e2SMichael Clark 343f798f1e2SMichael Clark uint64_t helper_fcvt_s_d(CPURISCVState *env, uint64_t rs1) 344f798f1e2SMichael Clark { 345e1a29bbdSWeiwei Li return nanbox_s(env, float64_to_float32(rs1, &env->fp_status)); 346f798f1e2SMichael Clark } 347f798f1e2SMichael Clark 348f798f1e2SMichael Clark uint64_t helper_fcvt_d_s(CPURISCVState *env, uint64_t rs1) 349f798f1e2SMichael Clark { 350e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 35100e925c5SRichard Henderson return float32_to_float64(frs1, &env->fp_status); 352f798f1e2SMichael Clark } 353f798f1e2SMichael Clark 354f798f1e2SMichael Clark uint64_t helper_fsqrt_d(CPURISCVState *env, uint64_t frs1) 355f798f1e2SMichael Clark { 356f798f1e2SMichael Clark return float64_sqrt(frs1, &env->fp_status); 357f798f1e2SMichael Clark } 358f798f1e2SMichael Clark 359f798f1e2SMichael Clark target_ulong helper_fle_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 360f798f1e2SMichael Clark { 361f798f1e2SMichael Clark return float64_le(frs1, frs2, &env->fp_status); 362f798f1e2SMichael Clark } 363f798f1e2SMichael Clark 364f798f1e2SMichael Clark target_ulong helper_flt_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 365f798f1e2SMichael Clark { 366f798f1e2SMichael Clark return float64_lt(frs1, frs2, &env->fp_status); 367f798f1e2SMichael Clark } 368f798f1e2SMichael Clark 369f798f1e2SMichael Clark target_ulong helper_feq_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2) 370f798f1e2SMichael Clark { 371f798f1e2SMichael Clark return float64_eq_quiet(frs1, frs2, &env->fp_status); 372f798f1e2SMichael Clark } 373f798f1e2SMichael Clark 374f798f1e2SMichael Clark target_ulong helper_fcvt_w_d(CPURISCVState *env, uint64_t frs1) 375f798f1e2SMichael Clark { 376f798f1e2SMichael Clark return float64_to_int32(frs1, &env->fp_status); 377f798f1e2SMichael Clark } 378f798f1e2SMichael Clark 379f798f1e2SMichael Clark target_ulong helper_fcvt_wu_d(CPURISCVState *env, uint64_t frs1) 380f798f1e2SMichael Clark { 381f798f1e2SMichael Clark return (int32_t)float64_to_uint32(frs1, &env->fp_status); 382f798f1e2SMichael Clark } 383f798f1e2SMichael Clark 384daf866b6SAlistair Francis target_ulong helper_fcvt_l_d(CPURISCVState *env, uint64_t frs1) 385f798f1e2SMichael Clark { 386f798f1e2SMichael Clark return float64_to_int64(frs1, &env->fp_status); 387f798f1e2SMichael Clark } 388f798f1e2SMichael Clark 389daf866b6SAlistair Francis target_ulong helper_fcvt_lu_d(CPURISCVState *env, uint64_t frs1) 390f798f1e2SMichael Clark { 391f798f1e2SMichael Clark return float64_to_uint64(frs1, &env->fp_status); 392f798f1e2SMichael Clark } 393f798f1e2SMichael Clark 394f798f1e2SMichael Clark uint64_t helper_fcvt_d_w(CPURISCVState *env, target_ulong rs1) 395f798f1e2SMichael Clark { 396f798f1e2SMichael Clark return int32_to_float64((int32_t)rs1, &env->fp_status); 397f798f1e2SMichael Clark } 398f798f1e2SMichael Clark 399f798f1e2SMichael Clark uint64_t helper_fcvt_d_wu(CPURISCVState *env, target_ulong rs1) 400f798f1e2SMichael Clark { 401f798f1e2SMichael Clark return uint32_to_float64((uint32_t)rs1, &env->fp_status); 402f798f1e2SMichael Clark } 403f798f1e2SMichael Clark 404daf866b6SAlistair Francis uint64_t helper_fcvt_d_l(CPURISCVState *env, target_ulong rs1) 405f798f1e2SMichael Clark { 406f798f1e2SMichael Clark return int64_to_float64(rs1, &env->fp_status); 407f798f1e2SMichael Clark } 408f798f1e2SMichael Clark 409daf866b6SAlistair Francis uint64_t helper_fcvt_d_lu(CPURISCVState *env, target_ulong rs1) 410f798f1e2SMichael Clark { 411f798f1e2SMichael Clark return uint64_to_float64(rs1, &env->fp_status); 412f798f1e2SMichael Clark } 413f798f1e2SMichael Clark 414f798f1e2SMichael Clark target_ulong helper_fclass_d(uint64_t frs1) 415f798f1e2SMichael Clark { 416121ddbb3SLIU Zhiwei return fclass_d(frs1); 417f798f1e2SMichael Clark } 41800c1899fSKito Cheng 41900c1899fSKito Cheng uint64_t helper_fadd_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 42000c1899fSKito Cheng { 421*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 422*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 423*a2464a4cSWeiwei Li return nanbox_h(env, float16_add(frs1, frs2, &env->fp_status)); 42400c1899fSKito Cheng } 42500c1899fSKito Cheng 42600c1899fSKito Cheng uint64_t helper_fsub_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 42700c1899fSKito Cheng { 428*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 429*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 430*a2464a4cSWeiwei Li return nanbox_h(env, float16_sub(frs1, frs2, &env->fp_status)); 43100c1899fSKito Cheng } 43200c1899fSKito Cheng 43300c1899fSKito Cheng uint64_t helper_fmul_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 43400c1899fSKito Cheng { 435*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 436*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 437*a2464a4cSWeiwei Li return nanbox_h(env, float16_mul(frs1, frs2, &env->fp_status)); 43800c1899fSKito Cheng } 43900c1899fSKito Cheng 44000c1899fSKito Cheng uint64_t helper_fdiv_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 44100c1899fSKito Cheng { 442*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 443*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 444*a2464a4cSWeiwei Li return nanbox_h(env, float16_div(frs1, frs2, &env->fp_status)); 44500c1899fSKito Cheng } 44600c1899fSKito Cheng 44700c1899fSKito Cheng uint64_t helper_fmin_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 44800c1899fSKito Cheng { 449*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 450*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 451*a2464a4cSWeiwei Li return nanbox_h(env, env->priv_ver < PRIV_VERSION_1_11_0 ? 45200c1899fSKito Cheng float16_minnum(frs1, frs2, &env->fp_status) : 45300c1899fSKito Cheng float16_minimum_number(frs1, frs2, &env->fp_status)); 45400c1899fSKito Cheng } 45500c1899fSKito Cheng 45600c1899fSKito Cheng uint64_t helper_fmax_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 45700c1899fSKito Cheng { 458*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 459*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 460*a2464a4cSWeiwei Li return nanbox_h(env, env->priv_ver < PRIV_VERSION_1_11_0 ? 46100c1899fSKito Cheng float16_maxnum(frs1, frs2, &env->fp_status) : 46200c1899fSKito Cheng float16_maximum_number(frs1, frs2, &env->fp_status)); 46300c1899fSKito Cheng } 46400c1899fSKito Cheng 46500c1899fSKito Cheng uint64_t helper_fsqrt_h(CPURISCVState *env, uint64_t rs1) 46600c1899fSKito Cheng { 467*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 468*a2464a4cSWeiwei Li return nanbox_h(env, float16_sqrt(frs1, &env->fp_status)); 46900c1899fSKito Cheng } 4707b03c8e5SKito Cheng 47111f9c450SKito Cheng target_ulong helper_fle_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 47211f9c450SKito Cheng { 473*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 474*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 47511f9c450SKito Cheng return float16_le(frs1, frs2, &env->fp_status); 47611f9c450SKito Cheng } 47711f9c450SKito Cheng 47811f9c450SKito Cheng target_ulong helper_flt_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 47911f9c450SKito Cheng { 480*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 481*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 48211f9c450SKito Cheng return float16_lt(frs1, frs2, &env->fp_status); 48311f9c450SKito Cheng } 48411f9c450SKito Cheng 48511f9c450SKito Cheng target_ulong helper_feq_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2) 48611f9c450SKito Cheng { 487*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 488*a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2); 48911f9c450SKito Cheng return float16_eq_quiet(frs1, frs2, &env->fp_status); 49011f9c450SKito Cheng } 49111f9c450SKito Cheng 492*a2464a4cSWeiwei Li target_ulong helper_fclass_h(CPURISCVState *env, uint64_t rs1) 4936bc6fc96SKito Cheng { 494*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 4956bc6fc96SKito Cheng return fclass_h(frs1); 4966bc6fc96SKito Cheng } 4976bc6fc96SKito Cheng 4987b03c8e5SKito Cheng target_ulong helper_fcvt_w_h(CPURISCVState *env, uint64_t rs1) 4997b03c8e5SKito Cheng { 500*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 5017b03c8e5SKito Cheng return float16_to_int32(frs1, &env->fp_status); 5027b03c8e5SKito Cheng } 5037b03c8e5SKito Cheng 5047b03c8e5SKito Cheng target_ulong helper_fcvt_wu_h(CPURISCVState *env, uint64_t rs1) 5057b03c8e5SKito Cheng { 506*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 5077b03c8e5SKito Cheng return (int32_t)float16_to_uint32(frs1, &env->fp_status); 5087b03c8e5SKito Cheng } 5097b03c8e5SKito Cheng 5107b03c8e5SKito Cheng target_ulong helper_fcvt_l_h(CPURISCVState *env, uint64_t rs1) 5117b03c8e5SKito Cheng { 512*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 5137b03c8e5SKito Cheng return float16_to_int64(frs1, &env->fp_status); 5147b03c8e5SKito Cheng } 5157b03c8e5SKito Cheng 5167b03c8e5SKito Cheng target_ulong helper_fcvt_lu_h(CPURISCVState *env, uint64_t rs1) 5177b03c8e5SKito Cheng { 518*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 5197b03c8e5SKito Cheng return float16_to_uint64(frs1, &env->fp_status); 5207b03c8e5SKito Cheng } 5217b03c8e5SKito Cheng 5227b03c8e5SKito Cheng uint64_t helper_fcvt_h_w(CPURISCVState *env, target_ulong rs1) 5237b03c8e5SKito Cheng { 524*a2464a4cSWeiwei Li return nanbox_h(env, int32_to_float16((int32_t)rs1, &env->fp_status)); 5257b03c8e5SKito Cheng } 5267b03c8e5SKito Cheng 5277b03c8e5SKito Cheng uint64_t helper_fcvt_h_wu(CPURISCVState *env, target_ulong rs1) 5287b03c8e5SKito Cheng { 529*a2464a4cSWeiwei Li return nanbox_h(env, uint32_to_float16((uint32_t)rs1, &env->fp_status)); 5307b03c8e5SKito Cheng } 5317b03c8e5SKito Cheng 5327b03c8e5SKito Cheng uint64_t helper_fcvt_h_l(CPURISCVState *env, target_ulong rs1) 5337b03c8e5SKito Cheng { 534*a2464a4cSWeiwei Li return nanbox_h(env, int64_to_float16(rs1, &env->fp_status)); 5357b03c8e5SKito Cheng } 5367b03c8e5SKito Cheng 5377b03c8e5SKito Cheng uint64_t helper_fcvt_h_lu(CPURISCVState *env, target_ulong rs1) 5387b03c8e5SKito Cheng { 539*a2464a4cSWeiwei Li return nanbox_h(env, uint64_to_float16(rs1, &env->fp_status)); 5407b03c8e5SKito Cheng } 5417b03c8e5SKito Cheng 5427b03c8e5SKito Cheng uint64_t helper_fcvt_h_s(CPURISCVState *env, uint64_t rs1) 5437b03c8e5SKito Cheng { 544e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1); 545*a2464a4cSWeiwei Li return nanbox_h(env, float32_to_float16(frs1, true, &env->fp_status)); 5467b03c8e5SKito Cheng } 5477b03c8e5SKito Cheng 5487b03c8e5SKito Cheng uint64_t helper_fcvt_s_h(CPURISCVState *env, uint64_t rs1) 5497b03c8e5SKito Cheng { 550*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 551e1a29bbdSWeiwei Li return nanbox_s(env, float16_to_float32(frs1, true, &env->fp_status)); 5527b03c8e5SKito Cheng } 5537b03c8e5SKito Cheng 5547b03c8e5SKito Cheng uint64_t helper_fcvt_h_d(CPURISCVState *env, uint64_t rs1) 5557b03c8e5SKito Cheng { 556*a2464a4cSWeiwei Li return nanbox_h(env, float64_to_float16(rs1, true, &env->fp_status)); 5577b03c8e5SKito Cheng } 5587b03c8e5SKito Cheng 5597b03c8e5SKito Cheng uint64_t helper_fcvt_d_h(CPURISCVState *env, uint64_t rs1) 5607b03c8e5SKito Cheng { 561*a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1); 5627b03c8e5SKito Cheng return float16_to_float64(frs1, true, &env->fp_status); 5637b03c8e5SKito Cheng } 564