2005-04-17 02:20:36 +04:00
# include <linux/types.h>
# include <linux/errno.h>
2016-12-24 22:46:01 +03:00
# include <linux/uaccess.h>
2005-04-17 02:20:36 +04:00
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
fmsub ( void * frD , void * frA , void * frB , void * frC )
{
FP_DECL_D ( R ) ;
FP_DECL_D ( A ) ;
FP_DECL_D ( B ) ;
FP_DECL_D ( C ) ;
FP_DECL_D ( T ) ;
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 %p \n " , __func__ , frD , frA , frB , frC ) ;
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 ) ;
FP_UNPACK_DP ( C , frC ) ;
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 ) ;
printk ( " C: %ld %lu %lu %ld (%ld) \n " , C_s , C_f1 , C_f0 , C_e , C_c ) ;
# endif
if ( ( A_c = = FP_CLS_INF & & C_c = = FP_CLS_ZERO ) | |
( A_c = = FP_CLS_ZERO & & C_c = = FP_CLS_INF ) )
2008-10-28 06:50:20 +03:00
FP_SET_EXCEPTION ( EFLAG_VXIMZ ) ;
2005-04-17 02:20:36 +04:00
FP_MUL_D ( T , A , C ) ;
if ( B_c ! = FP_CLS_NAN )
B_s ^ = 1 ;
if ( T_s ! = B_s & & T_c = = FP_CLS_INF & & B_c = = FP_CLS_INF )
2008-10-28 06:50:20 +03:00
FP_SET_EXCEPTION ( EFLAG_VXISI ) ;
2005-04-17 02:20:36 +04:00
FP_ADD_D ( R , T , 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
}