-/** @file\r
- Compiler intrinsic to return the number of trailing zeros, ported from LLVM code.\r
-\r
- Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-/**\r
- University of Illinois/NCSA\r
- Open Source License\r
-\r
- Copyright (c) 2003-2008 University of Illinois at Urbana-Champaign.\r
- All rights reserved.\r
-\r
- Developed by:\r
-\r
- LLVM Team\r
-\r
- University of Illinois at Urbana-Champaign\r
-\r
- http://llvm.org\r
-\r
- Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- this software and associated documentation files (the "Software"), to deal with\r
- the Software without restriction, including without limitation the rights to\r
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r
- of the Software, and to permit persons to whom the Software is furnished to do\r
- so, subject to the following conditions:\r
-\r
- * Redistributions of source code must retain the above copyright notice,\r
- this list of conditions and the following disclaimers.\r
-\r
- * Redistributions in binary form must reproduce the above copyright notice,\r
- this list of conditions and the following disclaimers in the\r
- documentation and/or other materials provided with the distribution.\r
-\r
- * Neither the names of the LLVM Team, University of Illinois at\r
- Urbana-Champaign, nor the names of its contributors may be used to\r
- endorse or promote products derived from this Software without specific\r
- prior written permission.\r
-\r
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\r
- SOFTWARE.\r
-**/\r
-\r
-\r
-#include "Llvm_int_lib.h"\r
-\r
-// Returns: the number of trailing 0-bits\r
-\r
-// Precondition: a != 0\r
-\r
-INT32\r
-__ctzsi2(INT32 a)\r
-{\r
- UINT32 x = (UINT32)a;\r
- INT32 t = ((x & 0x0000FFFF) == 0) << 4; // if (x has no small bits) t = 16 else 0\r
- x >>= t; // x = [0 - 0xFFFF] + higher garbage bits\r
- UINT32 r = t; // r = [0, 16]\r
- // return r + ctz(x)\r
- t = ((x & 0x00FF) == 0) << 3;\r
- x >>= t; // x = [0 - 0xFF] + higher garbage bits\r
- r += t; // r = [0, 8, 16, 24]\r
- // return r + ctz(x)\r
- t = ((x & 0x0F) == 0) << 2;\r
- x >>= t; // x = [0 - 0xF] + higher garbage bits\r
- r += t; // r = [0, 4, 8, 12, 16, 20, 24, 28]\r
- // return r + ctz(x)\r
- t = ((x & 0x3) == 0) << 1;\r
- x >>= t;\r
- x &= 3; // x = [0 - 3]\r
- r += t; // r = [0 - 30] and is even\r
- // return r + ctz(x)\r
-// The branch-less return statement below is equivalent\r
-// to the following switch statement:\r
-// switch (x)\r
-// {\r
-// case 0:\r
-// return r + 2;\r
-// case 2:\r
-// return r + 1;\r
-// case 1:\r
-// case 3:\r
-// return r;\r
-// }\r
- return r + ((2 - (x >> 1)) & -((x & 1) == 0));\r
-}\r