mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 20:42:39 +00:00 
			
		
		
		
	 5cd272085b
			
		
	
	
		5cd272085b
		
	
	
	
	
		
			
			Towards the goal of having arch/powerpc not build anything over in arch/ppc move math-emu over. Also, killed some references to arch/ppc/ in the arch/powerpc Makefile which should belong in drivers/ when the particular sub-arch's move over to arch/powerpc. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef SOFT_FP_H
 | |
| #define SOFT_FP_H
 | |
| 
 | |
| #include "sfp-machine.h"
 | |
| 
 | |
| #define _FP_WORKBITS		3
 | |
| #define _FP_WORK_LSB		((_FP_W_TYPE)1 << 3)
 | |
| #define _FP_WORK_ROUND		((_FP_W_TYPE)1 << 2)
 | |
| #define _FP_WORK_GUARD		((_FP_W_TYPE)1 << 1)
 | |
| #define _FP_WORK_STICKY		((_FP_W_TYPE)1 << 0)
 | |
| 
 | |
| #ifndef FP_RND_NEAREST
 | |
| # define FP_RND_NEAREST		0
 | |
| # define FP_RND_ZERO		1
 | |
| # define FP_RND_PINF		2
 | |
| # define FP_RND_MINF		3
 | |
| #ifndef FP_ROUNDMODE
 | |
| # define FP_ROUNDMODE		FP_RND_NEAREST
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #define _FP_ROUND_NEAREST(wc, X)			\
 | |
| ({  int __ret = 0;					\
 | |
|     int __frac = _FP_FRAC_LOW_##wc(X) & 15;		\
 | |
|     if (__frac & 7) {					\
 | |
|       __ret = EFLAG_INEXACT;				\
 | |
|       if ((__frac & 7) != _FP_WORK_ROUND)		\
 | |
|         _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);		\
 | |
|       else if (__frac & _FP_WORK_LSB)			\
 | |
|         _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);		\
 | |
|     }							\
 | |
|     __ret;						\
 | |
| })
 | |
| 
 | |
| #define _FP_ROUND_ZERO(wc, X)				\
 | |
| ({  int __ret = 0;					\
 | |
|     if (_FP_FRAC_LOW_##wc(X) & 7)			\
 | |
|       __ret = EFLAG_INEXACT;				\
 | |
|     __ret;						\
 | |
| })
 | |
| 
 | |
| #define _FP_ROUND_PINF(wc, X)				\
 | |
| ({  int __ret = EFLAG_INEXACT;				\
 | |
|     if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
 | |
|       _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
 | |
|     else __ret = 0;					\
 | |
|     __ret;						\
 | |
| })
 | |
| 
 | |
| #define _FP_ROUND_MINF(wc, X)				\
 | |
| ({  int __ret = EFLAG_INEXACT;				\
 | |
|     if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
 | |
|       _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
 | |
|     else __ret = 0;					\
 | |
|     __ret;						\
 | |
| })
 | |
| 
 | |
| #define _FP_ROUND(wc, X)			\
 | |
| ({	int __ret = 0;				\
 | |
| 	switch (FP_ROUNDMODE)			\
 | |
| 	{					\
 | |
| 	  case FP_RND_NEAREST:			\
 | |
| 	    __ret |= _FP_ROUND_NEAREST(wc,X);	\
 | |
| 	    break;				\
 | |
| 	  case FP_RND_ZERO:			\
 | |
| 	    __ret |= _FP_ROUND_ZERO(wc,X);	\
 | |
| 	    break;				\
 | |
| 	  case FP_RND_PINF:			\
 | |
| 	    __ret |= _FP_ROUND_PINF(wc,X);	\
 | |
| 	    break;				\
 | |
| 	  case FP_RND_MINF:			\
 | |
| 	    __ret |= _FP_ROUND_MINF(wc,X);	\
 | |
| 	    break;				\
 | |
| 	};					\
 | |
| 	__ret;					\
 | |
| })
 | |
| 
 | |
| #define FP_CLS_NORMAL		0
 | |
| #define FP_CLS_ZERO		1
 | |
| #define FP_CLS_INF		2
 | |
| #define FP_CLS_NAN		3
 | |
| 
 | |
| #define _FP_CLS_COMBINE(x,y)	(((x) << 2) | (y))
 | |
| 
 | |
| #include "op-1.h"
 | |
| #include "op-2.h"
 | |
| #include "op-4.h"
 | |
| #include "op-common.h"
 | |
| 
 | |
| /* Sigh.  Silly things longlong.h needs.  */
 | |
| #define UWtype		_FP_W_TYPE
 | |
| #define W_TYPE_SIZE	_FP_W_TYPE_SIZE
 | |
| 
 | |
| typedef int SItype __attribute__((mode(SI)));
 | |
| typedef int DItype __attribute__((mode(DI)));
 | |
| typedef unsigned int USItype __attribute__((mode(SI)));
 | |
| typedef unsigned int UDItype __attribute__((mode(DI)));
 | |
| #if _FP_W_TYPE_SIZE == 32
 | |
| typedef unsigned int UHWtype __attribute__((mode(HI)));
 | |
| #elif _FP_W_TYPE_SIZE == 64
 | |
| typedef USItype UHWtype;
 | |
| #endif
 | |
| 
 | |
| #endif
 |