2005-04-16 15:20:36 -07:00
/* Machine-dependent software floating-point definitions.
S / 390 kernel version .
Copyright ( C ) 1997 , 1998 , 1999 Free Software Foundation , Inc .
This file is part of the GNU C Library .
Contributed by Richard Henderson ( rth @ cygnus . com ) ,
Jakub Jelinek ( jj @ ultra . linux . cz ) ,
David S . Miller ( davem @ redhat . com ) and
Peter Maydell ( pmaydell @ chiark . greenend . org . uk ) .
The GNU C Library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation ; either version 2 of the
License , or ( at your option ) any later version .
The GNU C Library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Library General Public License for more details .
You should have received a copy of the GNU Library General Public
License along with the GNU C Library ; see the file COPYING . LIB . If
not , write to the Free Software Foundation , Inc . ,
59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA . */
# ifndef _SFP_MACHINE_H
# define _SFP_MACHINE_H
# define _FP_W_TYPE_SIZE 32
2007-07-10 11:24:14 +02:00
# define _FP_W_TYPE unsigned int
# define _FP_WS_TYPE signed int
# define _FP_I_TYPE int
2005-04-16 15:20:36 -07:00
# define _FP_MUL_MEAT_S(R,X,Y) \
_FP_MUL_MEAT_1_wide ( _FP_WFRACBITS_S , R , X , Y , umul_ppmm )
# define _FP_MUL_MEAT_D(R,X,Y) \
_FP_MUL_MEAT_2_wide ( _FP_WFRACBITS_D , R , X , Y , umul_ppmm )
# define _FP_MUL_MEAT_Q(R,X,Y) \
_FP_MUL_MEAT_4_wide ( _FP_WFRACBITS_Q , R , X , Y , umul_ppmm )
# define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y)
# define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
# define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
# define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
# define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
# define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
# define _FP_NANSIGN_S 0
# define _FP_NANSIGN_D 0
# define _FP_NANSIGN_Q 0
# define _FP_KEEPNANFRACP 1
/*
* If one NaN is signaling and the other is not ,
* we choose that one , otherwise we choose X .
*/
# define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
do { \
if ( ( _FP_FRAC_HIGH_RAW_ # # fs ( X ) & _FP_QNANBIT_ # # fs ) \
& & ! ( _FP_FRAC_HIGH_RAW_ # # fs ( Y ) & _FP_QNANBIT_ # # fs ) ) \
{ \
R # # _s = Y # # _s ; \
_FP_FRAC_COPY_ # # wc ( R , Y ) ; \
} \
else \
{ \
R # # _s = X # # _s ; \
_FP_FRAC_COPY_ # # wc ( R , X ) ; \
} \
R # # _c = FP_CLS_NAN ; \
} while ( 0 )
/* Some assembly to speed things up. */
# define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) ({ \
unsigned int __r2 = ( x2 ) + ( y2 ) ; \
unsigned int __r1 = ( x1 ) ; \
unsigned int __r0 = ( x0 ) ; \
2006-09-28 16:56:43 +02:00
asm volatile ( \
" alr %2,%3 \n " \
" brc 12,0f \n " \
" lhi 0,1 \n " \
" alr %1,0 \n " \
" brc 12,0f \n " \
" alr %0,0 \n " \
" 0: " \
: " +&d " ( __r2 ) , " +&d " ( __r1 ) , " +&d " ( __r0 ) \
: " d " ( y0 ) , " i " ( 1 ) : " cc " , " 0 " ) ; \
asm volatile ( \
" alr %1,%2 \n " \
" brc 12,0f \n " \
" ahi %0,1 \n " \
" 0: " \
: " +&d " ( __r2 ) , " +&d " ( __r1 ) \
: " d " ( y1 ) : " cc " ) ; \
2005-04-16 15:20:36 -07:00
( r2 ) = __r2 ; \
( r1 ) = __r1 ; \
( r0 ) = __r0 ; \
} )
# define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) ({ \
unsigned int __r2 = ( x2 ) - ( y2 ) ; \
unsigned int __r1 = ( x1 ) ; \
unsigned int __r0 = ( x0 ) ; \
2006-09-28 16:56:43 +02:00
asm volatile ( \
" slr %2,%3 \n " \
" brc 3,0f \n " \
" lhi 0,1 \n " \
" slr %1,0 \n " \
" brc 3,0f \n " \
" slr %0,0 \n " \
" 0: " \
: " +&d " ( __r2 ) , " +&d " ( __r1 ) , " +&d " ( __r0 ) \
: " d " ( y0 ) : " cc " , " 0 " ) ; \
asm volatile ( \
" slr %1,%2 \n " \
" brc 3,0f \n " \
" ahi %0,-1 \n " \
" 0: " \
: " +&d " ( __r2 ) , " +&d " ( __r1 ) \
: " d " ( y1 ) : " cc " ) ; \
2005-04-16 15:20:36 -07:00
( r2 ) = __r2 ; \
( r1 ) = __r1 ; \
( r0 ) = __r0 ; \
} )
# define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0) __FP_FRAC_SUB_3(x2,x1,x0,x2,x1,x0,y2,y1,y0)
/* Obtain the current rounding mode. */
# define FP_ROUNDMODE mode
/* Exception flags. */
# define FP_EX_INVALID 0x800000
# define FP_EX_DIVZERO 0x400000
# define FP_EX_OVERFLOW 0x200000
# define FP_EX_UNDERFLOW 0x100000
# define FP_EX_INEXACT 0x080000
/* We write the results always */
# define FP_INHIBIT_RESULTS 0
# endif