home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROS_m68k_bin.lha / AROS / include / aros / macros.h < prev    next >
C/C++ Source or Header  |  1997-02-08  |  3KB  |  103 lines

  1. #ifndef AROS_MACROS_H
  2. #define AROS_MACROS_H
  3.  
  4. /*
  5.     (C) 1995-96 AROS - The Amiga Replacement OS
  6.     $Id: macros.h,v 1.1 1997/02/07 14:12:07 digulla Exp $
  7.  
  8.     Desc: Work on 64bit data types
  9.     Lang: english
  10. */
  11. #ifndef AROS_MACHINE_H
  12. #   include <aros/machine.h>
  13. #endif
  14.  
  15. /* Convert a word or long to big endian on the current hardware */
  16. #if AROS_BIG_ENDIAN
  17. #   define AROS_WORD2BE(w)     (w)
  18. #   define AROS_LONG2BE(l)     (l)
  19. #else
  20. #   define AROS_WORD2BE(w)     ((((w) >> 8) & 0x00FF) | (((w) 0x00FF) << 8))
  21. #   define AROS_LONG2BE(l)     \
  22.     (                                  \
  23.         ((((unsigned long)l) >> 24) & 0x000000FFUL) | \
  24.         ((((unsigned long)l) >> 08) & 0x0000FF00UL) | \
  25.         ((((unsigned long)l) << 08) & 0x00FF0000UL) | \
  26.         ((((unsigned long)l) << 24) & 0xFF000000UL) | \
  27.     )
  28. #endif
  29.  
  30. /* Return the least set bit, ie. 0xFF00 will return 0x0100 */
  31. #ifndef AROS_LEAST_BIT
  32. #   define AROS_LEAST_BIT(l)    ((l) & -(l))
  33. #endif
  34.  
  35. /* Check if an int is a power of two */
  36. #ifndef AROS_IS_POWER_OF_2
  37. #   define AROS_IS_POWER_OF_2(l)    (((l) & -(l)) == (l))
  38. #endif
  39.  
  40. /* Return the number of the least set bit, ie. 0xFF00 will return 8 */
  41. #ifndef AROS_LEAST_BIT_POS
  42. #   define AROS_LEAST_BIT_POS(l) \
  43.     (((l) & 0x0000FFFFUL) ? \
  44.     ((l) & 0x000000FFUL) ? \
  45.         ((l) & 0x0000000FUL) ? \
  46.         ((l) & 0x03UL) ? \
  47.             ((l) & 0x01UL) ? 0 : 1 \
  48.         :   ((l) & 0x04UL) ? 2 : 3 \
  49.         :    ((l) & 0x30UL) ? \
  50.             ((l) & 0x10UL) ? 4 : 5 \
  51.         :   ((l) & 0x40UL) ? 6 : 7 \
  52.     :   ((l) & 0x00000F00UL) ? \
  53.         ((l) & 0x0300UL) ? \
  54.             ((l) & 0x0100UL) ?  8 :  9 \
  55.         :   ((l) & 0x0400UL) ? 10 : 11 \
  56.         :    ((l) & 0x3000UL) ? \
  57.             ((l) & 0x1000UL) ? 12 : 13 \
  58.         :   ((l) & 0x4000UL) ? 14 : 15 \
  59.     :    ((l) & 0x00FF0000UL) ? \
  60.         ((l) & 0x000F0000UL) ? \
  61.         ((l) & 0x030000UL) ? \
  62.             ((l) & 0x010000UL) ? 16 : 17 \
  63.         :   ((l) & 0x040000UL) ? 18 : 19 \
  64.         :    ((l) & 0x300000UL) ? \
  65.             ((l) & 0x100000UL) ? 20 : 21 \
  66.         :   ((l) & 0x400000UL) ? 22 : 23 \
  67.     :   ((l) & 0x0F00000000UL) ? \
  68.         ((l) & 0x03000000UL) ? \
  69.             ((l) & 0x01000000UL) ? 24 : 25 \
  70.         :   ((l) & 0x04000000UL) ? 26 : 27 \
  71.         :    ((l) & 0x30000000UL) ? \
  72.             ((l) & 0x10000000UL) ? 28 : 29 \
  73.         :   ((l) & 0x40000000UL) ? 30 : (l) ? 31 : -1)
  74. #endif /* AROS_LEAST_BIT_POS */
  75.  
  76. /* Swap to integer variables */
  77. #ifndef AROS_SWAP
  78. #   define AROS_SWAP(x,y)       (x) ^= (y) ^= (x) ^= (y)
  79. #endif
  80.  
  81. /* Reverse the bits in a word */
  82. #ifndef AROS_SWAP_BITS_WORD
  83. #   define AROS_SWAP_BITS_WORD(w) \
  84.     ((w) = ((w) = ((((w) >> 1) & 0x5555) | (((w) << 1) & 0xaaaa)), \
  85.         (w) = ((((w) >> 2) & 0x3333) | (((w) << 2) & 0xcccc)), \
  86.         (w) = ((((w) >> 4) & 0x0f0f) | (((w) << 4) & 0xf0f0)), \
  87.         (w) = ((((w) >> 8) & 0x00ff) | (((w) << 8) & 0xff00))) \
  88.     )
  89. #endif
  90.  
  91. /* Reverse the bits in a long */
  92. #ifndef AROS_SWAP_BITS_LONG
  93. #   define AROS_SWAP_BITS_LONG(l) \
  94.     ((l) = ((l) = ((((l) >>  1) & 0x55555555UL) | (((l) <<  1) & 0xaaaaaaaaUL)), \
  95.         (l) = ((((l) >>  2) & 0x33333333UL) | (((l) <<  2) & 0xccccccccUL)), \
  96.         (l) = ((((l) >>  4) & 0x0f0f0f0fUL) | (((l) <<  4) & 0xf0f0f0f0UL)), \
  97.         (l) = ((((l) >>  8) & 0x00ff00ffUL) | (((l) <<  8) & 0xff00ff00UL)), \
  98.         (l) = ((((l) >> 16) & 0x0000ffffUL) | (((l) << 16) & 0xffff0000UL))) \
  99.     )
  100. #endif
  101.  
  102. #endif /* AROS_MACROS_H */
  103.