Home | History | Annotate | Download | only in src
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #ifndef V8_MISC_INTRINSICS_H_
     29 #define V8_MISC_INTRINSICS_H_
     30 
     31 #include "../include/v8.h"
     32 #include "globals.h"
     33 
     34 namespace v8 {
     35 namespace internal {
     36 
     37 // Returns the index of the leading 1 bit, counting the least significant bit at
     38 // index 0.  (1 << IntegerLog2(x)) is a mask for the most significant bit of x.
     39 // Result is undefined if input is zero.
     40 int IntegerLog2(uint32_t value);
     41 
     42 #if defined(__GNUC__)
     43 
     44 inline int IntegerLog2(uint32_t value) {
     45   return 31 - __builtin_clz(value);
     46 }
     47 
     48 #elif defined(_MSC_VER)
     49 
     50 #pragma intrinsic(_BitScanReverse)
     51 
     52 inline int IntegerLog2(uint32_t value) {
     53   unsigned long result;             // NOLINT: MSVC intrinsic demands this type.
     54   _BitScanReverse(&result, value);
     55   return result;
     56 }
     57 
     58 #else
     59 
     60 // Default version using regular operations. Code taken from:
     61 // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
     62 inline int IntegerLog2(uint32_t value) {
     63   int result, shift;
     64 
     65   shift = (value > 0xFFFF) << 4;
     66   value >>= shift;
     67   result = shift;
     68 
     69   shift = (value > 0xFF) << 3;
     70   value >>= shift;
     71   result |= shift;
     72 
     73   shift = (value > 0xF) << 2;
     74   value >>= shift;
     75   result |= shift;
     76 
     77   shift = (value > 0x3) << 1;
     78   value >>= shift;
     79   result |= shift;
     80 
     81   result |= (value >> 1);
     82 
     83   return result;
     84 }
     85 #endif
     86 
     87 } }  // namespace v8::internal
     88 
     89 #endif  // V8_MISC_INTRINSICS_H_
     90