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/helper-proto.h"
23135b03cbSAlex Bennée #include "fpu/softfloat.h"
24121ddbb3SLIU Zhiwei #include "internals.h"
25f798f1e2SMichael Clark
riscv_cpu_get_fflags(CPURISCVState * env)26fb738839SMichael Clark target_ulong riscv_cpu_get_fflags(CPURISCVState *env)
27f798f1e2SMichael Clark {
28f798f1e2SMichael Clark int soft = get_float_exception_flags(&env->fp_status);
29f798f1e2SMichael Clark target_ulong hard = 0;
30f798f1e2SMichael Clark
31f798f1e2SMichael Clark hard |= (soft & float_flag_inexact) ? FPEXC_NX : 0;
32f798f1e2SMichael Clark hard |= (soft & float_flag_underflow) ? FPEXC_UF : 0;
33f798f1e2SMichael Clark hard |= (soft & float_flag_overflow) ? FPEXC_OF : 0;
34f798f1e2SMichael Clark hard |= (soft & float_flag_divbyzero) ? FPEXC_DZ : 0;
35f798f1e2SMichael Clark hard |= (soft & float_flag_invalid) ? FPEXC_NV : 0;
36f798f1e2SMichael Clark
37f798f1e2SMichael Clark return hard;
38f798f1e2SMichael Clark }
39f798f1e2SMichael Clark
riscv_cpu_set_fflags(CPURISCVState * env,target_ulong hard)40fb738839SMichael Clark void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong hard)
41f798f1e2SMichael Clark {
42f798f1e2SMichael Clark int soft = 0;
43f798f1e2SMichael Clark
44f798f1e2SMichael Clark soft |= (hard & FPEXC_NX) ? float_flag_inexact : 0;
45f798f1e2SMichael Clark soft |= (hard & FPEXC_UF) ? float_flag_underflow : 0;
46f798f1e2SMichael Clark soft |= (hard & FPEXC_OF) ? float_flag_overflow : 0;
47f798f1e2SMichael Clark soft |= (hard & FPEXC_DZ) ? float_flag_divbyzero : 0;
48f798f1e2SMichael Clark soft |= (hard & FPEXC_NV) ? float_flag_invalid : 0;
49f798f1e2SMichael Clark
50f798f1e2SMichael Clark set_float_exception_flags(soft, &env->fp_status);
51f798f1e2SMichael Clark }
52f798f1e2SMichael Clark
helper_set_rounding_mode(CPURISCVState * env,uint32_t rm)53f798f1e2SMichael Clark void helper_set_rounding_mode(CPURISCVState *env, uint32_t rm)
54f798f1e2SMichael Clark {
55f798f1e2SMichael Clark int softrm;
56f798f1e2SMichael Clark
57986c895dSFrank Chang if (rm == RISCV_FRM_DYN) {
58f798f1e2SMichael Clark rm = env->frm;
59f798f1e2SMichael Clark }
60f798f1e2SMichael Clark switch (rm) {
61986c895dSFrank Chang case RISCV_FRM_RNE:
62f798f1e2SMichael Clark softrm = float_round_nearest_even;
63f798f1e2SMichael Clark break;
64986c895dSFrank Chang case RISCV_FRM_RTZ:
65f798f1e2SMichael Clark softrm = float_round_to_zero;
66f798f1e2SMichael Clark break;
67986c895dSFrank Chang case RISCV_FRM_RDN:
68f798f1e2SMichael Clark softrm = float_round_down;
69f798f1e2SMichael Clark break;
70986c895dSFrank Chang case RISCV_FRM_RUP:
71f798f1e2SMichael Clark softrm = float_round_up;
72f798f1e2SMichael Clark break;
73986c895dSFrank Chang case RISCV_FRM_RMM:
74f798f1e2SMichael Clark softrm = float_round_ties_away;
75f798f1e2SMichael Clark break;
76f798f1e2SMichael Clark default:
77fb738839SMichael Clark riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
78f798f1e2SMichael Clark }
79f798f1e2SMichael Clark
80f798f1e2SMichael Clark set_float_rounding_mode(softrm, &env->fp_status);
81f798f1e2SMichael Clark }
82f798f1e2SMichael Clark
helper_set_rounding_mode_chkfrm(CPURISCVState * env,uint32_t rm)833ceeb19aSRichard Henderson void helper_set_rounding_mode_chkfrm(CPURISCVState *env, uint32_t rm)
843ceeb19aSRichard Henderson {
853ceeb19aSRichard Henderson int softrm;
863ceeb19aSRichard Henderson
873ceeb19aSRichard Henderson /* Always validate frm, even if rm != DYN. */
883ceeb19aSRichard Henderson if (unlikely(env->frm >= 5)) {
893ceeb19aSRichard Henderson riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
903ceeb19aSRichard Henderson }
913ceeb19aSRichard Henderson if (rm == RISCV_FRM_DYN) {
923ceeb19aSRichard Henderson rm = env->frm;
933ceeb19aSRichard Henderson }
943ceeb19aSRichard Henderson switch (rm) {
953ceeb19aSRichard Henderson case RISCV_FRM_RNE:
963ceeb19aSRichard Henderson softrm = float_round_nearest_even;
973ceeb19aSRichard Henderson break;
983ceeb19aSRichard Henderson case RISCV_FRM_RTZ:
993ceeb19aSRichard Henderson softrm = float_round_to_zero;
1003ceeb19aSRichard Henderson break;
1013ceeb19aSRichard Henderson case RISCV_FRM_RDN:
1023ceeb19aSRichard Henderson softrm = float_round_down;
1033ceeb19aSRichard Henderson break;
1043ceeb19aSRichard Henderson case RISCV_FRM_RUP:
1053ceeb19aSRichard Henderson softrm = float_round_up;
1063ceeb19aSRichard Henderson break;
1073ceeb19aSRichard Henderson case RISCV_FRM_RMM:
1083ceeb19aSRichard Henderson softrm = float_round_ties_away;
1093ceeb19aSRichard Henderson break;
1103ceeb19aSRichard Henderson case RISCV_FRM_ROD:
1113ceeb19aSRichard Henderson softrm = float_round_to_odd;
1123ceeb19aSRichard Henderson break;
1133ceeb19aSRichard Henderson default:
1143ceeb19aSRichard Henderson g_assert_not_reached();
1153ceeb19aSRichard Henderson }
1163ceeb19aSRichard Henderson
1173ceeb19aSRichard Henderson set_float_rounding_mode(softrm, &env->fp_status);
1183ceeb19aSRichard Henderson }
1193ceeb19aSRichard Henderson
do_fmadd_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2,uint64_t rs3,int flags)12000c1899fSKito Cheng static uint64_t do_fmadd_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2,
12100c1899fSKito Cheng uint64_t rs3, int flags)
12200c1899fSKito Cheng {
123a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
124a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
125a2464a4cSWeiwei Li float16 frs3 = check_nanbox_h(env, rs3);
126a2464a4cSWeiwei Li return nanbox_h(env, float16_muladd(frs1, frs2, frs3, flags,
127a2464a4cSWeiwei Li &env->fp_status));
12800c1899fSKito Cheng }
12900c1899fSKito Cheng
do_fmadd_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2,uint64_t rs3,int flags)13000e925c5SRichard Henderson static uint64_t do_fmadd_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2,
13100e925c5SRichard Henderson uint64_t rs3, int flags)
1329921e3d3SRichard Henderson {
133e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
134e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
135e1a29bbdSWeiwei Li float32 frs3 = check_nanbox_s(env, rs3);
136e1a29bbdSWeiwei Li return nanbox_s(env, float32_muladd(frs1, frs2, frs3, flags,
137e1a29bbdSWeiwei Li &env->fp_status));
1389921e3d3SRichard Henderson }
1399921e3d3SRichard Henderson
helper_fmadd_s(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)140f798f1e2SMichael Clark uint64_t helper_fmadd_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
141f798f1e2SMichael Clark uint64_t frs3)
142f798f1e2SMichael Clark {
1439921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, 0);
144f798f1e2SMichael Clark }
145f798f1e2SMichael Clark
helper_fmadd_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)146f798f1e2SMichael Clark uint64_t helper_fmadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
147f798f1e2SMichael Clark uint64_t frs3)
148f798f1e2SMichael Clark {
149f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, 0, &env->fp_status);
150f798f1e2SMichael Clark }
151f798f1e2SMichael Clark
helper_fmadd_h(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)15200c1899fSKito Cheng uint64_t helper_fmadd_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
15300c1899fSKito Cheng uint64_t frs3)
15400c1899fSKito Cheng {
15500c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, 0);
15600c1899fSKito Cheng }
15700c1899fSKito Cheng
helper_fmsub_s(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)158f798f1e2SMichael Clark uint64_t helper_fmsub_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
159f798f1e2SMichael Clark uint64_t frs3)
160f798f1e2SMichael Clark {
1619921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, float_muladd_negate_c);
162f798f1e2SMichael Clark }
163f798f1e2SMichael Clark
helper_fmsub_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)164f798f1e2SMichael Clark uint64_t helper_fmsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
165f798f1e2SMichael Clark uint64_t frs3)
166f798f1e2SMichael Clark {
167f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_c,
168f798f1e2SMichael Clark &env->fp_status);
169f798f1e2SMichael Clark }
170f798f1e2SMichael Clark
helper_fmsub_h(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)17100c1899fSKito Cheng uint64_t helper_fmsub_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
17200c1899fSKito Cheng uint64_t frs3)
17300c1899fSKito Cheng {
17400c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, float_muladd_negate_c);
17500c1899fSKito Cheng }
17600c1899fSKito Cheng
helper_fnmsub_s(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)177f798f1e2SMichael Clark uint64_t helper_fnmsub_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
178f798f1e2SMichael Clark uint64_t frs3)
179f798f1e2SMichael Clark {
1809921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3, float_muladd_negate_product);
181f798f1e2SMichael Clark }
182f798f1e2SMichael Clark
helper_fnmsub_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)183f798f1e2SMichael Clark uint64_t helper_fnmsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
184f798f1e2SMichael Clark uint64_t frs3)
185f798f1e2SMichael Clark {
186f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_product,
187f798f1e2SMichael Clark &env->fp_status);
188f798f1e2SMichael Clark }
189f798f1e2SMichael Clark
helper_fnmsub_h(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)19000c1899fSKito Cheng uint64_t helper_fnmsub_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
19100c1899fSKito Cheng uint64_t frs3)
19200c1899fSKito Cheng {
19300c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3, float_muladd_negate_product);
19400c1899fSKito Cheng }
19500c1899fSKito Cheng
helper_fnmadd_s(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)196f798f1e2SMichael Clark uint64_t helper_fnmadd_s(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
197f798f1e2SMichael Clark uint64_t frs3)
198f798f1e2SMichael Clark {
1999921e3d3SRichard Henderson return do_fmadd_s(env, frs1, frs2, frs3,
2009921e3d3SRichard Henderson float_muladd_negate_c | float_muladd_negate_product);
201f798f1e2SMichael Clark }
202f798f1e2SMichael Clark
helper_fnmadd_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)203f798f1e2SMichael Clark uint64_t helper_fnmadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
204f798f1e2SMichael Clark uint64_t frs3)
205f798f1e2SMichael Clark {
206f798f1e2SMichael Clark return float64_muladd(frs1, frs2, frs3, float_muladd_negate_c |
207f798f1e2SMichael Clark float_muladd_negate_product, &env->fp_status);
208f798f1e2SMichael Clark }
209f798f1e2SMichael Clark
helper_fnmadd_h(CPURISCVState * env,uint64_t frs1,uint64_t frs2,uint64_t frs3)21000c1899fSKito Cheng uint64_t helper_fnmadd_h(CPURISCVState *env, uint64_t frs1, uint64_t frs2,
21100c1899fSKito Cheng uint64_t frs3)
21200c1899fSKito Cheng {
21300c1899fSKito Cheng return do_fmadd_h(env, frs1, frs2, frs3,
21400c1899fSKito Cheng float_muladd_negate_c | float_muladd_negate_product);
21500c1899fSKito Cheng }
21600c1899fSKito Cheng
helper_fadd_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)21700e925c5SRichard Henderson uint64_t helper_fadd_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
218f798f1e2SMichael Clark {
219e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
220e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
221e1a29bbdSWeiwei Li return nanbox_s(env, float32_add(frs1, frs2, &env->fp_status));
222f798f1e2SMichael Clark }
223f798f1e2SMichael Clark
helper_fsub_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)22400e925c5SRichard Henderson uint64_t helper_fsub_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
225f798f1e2SMichael Clark {
226e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
227e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
228e1a29bbdSWeiwei Li return nanbox_s(env, float32_sub(frs1, frs2, &env->fp_status));
229f798f1e2SMichael Clark }
230f798f1e2SMichael Clark
helper_fmul_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)23100e925c5SRichard Henderson uint64_t helper_fmul_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
232f798f1e2SMichael Clark {
233e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
234e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
235e1a29bbdSWeiwei Li return nanbox_s(env, float32_mul(frs1, frs2, &env->fp_status));
236f798f1e2SMichael Clark }
237f798f1e2SMichael Clark
helper_fdiv_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)23800e925c5SRichard Henderson uint64_t helper_fdiv_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);
242e1a29bbdSWeiwei Li return nanbox_s(env, float32_div(frs1, frs2, &env->fp_status));
243f798f1e2SMichael Clark }
244f798f1e2SMichael Clark
helper_fmin_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)24500e925c5SRichard Henderson uint64_t helper_fmin_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);
249e1a29bbdSWeiwei Li return nanbox_s(env, env->priv_ver < PRIV_VERSION_1_11_0 ?
25015161e42SChih-Min Chao float32_minnum(frs1, frs2, &env->fp_status) :
25115161e42SChih-Min Chao float32_minimum_number(frs1, frs2, &env->fp_status));
252f798f1e2SMichael Clark }
253f798f1e2SMichael Clark
helper_fminm_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)254a47842d1SChristoph Müllner uint64_t helper_fminm_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
255a47842d1SChristoph Müllner {
256a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
257a47842d1SChristoph Müllner float32 frs2 = check_nanbox_s(env, rs2);
258a47842d1SChristoph Müllner float32 ret = float32_min(frs1, frs2, &env->fp_status);
259a47842d1SChristoph Müllner return nanbox_s(env, ret);
260a47842d1SChristoph Müllner }
261a47842d1SChristoph Müllner
helper_fmax_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)26200e925c5SRichard Henderson uint64_t helper_fmax_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
263f798f1e2SMichael Clark {
264e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
265e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
266e1a29bbdSWeiwei Li return nanbox_s(env, env->priv_ver < PRIV_VERSION_1_11_0 ?
26715161e42SChih-Min Chao float32_maxnum(frs1, frs2, &env->fp_status) :
26815161e42SChih-Min Chao float32_maximum_number(frs1, frs2, &env->fp_status));
269f798f1e2SMichael Clark }
270f798f1e2SMichael Clark
helper_fmaxm_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)271a47842d1SChristoph Müllner uint64_t helper_fmaxm_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
272a47842d1SChristoph Müllner {
273a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
274a47842d1SChristoph Müllner float32 frs2 = check_nanbox_s(env, rs2);
275a47842d1SChristoph Müllner float32 ret = float32_max(frs1, frs2, &env->fp_status);
276a47842d1SChristoph Müllner return nanbox_s(env, ret);
277a47842d1SChristoph Müllner }
278a47842d1SChristoph Müllner
helper_fsqrt_s(CPURISCVState * env,uint64_t rs1)27900e925c5SRichard Henderson uint64_t helper_fsqrt_s(CPURISCVState *env, uint64_t rs1)
280f798f1e2SMichael Clark {
281e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
282e1a29bbdSWeiwei Li return nanbox_s(env, float32_sqrt(frs1, &env->fp_status));
283f798f1e2SMichael Clark }
284f798f1e2SMichael Clark
helper_fle_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)28500e925c5SRichard Henderson target_ulong helper_fle_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
286f798f1e2SMichael Clark {
287e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
288e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
289f798f1e2SMichael Clark return float32_le(frs1, frs2, &env->fp_status);
290f798f1e2SMichael Clark }
291f798f1e2SMichael Clark
helper_fleq_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)292a47842d1SChristoph Müllner target_ulong helper_fleq_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
293a47842d1SChristoph Müllner {
294a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
295a47842d1SChristoph Müllner float32 frs2 = check_nanbox_s(env, rs2);
296a47842d1SChristoph Müllner return float32_le_quiet(frs1, frs2, &env->fp_status);
297a47842d1SChristoph Müllner }
298a47842d1SChristoph Müllner
helper_flt_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)29900e925c5SRichard Henderson target_ulong helper_flt_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
300f798f1e2SMichael Clark {
301e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
302e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
303f798f1e2SMichael Clark return float32_lt(frs1, frs2, &env->fp_status);
304f798f1e2SMichael Clark }
305f798f1e2SMichael Clark
helper_fltq_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)306a47842d1SChristoph Müllner target_ulong helper_fltq_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
307a47842d1SChristoph Müllner {
308a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
309a47842d1SChristoph Müllner float32 frs2 = check_nanbox_s(env, rs2);
310a47842d1SChristoph Müllner return float32_lt_quiet(frs1, frs2, &env->fp_status);
311a47842d1SChristoph Müllner }
312a47842d1SChristoph Müllner
helper_feq_s(CPURISCVState * env,uint64_t rs1,uint64_t rs2)31300e925c5SRichard Henderson target_ulong helper_feq_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
314f798f1e2SMichael Clark {
315e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
316e1a29bbdSWeiwei Li float32 frs2 = check_nanbox_s(env, rs2);
317f798f1e2SMichael Clark return float32_eq_quiet(frs1, frs2, &env->fp_status);
318f798f1e2SMichael Clark }
319f798f1e2SMichael Clark
helper_fcvt_w_s(CPURISCVState * env,uint64_t rs1)32000e925c5SRichard Henderson target_ulong helper_fcvt_w_s(CPURISCVState *env, uint64_t rs1)
321f798f1e2SMichael Clark {
322e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
323f798f1e2SMichael Clark return float32_to_int32(frs1, &env->fp_status);
324f798f1e2SMichael Clark }
325f798f1e2SMichael Clark
helper_fcvt_wu_s(CPURISCVState * env,uint64_t rs1)32600e925c5SRichard Henderson target_ulong helper_fcvt_wu_s(CPURISCVState *env, uint64_t rs1)
327f798f1e2SMichael Clark {
328e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
329f798f1e2SMichael Clark return (int32_t)float32_to_uint32(frs1, &env->fp_status);
330f798f1e2SMichael Clark }
331f798f1e2SMichael Clark
helper_fcvt_l_s(CPURISCVState * env,uint64_t rs1)332daf866b6SAlistair Francis target_ulong helper_fcvt_l_s(CPURISCVState *env, uint64_t rs1)
333f798f1e2SMichael Clark {
334e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
335f798f1e2SMichael Clark return float32_to_int64(frs1, &env->fp_status);
336f798f1e2SMichael Clark }
337f798f1e2SMichael Clark
helper_fcvt_lu_s(CPURISCVState * env,uint64_t rs1)338daf866b6SAlistair Francis target_ulong helper_fcvt_lu_s(CPURISCVState *env, uint64_t rs1)
339f798f1e2SMichael Clark {
340e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
341f798f1e2SMichael Clark return float32_to_uint64(frs1, &env->fp_status);
342f798f1e2SMichael Clark }
343f798f1e2SMichael Clark
helper_fcvt_s_w(CPURISCVState * env,target_ulong rs1)344f798f1e2SMichael Clark uint64_t helper_fcvt_s_w(CPURISCVState *env, target_ulong rs1)
345f798f1e2SMichael Clark {
346e1a29bbdSWeiwei Li return nanbox_s(env, int32_to_float32((int32_t)rs1, &env->fp_status));
347f798f1e2SMichael Clark }
348f798f1e2SMichael Clark
helper_fcvt_s_wu(CPURISCVState * env,target_ulong rs1)349f798f1e2SMichael Clark uint64_t helper_fcvt_s_wu(CPURISCVState *env, target_ulong rs1)
350f798f1e2SMichael Clark {
351e1a29bbdSWeiwei Li return nanbox_s(env, uint32_to_float32((uint32_t)rs1, &env->fp_status));
352f798f1e2SMichael Clark }
353f798f1e2SMichael Clark
helper_fcvt_s_l(CPURISCVState * env,target_ulong rs1)354daf866b6SAlistair Francis uint64_t helper_fcvt_s_l(CPURISCVState *env, target_ulong rs1)
355f798f1e2SMichael Clark {
356e1a29bbdSWeiwei Li return nanbox_s(env, int64_to_float32(rs1, &env->fp_status));
357f798f1e2SMichael Clark }
358f798f1e2SMichael Clark
helper_fcvt_s_lu(CPURISCVState * env,target_ulong rs1)359daf866b6SAlistair Francis uint64_t helper_fcvt_s_lu(CPURISCVState *env, target_ulong rs1)
360f798f1e2SMichael Clark {
361e1a29bbdSWeiwei Li return nanbox_s(env, uint64_to_float32(rs1, &env->fp_status));
362f798f1e2SMichael Clark }
363f798f1e2SMichael Clark
helper_fclass_s(CPURISCVState * env,uint64_t rs1)364e1a29bbdSWeiwei Li target_ulong helper_fclass_s(CPURISCVState *env, uint64_t rs1)
365f798f1e2SMichael Clark {
366e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
367121ddbb3SLIU Zhiwei return fclass_s(frs1);
368f798f1e2SMichael Clark }
369f798f1e2SMichael Clark
helper_fround_s(CPURISCVState * env,uint64_t rs1)370a47842d1SChristoph Müllner uint64_t helper_fround_s(CPURISCVState *env, uint64_t rs1)
371a47842d1SChristoph Müllner {
372a47842d1SChristoph Müllner float_status *fs = &env->fp_status;
373a47842d1SChristoph Müllner uint16_t nx_old = get_float_exception_flags(fs) & float_flag_inexact;
374a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
375a47842d1SChristoph Müllner
376a47842d1SChristoph Müllner frs1 = float32_round_to_int(frs1, fs);
377a47842d1SChristoph Müllner
378a47842d1SChristoph Müllner /* Restore the original NX flag. */
379a47842d1SChristoph Müllner uint16_t flags = get_float_exception_flags(fs);
380a47842d1SChristoph Müllner flags &= ~float_flag_inexact;
381a47842d1SChristoph Müllner flags |= nx_old;
382a47842d1SChristoph Müllner set_float_exception_flags(flags, fs);
383a47842d1SChristoph Müllner
384a47842d1SChristoph Müllner return nanbox_s(env, frs1);
385a47842d1SChristoph Müllner }
386a47842d1SChristoph Müllner
helper_froundnx_s(CPURISCVState * env,uint64_t rs1)387a47842d1SChristoph Müllner uint64_t helper_froundnx_s(CPURISCVState *env, uint64_t rs1)
388a47842d1SChristoph Müllner {
389a47842d1SChristoph Müllner float32 frs1 = check_nanbox_s(env, rs1);
390a47842d1SChristoph Müllner frs1 = float32_round_to_int(frs1, &env->fp_status);
391a47842d1SChristoph Müllner return nanbox_s(env, frs1);
392a47842d1SChristoph Müllner }
393a47842d1SChristoph Müllner
helper_fadd_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)394f798f1e2SMichael Clark uint64_t helper_fadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
395f798f1e2SMichael Clark {
396f798f1e2SMichael Clark return float64_add(frs1, frs2, &env->fp_status);
397f798f1e2SMichael Clark }
398f798f1e2SMichael Clark
helper_fsub_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)399f798f1e2SMichael Clark uint64_t helper_fsub_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
400f798f1e2SMichael Clark {
401f798f1e2SMichael Clark return float64_sub(frs1, frs2, &env->fp_status);
402f798f1e2SMichael Clark }
403f798f1e2SMichael Clark
helper_fmul_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)404f798f1e2SMichael Clark uint64_t helper_fmul_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
405f798f1e2SMichael Clark {
406f798f1e2SMichael Clark return float64_mul(frs1, frs2, &env->fp_status);
407f798f1e2SMichael Clark }
408f798f1e2SMichael Clark
helper_fdiv_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)409f798f1e2SMichael Clark uint64_t helper_fdiv_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
410f798f1e2SMichael Clark {
411f798f1e2SMichael Clark return float64_div(frs1, frs2, &env->fp_status);
412f798f1e2SMichael Clark }
413f798f1e2SMichael Clark
helper_fmin_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)414f798f1e2SMichael Clark uint64_t helper_fmin_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
415f798f1e2SMichael Clark {
41615161e42SChih-Min Chao return env->priv_ver < PRIV_VERSION_1_11_0 ?
41715161e42SChih-Min Chao float64_minnum(frs1, frs2, &env->fp_status) :
41815161e42SChih-Min Chao float64_minimum_number(frs1, frs2, &env->fp_status);
419f798f1e2SMichael Clark }
420f798f1e2SMichael Clark
helper_fminm_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)421a47842d1SChristoph Müllner uint64_t helper_fminm_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
422a47842d1SChristoph Müllner {
423a47842d1SChristoph Müllner return float64_min(frs1, frs2, &env->fp_status);
424a47842d1SChristoph Müllner }
425a47842d1SChristoph Müllner
helper_fmax_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)426f798f1e2SMichael Clark uint64_t helper_fmax_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
427f798f1e2SMichael Clark {
42815161e42SChih-Min Chao return env->priv_ver < PRIV_VERSION_1_11_0 ?
42915161e42SChih-Min Chao float64_maxnum(frs1, frs2, &env->fp_status) :
43015161e42SChih-Min Chao float64_maximum_number(frs1, frs2, &env->fp_status);
431f798f1e2SMichael Clark }
432f798f1e2SMichael Clark
helper_fmaxm_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)433a47842d1SChristoph Müllner uint64_t helper_fmaxm_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
434a47842d1SChristoph Müllner {
435a47842d1SChristoph Müllner return float64_max(frs1, frs2, &env->fp_status);
436a47842d1SChristoph Müllner }
437a47842d1SChristoph Müllner
helper_fcvt_s_d(CPURISCVState * env,uint64_t rs1)438f798f1e2SMichael Clark uint64_t helper_fcvt_s_d(CPURISCVState *env, uint64_t rs1)
439f798f1e2SMichael Clark {
440e1a29bbdSWeiwei Li return nanbox_s(env, float64_to_float32(rs1, &env->fp_status));
441f798f1e2SMichael Clark }
442f798f1e2SMichael Clark
helper_fcvt_d_s(CPURISCVState * env,uint64_t rs1)443f798f1e2SMichael Clark uint64_t helper_fcvt_d_s(CPURISCVState *env, uint64_t rs1)
444f798f1e2SMichael Clark {
445e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
44600e925c5SRichard Henderson return float32_to_float64(frs1, &env->fp_status);
447f798f1e2SMichael Clark }
448f798f1e2SMichael Clark
helper_fsqrt_d(CPURISCVState * env,uint64_t frs1)449f798f1e2SMichael Clark uint64_t helper_fsqrt_d(CPURISCVState *env, uint64_t frs1)
450f798f1e2SMichael Clark {
451f798f1e2SMichael Clark return float64_sqrt(frs1, &env->fp_status);
452f798f1e2SMichael Clark }
453f798f1e2SMichael Clark
helper_fle_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)454f798f1e2SMichael Clark target_ulong helper_fle_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
455f798f1e2SMichael Clark {
456f798f1e2SMichael Clark return float64_le(frs1, frs2, &env->fp_status);
457f798f1e2SMichael Clark }
458f798f1e2SMichael Clark
helper_fleq_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)459a47842d1SChristoph Müllner target_ulong helper_fleq_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
460a47842d1SChristoph Müllner {
461a47842d1SChristoph Müllner return float64_le_quiet(frs1, frs2, &env->fp_status);
462a47842d1SChristoph Müllner }
463a47842d1SChristoph Müllner
helper_flt_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)464f798f1e2SMichael Clark target_ulong helper_flt_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
465f798f1e2SMichael Clark {
466f798f1e2SMichael Clark return float64_lt(frs1, frs2, &env->fp_status);
467f798f1e2SMichael Clark }
468f798f1e2SMichael Clark
helper_fltq_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)469a47842d1SChristoph Müllner target_ulong helper_fltq_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
470a47842d1SChristoph Müllner {
471a47842d1SChristoph Müllner return float64_lt_quiet(frs1, frs2, &env->fp_status);
472a47842d1SChristoph Müllner }
473a47842d1SChristoph Müllner
helper_feq_d(CPURISCVState * env,uint64_t frs1,uint64_t frs2)474f798f1e2SMichael Clark target_ulong helper_feq_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
475f798f1e2SMichael Clark {
476f798f1e2SMichael Clark return float64_eq_quiet(frs1, frs2, &env->fp_status);
477f798f1e2SMichael Clark }
478f798f1e2SMichael Clark
helper_fcvt_w_d(CPURISCVState * env,uint64_t frs1)479f798f1e2SMichael Clark target_ulong helper_fcvt_w_d(CPURISCVState *env, uint64_t frs1)
480f798f1e2SMichael Clark {
481f798f1e2SMichael Clark return float64_to_int32(frs1, &env->fp_status);
482f798f1e2SMichael Clark }
483f798f1e2SMichael Clark
helper_fcvtmod_w_d(CPURISCVState * env,uint64_t value)484a47842d1SChristoph Müllner uint64_t helper_fcvtmod_w_d(CPURISCVState *env, uint64_t value)
485a47842d1SChristoph Müllner {
486a47842d1SChristoph Müllner return float64_to_int32_modulo(value, float_round_to_zero, &env->fp_status);
487a47842d1SChristoph Müllner }
488a47842d1SChristoph Müllner
helper_fcvt_wu_d(CPURISCVState * env,uint64_t frs1)489f798f1e2SMichael Clark target_ulong helper_fcvt_wu_d(CPURISCVState *env, uint64_t frs1)
490f798f1e2SMichael Clark {
491f798f1e2SMichael Clark return (int32_t)float64_to_uint32(frs1, &env->fp_status);
492f798f1e2SMichael Clark }
493f798f1e2SMichael Clark
helper_fcvt_l_d(CPURISCVState * env,uint64_t frs1)494daf866b6SAlistair Francis target_ulong helper_fcvt_l_d(CPURISCVState *env, uint64_t frs1)
495f798f1e2SMichael Clark {
496f798f1e2SMichael Clark return float64_to_int64(frs1, &env->fp_status);
497f798f1e2SMichael Clark }
498f798f1e2SMichael Clark
helper_fcvt_lu_d(CPURISCVState * env,uint64_t frs1)499daf866b6SAlistair Francis target_ulong helper_fcvt_lu_d(CPURISCVState *env, uint64_t frs1)
500f798f1e2SMichael Clark {
501f798f1e2SMichael Clark return float64_to_uint64(frs1, &env->fp_status);
502f798f1e2SMichael Clark }
503f798f1e2SMichael Clark
helper_fcvt_d_w(CPURISCVState * env,target_ulong rs1)504f798f1e2SMichael Clark uint64_t helper_fcvt_d_w(CPURISCVState *env, target_ulong rs1)
505f798f1e2SMichael Clark {
506f798f1e2SMichael Clark return int32_to_float64((int32_t)rs1, &env->fp_status);
507f798f1e2SMichael Clark }
508f798f1e2SMichael Clark
helper_fcvt_d_wu(CPURISCVState * env,target_ulong rs1)509f798f1e2SMichael Clark uint64_t helper_fcvt_d_wu(CPURISCVState *env, target_ulong rs1)
510f798f1e2SMichael Clark {
511f798f1e2SMichael Clark return uint32_to_float64((uint32_t)rs1, &env->fp_status);
512f798f1e2SMichael Clark }
513f798f1e2SMichael Clark
helper_fcvt_d_l(CPURISCVState * env,target_ulong rs1)514daf866b6SAlistair Francis uint64_t helper_fcvt_d_l(CPURISCVState *env, target_ulong rs1)
515f798f1e2SMichael Clark {
516f798f1e2SMichael Clark return int64_to_float64(rs1, &env->fp_status);
517f798f1e2SMichael Clark }
518f798f1e2SMichael Clark
helper_fcvt_d_lu(CPURISCVState * env,target_ulong rs1)519daf866b6SAlistair Francis uint64_t helper_fcvt_d_lu(CPURISCVState *env, target_ulong rs1)
520f798f1e2SMichael Clark {
521f798f1e2SMichael Clark return uint64_to_float64(rs1, &env->fp_status);
522f798f1e2SMichael Clark }
523f798f1e2SMichael Clark
helper_fclass_d(uint64_t frs1)524f798f1e2SMichael Clark target_ulong helper_fclass_d(uint64_t frs1)
525f798f1e2SMichael Clark {
526121ddbb3SLIU Zhiwei return fclass_d(frs1);
527f798f1e2SMichael Clark }
52800c1899fSKito Cheng
helper_fround_d(CPURISCVState * env,uint64_t frs1)529a47842d1SChristoph Müllner uint64_t helper_fround_d(CPURISCVState *env, uint64_t frs1)
530a47842d1SChristoph Müllner {
531a47842d1SChristoph Müllner float_status *fs = &env->fp_status;
532a47842d1SChristoph Müllner uint16_t nx_old = get_float_exception_flags(fs) & float_flag_inexact;
533a47842d1SChristoph Müllner
534a47842d1SChristoph Müllner frs1 = float64_round_to_int(frs1, fs);
535a47842d1SChristoph Müllner
536a47842d1SChristoph Müllner /* Restore the original NX flag. */
537a47842d1SChristoph Müllner uint16_t flags = get_float_exception_flags(fs);
538a47842d1SChristoph Müllner flags &= ~float_flag_inexact;
539a47842d1SChristoph Müllner flags |= nx_old;
540a47842d1SChristoph Müllner set_float_exception_flags(flags, fs);
541a47842d1SChristoph Müllner
542a47842d1SChristoph Müllner return frs1;
543a47842d1SChristoph Müllner }
544a47842d1SChristoph Müllner
helper_froundnx_d(CPURISCVState * env,uint64_t frs1)545a47842d1SChristoph Müllner uint64_t helper_froundnx_d(CPURISCVState *env, uint64_t frs1)
546a47842d1SChristoph Müllner {
547a47842d1SChristoph Müllner return float64_round_to_int(frs1, &env->fp_status);
548a47842d1SChristoph Müllner }
549a47842d1SChristoph Müllner
helper_fadd_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)55000c1899fSKito Cheng uint64_t helper_fadd_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
55100c1899fSKito Cheng {
552a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
553a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
554a2464a4cSWeiwei Li return nanbox_h(env, float16_add(frs1, frs2, &env->fp_status));
55500c1899fSKito Cheng }
55600c1899fSKito Cheng
helper_fsub_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)55700c1899fSKito Cheng uint64_t helper_fsub_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
55800c1899fSKito Cheng {
559a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
560a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
561a2464a4cSWeiwei Li return nanbox_h(env, float16_sub(frs1, frs2, &env->fp_status));
56200c1899fSKito Cheng }
56300c1899fSKito Cheng
helper_fmul_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)56400c1899fSKito Cheng uint64_t helper_fmul_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
56500c1899fSKito Cheng {
566a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
567a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
568a2464a4cSWeiwei Li return nanbox_h(env, float16_mul(frs1, frs2, &env->fp_status));
56900c1899fSKito Cheng }
57000c1899fSKito Cheng
helper_fdiv_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)57100c1899fSKito Cheng uint64_t helper_fdiv_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
57200c1899fSKito Cheng {
573a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
574a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
575a2464a4cSWeiwei Li return nanbox_h(env, float16_div(frs1, frs2, &env->fp_status));
57600c1899fSKito Cheng }
57700c1899fSKito Cheng
helper_fmin_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)57800c1899fSKito Cheng uint64_t helper_fmin_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
57900c1899fSKito Cheng {
580a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
581a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
582a2464a4cSWeiwei Li return nanbox_h(env, env->priv_ver < PRIV_VERSION_1_11_0 ?
58300c1899fSKito Cheng float16_minnum(frs1, frs2, &env->fp_status) :
58400c1899fSKito Cheng float16_minimum_number(frs1, frs2, &env->fp_status));
58500c1899fSKito Cheng }
58600c1899fSKito Cheng
helper_fminm_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)587a47842d1SChristoph Müllner uint64_t helper_fminm_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
588a47842d1SChristoph Müllner {
589a47842d1SChristoph Müllner float16 frs1 = check_nanbox_h(env, rs1);
590a47842d1SChristoph Müllner float16 frs2 = check_nanbox_h(env, rs2);
591a47842d1SChristoph Müllner float16 ret = float16_min(frs1, frs2, &env->fp_status);
592a47842d1SChristoph Müllner return nanbox_h(env, ret);
593a47842d1SChristoph Müllner }
594a47842d1SChristoph Müllner
helper_fmax_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)59500c1899fSKito Cheng uint64_t helper_fmax_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
59600c1899fSKito Cheng {
597a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
598a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
599a2464a4cSWeiwei Li return nanbox_h(env, env->priv_ver < PRIV_VERSION_1_11_0 ?
60000c1899fSKito Cheng float16_maxnum(frs1, frs2, &env->fp_status) :
60100c1899fSKito Cheng float16_maximum_number(frs1, frs2, &env->fp_status));
60200c1899fSKito Cheng }
60300c1899fSKito Cheng
helper_fmaxm_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)604a47842d1SChristoph Müllner uint64_t helper_fmaxm_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
605a47842d1SChristoph Müllner {
606a47842d1SChristoph Müllner float16 frs1 = check_nanbox_h(env, rs1);
607a47842d1SChristoph Müllner float16 frs2 = check_nanbox_h(env, rs2);
608a47842d1SChristoph Müllner float16 ret = float16_max(frs1, frs2, &env->fp_status);
609a47842d1SChristoph Müllner return nanbox_h(env, ret);
610a47842d1SChristoph Müllner }
611a47842d1SChristoph Müllner
helper_fsqrt_h(CPURISCVState * env,uint64_t rs1)61200c1899fSKito Cheng uint64_t helper_fsqrt_h(CPURISCVState *env, uint64_t rs1)
61300c1899fSKito Cheng {
614a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
615a2464a4cSWeiwei Li return nanbox_h(env, float16_sqrt(frs1, &env->fp_status));
61600c1899fSKito Cheng }
6177b03c8e5SKito Cheng
helper_fle_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)61811f9c450SKito Cheng target_ulong helper_fle_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
61911f9c450SKito Cheng {
620a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
621a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
62211f9c450SKito Cheng return float16_le(frs1, frs2, &env->fp_status);
62311f9c450SKito Cheng }
62411f9c450SKito Cheng
helper_fleq_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)625a47842d1SChristoph Müllner target_ulong helper_fleq_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
626a47842d1SChristoph Müllner {
627a47842d1SChristoph Müllner float16 frs1 = check_nanbox_h(env, rs1);
628a47842d1SChristoph Müllner float16 frs2 = check_nanbox_h(env, rs2);
629a47842d1SChristoph Müllner return float16_le_quiet(frs1, frs2, &env->fp_status);
630a47842d1SChristoph Müllner }
631a47842d1SChristoph Müllner
helper_flt_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)63211f9c450SKito Cheng target_ulong helper_flt_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
63311f9c450SKito Cheng {
634a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
635a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
63611f9c450SKito Cheng return float16_lt(frs1, frs2, &env->fp_status);
63711f9c450SKito Cheng }
63811f9c450SKito Cheng
helper_fltq_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)639a47842d1SChristoph Müllner target_ulong helper_fltq_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
640a47842d1SChristoph Müllner {
641a47842d1SChristoph Müllner float16 frs1 = check_nanbox_h(env, rs1);
642a47842d1SChristoph Müllner float16 frs2 = check_nanbox_h(env, rs2);
643a47842d1SChristoph Müllner return float16_lt_quiet(frs1, frs2, &env->fp_status);
644a47842d1SChristoph Müllner }
645a47842d1SChristoph Müllner
helper_feq_h(CPURISCVState * env,uint64_t rs1,uint64_t rs2)64611f9c450SKito Cheng target_ulong helper_feq_h(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
64711f9c450SKito Cheng {
648a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
649a2464a4cSWeiwei Li float16 frs2 = check_nanbox_h(env, rs2);
65011f9c450SKito Cheng return float16_eq_quiet(frs1, frs2, &env->fp_status);
65111f9c450SKito Cheng }
65211f9c450SKito Cheng
helper_fclass_h(CPURISCVState * env,uint64_t rs1)653a2464a4cSWeiwei Li target_ulong helper_fclass_h(CPURISCVState *env, uint64_t rs1)
6546bc6fc96SKito Cheng {
655a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
6566bc6fc96SKito Cheng return fclass_h(frs1);
6576bc6fc96SKito Cheng }
6586bc6fc96SKito Cheng
helper_fround_h(CPURISCVState * env,uint64_t rs1)659a47842d1SChristoph Müllner uint64_t helper_fround_h(CPURISCVState *env, uint64_t rs1)
660a47842d1SChristoph Müllner {
661a47842d1SChristoph Müllner float_status *fs = &env->fp_status;
662a47842d1SChristoph Müllner uint16_t nx_old = get_float_exception_flags(fs) & float_flag_inexact;
663a47842d1SChristoph Müllner float16 frs1 = check_nanbox_h(env, rs1);
664a47842d1SChristoph Müllner
665a47842d1SChristoph Müllner frs1 = float16_round_to_int(frs1, fs);
666a47842d1SChristoph Müllner
667a47842d1SChristoph Müllner /* Restore the original NX flag. */
668a47842d1SChristoph Müllner uint16_t flags = get_float_exception_flags(fs);
669a47842d1SChristoph Müllner flags &= ~float_flag_inexact;
670a47842d1SChristoph Müllner flags |= nx_old;
671a47842d1SChristoph Müllner set_float_exception_flags(flags, fs);
672a47842d1SChristoph Müllner
673a47842d1SChristoph Müllner return nanbox_h(env, frs1);
674a47842d1SChristoph Müllner }
675a47842d1SChristoph Müllner
helper_froundnx_h(CPURISCVState * env,uint64_t rs1)676a47842d1SChristoph Müllner uint64_t helper_froundnx_h(CPURISCVState *env, uint64_t rs1)
677a47842d1SChristoph Müllner {
678*209b7c29SBranislav Brzak float16 frs1 = check_nanbox_h(env, rs1);
679a47842d1SChristoph Müllner frs1 = float16_round_to_int(frs1, &env->fp_status);
680a47842d1SChristoph Müllner return nanbox_h(env, frs1);
681a47842d1SChristoph Müllner }
682a47842d1SChristoph Müllner
helper_fcvt_w_h(CPURISCVState * env,uint64_t rs1)6837b03c8e5SKito Cheng target_ulong helper_fcvt_w_h(CPURISCVState *env, uint64_t rs1)
6847b03c8e5SKito Cheng {
685a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
6867b03c8e5SKito Cheng return float16_to_int32(frs1, &env->fp_status);
6877b03c8e5SKito Cheng }
6887b03c8e5SKito Cheng
helper_fcvt_wu_h(CPURISCVState * env,uint64_t rs1)6897b03c8e5SKito Cheng target_ulong helper_fcvt_wu_h(CPURISCVState *env, uint64_t rs1)
6907b03c8e5SKito Cheng {
691a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
6927b03c8e5SKito Cheng return (int32_t)float16_to_uint32(frs1, &env->fp_status);
6937b03c8e5SKito Cheng }
6947b03c8e5SKito Cheng
helper_fcvt_l_h(CPURISCVState * env,uint64_t rs1)6957b03c8e5SKito Cheng target_ulong helper_fcvt_l_h(CPURISCVState *env, uint64_t rs1)
6967b03c8e5SKito Cheng {
697a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
6987b03c8e5SKito Cheng return float16_to_int64(frs1, &env->fp_status);
6997b03c8e5SKito Cheng }
7007b03c8e5SKito Cheng
helper_fcvt_lu_h(CPURISCVState * env,uint64_t rs1)7017b03c8e5SKito Cheng target_ulong helper_fcvt_lu_h(CPURISCVState *env, uint64_t rs1)
7027b03c8e5SKito Cheng {
703a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
7047b03c8e5SKito Cheng return float16_to_uint64(frs1, &env->fp_status);
7057b03c8e5SKito Cheng }
7067b03c8e5SKito Cheng
helper_fcvt_h_w(CPURISCVState * env,target_ulong rs1)7077b03c8e5SKito Cheng uint64_t helper_fcvt_h_w(CPURISCVState *env, target_ulong rs1)
7087b03c8e5SKito Cheng {
709a2464a4cSWeiwei Li return nanbox_h(env, int32_to_float16((int32_t)rs1, &env->fp_status));
7107b03c8e5SKito Cheng }
7117b03c8e5SKito Cheng
helper_fcvt_h_wu(CPURISCVState * env,target_ulong rs1)7127b03c8e5SKito Cheng uint64_t helper_fcvt_h_wu(CPURISCVState *env, target_ulong rs1)
7137b03c8e5SKito Cheng {
714a2464a4cSWeiwei Li return nanbox_h(env, uint32_to_float16((uint32_t)rs1, &env->fp_status));
7157b03c8e5SKito Cheng }
7167b03c8e5SKito Cheng
helper_fcvt_h_l(CPURISCVState * env,target_ulong rs1)7177b03c8e5SKito Cheng uint64_t helper_fcvt_h_l(CPURISCVState *env, target_ulong rs1)
7187b03c8e5SKito Cheng {
719a2464a4cSWeiwei Li return nanbox_h(env, int64_to_float16(rs1, &env->fp_status));
7207b03c8e5SKito Cheng }
7217b03c8e5SKito Cheng
helper_fcvt_h_lu(CPURISCVState * env,target_ulong rs1)7227b03c8e5SKito Cheng uint64_t helper_fcvt_h_lu(CPURISCVState *env, target_ulong rs1)
7237b03c8e5SKito Cheng {
724a2464a4cSWeiwei Li return nanbox_h(env, uint64_to_float16(rs1, &env->fp_status));
7257b03c8e5SKito Cheng }
7267b03c8e5SKito Cheng
helper_fcvt_h_s(CPURISCVState * env,uint64_t rs1)7277b03c8e5SKito Cheng uint64_t helper_fcvt_h_s(CPURISCVState *env, uint64_t rs1)
7287b03c8e5SKito Cheng {
729e1a29bbdSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
730a2464a4cSWeiwei Li return nanbox_h(env, float32_to_float16(frs1, true, &env->fp_status));
7317b03c8e5SKito Cheng }
7327b03c8e5SKito Cheng
helper_fcvt_s_h(CPURISCVState * env,uint64_t rs1)7337b03c8e5SKito Cheng uint64_t helper_fcvt_s_h(CPURISCVState *env, uint64_t rs1)
7347b03c8e5SKito Cheng {
735a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
736e1a29bbdSWeiwei Li return nanbox_s(env, float16_to_float32(frs1, true, &env->fp_status));
7377b03c8e5SKito Cheng }
7387b03c8e5SKito Cheng
helper_fcvt_h_d(CPURISCVState * env,uint64_t rs1)7397b03c8e5SKito Cheng uint64_t helper_fcvt_h_d(CPURISCVState *env, uint64_t rs1)
7407b03c8e5SKito Cheng {
741a2464a4cSWeiwei Li return nanbox_h(env, float64_to_float16(rs1, true, &env->fp_status));
7427b03c8e5SKito Cheng }
7437b03c8e5SKito Cheng
helper_fcvt_d_h(CPURISCVState * env,uint64_t rs1)7447b03c8e5SKito Cheng uint64_t helper_fcvt_d_h(CPURISCVState *env, uint64_t rs1)
7457b03c8e5SKito Cheng {
746a2464a4cSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
7477b03c8e5SKito Cheng return float16_to_float64(frs1, true, &env->fp_status);
7487b03c8e5SKito Cheng }
7495d1270caSWeiwei Li
helper_fcvt_bf16_s(CPURISCVState * env,uint64_t rs1)7505d1270caSWeiwei Li uint64_t helper_fcvt_bf16_s(CPURISCVState *env, uint64_t rs1)
7515d1270caSWeiwei Li {
7525d1270caSWeiwei Li float32 frs1 = check_nanbox_s(env, rs1);
7535d1270caSWeiwei Li return nanbox_h(env, float32_to_bfloat16(frs1, &env->fp_status));
7545d1270caSWeiwei Li }
7555d1270caSWeiwei Li
helper_fcvt_s_bf16(CPURISCVState * env,uint64_t rs1)7565d1270caSWeiwei Li uint64_t helper_fcvt_s_bf16(CPURISCVState *env, uint64_t rs1)
7575d1270caSWeiwei Li {
7585d1270caSWeiwei Li float16 frs1 = check_nanbox_h(env, rs1);
7595d1270caSWeiwei Li return nanbox_s(env, bfloat16_to_float32(frs1, &env->fp_status));
7605d1270caSWeiwei Li }
761