2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-16 01:04:08 +08:00
linux-next/arch/nds32/math-emu/fd2si.c
Vincent Chen 9322961205 nds32: add new emulations for floating point instruction
The existing floating point emulations is only available for floating
instruction that possibly issue denormalized input and underflow
exceptions. These existing FPU emulations are not sufficient when IEx
Trap is enabled because some floating point instructions only issue inexact
exception. This patch adds the emulations of such floating point
instructions.

Signed-off-by: Vincent Chen <vincentc@andestech.com>
Acked-by: Greentime Hu <greentime@andestech.com>
Signed-off-by: Greentime Hu <greentime@andestech.com>
2019-05-31 15:23:26 +08:00

31 lines
610 B
C

// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2005-2019 Andes Technology Corporation
#include <linux/uaccess.h>
#include <asm/sfp-machine.h>
#include <math-emu/soft-fp.h>
#include <math-emu/double.h>
void fd2si(void *ft, void *fa)
{
int r;
FP_DECL_D(A);
FP_DECL_EX;
FP_UNPACK_DP(A, fa);
if (A_c == FP_CLS_INF) {
*(int *)ft = (A_s == 0) ? 0x7fffffff : 0x80000000;
__FPU_FPCSR |= FP_EX_INVALID;
} else if (A_c == FP_CLS_NAN) {
*(int *)ft = 0xffffffff;
__FPU_FPCSR |= FP_EX_INVALID;
} else {
FP_TO_INT_ROUND_D(r, A, 32, 1);
__FPU_FPCSR |= FP_CUR_EXCEPTIONS;
*(int *)ft = r;
}
}