/* ********************************************************************************************************* * uC/CPU * CPU CONFIGURATION & PORT LAYER * * Copyright 2004-2021 Silicon Laboratories Inc. www.silabs.com * * SPDX-License-Identifier: APACHE-2.0 * * This software is subject to an open source license and is distributed by * Silicon Laboratories Inc. pursuant to the terms of the Apache License, * Version 2.0 available at www.apache.org/licenses/LICENSE-2.0. * ********************************************************************************************************* */ /* ********************************************************************************************************* * * CPU PORT FILE * * ARM * IAR C Compiler * * Filename : cpu_c.c * Version : V1.32.01 ********************************************************************************************************* */ /* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #define MICRIUM_SOURCE #include <cpu.h> #include <cpu_core.h> #include <lib_def.h> #ifdef __cplusplus extern "C" { #endif /* ********************************************************************************************************* * LOCAL DEFINES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL CONSTANTS ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL DATA TYPES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL TABLES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL GLOBAL VARIABLES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL FUNCTION PROTOTYPES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL CONFIGURATION ERRORS ********************************************************************************************************* */ /* ********************************************************************************************************* * CPU_CntLeadZeros() * * Description : Counts the number of contiguous, most-significant, leading zero bits before the * first binary one bit in a data value. * * Argument(s) : val Data value to count leading zero bits. * * Return(s) : Number of contiguous, most-significant, leading zero bits in 'val'. * * Note(s) : (1) (a) Supports 32-bit data value size as configured by 'CPU_DATA' (see 'cpu.h * CPU WORD CONFIGURATION Note #1'). * * (b) For 32-bit values : * * b31 b30 b29 ... b04 b03 b02 b01 b00 # Leading Zeros * --- --- --- --- --- --- --- --- --------------- * 1 x x x x x x x 0 * 0 1 x x x x x x 1 * 0 0 1 x x x x x 2 * : : : : : : : : : * : : : : : : : : : * 0 0 0 1 x x x x 27 * 0 0 0 0 1 x x x 28 * 0 0 0 0 0 1 x x 29 * 0 0 0 0 0 0 1 x 30 * 0 0 0 0 0 0 0 1 31 * 0 0 0 0 0 0 0 0 32 * * * (2) MUST be defined in 'cpu_a.asm' (or 'cpu_c.c') if CPU_CFG_LEAD_ZEROS_ASM_PRESENT * is #define'd in 'cpu_cfg.h' or 'cpu.h'. ********************************************************************************************************* */ #ifdef CPU_CFG_LEAD_ZEROS_ASM_PRESENT CPU_DATA CPU_CntLeadZeros (CPU_DATA val) { CPU_DATA cnt = 0u; asm("CLZ %0, %1" : "=r"(cnt) : "r" (val)); return (cnt); } #endif #ifdef __cplusplus } #endif