diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/build.mk | 1 | ||||
-rw-r--r-- | common/clz.c | 42 |
2 files changed, 43 insertions, 0 deletions
diff --git a/common/build.mk b/common/build.mk index 40b393bc09..fc28dcc0fe 100644 --- a/common/build.mk +++ b/common/build.mk @@ -53,6 +53,7 @@ common-$(CONFIG_POWER_BUTTON_X86)+=power_button_x86.o common-$(CONFIG_PSTORE)+=pstore_commands.o common-$(CONFIG_PWM)+=pwm.o common-$(CONFIG_PWM_KBLIGHT)+=pwm_kblight.o +common-$(CONFIG_SOFTWARE_CLZ)+=clz.o common-$(CONFIG_SWITCH)+=switch.o common-$(CONFIG_TEMP_SENSOR)+=temp_sensor.o thermal.o common-$(CONFIG_USB_PORT_POWER_DUMB)+=usb_port_power_dumb.o diff --git a/common/clz.c b/common/clz.c new file mode 100644 index 0000000000..30c987e367 --- /dev/null +++ b/common/clz.c @@ -0,0 +1,42 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * 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 + */ + +/** + * 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 __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; +} |