2005-04-17 02:20:36 +04:00
# include <linux/types.h>
# include <linux/errno.h>
# include <asm/uaccess.h>
2008-06-04 11:59:29 +04:00
# include <asm/sfp-machine.h>
# include <math-emu/soft-fp.h>
# include <math-emu/double.h>
2005-04-17 02:20:36 +04:00
int
fdiv ( void * frD , void * frA , void * frB )
{
FP_DECL_D ( A ) ;
FP_DECL_D ( B ) ;
FP_DECL_D ( R ) ;
2008-06-04 11:59:29 +04:00
FP_DECL_EX ;
2005-04-17 02:20:36 +04:00
# ifdef DEBUG
2008-03-29 00:21:07 +03:00
printk ( " %s: %p %p %p \n " , __func__ , frD , frA , frB ) ;
2005-04-17 02:20:36 +04:00
# endif
2008-06-04 11:59:29 +04:00
FP_UNPACK_DP ( A , frA ) ;
FP_UNPACK_DP ( B , frB ) ;
2005-04-17 02:20:36 +04:00
# 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 ) {
2008-10-28 06:50:20 +03:00
FP_SET_EXCEPTION ( EFLAG_VXZDZ ) ;
2005-04-17 02:20:36 +04:00
# ifdef DEBUG
2008-03-29 00:21:07 +03:00
printk ( " %s: FPSCR_VXZDZ raised \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
# endif
}
if ( A_c = = FP_CLS_INF & & B_c = = FP_CLS_INF ) {
2008-10-28 06:50:20 +03:00
FP_SET_EXCEPTION ( EFLAG_VXIDI ) ;
2005-04-17 02:20:36 +04:00
# ifdef DEBUG
2008-03-29 00:21:07 +03:00
printk ( " %s: FPSCR_VXIDI raised \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
# endif
}
if ( B_c = = FP_CLS_ZERO & & A_c ! = FP_CLS_ZERO ) {
2008-10-28 06:50:20 +03:00
FP_SET_EXCEPTION ( EFLAG_DIVZERO ) ;
2005-04-17 02:20:36 +04:00
if ( __FPU_TRAP_P ( EFLAG_DIVZERO ) )
2008-10-28 06:50:20 +03:00
return FP_CUR_EXCEPTIONS ;
2005-04-17 02:20:36 +04:00
}
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
2008-06-04 11:59:29 +04:00
__FP_PACK_D ( frD , R ) ;
return FP_CUR_EXCEPTIONS ;
2005-04-17 02:20:36 +04:00
}