2005-04-16 15:20:36 -07:00
/*
* Copyright ( C ) 2000 , 2004 Maciej W . Rozycki
2007-03-25 19:54:23 -07:00
* Copyright ( C ) 2003 , 07 Ralf Baechle ( ralf @ linux - mips . org )
2005-04-16 15:20:36 -07:00
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
2009-04-30 18:14:56 +02:00
# ifndef __ASM_DIV64_H
# define __ASM_DIV64_H
2005-04-16 15:20:36 -07:00
2009-04-30 18:14:56 +02:00
# include <asm-generic/div64.h>
2007-03-25 19:54:23 -07:00
2009-04-30 18:14:56 +02:00
# if BITS_PER_LONG == 64
2005-04-16 15:20:36 -07:00
2009-04-30 18:14:56 +02:00
# include <linux/types.h>
2005-04-16 15:20:36 -07:00
/*
* No traps on overflows for any of these . . .
*/
2009-04-30 18:14:56 +02:00
# define __div64_32(n, base) \
( { \
unsigned long __cf , __tmp , __tmp2 , __i ; \
unsigned long __quot32 , __mod32 ; \
unsigned long __high , __low ; \
unsigned long long __n ; \
\
__high = * __n > > 32 ; \
__low = __n ; \
__asm__ ( \
" .set push \n " \
" .set noat \n " \
" .set noreorder \n " \
" move %2, $0 \n " \
" move %3, $0 \n " \
" b 1f \n " \
" li %4, 0x21 \n " \
" 0: \n " \
" sll $1, %0, 0x1 \n " \
" srl %3, %0, 0x1f \n " \
" or %0, $1, %5 \n " \
" sll %1, %1, 0x1 \n " \
" sll %2, %2, 0x1 \n " \
" 1: \n " \
" bnez %3, 2f \n " \
" sltu %5, %0, %z6 \n " \
" bnez %5, 3f \n " \
" 2: \n " \
" addiu %4, %4, -1 \n " \
" subu %0, %0, %z6 \n " \
" addiu %2, %2, 1 \n " \
" 3: \n " \
" bnez %4, 0b \n \t " \
" srl %5, %1, 0x1f \n \t " \
" .set pop " \
: " =&r " ( __mod32 ) , " =&r " ( __tmp ) , \
" =&r " ( __quot32 ) , " =&r " ( __cf ) , \
" =&r " ( __i ) , " =&r " ( __tmp2 ) \
: " Jr " ( base ) , " 0 " ( __high ) , " 1 " ( __low ) ) ; \
\
( __n ) = __quot32 ; \
__mod32 ; \
} )
2005-04-16 15:20:36 -07:00
2009-04-30 18:14:56 +02:00
# endif /* BITS_PER_LONG == 64 */
2005-04-16 15:20:36 -07:00
2009-04-30 18:14:56 +02:00
# endif /* __ASM_DIV64_H */