1 /*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "clz.h"
18
19 /*
20 * Implementation of CLZ; intended to mimic gcc's __builtin_clz.
21 *
22 * Returns the number of leading zero bits, starting at the most
23 * significant bit position. If the argument is zero, the result is
24 * undefined.
25 *
26 * (For best results, this file should always be compiled for ARM, not THUMB.)
27 */
dvmClzImpl(unsigned int x)28 int dvmClzImpl(unsigned int x)
29 {
30 #ifdef HAVE_BUILTIN_CLZ
31 /*
32 * This file was compiled with flags that allow it to use the built-in
33 * CLZ (e.g. ARM mode for ARMv5 or later).
34 */
35 return __builtin_clz(x);
36 #else
37 /*
38 * Built-in version not available.
39 */
40 if (!x) return 32;
41 int e = 31;
42 if (x&0xFFFF0000) { e -=16; x >>=16; }
43 if (x&0x0000FF00) { e -= 8; x >>= 8; }
44 if (x&0x000000F0) { e -= 4; x >>= 4; }
45 if (x&0x0000000C) { e -= 2; x >>= 2; }
46 if (x&0x00000002) { e -= 1; }
47 return e;
48 #endif
49 }
50
51