forked from luck/tmp_suning_uos_patched
d2b194ed82
The math emulation code is centered around a set of generic macros that provide the core of the emulation that are shared by the various architectures and other projects (like glibc). Each arch implements its own sfp-machine.h to specific various arch specific details. For historic reasons that are now lost the powerpc math-emu code had its own version of the common headers. This moves us to using the kernel generic version and thus getting fixes when those are updated. Also cleaned up exception/error reporting from the FP emulation functions. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
58 lines
1.1 KiB
C
58 lines
1.1 KiB
C
#include <linux/types.h>
|
|
#include <linux/errno.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
#include <asm/sfp-machine.h>
|
|
#include <math-emu/soft-fp.h>
|
|
#include <math-emu/double.h>
|
|
|
|
int
|
|
fdiv(void *frD, void *frA, void *frB)
|
|
{
|
|
FP_DECL_D(A);
|
|
FP_DECL_D(B);
|
|
FP_DECL_D(R);
|
|
FP_DECL_EX;
|
|
int ret = 0;
|
|
|
|
#ifdef DEBUG
|
|
printk("%s: %p %p %p\n", __func__, frD, frA, frB);
|
|
#endif
|
|
|
|
FP_UNPACK_DP(A, frA);
|
|
FP_UNPACK_DP(B, frB);
|
|
|
|
#ifdef DEBUG
|
|
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
|
|
printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c);
|
|
#endif
|
|
|
|
if (A_c == FP_CLS_ZERO && B_c == FP_CLS_ZERO) {
|
|
ret |= EFLAG_VXZDZ;
|
|
#ifdef DEBUG
|
|
printk("%s: FPSCR_VXZDZ raised\n", __func__);
|
|
#endif
|
|
}
|
|
if (A_c == FP_CLS_INF && B_c == FP_CLS_INF) {
|
|
ret |= EFLAG_VXIDI;
|
|
#ifdef DEBUG
|
|
printk("%s: FPSCR_VXIDI raised\n", __func__);
|
|
#endif
|
|
}
|
|
|
|
if (B_c == FP_CLS_ZERO && A_c != FP_CLS_ZERO) {
|
|
ret |= EFLAG_DIVZERO;
|
|
if (__FPU_TRAP_P(EFLAG_DIVZERO))
|
|
return ret;
|
|
}
|
|
FP_DIV_D(R, A, B);
|
|
|
|
#ifdef DEBUG
|
|
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
|
|
#endif
|
|
|
|
__FP_PACK_D(frD, R);
|
|
|
|
return FP_CUR_EXCEPTIONS;
|
|
}
|