xref: /qemu/target/riscv/fpu_helper.c (revision a2464a4cec4740c3703d8232f695d6643e0e086e)
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