13cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
23cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// Redistribution and use in source and binary forms, with or without
33cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// modification, are permitted provided that the following conditions are
43cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// met:
53cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//
63cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//     * Redistributions of source code must retain the above copyright
73cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       notice, this list of conditions and the following disclaimer.
83cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//     * Redistributions in binary form must reproduce the above
93cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       copyright notice, this list of conditions and the following
103cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       disclaimer in the documentation and/or other materials provided
113cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       with the distribution.
123cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//     * Neither the name of Google Inc. nor the names of its
133cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       contributors may be used to endorse or promote products derived
143cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//       from this software without specific prior written permission.
153cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org//
163cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
283cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#ifndef V8_MISC_INTRINSICS_H_
293cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#define V8_MISC_INTRINSICS_H_
303cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
313cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#include "../include/v8.h"
323cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#include "globals.h"
333cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
343cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orgnamespace v8 {
353cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orgnamespace internal {
363cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
373cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// Returns the index of the leading 1 bit, counting the least significant bit at
383cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// index 0.  (1 << IntegerLog2(x)) is a mask for the most significant bit of x.
393cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// Result is undefined if input is zero.
403cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orgint IntegerLog2(uint32_t value);
413cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
423cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#if defined(__GNUC__)
433cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
443cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orginline int IntegerLog2(uint32_t value) {
453cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  return 31 - __builtin_clz(value);
463cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org}
473cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
483cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#elif defined(_MSC_VER)
493cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
503cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#pragma intrinsic(_BitScanReverse)
513cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
523cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orginline int IntegerLog2(uint32_t value) {
533cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  unsigned long result;             // NOLINT: MSVC intrinsic demands this type.
543cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  _BitScanReverse(&result, value);
553cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  return result;
563cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org}
573cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
583cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#else
593cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
603cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// Default version using regular operations. Code taken from:
613cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
623cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orginline int IntegerLog2(uint32_t value) {
633cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  int result, shift;
643cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
653cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  shift = (value > 0xFFFF) << 4;
663cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  value >>= shift;
673cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  result = shift;
683cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
693cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  shift = (value > 0xFF) << 3;
703cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  value >>= shift;
713cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  result |= shift;
723cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
733cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  shift = (value > 0xF) << 2;
743cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  value >>= shift;
753cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  result |= shift;
763cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
773cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  shift = (value > 0x3) << 1;
783cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  value >>= shift;
793cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  result |= shift;
803cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
813cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  result |= (value >> 1);
823cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
833cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org  return result;
843cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org}
853cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#endif
863cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
873cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org} }  // namespace v8::internal
883cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org
893cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org#endif  // V8_MISC_INTRINSICS_H_
90