home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / gcc / ixemulsrc.lha / ixemul / general / common.h < prev    next >
C/C++ Source or Header  |  1996-12-11  |  3KB  |  86 lines

  1. #ifndef _COMMON_H_
  2. #define _COMMON_H_
  3.  
  4. #include <exec/types.h>
  5. #undef FLOAT
  6.  
  7. #include "types.h"
  8. #define FLOAT SFVALUE
  9.  
  10. #define lowpart(a) ((unsigned short)a)
  11. #define highpart(a) ((unsigned short)((a)>>16))
  12.  
  13. static inline unsigned long
  14. mulu (unsigned long U, unsigned long V)
  15. {
  16.   register unsigned long result asm("d0");
  17.  
  18.   asm volatile ("
  19.     movel    %1,d0
  20.     movel    %2,d1
  21.     movel    d0,d2
  22.     movel    d1,d3
  23.     swap    d2
  24.     swap    d3
  25.     mulu    d1,d2
  26.     mulu    d0,d3
  27.     mulu    d1,d0
  28.     addw    d3,d2
  29.     swap    d2
  30.     clrw    d2
  31.     addl    d2,d0"
  32.     : "=r" (result)
  33.     : "g" (U), "g" (V)
  34.     : "d0", "d1", "d2", "d3");
  35.   return result;
  36. }
  37.  
  38. #define divmodu(q, r, n, d)                 \
  39. ({ register unsigned long rq asm("d0"), rr asm("d1");    \
  40.                             \
  41.    asm volatile ("                    \
  42.        movel    %2,d0;                    \
  43.        movel    %3,d1;                    \
  44.     cmpl    #0xffff,d1;                \
  45.     bhi    2f;                    \
  46.     movel    d1,d3;                    \
  47.     swap    d0;                                     \
  48.     movew    d0,d3;                                  \
  49.     beq    1f;                    \
  50.     divu    d1,d3;                                  \
  51.     movew    d3,d0;                                  \
  52.    1:                                                   \
  53.     swap    d0;                                     \
  54.     movew    d0,d3;                                  \
  55.     divu    d1,d3;                                  \
  56.     movew    d3,d0;                                  \
  57.     swap    d3;                                     \
  58.     movew    d3,d1;                                  \
  59.     bra    5f;                                  \
  60.                                                         \
  61.    2:                                               \
  62.     movel    d1,d3;                                  \
  63.     movel    d0,d1;                                  \
  64.     clrw    d1;                                     \
  65.     swap    d1;                                     \
  66.     swap    d0;                                     \
  67.     clrw    d0;                                     \
  68.     moveq    #15,d2;                                 \
  69.    3:                                                 \
  70.     addl    d0,d0;                                  \
  71.     addxl    d1,d1;                                  \
  72.     cmpl    d1,d3;                                  \
  73.     bhi    4f;                                      \
  74.     subl    d3,d1;                                  \
  75.     addqw    #1,d0;                                  \
  76.    4:                                                   \
  77.     dbra    d2,3b;                                  \
  78.                                                         \
  79.    5:"                                                 \
  80.    : "=r" (rq), "=r" (rr)                               \
  81.    : "g" (n), "g" (d)                                   \
  82.    : "d0", "d1", "d2", "d3");                           \
  83.    q = rq; r = rr;})
  84.  
  85. #endif
  86.