5 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
8 Desc: Work on 64bit data types
12 #ifndef AROS_MACHINE_H
13 # include <aros/machine.h>
16 /* Convert a word or long to big endian on the current hardware */
18 # define AROS_WORD2BE(w) (w)
19 # define AROS_LONG2BE(l) (l)
20 # define AROS_BE2WORD(w) (w)
21 # define AROS_BE2LONG(l) (l)
23 # define AROS_WORD2BE(w) ((((w) >> 8) & 0x00FF) | (((w) & 0x00FF) << 8))
24 # define AROS_LONG2BE(l) \
26 ((((unsigned long)(l)) >> 24) & 0x000000FFUL) | \
27 ((((unsigned long)(l)) >> 8) & 0x0000FF00UL) | \
28 ((((unsigned long)(l)) << 8) & 0x00FF0000UL) | \
29 ((((unsigned long)(l)) << 24) & 0xFF000000UL) \
31 # define AROS_BE2WORD(w) AROS_WORD2BE(w)
32 # define AROS_BE2LONG(l) AROS_LONG2BE(l)
35 /* Return the least set bit, ie. 0xFF00 will return 0x0100 */
36 #ifndef AROS_LEAST_BIT
37 # define AROS_LEAST_BIT(l) ((l) & -(l))
40 /* Check if an int is a power of two */
41 #ifndef AROS_IS_POWER_OF_2
42 # define AROS_IS_POWER_OF_2(l) (((l) & -(l)) == (l))
45 /* Round down <x> to a multiple of <r>. <r> must be a power of two */
46 #ifndef AROS_ROUNDDOWN2
47 # define AROS_ROUNDDOWN2(x,r) ((x) & ~((r) - 1))
50 /* Round up <x> to a multiple of <r>. <r> must be a power of two */
52 # define AROS_ROUNDUP2(x,r) (((x) + ((r) - 1)) & ~((r) - 1))
55 /* Return the number of the least set bit, ie. 0xFF00 will return 8 */
56 #ifndef AROS_LEAST_BIT_POS
57 # define AROS_LEAST_BIT_POS(l) \
58 (((l) & 0x0000FFFFUL) ? \
59 ((l) & 0x000000FFUL) ? \
60 ((l) & 0x0000000FUL) ? \
62 ((l) & 0x01UL) ? 0 : 1 \
63 : ((l) & 0x04UL) ? 2 : 3 \
65 ((l) & 0x10UL) ? 4 : 5 \
66 : ((l) & 0x40UL) ? 6 : 7 \
67 : ((l) & 0x00000F00UL) ? \
69 ((l) & 0x0100UL) ? 8 : 9 \
70 : ((l) & 0x0400UL) ? 10 : 11 \
71 : ((l) & 0x3000UL) ? \
72 ((l) & 0x1000UL) ? 12 : 13 \
73 : ((l) & 0x4000UL) ? 14 : 15 \
74 : ((l) & 0x00FF0000UL) ? \
75 ((l) & 0x000F0000UL) ? \
76 ((l) & 0x030000UL) ? \
77 ((l) & 0x010000UL) ? 16 : 17 \
78 : ((l) & 0x040000UL) ? 18 : 19 \
79 : ((l) & 0x300000UL) ? \
80 ((l) & 0x100000UL) ? 20 : 21 \
81 : ((l) & 0x400000UL) ? 22 : 23 \
82 : ((l) & 0x0F00000000UL) ? \
83 ((l) & 0x03000000UL) ? \
84 ((l) & 0x01000000UL) ? 24 : 25 \
85 : ((l) & 0x04000000UL) ? 26 : 27 \
86 : ((l) & 0x30000000UL) ? \
87 ((l) & 0x10000000UL) ? 28 : 29 \
88 : ((l) & 0x40000000UL) ? 30 : (l) ? 31 : -1)
89 #endif /* AROS_LEAST_BIT_POS */
91 /* Swap to integer variables */
93 # define AROS_SWAP(x,y) (x) ^= (y) ^= (x) ^= (y)
96 /* Reverse the bits in a word */
97 #ifndef AROS_SWAP_BITS_WORD
98 # define AROS_SWAP_BITS_WORD(w) \
99 ((w) = ((w) = ((((w) >> 1) & 0x5555) | (((w) << 1) & 0xaaaa)), \
100 (w) = ((((w) >> 2) & 0x3333) | (((w) << 2) & 0xcccc)), \
101 (w) = ((((w) >> 4) & 0x0f0f) | (((w) << 4) & 0xf0f0)), \
102 (w) = ((((w) >> 8) & 0x00ff) | (((w) << 8) & 0xff00))) \
106 /* Reverse the bits in a long */
107 #ifndef AROS_SWAP_BITS_LONG
108 # define AROS_SWAP_BITS_LONG(l) \
109 ((l) = ((l) = ((((l) >> 1) & 0x55555555UL) | (((l) << 1) & 0xaaaaaaaaUL)), \
110 (l) = ((((l) >> 2) & 0x33333333UL) | (((l) << 2) & 0xccccccccUL)), \
111 (l) = ((((l) >> 4) & 0x0f0f0f0fUL) | (((l) << 4) & 0xf0f0f0f0UL)), \
112 (l) = ((((l) >> 8) & 0x00ff00ffUL) | (((l) << 8) & 0xff00ff00UL)), \
113 (l) = ((((l) >> 16) & 0x0000ffffUL) | (((l) << 16) & 0xffff0000UL))) \
117 #endif /* AROS_MACROS_H */