Skip to content
Snippets Groups Projects
div64.h 984 B
Newer Older
  • Learn to ignore specific revisions
  • #ifndef _ASM_GENERIC_DIV64_H
    #define _ASM_GENERIC_DIV64_H
    /*
     * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com>
     * Based on former asm-ppc/div64.h and asm-m68knommu/div64.h
     *
     * The semantics of do_div() are:
     *
     * uint32_t do_div(uint64_t *n, uint32_t base)
     * {
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     *	uint32_t remainder = *n % base;
     *	*n = *n / base;
     *	return remainder;
    
     * }
     *
     * NOTE: macro parameter n is evaluated multiple times,
     *       beware of side effects!
     */
    
    #include <linux/types.h>
    
    extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor);
    
    /* The unnecessary pointer compare is there
     * to check for type safety (n must be 64bit)
     */
    # define do_div(n,base) ({				\
    	uint32_t __base = (base);			\
    	uint32_t __rem;					\
    	(void)(((typeof((n)) *)0) == ((uint64_t *)0));	\
    	if (((n) >> 32) == 0) {			\
    		__rem = (uint32_t)(n) % __base;		\
    		(n) = (uint32_t)(n) / __base;		\
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	} else						\
    
    		__rem = __div64_32(&(n), __base);	\
    	__rem;						\
     })
    
    #endif /* _ASM_GENERIC_DIV64_H */