Statistics
| Branch: | Revision:

root / host-utils.h @ b9ef45ff

History | View | Annotate | Download (4.9 kB)

1 05f778c8 ths
/*
2 05f778c8 ths
 * Utility compute operations used by translated code.
3 05f778c8 ths
 *
4 05f778c8 ths
 * Copyright (c) 2007 Thiemo Seufer
5 05f778c8 ths
 * Copyright (c) 2007 Jocelyn Mayer
6 05f778c8 ths
 *
7 05f778c8 ths
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 05f778c8 ths
 * of this software and associated documentation files (the "Software"), to deal
9 05f778c8 ths
 * in the Software without restriction, including without limitation the rights
10 05f778c8 ths
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 05f778c8 ths
 * copies of the Software, and to permit persons to whom the Software is
12 05f778c8 ths
 * furnished to do so, subject to the following conditions:
13 05f778c8 ths
 *
14 05f778c8 ths
 * The above copyright notice and this permission notice shall be included in
15 05f778c8 ths
 * all copies or substantial portions of the Software.
16 05f778c8 ths
 *
17 05f778c8 ths
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 05f778c8 ths
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 05f778c8 ths
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 05f778c8 ths
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 05f778c8 ths
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 05f778c8 ths
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 05f778c8 ths
 * THE SOFTWARE.
24 05f778c8 ths
 */
25 05f778c8 ths
26 05f778c8 ths
/* Note that some of those functions may end up calling libgcc functions,
27 05f778c8 ths
   depending on the host machine. It is up to the target emulation to
28 05f778c8 ths
   cope with that. */
29 05f778c8 ths
30 05f778c8 ths
/* Binary search for leading zeros.  */
31 05f778c8 ths
32 05f778c8 ths
static always_inline int clz32(uint32_t val)
33 05f778c8 ths
{
34 05f778c8 ths
    int cnt = 0;
35 05f778c8 ths
36 05f778c8 ths
    if (!(val & 0xFFFF0000U)) {
37 05f778c8 ths
        cnt += 16;
38 05f778c8 ths
        val <<= 16;
39 05f778c8 ths
    }
40 05f778c8 ths
    if (!(val & 0xFF000000U)) {
41 05f778c8 ths
        cnt += 8;
42 05f778c8 ths
        val <<= 8;
43 05f778c8 ths
    }
44 05f778c8 ths
    if (!(val & 0xF0000000U)) {
45 05f778c8 ths
        cnt += 4;
46 05f778c8 ths
        val <<= 4;
47 05f778c8 ths
    }
48 05f778c8 ths
    if (!(val & 0xC0000000U)) {
49 05f778c8 ths
        cnt += 2;
50 05f778c8 ths
        val <<= 2;
51 05f778c8 ths
    }
52 05f778c8 ths
    if (!(val & 0x80000000U)) {
53 05f778c8 ths
        cnt++;
54 05f778c8 ths
        val <<= 1;
55 05f778c8 ths
    }
56 05f778c8 ths
    if (!(val & 0x80000000U)) {
57 05f778c8 ths
        cnt++;
58 05f778c8 ths
    }
59 05f778c8 ths
    return cnt;
60 05f778c8 ths
}
61 05f778c8 ths
62 05f778c8 ths
static always_inline int clo32(uint32_t val)
63 05f778c8 ths
{
64 05f778c8 ths
    return clz32(~val);
65 05f778c8 ths
}
66 05f778c8 ths
67 05f778c8 ths
static always_inline int clz64(uint64_t val)
68 05f778c8 ths
{
69 05f778c8 ths
    int cnt = 0;
70 05f778c8 ths
71 05f778c8 ths
    if (!(val & 0xFFFFFFFF00000000ULL)) {
72 05f778c8 ths
        cnt += 32;
73 05f778c8 ths
        val <<= 32;
74 05f778c8 ths
    }
75 05f778c8 ths
    if (!(val & 0xFFFF000000000000ULL)) {
76 05f778c8 ths
        cnt += 16;
77 05f778c8 ths
        val <<= 16;
78 05f778c8 ths
    }
79 05f778c8 ths
    if (!(val & 0xFF00000000000000ULL)) {
80 05f778c8 ths
        cnt += 8;
81 05f778c8 ths
        val <<= 8;
82 05f778c8 ths
    }
83 05f778c8 ths
    if (!(val & 0xF000000000000000ULL)) {
84 05f778c8 ths
        cnt += 4;
85 05f778c8 ths
        val <<= 4;
86 05f778c8 ths
    }
87 05f778c8 ths
    if (!(val & 0xC000000000000000ULL)) {
88 05f778c8 ths
        cnt += 2;
89 05f778c8 ths
        val <<= 2;
90 05f778c8 ths
    }
91 05f778c8 ths
    if (!(val & 0x8000000000000000ULL)) {
92 05f778c8 ths
        cnt++;
93 05f778c8 ths
        val <<= 1;
94 05f778c8 ths
    }
95 05f778c8 ths
    if (!(val & 0x8000000000000000ULL)) {
96 05f778c8 ths
        cnt++;
97 05f778c8 ths
    }
98 05f778c8 ths
    return cnt;
99 05f778c8 ths
}
100 05f778c8 ths
101 05f778c8 ths
static always_inline int clo64(uint64_t val)
102 05f778c8 ths
{
103 05f778c8 ths
    return clz64(~val);
104 05f778c8 ths
}
105 b9ef45ff j_mayer
106 b9ef45ff j_mayer
static always_inline int ctz32 (uint32_t val)
107 b9ef45ff j_mayer
{
108 b9ef45ff j_mayer
    int cnt;
109 b9ef45ff j_mayer
110 b9ef45ff j_mayer
    cnt = 0;
111 b9ef45ff j_mayer
    if (!(val & 0x0000FFFFUL)) {
112 b9ef45ff j_mayer
         cnt += 16;
113 b9ef45ff j_mayer
        val >>= 16;
114 b9ef45ff j_mayer
     }
115 b9ef45ff j_mayer
    if (!(val & 0x000000FFUL)) {
116 b9ef45ff j_mayer
         cnt += 8;
117 b9ef45ff j_mayer
        val >>= 8;
118 b9ef45ff j_mayer
     }
119 b9ef45ff j_mayer
    if (!(val & 0x0000000FUL)) {
120 b9ef45ff j_mayer
         cnt += 4;
121 b9ef45ff j_mayer
        val >>= 4;
122 b9ef45ff j_mayer
     }
123 b9ef45ff j_mayer
    if (!(val & 0x00000003UL)) {
124 b9ef45ff j_mayer
         cnt += 2;
125 b9ef45ff j_mayer
        val >>= 2;
126 b9ef45ff j_mayer
     }
127 b9ef45ff j_mayer
    if (!(val & 0x00000001UL)) {
128 b9ef45ff j_mayer
         cnt++;
129 b9ef45ff j_mayer
        val >>= 1;
130 b9ef45ff j_mayer
     }
131 b9ef45ff j_mayer
    if (!(val & 0x00000001UL)) {
132 b9ef45ff j_mayer
         cnt++;
133 b9ef45ff j_mayer
     }
134 b9ef45ff j_mayer
135 b9ef45ff j_mayer
     return cnt;
136 b9ef45ff j_mayer
 }
137 b9ef45ff j_mayer
 
138 b9ef45ff j_mayer
static always_inline int cto32 (uint32_t val)
139 b9ef45ff j_mayer
 {
140 b9ef45ff j_mayer
    return ctz32(~val);
141 b9ef45ff j_mayer
}
142 b9ef45ff j_mayer
143 b9ef45ff j_mayer
static always_inline int ctz64 (uint64_t val)
144 b9ef45ff j_mayer
{
145 b9ef45ff j_mayer
    int cnt;
146 b9ef45ff j_mayer
147 b9ef45ff j_mayer
    cnt = 0;
148 b9ef45ff j_mayer
    if (!((uint32_t)val)) {
149 b9ef45ff j_mayer
        cnt += 32;
150 b9ef45ff j_mayer
        val >>= 32;
151 b9ef45ff j_mayer
    }
152 b9ef45ff j_mayer
153 b9ef45ff j_mayer
    return cnt + ctz32(val);
154 b9ef45ff j_mayer
}
155 b9ef45ff j_mayer
156 b9ef45ff j_mayer
static always_inline int cto64 (uint64_t val)
157 b9ef45ff j_mayer
{
158 b9ef45ff j_mayer
    return ctz64(~val);
159 b9ef45ff j_mayer
}
160 b9ef45ff j_mayer
161 b9ef45ff j_mayer
static always_inline int ctpop8 (uint8_t val)
162 b9ef45ff j_mayer
{
163 b9ef45ff j_mayer
    val = (val & 0x55) + ((val >> 1) & 0x55);
164 b9ef45ff j_mayer
    val = (val & 0x33) + ((val >> 2) & 0x33);
165 b9ef45ff j_mayer
    val = (val & 0x0f) + ((val >> 4) & 0x0f);
166 b9ef45ff j_mayer
167 b9ef45ff j_mayer
    return val;
168 b9ef45ff j_mayer
}
169 b9ef45ff j_mayer
170 b9ef45ff j_mayer
static always_inline int ctpop16 (uint16_t val)
171 b9ef45ff j_mayer
{
172 b9ef45ff j_mayer
    val = (val & 0x5555) + ((val >> 1) & 0x5555);
173 b9ef45ff j_mayer
    val = (val & 0x3333) + ((val >> 2) & 0x3333);
174 b9ef45ff j_mayer
    val = (val & 0x0f0f) + ((val >> 4) & 0x0f0f);
175 b9ef45ff j_mayer
    val = (val & 0x00ff) + ((val >> 8) & 0x00ff);
176 b9ef45ff j_mayer
177 b9ef45ff j_mayer
    return val;
178 b9ef45ff j_mayer
}
179 b9ef45ff j_mayer
180 b9ef45ff j_mayer
static always_inline int ctpop32 (uint32_t val)
181 b9ef45ff j_mayer
{
182 b9ef45ff j_mayer
    val = (val & 0x55555555) + ((val >>  1) & 0x55555555);
183 b9ef45ff j_mayer
    val = (val & 0x33333333) + ((val >>  2) & 0x33333333);
184 b9ef45ff j_mayer
    val = (val & 0x0f0f0f0f) + ((val >>  4) & 0x0f0f0f0f);
185 b9ef45ff j_mayer
    val = (val & 0x00ff00ff) + ((val >>  8) & 0x00ff00ff);
186 b9ef45ff j_mayer
    val = (val & 0x0000ffff) + ((val >> 16) & 0x0000ffff);
187 b9ef45ff j_mayer
188 b9ef45ff j_mayer
    return val;
189 b9ef45ff j_mayer
}
190 b9ef45ff j_mayer
191 b9ef45ff j_mayer
static always_inline int ctpop64 (uint64_t val)
192 b9ef45ff j_mayer
{
193 b9ef45ff j_mayer
    val = (val & 0x5555555555555555ULL) + ((val >>  1) & 0x5555555555555555ULL);
194 b9ef45ff j_mayer
    val = (val & 0x3333333333333333ULL) + ((val >>  2) & 0x3333333333333333ULL);
195 b9ef45ff j_mayer
    val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >>  4) & 0x0f0f0f0f0f0f0f0fULL);
196 b9ef45ff j_mayer
    val = (val & 0x00ff00ff00ff00ffULL) + ((val >>  8) & 0x00ff00ff00ff00ffULL);
197 b9ef45ff j_mayer
    val = (val & 0x0000ffff0000ffffULL) + ((val >> 16) & 0x0000ffff0000ffffULL);
198 b9ef45ff j_mayer
    val = (val & 0x00000000ffffffffULL) + ((val >> 32) & 0x00000000ffffffffULL);
199 b9ef45ff j_mayer
200 b9ef45ff j_mayer
    return val;
201 b9ef45ff j_mayer
 }