linux/arch/m68k/include/asm/div64.h
<<
>>
Prefs
   1#ifndef _M68K_DIV64_H
   2#define _M68K_DIV64_H
   3
   4#ifdef CONFIG_CPU_HAS_NO_MULDIV64
   5#include <asm-generic/div64.h>
   6#else
   7
   8#include <linux/types.h>
   9
  10/* n = n / base; return rem; */
  11
  12#define do_div(n, base) ({                                      \
  13        union {                                                 \
  14                unsigned long n32[2];                           \
  15                unsigned long long n64;                         \
  16        } __n;                                                  \
  17        unsigned long __rem, __upper;                           \
  18                                                                \
  19        __n.n64 = (n);                                          \
  20        if ((__upper = __n.n32[0])) {                           \
  21                asm ("divul.l %2,%1:%0"                         \
  22                        : "=d" (__n.n32[0]), "=d" (__upper)     \
  23                        : "d" (base), "0" (__n.n32[0]));        \
  24        }                                                       \
  25        asm ("divu.l %2,%1:%0"                                  \
  26                : "=d" (__n.n32[1]), "=d" (__rem)               \
  27                : "d" (base), "1" (__upper), "0" (__n.n32[1])); \
  28        (n) = __n.n64;                                          \
  29        __rem;                                                  \
  30})
  31
  32#endif /* CONFIG_CPU_HAS_NO_MULDIV64 */
  33
  34#endif /* _M68K_DIV64_H */
  35