| /* Copyright 2014 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * Software emulation for CLZ instruction |
| */ |
| |
| #include "common.h" |
| |
| /** |
| * Count leading zeros |
| * |
| * @param x non null integer. |
| * @return the number of leading 0-bits in x, |
| * starting at the most significant bit position. |
| */ |
| int __keep __clzsi2(int x) |
| { |
| int r = 0; |
| |
| if (!x) |
| return 32; |
| if (!(x & 0xffff0000u)) { |
| x <<= 16; |
| r += 16; |
| } |
| if (!(x & 0xff000000u)) { |
| x <<= 8; |
| r += 8; |
| } |
| if (!(x & 0xf0000000u)) { |
| x <<= 4; |
| r += 4; |
| } |
| if (!(x & 0xc0000000u)) { |
| x <<= 2; |
| r += 2; |
| } |
| if (!(x & 0x80000000u)) { |
| x <<= 1; |
| r += 1; |
| } |
| return r; |
| } |