On 3/27/23 20:06, Song Gao wrote:
This patch includes:
- VFCVT{L/H}.{S.H/D.S};
- VFCVT.{H.S/S.D};
- VFRINT[{RNE/RZ/RP/RM}].{S/D};
- VFTINT[{RNE/RZ/RP/RM}].{W.S/L.D};
- VFTINT[RZ].{WU.S/LU.D};
- VFTINT[{RNE/RZ/RP/RM}].W.D;
- VFTINT[{RNE/RZ/RP/RM}]{L/H}.L.S;
- VFFINT.{S.W/D.L}[U];
- VFFINT.S.L, VFFINT{L/H}.D.W.
Signed-off-by: Song Gao <gaos...@loongson.cn>
---
fpu/softfloat.c | 55 +++
include/fpu/softfloat.h | 27 ++
target/loongarch/disas.c | 56 +++
target/loongarch/helper.h | 56 +++
target/loongarch/insn_trans/trans_lsx.c.inc | 56 +++
target/loongarch/insns.decode | 56 +++
target/loongarch/lsx_helper.c | 369 ++++++++++++++++++++
7 files changed, 675 insertions(+)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index c7454c3eb1..79975c6b01 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -2988,6 +2988,25 @@ float64 float64_round_to_int(float64 a, float_status *s)
return float64_round_pack_canonical(&p, s);
}
+#define FRINT_RM(rm, rmode, bits) \
+float ## bits float ## bits ## _round_to_int_ ## rm( \
+ float ## bits a, float_status *s) \
+{ \
+ FloatParts64 pa; \
+ float ## bits ## _unpack_canonical(&pa, a, s); \
+ parts_round_to_int(&pa, rmode, 0, s, &float64_params); \
+ return float ## bits ## _round_pack_canonical(&pa, s); \
+}
+FRINT_RM(rne, float_round_nearest_even, 32)
+FRINT_RM(rm, float_round_down, 32)
+FRINT_RM(rp, float_round_up, 32)
+FRINT_RM(rz, float_round_to_zero, 32)
+FRINT_RM(rne, float_round_nearest_even, 64)
+FRINT_RM(rm, float_round_down, 64)
+FRINT_RM(rp, float_round_up, 64)
+FRINT_RM(rz, float_round_to_zero, 64)
+#undef FRINT_RM
No, you should simply swap your float_status rounding mode around the operation.
See the arm/tcg gen_set_rmode function.
r~